写在前面,这里时对OpenTSDB查询的一篇补充文档,一个特殊的查询方式:末尾反向查询。
翻译原文档http://opentsdb.net/docs/build/html/api_http/query/last.html
末尾反向查询与其他的查询有很多不同的地方,最关键的就是Http api的URL不同,结尾需要写为query/last而不是query。
在查找资料的时候看到有博客写的需要在写入中做一个设置,但我没遇到该问题。
这个api在我做的项目中有两点应用,第一点是查询最后一个数据;第二点是通过backScan的设置查询前面某个时刻是否有数据。
下面是文章翻译
此端点(2.1及更高版本)支持访问各个时间序列的最新值。当仅需要最后一个数据点时,它提供对常规查询的优化。可以使用元数据计数器的时间戳或通过从当前系统时间向后扫描来完成最后一个点的定位。
注意
为了使此端点通过扫描匹配的时间序列来使用度量字符串查询,元数据表必须存在,并且已使用元数据中指定的方法之一填充计数器或TSMeta对象。你必须设置tsd.core.meta.enable_tsuid_tracking
或tsd.core.meta.enable_realtime_ts
。使用backscan参数的查询将跳过元表。
与标准查询端点类似,有两种方法可用于选择应返回数据的时间序列:
度量标准查询 - 与常规度量标准查询类似,您可以发送度量标准名称和可选的一组标记对。如果已启用实时元数据,则TSD将扫描元数据表以查看是否有任何时间序列与查询匹配。对于匹配的每个时间序列,它将扫描最新的数据点并将其返回。但是,如果禁用了meta,那么只要给出了反向扫描值,TSD就会尝试查找所提供的精确度量标准集(从2.1.1开始)。
TSUID查询 - 如果您知道要访问数据的时间序列的TSUID,只需提供TSUID列表。
此外,有两种方法可以找到每个时间序列的最后一个数据点:
计数器方法 - 如果未给出反向扫描值且启用了元数据,则默认情况下是在每个时间系列的元数据表中查找数据点计数器。此计数器记录TSD写入最新数据点的时间。端点查找时间戳并“获取”正确的数据行,获取行中的最后一个点。这将在大多数情况下工作,但请注意,如果您回填旧数据(通过导入或仅使用旧时间戳放置数据点),计数器列时间戳可能不准确。此方法最适用于不断更新的数据。
反向扫描 - 或者,您可以指定从正在执行查询的TSD的当前系统时间开始扫描的小时数。例如,如果指定24小时的反向扫描时间,TSD将首先查找当前小时的行中的数据。如果该行为空,它将在此之前一小时查找数据。它将一直这样做,直到找到一个数据点或超过小时限制。如果您经常无序地编写数据点,则此方法很有用。另请注意,反向扫描值越大,查询完成所需的时间越长,因为它们可能会进一步扫描数据。
所有查询仅返回与查询匹配且找到数据点的时间序列的结果。结果是每个时间序列的各个数据点列表。无法对单个数据点执行聚合,因为时间戳可能不对齐,并且TSD将仅返回单个点,因此无法进行插值。
GET
POST
常见参数包括:
名称 | 数据类型 | 需要 | 描述 | 默认 | QS | RW | 例 |
---|---|---|---|---|---|---|---|
query/last | 排列 | 需要 | 用于确定要获取最后一个数据点的时间序列的一个或多个查询的列表。 | 时间序列|tsuids | |||
resolveNames | 布尔 | 可选的 | 是否将结果的TSUID解析为其度量标准和标记名称。 | 假 | 解决 | 真正 | |
backScan | 整数 | 可选的 | 过去需要几个小时来搜索数据。如果设置为0,则使用时间序列的元数据计数器的时间戳。 | 0 | back_scan | 24 |
请注意,您可以在一个请求中混合多个度量标准和TSUID查询。
度量标准查询字符串子查询的完整规范如下:
timeseries=[{=[,...=]}]
它类似于常规度量标准查询,但不允许聚合,速率,下采样或分组运算符。请注意,如果提供反扫描值以避免元表,则必须提供所有标记和值以匹配您要查找的确切时间序列。Backscan目前不会过滤指定的指标和标签,但会查找特定的系列。
TSUID查询比度量标准查询更简单。只需传递由逗号分隔的一个或多个十六进制编码的TSUID列表:
tsuids = < tsuid1 > [,... < tsuidN > ]
http://localhost:4242/api/query/last?timeseries=proc.stat.cpu{host=foo,type=idle}×eries=proc.stat.mem{host=foo,type=idle}
http://localhost:4242/api/query/last?tsuids=000001000002000003,000001000002000004&back_scan=24&resolve=true
{
"queries": [
{
"metric": "sys.cpu.0",
"tags": {
"host": "web01",
"dc": "lga"
}
},
{
"tsuids": [
"000001000002000042",
"000001000002000043"
]
}
}
],
"resolveNames":true,
"backScan":24
}
输出将是一个包含0个或更多数据点的数组,具体取决于找到的数据。如果特定时间序列的数据点未在指定的时间内定位,则它不会出现在输出中。输出字段取决于是否resolve
设置了标志。
名称 | 描述 |
---|---|
metric | 时间系列的度量标准的名称。仅resolve 在设置为true时返回。 |
tags | 时间序列的标记列表。仅resolve 在设置为true时返回。 |
时间戳 | 写入数据点时的Unix纪元时间戳(以毫秒为单位) |
值 | 用引号括起来的数据点的值为字符串 |
tsuid | 时间序列的十六进制TSUID |
除非查询出错,否则通常会收到200
包含内容的状态。但是,如果您的查询找不到任何数据,它将返回一个空结果集。对于JSON序列化程序,结果将是一个空数组:
[]
[
{
“timestamp” : 1377118201000 ,
“value” : “1976558550” ,
“tsuid” : “0023E3000002000008000006000001”
},
{
“timestamp” : 1377118201000 ,
“value” : “1654587485” ,
“tsuid” : “0023E3000002000008000006001656”
}
]
[
{
“metric” : “tsd.hbase.rpcs” ,
“timestamp” : 1377186301000 ,
“value” : “2723265185” ,
“tags” : {
“type” : “put” ,
“host” : “tsd1”
},
“tsuid” : “0023E3000002000008000006000001”
},
{
“metric” : “tsd.hbase.rpcs” ,
“timestamp” : 1377186301000 ,
“value” : “580720“ ,
”tags“ : {
”type“ : “put” ,
“host” : “tsd2”
},
“tsuid” : “0023E3000002000008000006017438”
}
]
OpenTSDB系列文章见
OpenTSDB系列目录https://blog.csdn.net/jyj1100/article/details/83450282