写在前面
这是有关于OpenTSDB支持的有关配置,和预先设置聚合,不过这方面的应用还是太少,有待补充。
原地址:http://opentsdb.net/docs/build/html/user_guide/rollups.html
虽然TSDB旨在存储原始的全分辨率数据,只要有空间,对宽时间范围或许多标签组合的查询都会非常痛苦。此类查询可能需要很长时间才能完成,或者在最坏的情况下,会因内存不足而终止TSD。从OpenTSDB 2.4开始,一组新的API允许存储和查询较低分辨率的数据,以便更快地回答这些查询。此页面将概述汇总和预聚合的内容,它们在TSDB中的工作方式以及如何最好地使用它们。请参阅API的部分以了解具体的实现细节。
注意
OpenTSDB本身不会计算和存储汇总或预聚合数据。有多种方法可以计算结果,但根据比例和精度要求,它们都有其优点和缺点。请参阅生成汇总和预聚合部分,了解如何创建此数据。
示例数据
为了帮助描述较低分辨率的数据,让我们看一些完整的分辨率(也称为原始数据)示例数据。第一个表定义了带有快捷标识符的时间序列
Series ID | Metric | Tag 1 | Tag 2 | Tag 3 |
---|---|---|---|---|
ts1 | system.if.bytes.out | host=web01 | colo=lga | interface=eth0 |
ts2 | system.if.bytes.out | host=web02 | colo=lga | interface=eth0 |
ts3 | system.if.bytes.out | host=web03 | colo=sjc | interface=eth0 |
ts4 | system.if.bytes.out | host=web04 | colo=sjc | interface=eth0 |
请注意,它们都具有相同metric
和interface
标记,但不同host
和colo
标签。
接下来是以15分钟为间隔写入的一些数据:
Series ID | 12:00 | 12:15 | 12:30 | 12:45 | 13:00 | 13:15 | 13:30 | 13:45 |
---|---|---|---|---|---|---|---|---|
ts1 | 1 | 4 | -3 | 8 | 2 | -4 | 5 | 2 |
ts2 | 7 | 2 | 8 | -9 | 4 | 1 | 1 | |
ts3 | 9 | 3 | -2 | -1 | 6 | 3 | 8 | 2 |
ts4 | 2 | 5 | 2 | 8 | 5 | -4 | 7 |
汇总
在OpenTSDB中,“汇总”被定义为随时间聚合的单个时间序列。它也可以称为“基于时间的聚合”。汇总有助于解决查看广泛时间跨度的问题。例如,如果您每60秒写一个数据点并查询一年的数据,则时间序列将返回超过525k个别数据点。绘制许多点可能会非常混乱。相反,您可能希望查看较低分辨率的数据,例如1小时数据,其中您只有大约8k的值要绘制。然后,您可以识别异常并向下钻取更精细的分辨率数据。
如果您已经使用OpenTSDB来查询数据,那么您可能熟悉将每个时间序列聚合为较小或较低分辨率值的下采样器。汇总实质上是存储在系统中的下采样器的结果,并且随意调用。每个汇总(或下采样器)都需要两条信息:
-
间隔 - “滚动”到新值的时间。例如,
1h
一小时的数据或1d
一天的数据。 -
聚合函数 - 对基础值执行了哪些算术以获得新值。例如
sum
,添加所有值或max
存储最大值。
警告
存储汇总时,最好避免使用平均值,中值或偏差等函数。在执行进一步的下采样或分组聚合时,这些值变得毫无意义。相反,总是存储总和和计数要好得多,至少可以在查询时计算平均值。有关更多信息,请参阅以下部分。
汇总数据点的时间戳应捕捉到汇总间隔的顶部。例如,如果汇总间隔是,1h
则它包含1小时的数据,并且应该捕捉到小时的顶部。(因为所有时间戳都是以Unix Epoch格式编写的,定义为UTC时区,这将是一小时UTC时间的开始)。
汇总示例
鉴于上面的系列,让我们存储sum
和count
间隔1h
。
Series ID | 12:00 | 13:00 |
---|---|---|
ts1 SUM | 10 | 5 |
ts1 COUNT | 4 | 4 |
ts2 SUM | 8 | 6 |
ts2 COUNT | 4 | 3 |
ts3 SUM | 9 | 19 |
ts3 COUNT | 4 | 4 |
ts4 SUM | 9 | 16 |
ts4 COUNT | 3 | 4 |
请注意,无论何时出现“bucket”区间中的第一个数据点,所有时间戳都会与小时的顶部对齐。另请注意,如果间隔中不存在数据点,则计数较低。
在一般情况下,你的目标应该是计算和存储MAX
,MIN
,SUM
并且COUNT
每个时间序列存储汇总时。
平均汇总示例
启用汇总并使用avg
OpenTSDB中的函数请求下采样器时,TSD将扫描存储器SUM
和COUNT
值。然后在迭代数据时,它将准确计算平均值。
count和sum值的时间戳必须匹配。但是,如果缺少总和的预期计数值,则总和将从结果中踢出。从上面的示例中取出以下示例,我们现在错过了一个计数数据点ts2
。
Series ID | 12:00 | 13:00 |
---|---|---|
ts1 SUM | 10 | 5 |
ts1 COUNT | 4 | 4 |
ts2 SUM | 8 | 6 |
ts2 COUNT | 4 |
所得到的avg
一个2h
采样查询应该是这样的:
Series ID | 12:00 |
---|---|
ts1 AVG | 1.875 |
ts2 AVG | 2 |