翻译自http://opentsdb.net/docs/build/html/user_guide/query/index.html
查询或读取数据
OpenTSDB提供了许多提取,操作和分析数据的方法。可以通过CLI工具,HTTP API查询数据,并将其视为GnuPlot图。开源工具,如Grafana和博斯还可以访问TSDB数据。使用OpenTSDB基于标签的系统进行查询可能有点棘手,因此请仔细阅读本文档并查看以下页面以获取更深入的信息。此页面上的示例查询遵循HTTP API格式。
此页面提供典型查询组件的快速概述。有关每个组件的详细信息,请参阅上面的文本或目录中提到的页面。
查询组件
OpenTSDB提供了许多工具和端点,允许随时间演变的各种查询规范。原始语法允许简单的过滤,聚合和下采样。更高版本添加了对函数和表达式的支持。通常,每个查询都包含以下组件:
参数 | 日期类型 | 需要 | 描述 | 例 |
---|---|---|---|---|
开始时间 | 字符串或整数 | 需要 | 查询的开始时间。这可能是绝对时间或相对时间。有关详细信息,请参阅日期和时间 | 24小时,前 |
时间结束 | 字符串或整数 | 可选的 | 查询的结束时间。如果未提供结束时间,则将使用TSD上的当前时间。有关详细信息,请参阅日期和时间。 | H-前 |
公 | 串 | 需要 | 系统中度量标准的全名。必须是完整的名称,并且始终区分大小写 | sys.cpu.user |
聚合功能 | 串 | 需要 | 用于组合多个时间序列的数学函数(即如何合并组中的时间序列) | 和 |
过滤 | 串 | 可选的 | 过滤标记值以减少查询或组中拾取的时间序列数,并在各种标记上进行聚合。 | 主机= *,DC =松懈 |
欠采样器 | 串 | 可选的 | 可选的间隔和函数,用于减少跨时间返回的数据点数 | H-平均 |
率 | 串 | 可选的 | 一个可选标志,用于计算结果的每秒变化率 | 率 |
功能 | 串 | 可选的 | 数据处理功能,如附加过滤,时移等。 | highestMax(...) |
表达式 | 串 | 可选的 | 跨时间序列的数据操作功能,例如将一个系列分成另一个系列。 | (m2 /(m1 + m2))* 100 |
时
绝对时间戳以人类可读格式或Unix样式整数支持。相对时间可用于刷新仪表板。目前,所有查询都能够覆盖单个时间跨度。在未来,我们希望提供一个偏移查询参数,该参数允许在不同时间段内对度量进行聚合或绘图,例如比较上周到1年前。有关允许的详细信息,请参阅日期和时间。
虽然OpenTSDB可以以毫秒分辨率存储数据,但默认情况下,查询将返回具有第二分辨率的数据,以提供现有工具的向后兼容性。如果每秒存储多个数据点,请确保您发出的任何查询都包含1s- <func>下采样器以读取正确的数据。否则将发出不确定的值。
要以毫秒分辨率提取数据,请使用/api/query
端点并指定msResolution
(ms
也可以,但不建议)JSON参数或查询字符串标志,它将绕过采样(除非指定)并以Unix纪元毫秒分辨率返回所有时间戳。此外,scan
命令行实用程序将返回存储中写入的时间戳。
过滤器
每个时间序列都包含一个度量标准和一个或多个标记名称/值对。在OpenTSDB中,过滤器应用于标记值(此时TSDB不提供对度量标记或标记键的过滤)。由于过滤器在查询中是可选的,因此,如果仅请求度量标准名称,则将在聚合结果中返回具有任何数量或值的标记的每个度量标准。过滤器类似于WHERE
SQL中的子句后面的谓词。例如,如果我们有一个存储的数据集:
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。
阅读查询过滤器文档以获取详细信息
聚合
OpenTSDB的一个强大功能是能够将多个时间序列的动态聚合执行到一组数据点中。原始数据始终可用于存储,但我们可以以有意义的方式快速提取数据。聚合函数是将单个时间戳的两个或多个数据点合并为单个值的方法。
注意
OpenTSDB默认聚合数据,并且每个查询都需要一个聚合运算符。每个聚合器必须处理多个系列的不同时间戳的丢失或数据点。这是通过插值执行的,如果用户不知道TSDB正在做什么,可能会在查询时导致意外结果。
有关详细信息,请参阅聚合。
下采样
对于给定的时间序列,OpenTSDB可以每秒摄取大量数据,甚至是数据点。因此,查询可能返回大量数据点。使用API中的大量点访问查询结果可能会占用带宽。高频率的数据很容易淹没Javascript图形库,因此可以选择使用GnuPlot。由GUI创建的图形可能难以阅读,从而产生粗线,如下图:
可以在查询时使用下采样来减少返回的数据点数,以便您可以从图中提取更好的信息或通过连接传递更少的数据。下采样需要聚合函数和时间间隔。聚合函数用于使用适当的数学函数计算指定区间内所有数据点的新数据点。例如,如果使用聚合sum
,则间隔内的所有数据点将一起求和为单个值。如果avg
选择,则返回间隔内所有数据点的平均值。
使用下采样我们可以清理上一个图形以获得更有用的东西:
有关详细信息,请参阅下采样。
率
许多数据源将值返回为不断递增的计数器。一个例子是网站点击计数器。当您启动Web服务器时,它的命中计数器可能为0.五分钟后,该值可能为1,024。再过五分钟,它可能是2,048。计数器的图形将是一条向右倾斜的直线,并不总是非常有用。OpenTSDB提供速率转换功能,可以计算值随时间的变化率。这会将计数器转换为带有峰值的行,以显示活动何时发生并且可以更有用。
费率是价值的第一个衍生物。它定义为时间以秒为单位。因此,您将获得每秒的变化率。目前,毫秒值之间的变化率默认为每秒计算。(v2 - v1) / (t2 - t1)
OpenTSDB 2.0支持特殊的单调递增计数器数据处理,包括设置“翻转”值和抑制异常波动的能力。当counterMax
在查询中指定的值,如果数据点接近该值和点之后是小于前,最大值将被用来计算给定的两个点的准确率。例如,如果我们在2个字节上记录整数计数器,则最大值为65,535。如果在值t0
是64000
和值在t1
IS 1000
,每秒所得到的速率将被作为计算-63000
。但是我们知道计数器可能已经翻过来,所以我们可以设置最大值65535
,现在计算将给我们。65535 - t0+ t1
2535
跟踪计数器中的数据的系统通常在重新启动时恢复为0。当发生这种情况时,我们可以在使用最大计数器功能时获得虚假结果。例如,如果计数器达到2000
在t0
和某人重新启动服务器时,下一个值可能会500
在t1
。如果我们设置我们的最大值,65535
结果就是给我们。如果正常速率是每秒几个点,这个特定的尖峰,在点之间,将产生一个速率峰值!为避免这种情况,我们可以设置当速率超过此值时,将返回一个数据点,以避免任何一个方向出现尖峰。对于上面的例子,如果我们知道,我们的速度几乎从来没有超过100,我们可以配置的65535 - 2000 + 500
64035
30s
2,134.5
resetValue
0
resetValue
100
当计算出上面的数据点时,它将返回0
而不是2,134.5
。默认值0表示将忽略复位值,不会抑制速率。
运营顺序
了解操作顺序很重要。返回查询结果时,以下是处理发生的顺序:
- 过滤
- 分组
- 下采样
- 插值
- 聚合
- 费率转换
- 功能
- 表达式