OpenTSDB之函数使用

1,071 阅读7分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

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 的值,公式是:v1=v0+(v2v0)((t1t0)/(t2t0))v1=v0+(v2-v0)*((t1-t0)/(t2-t0));这里假设 t0、t1、t2 的时间间隔为 5s,v0 和 v2 分别是 10 和 20,则 v1 的估计值为 15。 在这里插入图片描述
    • ZIM(Zero if missing):如果存在丢失点,则使用 0 进行替换。
    • MAX:如果存在丢失点,则使用其类型的最大值替换。
    • MIN:如果存在丢失点,则使用其类型的最小值替换。

列出部分常用的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。

执行顺序

QQ拼音截图20220518095503.jpg

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 数据。