OpenTSDB是一个时间序列数据库。时间序列是一段时间内某个特定指标量的一系列数值数据点。每个时间序列由一个指标量加上一个或多个与此指标量相关联的标签组成(我们会稍微介绍一下标签)。指标量是您希望随时跟踪的任意特定数据(例如点击Apache主机文件)。
OpenTSDB也是一个数据绘图系统。OpenTSDB绘制的东西与其他系统有点不同。我们将在下面更详细地讨论绘图,但现在对于OpenTSDB来说,任何给定绘图的基础都是指标量,了解这一点是很重要的。它采用该指标量,找出所选时间范围的所有时间序列,将这些时间序列聚合在一起(例如将它们累加)并绘制结果。绘图机制非常灵活且功能强大,可以做的远远不止这些,但现在让我们来谈谈时间序列的关键——指标(Metric)。
在OpenTSDB中,指标命名为一个字符串,像“http.hits”。为了能够存储该指标量存在的所有位置的不同的值,可以在将数据发送到TSD时使用一个或多个标签标记数据。TSD存储时间戳,值和标签。当您想要读取这些数据时,TSD检索读取您提供的时间范围的所有值,可选地使用您提供的标签过滤器,按照您想要的算法聚合所有的这些值,并绘制该指标值随时间变化的图形。
到目前为止,我们已经介绍了一些内容。为了帮助你理解它的工作方式,将从一个典型的例子开始。假设您有一堆Web服务器,并且您想跟踪两件事情: Web服务器点击量和系统负载的平均值。我们来定义指标名称来表达它们。对于平均负载,我们称之为”proc.loadavg.lmin”(因为在Linux上,你可以通过读取/proc/loadavg轻易获取这些数据)。对很多Web服务器来说,有一种方法可以向Web服务器请求一个表示从服务器启动以来点击服务器次数的计数器。这是一个便利的计数器,我们称之为”http.hits”的指标量。我选择这两个例子有如下两个原因:
- 我们将看看OpenTSDB如何轻松地处理两个计数器(随着时间的推移,值会单调递增,除非通过restart/reboot或overflow溢出重置),以及如何处理正常值的上升和下降,如负载平均值。OpenTSDB的一大优点就是无需对计数器进行Rate比率的计算,它会为你做这些。
- 我们还可以向您展示如何在同一图表上绘制两个不同比例的指标量,这是关联不同指标量非常好的一种方式。
第一个数据点
在没有详细讨论收集器如何将数据发送到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”是以秒为单位的当前纪元(epoch )时间(日期+%s)。下一个数字是此时的指标值。这是来自主机A的数据,因此标签标记为host=A。来自主机B的数据将被标记host=B等等。随着时间的推移,会得到一堆存储在OpenTSDB中的时间序列。
# 第一个绘制点
现在,让我们重新回顾一下我们在开始时谈到的内容。时间序列是一段时间内某个特定指标量(及其标签)的一系列数据点。在这个例子中,每个主机都向TSD发送两个时间序列。如果你有三个箱子(主机)发送这两个时间序列,TSD将收集和存储6个时间序列。现在有数据了,我们开始绘制。
要绘制HTTP点击量,您只需转到UI界面并输入http.hits为指标名称,然后输入时间范围。选中“Rate”复选框,因为这个特定的指标是一个速率计数器,而且,有随着时间的HTTP点击到Web服务器的比率。
聚合器
UI界面上聚合函数的默认值是通过将每个主机的每个时间序列相加(sum)来聚合每个主机的时间序列。这意味着,TSD将采用这个三个时间序列(主机= A,B和C)的指标并将它们的值相加在一起,以提供给定时间内所有Web服务器的总的点击次数。请注意,您不需要在同一时间发送数据点,TSD将会找出它。因此,如果您的每个主机在某个时间点每秒提供1000次点击,则图表会显示3000。如果您想要显示每个Web服务器提供的点击次数,该怎么办?有两种方式。如果您只关心每个Web服务器的服务平均次数,只需将Aggregator方法从sum更改为avg即可。您也可以尝试其他(最大值,最小值)来查看最大值或最小值。更多的聚合函数正在起作用(percentiles,百分数等)。这是在每个间隔的基础上完成的,所以如果在某个时间点,您的某个网络服务器的服务时间为50 QPS,其他服务器的服务时间为100个,稍迟一些另外一个网络服务器的服务时间为50 QPS,而其他服务器的服务时间为100个,这两个点的Min函数值将是50。换句话说,它不能确定哪个时间系列是总的最小值,只是告诉你主机的情节。另一种方法来查看每个Web服务器正在服务的点击数量?这是我们查看标签字段的地方。
降采样
为了减少返回的数据点的数量,可以指定一个降采样的间隔和方法,例如1h-avg或1d-sum。这也是有用的(例如当使用max和min时)在给定时间段内找到最佳和最差情况的数据点。降采样对于使绘图阶段不太密集,以及更具可读性尤其有用,特别是绘制比屏幕像素点更多的数据点时。
标签过滤器
在UI中,您会看到TSD填充了一个或多个“标签”,第一个是host。TSD在这里说,在这个时间范围内,它看到数据标记有host标签。您可以过滤图表,使其只绘制一个host的值。如果在host行中填写A,则只绘制主机A随时间变化的值。如果要给出要绘制的主机列表,请填写由管道符号分隔的主机列表,例如A | B,这将会绘制两个图,而不是一个,一个用于A,一个用于B。最后,还可以指定特殊字符*,这意味着为每个主机绘制一条线。
添加更多指标
在UI中,您会看到TSD填充了一个或多个“标签”,第一个是host。TSD在这里说,在这个时间范围内,它看到数据标记有host标签。您可以过滤图表,使其只绘制一个host的值。如果在host行中填写A,则只绘制主机A随时间变化的值。如果要给出要绘制的主机列表,请填写由管道符号分隔的主机列表,例如A | B,这将会绘制两个图,而不是一个,一个用于A,一个用于B。最后,还可以指定特殊字符*,这意味着为每个主机绘制一条线。
变得花俏美观
试想一下,如果服务器实际上运行了两个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
为什么要这样做而不是创建另一个指标?那么,如果有时候你关心的是绘制总HTTP点击量,有时候你会分别关心静态点击或动态点击呢?使用标签,很容易实现。使用这个新标签,绘制此指标时,会看到UI中会显示一个webserver标签。可以将其保留为空,并将两个值合并到一个绘图中(根据聚合器设置),可以看到总点击数,或者可以执行webserver = 来分析通过web服务器的每个静态和动态实例的数量。甚至可以更深入地指定webserver = 和host = *以查看完整分类。
创建指标的向导
现在,无法将两个指标合并成一条折线。这意味着您希望指标量成为最大可能的聚合点。如果您想深入查看指标中的具体内容,请使用标签。
标签和指标
指标量应该是一个特定的事物,比如“以太网数据包”,但不能分解成某个事物的特定实例。一般而言,您不希望收集诸如net.bytes.eth0,net.bytes.eth2等的指标。收集net.bytes并使用iface = eth0标记eth0数据点等。不要费心创建单独的“in”和“out”指标,而是添加标签direction = in或direction = out。通过这种方式,您可以轻松查看给定”盒子”的整个网络活动,而无需绘制大量指标。这仍然使您可以灵活地向下钻取,只显示特定接口的活动,或只显示特定方向的活动数据。
计数器和Rates
如果有东西是计数器,或者天生地是Rate的东西,请不要在将其发送到TSD之前将其转换为Rate。这有两个主要原因。首先,做自己的Rate计算,重置/溢出处理等是愚蠢的,因为TSD可以自动做。您也不必担心基于稍微不准确或不断改变的采样间隔来获取单位每秒计算的正确性。其次,如果发生了丢失数据点或更多数据点的情况,如果您发送当前计数器值,则不会丢失数据,只是该数据的解析度会稍差一些。TSD的黄金法则是,如果源数据是一个计数器(某些计数器输出到/ proc或SNMP),请保持原样,不要转换它。如果你正在写你自己的收集器(比如说,用于计算特定错误消息出现在日志尾部的频率),请勿在每个采样时间间隔重置计数器。让TSD为你做好此类工作。
您的朋友-标签
在小环境之上的任何环境中,您可能会有一些集群或一组机器在做同样的事情。不过随着时间的推移这些会发生改变,没关系。只需在将数据发送到TSD以传递此集群信息时使用标签。将cluster = webserver添加到每个Web服务器发送的所有数据点,cluster = db标签添加到所有数据库等。
现在,当您为Web服务器集群绘制CPU活动情况时,会看到所有这些聚合到一个绘图中。然后,我们假设您添加一个web服务器,甚至将其从web服务器更改为数据库。您所要做的就是确保在其角色更改时发送正确的标签,并且现在将该“盒子”的CPU活动计入正确的集群。更重要的是,所有的历史数据都是正确的!这是OpenTSDB的真正能力。您不仅不会像基于RRD的系统一样随时间丢失数据点的解析度,而且随着“盒子”转移,历史数据不会丢失。您也不必将大量集群或分组意识(awareness)逻辑放入仪表板。
指标和标签的精度
数据点上允许的最大标签数量由常量(Const.MAX_NUMTAGS)定义,在写入时为8。指标量名称,标签名称和标签值必须由字母数字字符, “ – ” , “”,”.”和 “/”构成,正如包私有函数Tags.validateString所强制的那样。
下一篇
OpenTsdb官方文档—-日期和时间
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/tech/opensource/192115.html