本文已参与「新人创作礼」活动,一起开启掘金创作之路。
Timestamp
OpenTSDB的查询中的两种类型的时间:
- 绝对时间:用于精确指定查询的起止时间,格式 yyyy/MM/dd-HH:mm:ss
- 相对时间:用于指定查询的时间范围,格式 (amount) (time unit)-ago,例如:3h-ago(查询的结束时间是当前时间,起始时间是3小时之前)。
- amount:表示时间跨度
- time out:表示时间跨度单位,相应的时间跨度的单位,ms(毫秒)、s(秒) 、m(分钟)、h(小时)、d(天,24小时)、w(周,7天)、n(月,30天)、y(年,365天)
- -ago:固定项
由于存储时间序列的最高精度是毫秒,毫秒级、秒级所占用字节数:
- 使用毫秒精度:HBase RowKey 中的时间戳占用6个字节
- 使用秒精度:RowKey 中的时间戳占用4个字节
注意:毫秒级存储,在查询时默认返回秒级数据(按照查询中指定的聚合方式对 1秒内的时序数据进行采样聚合,形成最终结果);可以通过 msResolution 参数设置,返回毫秒级数据。
Filtering
Filter 详解:
- Filter 类似于 SQL 语句中的 Where 子句,主要用于 tagv 的过滤;
- 同一个子查询中多个 Filter 进行过滤时,FIlter 之间的关系是 AND;
- 多个 Filter 同时对一组 Tag 进行过滤,只要一个 Filter 开启分组功能,就会按照 Tag 进行分组。
Filter 的具体格式:
{
"type": "wildcard", // Fliter 类型,可以直接使用 OpenTSDB 中内置的 Filter,也可以通过插件
// 的方式增加自定义的 Filter 类型
"tagk": "host", // 被过滤的 TagKey
"filter": "*", // 过滤表达式,该表达式作用于 TagValue 上,不同类型的 Filter 支持不同形式的表达式
"groupBy": true // 是否对过滤结果进行分组(group by),默认为 false,即查询结果会被聚合成一条时序数据
}
几个实用内置 Filter 类型详解:
-
literal_or、ilteral_or 类型:
-
支持单个字符串,也支持使用 “|” 连接多个字符串;
-
含义与 SQL 语句中的 “WHERE host IN('server01','server02','server03')” 相同;
-
ilteral_or 是 literal_or 的大小写不敏感版本,使用方式一致。
-
使用方式:
{ "type": "literal_or", "tagk": "host", "filter": "server01|server02|server03", "groupBy": false }
-
-
not_literal_or、not_iliteral_or 类型:
- 与 literal_or 的含义相反,使用方式与 literal_or 一致
- 含义与 SQL 语句中的 “WHERE host NOT IN('server01','server02')” 相同;
- not_ilteral_or 是 not_literal_or 的大小写不敏感版本,使用方式一致。
- 使用方式:
{ "type": "not_literal_or", "tagk": "host", "filter": "server01|server02", "groupBy": false }
-
wildcard、iwildcard 类型:
- wildcard 类型的 Filter 提供前缀、中缀、后缀的匹配功能;
- 支持使用 “*” 通配符匹配任何字符,其表达式中可以包含多个(但至少包含一个);
- 使用方式:
- iwildcard 是 wildcard 的大小写不敏感版本,使用方式一致。
{ "type": "wildcard", "tagk": "host", "filter": "server*", "groupBy": false }
-
regexp 类型:
- regexp 类型的 Filter 提供了正则表达式的过滤条件功能;
- 其含义与 SQL 语句中的 “ WHERE host REGEXP '.*' ” 相同。
{ "type": "regexp", "tagk": "host", "filter": ".*", "groupBy": false }
-
not_key 类型:
- not_key 类型的 Filter 提供了过滤指定 TagKey 的功能;
- 其含义是跳过任何包含 host 这个 TagKey 的时序,注意,其 Filter 表达式必须为空。
{ "type": "not_key", "tagk": "host", "filter": "", "groupBy": false }
Aggregation
aggregator 是用于对查询结果进行聚合,将同一 unix 时间戳内的数据进行聚合计算后返回结果,例如如果 tags 不填,1456123705 有两条数据,一条 host=web1,另外一条 host=web2,值都为10,那么返回的该时间点的值为 sum 后的 20。
- 条件过滤
可以针对 tag 进行一些条件的过滤,返回 tag 中 host 的值以 web 开头的数据。
"queries": [ { "aggregator": "sum", "metric": "self.test", "filters": [ { "type": "wildcard", "tagk": "host", "filter": "web*" } ] } ]
OpenTSDB 中提供了 interpolation 来解决聚合时数据缺失的补全问题,目前支持如下四种类型:
- LERP(Linear Interpolation):根据丢失点的前后两个点估计该点的值。
- 例如,时间戳 t1 处的点丢失,则使用 t0 和 t2 两个点的值(其前后两个点)估计 t1 的值,公式是:;这里假设 t0、t1、t2 的时间间隔为 5s,v0 和 v2 分别是 10 和 20,则 v1 的估计值为 15。
- ZIM(Zero if missing):如果存在丢失点,则使用 0 进行替换。
- MAX:如果存在丢失点,则使用其类型的最大值替换。
- MIN:如果存在丢失点,则使用其类型的最小值替换。
- 例如,时间戳 t1 处的点丢失,则使用 t0 和 t2 两个点的值(其前后两个点)估计 t1 的值,公式是:;这里假设 t0、t1、t2 的时间间隔为 5s,v0 和 v2 分别是 10 和 20,则 v1 的估计值为 15。
列出部分常用的Aggregator 函数 机器使用的 Interpolation 类型:
| Aggregator | 描述 | Interpolation |
|---|---|---|
| avg | 计算平均值作为聚合结果 | Linear Interpolation |
| count | 点的个数作为聚合结果 | ZIM |
| dev | 标准差 | Linear Interpolation |
| min | 最小值作为聚合结果 | Linear Interpolation |
| max | 最大值作为聚合结果 | Linear Interpolation |
| sum | 求和 | Linear Interpolation |
| zimsum | 求和 | ZIM |
| p99 | 将p99作为聚合结果 | Linear Interpolation |
downsample(采样功能)
简单来说就是对指定时间段内的数据进行聚合后返回;例如,需要返回每分钟的平均值数据,按照 5m-avg 的方式进行采样;分析 5m-avg 参数:
- 第一部分,采样的时间范围,即5分钟一次采样;
- 第二部分,采样使用的聚合函数,这里使用的是 avg(平均值)的聚合方式。
其含义是 每5分钟为一个采样区间,将每个区间的平均值作为返回的点。返回结果中,每个点之间的时间间隔为5分钟。
"queries": [
{
"aggregator": "sum",
"metric": "self.test",
"downsample": "5m-avg",
"tags": {
"host": "web1"
}
}
]
时序数据的丢失也会对 Downsampling 处理结果产生一定的影响。OpenTSDB 也为 Downsampling 提供了相应的填充策略,Downsampling 的填充策略如下:
- None(none):默认填充策略,当 Downsampling 结果中缺失某个节点时,不会进行处理,而是在进行 “Aggregator” 时通过相应的 interpolation 进行填充。
- NaN(nan):当 Downsampling 结果中缺少某个节点时,会将其填充为 NaN,在进行 “Aggregation” 时会跳过该点。
- Null(null):与 NaN 类似。
- Zero(zero):当 Downsampling 结果中缺少某个节点时,会将其填充为 0。
执行顺序
Rate Conversion(增长率)
在子查询中,有两个字段与 Rate Conversion 相关
- rate 字段:表示是否进行 Rate Conversion 操作;参数为 true 或 false。
- rateOptions 字段:记录 Rate Conversion 操作的一些参数,该字段是一个 Map,其中的字段及含义如下。
- counter 字段:参与 Rate Conversion 操作的时序记录是否为一个会溢出(rollover)的单调递增值。
- counterMax 字段:时序的最大值,详细介绍。
- resetValue 字段:当计算得到的比值超过该字段值时会返回0,主要是防止出现异常的峰值。
- dropResets 字段:是否直接丢弃 resetValue 的点或出现 rollover 的点。
其他接口
- /api/suggest 接口:该接口的主要功能是根据给定的前缀查询符合该前缀的 metric、tagk 或 tagv,主要用于给页面提供自动补全功能。请求结构如下:
{ "type": "metric", // 查询的字符串的类型,可选项有 metrics、tagk、tagv "q": "sys", // 字符串前缀 "max": 10 // 此次请求返回值携带的字符串个数上限 } - /api/query/exp 接口:该接口支持表达式查询。
- /api/query/gexp 接口:该接口主要为了兼容 Graphite 到 OpenTSDB 的迁移。
- /api/query/last 接口:在有些场景中,只需要一条时序数据中最近的一个点的值。
- /api/uid/assign 接口:该接口主要为 metric、tagk、tagv 分配 UID,UID 的相关内容和分配的具体实现在后面会进行详细分析。
- /api/uid/tsmeta 接口:该接口支持查询、编辑、删除 TSMeta 元数据。
- /api/uid/uidmeta 接口:改接口支持编辑、删除 UIDMeta 元数据。
- /api/annotation 接口:改接口支持添加、编辑、删除 Annotation 数据。