【翻译】OpenTSDB 2.3 文档-降采样(Downsampling)

遇到了点采样的问题,发现采样的文档很少,示例也很少,翻译下,顺便理解下配置。

Downsampling(降采样)

Downsampling是降低数据采样率或分辨率的过程。例如,假设温度传感器每秒向OpenTSDB系统发送数据。如果用户在一小时的时间跨度内查询数据,他们将收到3,600个数据点,这些数据点可以很容易地绘制出来。但是现在,如果用户要求整整一周的数据,他们将收到604,800个数据点,这样图形可能变得非常混乱。使用Downsampling(降采样),把单位时间范围内的多个数据点经过数学函数运算,聚合成一个时间戳对齐的值。这样可以减少从604,800到168的值的数量。

Downsampling(降采样)至少需要两个参数:

时间间隔Interval - 也就是一个时间范围。例如,我们可以聚合1分钟或1小时甚至一整天内的多个值。时间间隔Interval的书写格式为指定,如1h代表1小时,30分钟写成30m。从2.3开始,all也作为一个时间间隔出现,可用于将时间范围内的所有结果采样到一个值。例如,如果downsample设置为0all-sum将从查询开始到结束的所有值相加sum。请注意,仍然需要有个数值,但它可以是零或任何其他值。

聚合函数Aggregation Function - 一个合并时间间隔中的所有值的数学函数。用的是聚合函数文档中的聚合函数,参见链接。

例如,如果有以下时间序列A和B。数据覆盖70秒的时间范围,每10秒钟一次。假设我们想要缩短采样到30秒,因为用户正在查看更长时间跨度的图表。另外,我们使用sum聚合器将这两个系列分组为一个。我们可以指定一个降采样器30s-sum,它将创建30秒的存储bucket,并对每个存储bucket中的所有数据点求和。这将为每个系列提供三个数据点:

在这里插入图片描述

对于每个时间序列,生成一个合成的时间序列,其时间戳在区间边界上标准化(每30秒),这样得到一个值t0,t0+30s和t0+60s。每个间隔或存储bucket将包含存储bucket时间戳(开始)的数据点,并且不包括存储bucket的结束时间戳。在这种情况下,第一个bucket将从延伸t0到t0+29.9999s。使用提供的聚合器,所有值都合并为一个新值。最后,使用sum对查询进行分组,以便合成时间序列。

**注意:**对于早期版本的OpenTSDB,采样后的数据点的时间戳是时间跨度中每个数据点的时间戳的平均值。从2.1及更高版本开始,采样后的数据点的时间戳计算方式发生变化,是基于时间间隔、当前时间和当前时间与时间间隔的模计算出的一个值,下面会说。

Java代码表示为timestamp - (timestamp % interval_ms)。例如,给定时间戳为1388550980000或者1/1/2014 04:36:20 UTC ,时间隔为1小时或者3600000毫秒,生成的时间戳将四舍五入为1388548800000。所有4到5 点之间的所有数据点将在4 点的bucket中。如果时间间隔为1小时,查询一天的数据的采样,将收到24个数据点(假设所有24小时都有数据)。

使用0all-时间间隔时时,结果的时间戳将是查询的开始时间。

这种时间戳规范化对于常见的查询非常有效,例如将一天的数据按1分钟或1小时采样。但是,如果在奇怪的间隔(例如36分钟)下采样,则由于模数计算的性质,时间戳可能看起来有点奇怪。给定36分钟的间隔和上面的示例,间隔将是2160000毫秒,结果时间戳1388549520或04:12:00 UTC。04:12到04:48之间的所有数据点会在同一个bucket中。

日历边界Calendar Boundaries
从OpenTSDB 2.3开始,用户可以指定基于日历的下采样而不是快速模数方法(上面是快速模数法)。这对于报告目的更有用,例如查看与人类相关的时间值,例如月报,周宝或日报。此外,下采样可以考虑时区,并结合夏令时时移和区域偏移。

要使用日历边界Calendar Boundaries,请查看使用方式及版本(API的话查看API文档)的文档。例如,V2 URI方式具有要有特定时区参数,参数示例为&timezone=Asia/Kabul,基于日历的downsampling采样通过将c加在时间间隔来启用,如&m=sum:1dc-sum:my.metric。对于JSON查询,在JSON的顶层使用单独的字段timezone以及useCalendar布尔标志来启用日历边界。如果未提供时区,则日历使用UTC时间。

使用日历降采样时,第一个间隔将从查询的那年的一月一日0点开始。从此开始,计算间隔bucket直到查询结束。每个存储bucket都标有存储桶开头的时间戳(包括),并包括直到下一个存储bucket开始的所有值(不包括)。

补齐政策
降采样downsampling通常用于对齐时间戳,以避免在执行分组时进行插值。由于OpenTSDB不对时间对齐施加约束,本来认为应该有的值,可能也没有,因此必须在查询时需要作此类约束。使用downsampling降采样执行分组聚合时,如果所有序列都缺少预期间隔的值,则不会发出任何内容。例如,如果一个系列的写入数据从每分钟t0到t0+6m,但由于某种原因源未能在t0+3m写入数据,只有5个值将被序列化时,然而用户期望的是6个点。2.2及更高版本的补齐策略中,可以选择t0+3m的值,以便用户(或应用程序)看到特定时间戳缺少值,而不必用户去确定缺少哪个时间戳。只要下采样bucket为空,填充策略就会发出预定义的值。

可用的政策包括:

  • None(none) - 默认行为,在序列化期间不输出缺失值,在聚合序列时执行线性插值(或以其他方式指定插值)的。
  • NaN(nan) - 当序列中缺少所有值时,在序列化输出中输出NaN 。缺少值时跳过聚合中的NaN,而不是将整个分组计算转换为NaN(参见下表)。
  • Null(null) - 与NaN的行为相同,只是在序列化期间它会发出一个null,而不是一个NaN。
  • 零(zero) - 缺少时间戳时替换为零。零值将合并到汇总结果中。

要使用填充策略,将策略名称(括号中的术语)附加到由连字符分隔的降采样聚合函数的末尾。例如1h-sum-nan或1m-avg-zero。

在此示例中,我们每隔10秒报告一次数据,并且我们希望通过每10秒进行一次下采样并使用NaN通过10s-sum-nan以下方式填充缺失值来强制执行10秒的查询时策略:
在这里插入图片描述

在没有填充策略的情况下输出,则在t0+20s和t0+40s将不会有任何值或时间戳。另外,B的t0+30s和t0+50s将通过线性插值的方式来填充,最终与A的值相加。

猜你喜欢

转载自blog.csdn.net/qq_36101933/article/details/83754618
2.3
今日推荐