- Aggregation
- Aggregation
- Interpolation
- Downsampling
- Available Aggregators
- Avg
- Count
- Dev
- Estimated Percentiles
- First & Last
- Max
- MimMin
- MimMax
- Min
- None
- Percentiles
- Sum
- ZimSum
- Listing Aggregators
原文地址:http://opentsdb.net/docs/build/html/user_guide/query/aggregators.html
OpenTSDB 旨在在查询执行期间有效地组合多个不同的时间序列。这样做的原因是,当用户查看他们的数据时,他们通常会从高层次开始询问诸如“我的数据中心的总吞吐量是多少?”之类的问题。或“按地区划分的当前功耗是多少?”。查看这些高级值后,一个或多个可能会突出显示,因此用户可以深入研究更细粒度的数据集,例如“我的 LAX 数据中心中主机的吞吐量是多少?”。我们想让回答这些高级问题变得容易,但仍然允许深入了解更多细节。
但是如何将多个单独的时间序列合并为一个数据序列?聚合函数提供了在数学上将不同的时间序列合并为一个的方法。过滤器用于按标签对结果进行分组,然后将聚合应用于每个组。聚合类似于 SQL 的 GROUP BY
子句,其中用户选择预定义的聚合函数将多条记录合并为单个结果。然而,在 TSD 中,一组记录是按时间戳和组聚合的。
每个聚合器都有两个组件:
- Function - 应用的数学计算,例如对所有值求和、计算平均值或选择最高值.
- Interpolation - 一种处理 缺失 值的方法,例如当时间序列 A 在 T1 有值但时间序列 B 没有值时.
本文档重点介绍如何按上下文在组中使用聚合器,即将多个时间序列合并为一个。 此外,聚合器可用于对时间序列进行下采样(即返回较低分辨率的结果集)。 有关更多信息,see Downsampling.。
Aggregation当将每组时间序列聚合或分组为一个时,每个时间序列中的时间戳是对齐的。 然后对于每个时间戳,所有时间序列中的值都聚合成一个新的数值。 也就是说,聚合器将在每个时间戳的所有时间序列中工作。 将原始数据视为矩阵或表格,如下例所示,该示例说明了总和聚合器在两个时间序列 A 和 B 上工作以生成新的时间序列Output
。
对于时间戳 t0
,A
和 B
的数据点相加,即 5 + 10 == 15
。接下来,将 ts1
的两个值相加得到 10
,依此类推。 在 SQL 中,这可能类似于 SELECT SUM(value) FROM ts_table GROUP BY timestamp
。
在上面的例子中,时间序列 A 和 B 在每个时间戳都有数据点,它们排列整齐。 但是,当两个系列不对齐时会发生什么? 同步所有数据源以在完全相同的时间写入可能很困难,有时也是不可取的。 例如,如果我们有 10,000 台服务器每 5 分钟发送 100 个系统指标,那将是一秒钟内 1000 万个数据点的爆发。 我们需要一个非常强大的网络和集群来容纳该流量。 更不用说系统会闲置 4 分 59 秒。 相反,随着时间的推移展开写入更有意义,这样我们平均每秒有 3,333 次写入,以减少我们的硬件和网络需求。
你如何求和或找到一个数字和不存在的东西的平均值? 一个人的第一直觉是返回有效的数据点并完成它。 但是,如果您如上所述处理数以千计的数据点未对齐的数据源,该怎么办? 例如,下图显示了一个写入未对齐的时间序列,导致出现锯齿状的线条,难以阅读:
Missing Data
“缺失”只是意味着时间序列在给定的时间戳上没有数据点。 通常,数据只是在请求的时间戳之前或之后进行时移,但如果源或 TSD 遇到错误并且未记录数据,则它实际上可能会丢失。 某些时间序列 DB 可能允许在时间戳处存储“NaN”以表示不可记录的值,但 OpenTSDB 尚不允许这样做。
或者,您可以简单地忽略给定时间戳的所有时间序列的数据点,其中任何序列都缺少数据。 但是,如果您有两个时间序列并且它们只是未对齐,即使存储中有良好的数据,您的查询也会返回一个空数据集,因此这不一定很有用。
另一种选择是定义一个标量值(例如 0 或 Long 的最大值)以在数据点丢失时使用。 OpenTSDB 2.0 及更高版本提供了一些聚合方法,这些方法用标量值替换缺失的数据点,实际上,上图是使用 zimsum 聚合器生成的,该聚合器将未对齐的值替换为零。 这种替代在处理不同的价值时间序列时很有用,例如在给定时间的销售总数,但在处理平均值或视觉验证图形看起来不错时不起作用。
OpenTSDB 提供的一个答案是使用定义明确的插值数值分析方法来猜测该时间点的值。 插值使用时间序列的现有数据点来计算请求的时间戳的最佳猜测值。 使用 OpenTSDB 的线性插值,我们可以平滑未对齐的图以获得:
对于数值示例,请看这两个时间序列,其中源每 20 秒发布一个值,数据仅偏移 10 秒:
Time Seriest0t0+10st0+20st0+30st0+40st0+50st0+60sAna5na15na5naB10na20na10na20当 OpenTSDB 计算聚合时,它从为任何系列找到的第一个数据点开始,在这种情况下,它将是 B 在 t0 的数据。我们在 t0 请求 A 的值,但那里没有任何数据。我们知道在 t0+10s 有 A 的数据,但由于在此之前我们没有任何值,我们无法猜测它会是什么。因此我们简单地返回 B 的值。
接下来,我们在时间 t0+10s 遇到 A 的值。我们从时间序列 B 中请求t0+10s
的值,但没有。但是 B 知道在t0+20s
有一个值,我们在 t0 有一个值,所以我们现在可以计算 t0+10s
的猜测。线性插值的公式为 y = y0 + (y1 - y0) * ((x - x0) / (x1 - x0))
其中,对于系列 B,y0 = 10
,y1 = 20
,x = t0+10s(或10)
,x0 = t0(或 0)
且x1 = t0+20s(或 20)
。因此我们有y = 10 + (20 - 10) * ((10 - 0) / (20 - 0)
这将减少到y = 10 + 10 * (10 / 20)
进一步减少到y = 10 + 10 * . 5
和 y = 10 + 5
。因此 B 将在t0+10s
给我们一个 15 的估计值。
对于作为查询的一部分返回的每个系列找到数据点的每个时间戳,迭代都会继续。 使用 sum 聚合器生成的系列将如下所示:
seriest0t0+10st0+20st0+30st0+40st0+50st0+60sAna5na15na5naB10na20na10na20Interpolated A1010Interpolated B151515naSummed RMore Examples: 对于图形倾向,我们有以下示例。 一个名为m
的虚构指标记录在 OpenTSDB 中。 “m 的总和”是顶部的蓝线,由类似 start=1h-ago&m=sum:m
的查询产生。 它由host=foo
的红线和host=bar
的绿线之和组成:
从上图中可以很直观地看出,如果将红线和绿线“叠加”起来,就会得到蓝线。 在任何离散时间点,蓝线的值等于当时红线的值和绿线的值之和。 没有插值,你会得到一些相当不直观的东西,更难理解,而且意义和用处也少得多:
请注意蓝线如何下降到 18:46:48 处的绿色数据点。 无需成为数学家或参加过高级数学课程即可了解需要插值才能将多个时间序列正确聚合在一起并获得有意义的结果。
目前 OpenTSDB 主要支持线性插值(有时缩写为“lerp”)以及一些聚合器,这些聚合器将简单地替换零或最大值或最小值。 欢迎那些想要添加其他插值方法的人使用补丁。
仅当发现多个时间序列与查询匹配时,才会在查询时执行插值。 许多指标收集系统在写入时进行插值,因此您的原始值永远不会被记录。 OpenTSDB 存储您的原始值并让您随时检索它。
这是来自邮件列表的另一个稍微复杂的示例,描述了如何按平均值聚合多个时间序列:
带有三角形的粗蓝线是具有多个时间序列的 avg 函数的聚合,根据查询start=1h-ago&m=avg:duration_seconds
。 正如我们所见,生成的时间序列在它聚合的所有基础时间序列的每个时间戳处都有一个数据点,并且该数据点是通过取该时间戳处所有时间序列的值的平均值来计算的。 对于平方紫色时间序列的孤独数据点也是如此,它暂时提高了平均值直到下一个数据点。
聚合函数根据输入数据点返回整数或双精度值。 如果两个源值在存储中都是整数,则结果计算将为整数。 这意味着计算产生的任何小数值都将被删除,不会发生舍入。 如果任一数据点是浮点值,则结果将是浮点数。 但是,如果启用了下采样或速率,则结果将始终为浮点数。
Downsampling如上所述,插值是处理缺失数据的一种方法。 但是一些用户讨厌线性插值是一种对数据撒谎的方式,因为它会生成幻影值。 相反,处理未对齐值的一种方法是通过下采样。 例如,如果源每分钟报告一个值,但它们在那一分钟的时间上有偏差,则为跨该源数据的每个查询提供 1 分钟的下采样。 这将导致在每个时间序列中将值捕捉到相同的时间戳,以便在很大程度上避免插值。 当下采样桶缺少一个值时,插值仍然会发生。
See Downsampling for details and examples on avoiding interpolation.
一般来说,对包含多个时间序列的每个查询进行下采样是一个很好的理想选择。
Available Aggregators下面是对 OpenTSDB 中可用的聚合函数的描述。 请注意,有些应仅用于分组,而其他应用于下采样。
AggregatorTSD VersionDescriptionInterpolationavg1.0Averages the data pointsLinear Interpolationcount2.2The number of raw data points in the setZero if missingdev1.0Calculates the standard deviationLinear Interpolationep50r32.2Calculates the estimated 50th percentile with the R-3 method *Linear Interpolationep50r72.2Calculates the estimated 50th percentile with the R-7 method *Linear Interpolationep75r32.2Calculates the estimated 75th percentile with the R-3 method *Linear Interpolationep75r72.2Calculates the estimated 75th percentile with the R-7 method *Linear Interpolationep90r32.2Calculates the estimated 90th percentile with the R-3 method *Linear Interpolationep90r72.2Calculates the estimated 90th percentile with the R-7 method *Linear Interpolationep95r32.2Calculates the estimated 95th percentile with the R-3 method *Linear Interpolationep95r72.2Calculates the estimated 95th percentile with the R-7 method *Linear Interpolationep99r32.2Calculates the estimated 99th percentile with the R-3 method *Linear Interpolationep99r72.2Calculates the estimated 99th percentile with the R-7 method *Linear Interpolationep999r32.2Calculates the estimated 999th percentile with the R-3 method *Linear Interpolationep999r72.2Calculates the estimated 999th percentile with the R-7 method *Linear Interpolationfirst2.3Returns the first data point in the set. Only useful for downsampling, not aggregation.Indeterminatelast2.3Returns the last data point in the set. Only useful for downsampling, not aggregation.Indeterminatemimmin2.0Selects the smallest data pointMaximum if missingmimmax2.0Selects the largest data pointMinimum if missingmin1.0Selects the smallest data pointLinear Interpolationmax1.0Selects the largest data pointLinear Interpolationnone2.3Skips group by aggregation of all time series.Zero if missingp502.2Calculates the 50th percentileLinear Interpolationp752.2Calculates the 75th percentileLinear Interpolationp902.2Calculates the 90th percentileLinear Interpolationp952.2Calculates the 95th percentileLinear Interpolationp992.2Calculates the 99th percentileLinear Interpolationp9992.2Calculates the 999th percentileLinear Interpolationsum1.0Adds the data points togetherLinear Interpolationzimsum2.0Adds the data points togetherZero if missing有关百分位数计算,请参阅维基百科文章。 对于高基数计算,使用估计的百分位数可能会更高效。
Avg计算下采样桶或多个时间序列中所有值的平均值。 此函数将跨时间序列执行线性插值。 这对于查看仪表指标很有用。
即使计算通常会产生一个浮点值,如果数据点被记录为整数,则返回的整数将失去一些精度。
Count返回存储在系列或范围中的数据点数。 当用于聚合多个系列时,零将被替换。 当与下采样一起使用时,它将反映每个下采样桶中的数据点数。 在 group-by 聚合中使用时,反映给定时间具有值的时间序列的数量。
Dev计算存储桶或时间序列的标准偏差。 此函数将跨时间序列执行线性插值。 这对于查看仪表指标很有用。
即使计算通常会产生一个浮点值,如果数据点被记录为整数,则返回的整数将失去一些精度。
Estimated Percentiles使用选择的算法计算各种百分位数。 这些对于具有许多数据点的系列很有用,因为某些数据可能会被排除在计算之外。 当用于聚合多个系列时,该函数将执行线性插值。 有关详细信息,请参阅维基百科。 实现是通过 Apache Math 库实现的。
First & Last这些聚合器将返回下采样间隔中的第一个或最后一个数据点。 例如。 如果下采样桶由系列 2、6、1、7
组成,则first
聚合器将返回 1,last
将返回 7。请注意,此聚合器仅对下采样器有用。
Warning
当用作 group-by 聚合器时,结果是不确定的,因为从存储检索并保存在内存中的时间序列的顺序从 TSD 到 TSD 或执行到执行不一致。
Maxmin
的倒数,它返回所有时间序列或时间跨度内的最大数据点。 此函数将跨时间序列执行线性插值。 这对于查看仪表指标的上限很有用。
“如果缺少最小值则为最大值”函数仅返回所有时间序列或时间跨度内的最小数据点。 此函数将不执行插值,相反,如果该值缺失,它将返回指定数据类型的最大值。 这将返回整数点的 Long.MaxValue 或浮点值的 Double.MaxValue。 有关详细信息,请参阅 原始数据类型。 这对于查看仪表指标的下限很有用。
MimMax“如果缺少最大值则为最小值”函数仅返回所有时间序列或时间跨度内的最大数据点。 此函数将不执行插值,相反,如果该值缺失,它将返回指定数据类型的最小值。 这将返回整数点的 Long.MinValue 或浮点值的 Double.MinValue。 有关详细信息,请参阅 原始数据类型。 这对于查看仪表指标的上限很有用。
Min仅返回所有时间序列或时间跨度内的最小数据点。 此函数将跨时间序列执行线性插值。 这对于查看仪表指标的下限很有用。
None按聚合跳过组。 这个聚合器对于从存储中获取 raw 数据很有用,因为它会为每个匹配过滤器的时间序列返回一个结果集。 请注意,如果与下采样器一起使用,查询将引发异常。
Percentiles计算各种百分位数。 当用于聚合多个系列时,该函数将执行线性插值。 实现是通过 Apache Math 库。
Sum如果下采样,则计算来自所有时间序列或时间跨度内的所有数据点的总和。 这是 GUI 的默认聚合函数,因为它在组合多个时间序列(如仪表或计数器)时通常最有用。 当数据点无法对齐时,它会执行线性插值。 如果您有一系列不同的要求和的值并且不需要插值,请查看 zimsum
计算所有时间序列或时间跨度内指定时间戳的所有数据点的总和。 该函数不执行插值,而是用0
代替缺失的数据点。 这在处理离散值时很有用。
通过在 TSD 上运行的 HTTP API,用户可以查询 /api/aggregators
以获取在 TSD 上实现的聚合器列表。