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