OpenTSDB 查询介绍

前言

本章节作为理论基础,下一章节介绍数据读取具体操作。
翻译自:http://opentsdb.net/docs/build/html/user_guide/query/index.html
OpenTSDB提供了多种方法来提取数据,如CLI工具、HTTP API和GnuPlot用户图形界面(其实该用户界面就是HTTP接口的实现)。还有例如Grafana和Bosun等开源工具也能读取TSDB数据。此外学习OpenTSDB查询并不容易,因此请查阅本文档以获取更详细的信息。此页面展示HTTP API查询方式。

查询组件

后来的版本增加了对功能和表达式的支持。 一般来说,每个查询都有以下组件:
这里写图片描述

Times

绝对时间支持年-月-日等(一般人们看了都可理解的形式)或时间戳这两种方式。相对时间用于刷新仪表板。目前,所有查询都能覆盖简单的时间跨度。在将来,我们预计提供一个偏移量查询参数,允许在不同时间段内进行聚合或图表测量,例如比较上周至1年前。 有关可允许的细节,请参阅 Dates and Times
虽然OpenTSDB可以以毫秒分辨率存储数据,但为保持工具的向后兼容性,大多数查询将以秒为分辨率返回数据。 除非在使用的查询中指定了一个下采样算法,这样数据将会根据查询中的聚合函数被自动下采样成为1秒分辨率。 如果相同的时间点存储了多个数据值,这些数据值将被聚合并且作为一个正常的查询结果返回。

Filters

每个时间序列都包含一个metric以及一个或多个键值对tag。在OpenTSBD中过滤器应用于tag-value(目前OpenTSDB还没有针对metric和tag-key的过滤器)。由于查询中的过滤器是可选的,因此如果仅查询metric名,则将返回所有包含这个metric的聚合结果。过滤器类似于SQL中的where条件语句。例如,存有这样的数据集:

sys.cpu.user host=webserver01,cpu=0  1356998400  1
sys.cpu.user host=webserver01,cpu=1  1356998400  4
sys.cpu.user host=webserver02,cpu=0  1356998400  2
sys.cpu.user host=webserver02,cpu=1  1356998400  1

用start time、aggregator和metric这三个组件组成一个最简单的查询,例如:start=1356998400&m=sum:sys.cpu.user。那么在1356998400这个时间戳下,得到结果的结果为8。
如果我们要得到特定的序列或序列集合,可以过滤器实现。例如我们可以设置host标签过滤项,如下:start=1356998400&m=sum:sys.cpu.user{host=webserver01},得到的结果为5。此外还可以进一步深入,查询条件可以是:start=1356998400&m=sum:sys.cpu.user{host=webserver01,cpu=0},这样得到的结果就是1。
可查阅Query Filters文档,以获得更加详细的信息。

Aggregation

OpenTSDB的一个强大功能是能够将多个时间序列的即时聚合功能执行到一组数据点。原始数据在存储中始终可用,但我们可以以更有意义的方式来提取数据。 聚合函数是将单个时间戳的两个或多个数据点的值合并成单个数据值的方法。
参阅Aggregation部分

Downsampling

OpenTSDB可以获取大量的数据,甚至在给定的时间序列中每秒获取一个数据点。这样查询将会返回大量的数据点。这样包含大量数据点的查询将会消耗完带宽资源。高频率的数据可以轻易地压垮JavaScript图形库,因此选择使用GnuPlot画图。由GUI创建的图形可能难以阅读,如下图所示,用粗线显示结果。
这里写图片描述
可以在查询时使用向下采样以减少返回的数据点的数量,以便从图中提取更好的信息或通过连接传递较少的数据。下采样需要聚合函数和时间间隔。聚合函数使用适当的数学函数计算所有跨指定间隔的数据点,并生成新的数据点。例如,如果使用sum进行聚合,则在指定间隔内的所有数据点将被一起求和,用求和的值替代原来间隔内所有的数据值。如果选用avg函数,则在指定间隔内的所有数据点将被一起求平均,用平均值替代原来间隔内所有的数据值。
使用下采样,我们可以清理出上一个图形,以便获得更有用的东西:
这里写图片描述
更多信息参考Downsampling.

Rate

许多数据源返回不断递增的数值,例如网站访问计数器,当你打开网站时,这计数器为0。5分钟后这数值变成了1024,再过了5分钟后这数字变成了2048。一个计数器的图形可能是一个有点向右倾斜的直线,但这条直线并不一定有用,OpenTSDB提供了一个速率转换函数,可以计算值随时间的变化率。在事件发生时,可将计数器的图形装换为带有尖峰的线,以来向用户展示,这样可以更有用处。
速率是值的一阶导数,定义:(v2 - v1) / (t2 - t1)。因此可得到每秒变化的速率。目前,毫秒值之间的变化率默认为每秒计算。
OpenTSDB 2.0支持特殊的单调递增计数器数据处理,包括设置“滚动”值并抑制异常波动的能力。当在查询中指定counterMax值时,如果数据点接近该值且后点小于前一个值,则最大值将用于计算给定两点的准确率。 例如,如果我们在2字节上记录一个整数计数器,最大值将为65,535。 如果t0处的值为64000,t1的值为1000,则每秒产生的速率将计算为-63000。 然而,我们知道这个计数器可能会翻转,所以我们可以设置最大值为65535,现在计算将为65535 - t0 + t1给我们2535。
跟踪计数器中的数据的系统在重新启动时通常会恢复为0。 当这种情况发生时,我们可以在使用最大计数器功能时获得虚假的结果。 例如,如果计数器在t0达到2000,有人重新启动服务器,那么在t1的下一个值可能是500。 如果我们将最大值设置为65535,结果将为65535 - 2000 + 500,给我们64035.如果正常速率是每秒几点,这个特定的峰值,30秒之间的点,将创造一个2,134.5的速率峰值! 为了避免这种情况,我们可以设置resetValue,当速率超过此值时,返回数据点为0,以避免任一方向上的尖峰。 对于上面的示例,如果我们知道我们的利率几乎不会超过100,我们可以配置一个resetValue为100,当上面的数据点被计算时,它将返回0而不是2,134.5。 默认值为0表示复位值将被忽略,不会抑制任何速率。

Order of Operations

了解操作顺序很重要。 返回查询结果时,以下是进行处理的顺序:

  • Filtering
  • Grouping
  • Downsampling
  • Interpolation
  • Aggregation
  • Rate Conversion
  • Functions
  • Expressions
展开阅读全文

没有更多推荐了,返回首页