了解 Metrics 和时间序列

OpenTSDB 是一个时间序列数据库。时间序列是一段时间内某些特定 Metrics 的一系列数字数据点。每个时间序列都包含一个 Metrics 以及与此 Metrics 相关联的一个或多个标签(我们将简要介绍标签)。Metrics 是您希望随时间跟踪的任何特定数据(例如,对 Apache 托管文件的点击)。

OpenTSDB 还是数据绘图系统。 OpenTSDB 绘制事物的方式与其他系统略有不同。我们将在下面更详细地讨论绘图,但是现在重要的是要知道,对于 OpenTSDB,任何给定绘图的基础都是度量。它采用该 Metrics,找到您选择的时间范围内的所有时间序列,将这些时间序列汇总在一起(例如,通过对它们进行求和)并绘制结果。绘图机制非常灵活和强大,您可以做更多的事情,但是现在让我们来谈谈时间序列的关键,即度量。

在 OpenTSDB 中,度量标准以字符串命名,例如http.hits。为了能够存储此度量标准存在的所有位置的所有不同值,请在将数据发送到 TSD 时使用一个或多个标签来标记数据。 TSD 存储时间戳,值和标记。当您想要检索此数据时,TSD 会检索您提供的时间 Span 的所有值,还可以选择使用提供的标签过滤器,将所有这些值汇总在一起,并按需要绘制此值的图形。

到目前为止,这里已经介绍了很多东西。为了帮助您了解事情的运作方式,我将以一个典型的例子开始。假设您有一堆 Web 服务器,并且想要跟踪两件事:Web 服务器的命中率和系统的平均负载。让我们组成度量名称来表达这一点。对于平均负载,我们将其称为proc.loadavg.1min(因为在 Linux 上,您可以通过读取/proc/loadavg轻松获取此数据)。对于许多 Web 服务器,有一种方法可以要求 Web 服务器提供一个计数器,以表达自服务器启动以来对该服务器的点击次数。这是用于度量的便捷计数器,我们将其称为http.hits。我选择这两个示例有两个原因。首先,我们将了解 OpenTSDB 如何轻松处理两个计数器(随时间增加的值,除非它们通过重新启动/重启或溢出而重置),以及它如何处理正常的值(如平均负载)。 OpenTSDB 的一大优势是您无需对计数器进行任何费率计算。它将为您完成所有工作。第二个原因是,我们还可以向您展示如何在同一图形上绘制具有不同比例的两个不同 Metrics,这是关联不同 Metrics 的一种好方法。

您的第一个数据点

无需过多介绍收集器如何将数据发送到 TSD,而是编写一个收集器,该收集器定期将每个服务器的这些数据点的当前值发送到 TSD。因此,TSD 可以聚合来自多个主机的数据,您可以使用“主机”标签来标记每个值。因此,如果您有 Web 服务器 A,B,C 等,它们每个都会定期向 TSD 发送这样的消息:

put http.hits 1234567890 34877 host=A
put proc.loadavg.1min 1234567890 1.35 host=A

此处的“ 1234567890”是当前纪元时间(日期%s),以秒为单位。下一个数字是此时的 Metrics 值。这是来自主机 A 的数据,因此标记为host=A。来自主机 B 的数据将被标记为host=B,依此类推。随着时间的流逝,您将获得大量存储在 OpenTSDB 中的时间序列。

您的第一个情节

现在,让我们重新回顾我们在这里开始讨论的内容。时间序列是一段时间内某些特定 Metrics(及其标签)的一系列数据点。对于此示例,每个主机都将两个时间序列发送到 TSD。如果您有 3 个盒子分别发送这两个时间序列,则 TSD 将收集并存储 6 个时间序列。现在您已经有了数据,让我们开始绘制。

要绘制 HTTP 命中,只需进入 UI 并 Importinghttp.hits作为 Metrics 名称,然后 Importing 时间范围。由于此特定 Metrics 是一个速率计数器,请选中“费率”按钮,然后检查,随着时间的推移,您将获得对 Web 服务器的 HTTP 命中率的图表。

Aggregators

UI 的默认设置是通过将每个主机的每个时间序列加在一起(总和)来汇总每个时间序列。这意味着,TSD 将采用此度量标准的三个时间序列(主机= A,B 和 C)并将其值相加,以得出给定时间所有 Web 服务器的总点击量。请注意,您不需要在同一时间发送数据点,TSD 会弄清楚。因此,如果每个主机在某个时间点每个每秒提供 1000 次匹配,则该图将显示 3000.如果要显示每个 Web 服务器正在提供多少匹配,该怎么办?两种方式。如果您只关心每个 Web 服务器所服务的平均值,则只需将 Aggregator 方法从 sum 更改为 avg 即可。您也可以尝试其他(最大值,最小值)以查看最大值或最小值。更多的聚合函数正在起作用(百分位数等)。这是按时间间隔进行的,因此对于这两个时间段,如果某个时间点您的某个 Web 服务器的服务水平为 50 QPS,而其他 Web 服务器的服务水平为 100 QPS,后来又有一个 Web 服务器的服务水平为 50 QPS,其他 Web 服务器的速度为 50 QPS,点的最小值将是 50.换句话说,它不会弄清楚哪个时间序列是总最小值,只是向您显示该主机图。另一种查看每个 Web 服务器服务的匹配数的方法?这是我们查看标签字段的地方。

Downsampling

为了减少返回的数据点的数量,您可以指定下采样间隔和方法,例如 1h-avg 或 1d-sum。这也很有用(例如,使用 max 和 min 时),以查找给定时间段内最佳和最差情况的数据点。下采样对于使绘图阶段的强度降低和提高可读性最为有用,尤其是在绘制比屏幕像素更多的数据点时。

Tag Filters

在用户界面中,您会看到 TSD 填充了一个或多个“标签”,第一个是主机。 TSD 在这里说的是,在此时间范围内,它可以看到数据已使用主机标签进行了标签。您可以过滤图形,以便仅绘制一个主机的值。如果在主机行中填写 A,则只需绘制主机 A 的时间值即可。如果要提供要绘制的主机列表,请填写由管道符号分隔的主机列表,例如 A | B。这将为您提供两个图,而不是一个,一个用于 A,一个用于 B。最后,您还可以指定特殊字符*,这意味着为每个主机绘制一条线。

添加更多 Metrics

因此,现在您有了一个网页点击量图。这与平均负载有何关系?在同一张图上,点击“”标签,向该现有图添加新 Metrics。Importingproc.loadavg.1min 作为度量标准,然后单击“右轴”,以便分别缩放 Y 轴及其标签在右侧。由于平均负载不是计数器 Metrics,因此请确保未选中“费率”。贴吧?!现在,您可以看到 Web 点击率的变化如何影响系统的平均负载。

Getting Fancy

想象一下,如果您的服务器实际上运行了两个 Web 服务器,例如,一个用于静态内容,另一个用于动态内容。无需创建另一个度量标准,只需使用服务器实例标记 http.hits 度量标准即可。让您的收藏家发送以下内容:

put http.hits 1234567890 34877 host=A webserver=static put http.hits 1234567890 4357 host=A webserver=dynamic put proc.loadavg.1min 1234567890 1.35 host=A

为什么这样做而不是创建另一个 Metrics?好吧,如果有时您关心绘制 HTTP 总命中数,而有时又关心突破静态和动态命中数怎么办?有了标签,很容易。使用此新标签,在绘制该 Metrics 时,您会看到一个 Web 服务器标签出现在 UI 中。您可以将其保留为空白,并将这两个值合计为一个图(根据 Aggregator 设置),可以看到总点击数,也可以执行 webserver = *来确定每个静态和动态实例的数量共同在您的 Web 服务器上进行。您甚至可以更深入地指定 webserver = *和 host = *来查看完整的细分。

准则何时创建 Metrics

目前,您无法将两个 Metrics 合并为一条绘图线。这意味着您希望 Metrics 成为最大可能的聚合点。如果您想深入了解 Metrics 中的具体信息,请使用标签。

代码与 Metrics

度量标准应该是特定的事物,例如“以太网数据包”,但不能分解为特定事物的实例。通常,您不希望收集诸如 net.bytes.eth0,net.bytes.eth1 等之类的度量。收集 net.bytes 并使用 iface = eth0 等标记 eth0 数据点。请勿打扰创建单独的“ in”和要么是“出局”Metrics。添加标签 direction = in 或 direction = out。这样,您可以轻松查看给定框的总网络活动,而无需绘制大量 Metrics。这仍然使您可以灵活地向下钻取并仅显示特定界面或特定方向的活动。

计数器和费率

如果某物是计数器,或者自然是某个比率,那么在将其发送到 TSD 之前,请勿将其转换为比率。这有两个主要原因。首先,由于 TSD 可以为您完成自己的速率计算,重置/溢出处理等工作,所以很愚蠢。您也不必担心由于稍微不准确或不断变化的采样间隔而使每秒单位计算正确。其次,如果在丢失一个或多个数据点的地方发生了某些事情,如果您正在发送当前计数器值,则不会丢失数据,而只是丢失该数据。 TSD 中的黄金法则是,如果您的源数据是一个计数器(/ proc 或 SNMP 之外的某个计数器),请保持这种方式。不要转换它。如果您正在编写自己的收集器(例如,一个收集器统计特定错误消息在日志的尾部-f 中出现的频率),请不要在每个采样间隔内重置计数器。让 TSD 为您完成工作。

标签是您的朋友

在小型环境之上的任何环境中,您可能都有集群或成组的计算机在执行相同的操作。随着时间的流逝,这些变化。没关系。将数据发送到 TSD 时,只需使用标签即可传递此群集信息。向从每个 Web 服务器发送的所有数据点添加 cluster = webserver 之类的内容,并为所有数据库添加 cluster = db 等。

现在,当您为 Web 服务器群集绘制 CPU 活动时,您会看到所有这些活动都聚合到一个图中。然后,假设您添加了一个 Web 服务器,甚至将其从 Web 服务器更改为数据库。您要做的就是确保在角色更改时发送正确的标签,现在,该框的 CPU 活动被计入正确的集群。而且,您所有的历史数据仍然正确!这是 OpenTSDB 的 true 力量。您不仅不会像基于 RRD 的系统那样随着时间的流逝而失去数据点的分辨率,而且历史数据也不会随着框的移动而丢失。您也不必在仪表盘中放置一堆集群或分组感知逻辑。

Metrics 和标签的精度

数据点上允许的最大标签数由常量(Const.MAX_NUM_TAGS)定义,该常量在编写时为 8.Metrics 名称,标签名称和标签值必须由字母数字字符组成,连字符“-” ,下划线“ _”,句点“。”和正斜杠“ /”,这是由 package-private 函数 Tags.validateString 强制执行的。