这篇文章基本上是转至https://blog.csdn.net/xsdxs/article/details/65938213,先严正声明下。
同时翻译至http://opentsdb.net/docs/build/html/user_guide/query/index.html
其实这种转载我也不想做,但是这篇确实是opentsdb查询的核心内容,但这篇文章也有一定的坑。也是我把它设置为基础知识和UI操作的原因:
因为这里面的查询的一些设定方式和http api的结构和内容有些差异,容易造成误导,比如我就遇到一件这样的事:
同事:UI上面不是有查时间端存储的信息条数,你使用下http api的查询查询下,应该很简单的。
我:OK,两个小时做完。 结果最后用了半天也没做好。
用http api做一个count比较复杂。官方文档也写的很零碎,偏重于原理介绍。
所以也是我在这里归档的主要原因,希望了解这个后能去看下/api/query,和我的下一篇博客对照来看,才能熟练使用opentsdb。
OpenTSDB的/ API / query(opentsdb的查询的api)简介(一)https://blog.csdn.net/jyj1100/article/details/81326660
==================================================================================
OpenTSDB提供了多种方法来提取数据,如CLI工具、HTTP API和GnuPlot用户图形界面(其实该用户界面就是HTTP接口的实现)。还有例如Grafana和Bosun等开源工具也能读取TSDB数据。此外学习OpenTSDB查询并不容易,因此请查阅本文档以获取更详细的信息。此页面展示HTTP API查询方式。
后来的版本增加了对功能和表达式的支持。 一般来说,每个查询都有以下组件:
参数 | 日期类型 | 是否为必须 | 描述 | 例 |
---|---|---|---|---|
Start Time | String or Integer | 是 | 查询的开始时间。这可能是绝对时间或相对时间。有关详细信息,请参阅日期和时间 | 24h-ago |
End Time | String or Integer | 否 | 查询的结束时间。如果未提供结束时间,则将使用TSD上的当前时间。有关详细信息,请参阅日期和时间。 | 1h-ago |
Metric | String | 是 | 系统中度量标准的全名。必须是完整的名称,并且始终区分大小写 | sys.cpu.user |
Aggregation Function | String | 是 | 用于组合多个时间序列的数学函数(即如何合并组中的时间序列) | sum |
Filter | String | 否 | 过滤标记值以减少查询或组中拾取的时间序列数,并在各种标记上进行聚合。 | host=*,dc=lax |
Downsampler | String | 否 | 可选的间隔和函数,用于减少跨时间返回的数据点数 | 1h-avg |
Rate | String | 否 | 一个可选标志,用于计算结果的每秒变化率 | rate |
Functions | String | 否 | 数据处理功能,如附加过滤,时移等。 | highestMax(...) |
Expressions | String | 否 | 跨时间序列的数据操作功能,例如将一个系列分成另一个系列。 | (m2 / (m1 + m2)) * 100 |
绝对时间戳以人类可读格式或Unix样式整数支持。相对时间可用于刷新仪表板。目前,所有查询都能够覆盖单个时间跨度。在未来,我们希望提供一个偏移查询参数,该参数允许在不同时间段内对度量进行聚合或绘图,例如比较上周到1年前。有关允许的详细信息,请参阅日期和时间。
虽然OpenTSDB可以以毫秒分辨率存储数据,但默认情况下,查询将返回具有第二分辨率的数据,以提供现有工具的向后兼容性。如果每秒存储多个数据点,请确保您发出的任何查询都包含1s-
要以毫秒分辨率提取数据,请使用/api/query
端点并指定msResolution
(ms
也可以,但不建议)JSON参数或查询字符串标志,它将绕过采样(除非指定)并以Unix纪元毫秒分辨率返回所有时间戳。此外,scan
命令行实用程序将返回存储中写入的时间戳。
每个时间序列都包含一个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=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
。
注意
查询时,不一致的标记可能会导致意外结果。请参阅编写数据以获取详细 另请参阅下面的显式标记。
阅读查询过滤器文档以获取详细信息
Aggregation(聚合方式)
OpenTSDB的一个强大功能是能够将多个时间序列的即时聚合功能执行到一组数据点。原始数据在存储中始终可用,但我们可以以更有意义的方式来提取数据。 聚合函数是将单个时间戳的两个或多个数据点的值合并成单个数据值的方法。
参阅Aggregation部分
OpenTSDB可以获取大量的数据,甚至在给定的时间序列中每秒获取一个数据点。这样查询将会返回大量的数据点。这样包含大量数据点的查询将会消耗完带宽资源。高频率的数据可以轻易地压垮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表示将忽略复位值,不会抑制速率。
了解操作顺序很重要。 返回查询结果时,以下是进行处理的顺序:
OpenTSDB系列
OpenTSDB的/ API / PUT(opentsdb的输入的api)简介https://blog.csdn.net/jyj1100/article/details/81323705
OpenTSDB使用/ API / PUT进行数据存储的java实现https://blog.csdn.net/jyj1100/article/details/81330623
(转)opentsdb查询的简介——基础知识和UI操作https://blog.csdn.net/jyj1100/article/details/81324017
OpenTSDB的/ API / query(opentsdb的查询的api)简介(一)https://blog.csdn.net/jyj1100/article/details/81326660
OpenTSDB的/ API / query(opentsdb的查询的api)简介(二)https://blog.csdn.net/jyj1100/article/details/81329290
OpenTSDB使用/ API / query进行数据查询的java实现https://blog.csdn.net/jyj1100/article/details/81347817
其他OpenTSDB系列文章见
OpenTSDB系列目录https://blog.csdn.net/jyj1100/article/details/83450282