OpenTSDB 向下采样说明
Posted 顧棟
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenTSDB 向下采样说明相关的知识,希望对你有一定的参考价值。
Downsampling
原文地址:http://opentsdb.net/docs/build/html/user_guide/query/downsampling.html
向下采样(或在信号处理中,抽取)是降低数据采样率或分辨率的过程。 例如,假设温度传感器每秒向 OpenTSDB 系统发送数据。 如果用户在一个小时的时间内查询数据,他们将收到 3,600 个数据点,这些数据可以很容易地绘制成图表。 然而,现在如果用户要求提供整整一周的数据,他们将收到 604,800 个数据点,并且图表可能会突然变得非常混乱。 使用下采样器,单个时间序列的时间范围内的多个数据点与数学函数一起聚合为一个对齐时间戳的单个值。 通过这种方式,我们可以将值的数量从 604,800 减少到 168。
下采样器至少需要两个组件:
- Interval - 聚合值的时间范围(或 bucket)。 例如,我们可以聚合 1 分钟或 1 小时甚至一整天的多个值。 间隔以
<Size><Units>
格式指定,例如1h
表示 1 小时或30m
表示 30 分钟。 从 2.3 开始,all
间隔现在可用于将时间范围内的所有结果下采样到一个值。 例如。0all-sum
将对从查询开始到结束的所有值求和。 请注意,仍然需要一个数值,但它可以是零或任何其他值。 - Aggregation Function - 确定如何合并区间中的值的数学函数。 Aggregation 文档中的聚合函数用于该函数。
例如,采用以下时间序列 A 和 B。数据点涵盖 70 秒的时间跨度,每 10 秒一个值。 假设我们想将采样时间缩减到 30 秒,因为用户正在查看更广泛的时间跨度的图表。 此外,我们使用总和聚合器将这两个系列合二为一。 我们可以指定一个 30s-sum 的下采样器,它将创建 30 秒的存储桶并对每个存储桶中的所有数据点求和。 这将为我们提供每个系列的三个数据点:
Time Series | t0 | t0+10s | t0+20s | t0+30s | t0+40s | t0+50s | t0+60s |
---|---|---|---|---|---|---|---|
A | 5 | 5 | 10 | 15 | 20 | 5 | 1 |
A sum Downsampled | 5 + 5 + 10 = 20 | 15 + 20 + 5 = 40 | 1 = 1 | ||||
B | 10 | 5 | 20 | 15 | 10 | 0 | 5 |
B sum Downsampled | 10 + 5 + 20 = 35 | 15 + 10 + 0 = 25 | 5 = 5 | ||||
sum Aggregated Result | 55 | 65 | 6 |
如您所见,对于每个时间序列,我们生成一个合成序列,其时间戳在间隔边界(每 30 秒)上标准化,以便我们在 t0、t0+30s 和 t0+60s 处有一个值。 每个间隔或存储桶将包含包含存储桶时间戳(开始)和不包括后续存储桶时间戳(结束)的数据点。 在这种情况下,第一个桶将从 t0 扩展到 t0+29.9999s。 使用提供的聚合器,所有值都合并为一个新值。 例如。 对于系列 A,我们将 t0、t0+10s 和 t0+20s 的值相加,得出 t0 处的新值 20。 最后,使用 sum 对查询进行分组,以便我们添加两个合成时间序列。 这时候OpenTSDB总是在下采样后进行group-by聚合。
对于 OpenTSDB 的早期版本,新数据点的实际时间戳将是时间跨度中每个数据点的时间戳的平均值。 从 2.1 及更高版本开始,每个点的时间戳都根据当前时间和下采样间隔的模数与时间段的开始对齐。
下采样时间戳基于原始数据点时间戳的剩余部分除以以毫秒为单位的下采样间隔(即模数)进行归一化。 在 Java 中,代码是timestamp - (timestamp % interval_ms)
。 例如,给定时间戳 1388550980000
,或 1/1/2014 04:36:20 UTC
和等于 3600000 毫秒的每小时间隔,生成的时间戳将四舍五入为 1388548800000
。4 到 5 UTC 之间的所有数据点 在凌晨 4 点的桶中。 如果您在 1 小时内查询一天的数据降采样,您将收到 24 个数据点(假设所有 24 小时都有数据)。
当使用 0all-
interval 时,结果的时间戳将是查询的开始时间。
规范化对于常见查询非常有效,例如将一天的数据降采样到 1 分钟或 1 小时。 但是,如果您尝试以奇数间隔(例如 36 分钟)进行下采样,则由于模数计算的性质,时间戳可能看起来有点奇怪。 给定 36 分钟的间隔和我们上面的示例,间隔将为 2160000
毫秒,结果时间戳为 1388549520
或 04:12:00 UTC
。 04:12
和 04:48
之间的所有数据点都将集中在一个桶中。
Calendar Boundaries
从 OpenTSDB 2.3 开始,用户可以指定基于日历的下采样而不是快速模数方法。这对于报告目的更有用,例如查看与人类时间相关的值,例如月、周或天。此外,下采样可以考虑时区并结合夏令时转换和区域偏移。
要使用日历边界,请查看您从中进行查询的端点的文档。例如,V2 URI 端点具有要使用的特定时区参数,例如 &timezone=Asia/Kabul
,并且通过将 c 附加到间隔时间单位(如 &m=sum:1dc-sum:my.metric
)来启用基于日历的下采样。对于 JSON 查询,在顶层使用单独的时区字段以及useCalendar
布尔标志。如果未提供时区,则日历使用 UTC 时间。
使用日历下采样,第一个时间间隔会捕捉到指定时区中查询年份的 1 月 1 日 00:00:00。从那里开始计算间隔桶,直到查询结束。每个桶都标有桶开始的时间戳,包括在内,并包括直到下一个桶开始的所有值,不包括在内。
Fill Policies
下采样通常用于对齐时间戳以避免在执行分组时进行插值。 由于 OpenTSDB 不会对时间对齐或值应该存在的时间施加约束,因此必须在查询时指定此类约束。 使用下采样执行分组聚合时,如果所有系列都缺少预期间隔的值,则不会发出任何内容。 例如,如果一个系列每分钟从 t0
到 t0+6m
写入数据,但由于某种原因源无法在t0+3m
写入数据,那么当用户可能期望 6 时,只会序列化 5 个值。 使用填充策略 2.2 及更高版本,您现在可以选择为t0+3m
发出什么值,以便用户(或应用程序)将看到特定时间戳缺少某个值,而不必弄清楚缺少哪个时间戳。 只要下采样桶为空,填充策略就会简单地发出一个预定义的值。
可用的策略包括:
- None (
none
) - 在序列化期间不发出缺失值并在聚合系列时执行线性插值(或以其他方式指定的插值)的默认行为。 - NaN (
nan
) -当序列中的所有值都丢失时,在序列化输出中发出NaN
。 当值缺失时跳过聚合中的系列,而不是将整个 group-by 计算转换为 NaN。 - Null (
null
) - 与 NaN 相同的行为,除了在序列化期间它发出null
而不是NaN
. - Zero (
zero
) - 缺少时间戳时替换零。 零值将包含在汇总结果中.
要使用填充策略,请将策略名称(括号中的术语)附加到由连字符分隔的下采样聚合函数的末尾。 例如。 1h-sum-nan
或 1m-avg-zero
。
在这个例子中,我们每 10 秒报告一次数据,我们希望通过每 10 秒下采样并通过 10s-sum-nan
用 NaN 填充缺失值来强制执行 10 秒报告的查询时间策略:
Time Series | t0 | t0+10s | t0+20s | t0+30s | t0+40s | t0+50s | t0+60s |
---|---|---|---|---|---|---|---|
A | 15 | 5 | |||||
B | 10 | 20 | 20 | ||||
A sum Downsampled | NaN | NaN | NaN | 15 | NaN | 5 | NaN |
B sum Downsampled | 10 | NaN | 20 | NaN | NaN | NaN | 20 |
sum Aggregated Result | 10 | NaN | 20 | 15 | NaN | 5 | 20 |
If we requested the output without a fill policy, no value or timestamp at t0+20s
or t0+40s
would be emitted. Additionally, values at t0+30s
and t0+50s
for series B
would be linearly interpolated to fill in values to be summed with series A
.
如果我们在没有填充策略的情况下请求输出,则不会发出 t0+20s
或 t0+40s
处的值或时间戳。 此外,B
系列的t0+30s
和t0+50s
处的值将被线性插值以填充与A
系列相加的值。
以上是关于OpenTSDB 向下采样说明的主要内容,如果未能解决你的问题,请参考以下文章