promql基础

163 阅读3分钟

数据类型

指标名称和标签

每一条时间序列由指标名称(Metrics Name)以及一组标签(键值对)唯一标识。其中指标的名称(metric name)可以反映被监控样本的含义(例如,http_requests_total — 表示当前系统接收到的 HTTP 请求总量),指标名称只能由 ASCII 字符、数字、下划线以及冒号组成,同时必须匹配正则表达式 [a-zA-Z_:][a-zA-Z0-9_:]*
[info] 注意 冒号用来表示用户自定义的记录规则,不能在 exporter 中或监控对象直接暴露的指标中使用冒号来定义指标名称。
通过使用标签,Prometheus 开启了强大的多维数据模型:对于相同的指标名称,通过不同标签列表的集合,会形成特定的度量维度实例(例如:所有包含度量名称为 /api/tracks 的 http 请求,打上 method=POST 的标签,就会形成具体的 http 请求)。该查询语言在这些指标和标签列表的基础上进行过滤和聚合。改变任何度量指标上的任何标签值(包括添加或删除指标),都会创建新的时间序列。

样本

在时间序列中的每一个点称为一个样本(sample),样本由以下三部分组成:

  • 指标(metric):指标名称和描述当前样本特征的 labelsets;
  • 时间戳(timestamp):一个精确到毫秒的时间戳;
  • 样本值(value): 一个 folat64 的浮点型数据表示当前样本的值。

表示方式

通过如下表达方式表示指定指标名称和指定标签集合的时间序列:

{=, ...}

例如,指标名称为 api_http_requests_total,标签为 method="POST"handler="/messages" 的时间序列可以表示为:

api_http_requests_total{method="POST", handler="/messages"}

这与 OpenTSDB 中使用的标记法相同。

时间向量

  • 瞬时向量(Instant vector) - 一组时间序列,每个时间序列包含单个样本,它们共享相同的时间戳。也就是说,表达式的返回值中只会包含该时间序列中的最新的一个样本值。而相应的这样的表达式称之为瞬时向量表达式

  • 区间向量(Range vector) - 一组时间序列,每个时间序列包含一段时间范围内的样本数据。

聚合操作

  • sum() (求和)

  • min (最小值)

  • max (最大值)

  • avg (平均值)

  • stddev (标准差)

  • stdvar (标准方差)

  • count (计数)

  • count_values (对value进行计数)

  • bottomk (后n条时序)

  • topk (前n条时序)

  • quantile (分位数)
    这些操作符被用于聚合所有标签维度,或者通过 without 或者 by 子语句来保留不同的维度 例子: avg(m)

  • 选取名为m的time series

  • 每个点之前的时间范围(time range = start ~ end)内原始样本的平均值

内置聚合函数

不支持by/without
avg_over_time(m[d])

  • 选取名为m的time series
  • 每个点前d时间范围内原始样本的平均值

聚合概念

  • 聚合周期
  • start: 开始时间戳,包含。
  • end: 结束时间戳,包含。
  • step: 查询时间步长,范围时间(time range = start ~ end)内每step秒执行一次聚合

一般我们可以使用prometheus_egine_query_duration_seconds来评估prometheus整体的响应时间,如果响应过慢,可能是promql使用不当造成的,比如

  • 大量使用join来组合指标或者增加label
  • 大范围时间查询,step很小,导致数据量很大
  • rate时,range duration要大于step,否则会丢失数据

预聚合

预聚合 (Recording Rule) 可以让我们对一些常用的指标或者计算相对复杂的指标进行提前计算,然后将这些数据存储到新的数据指标中,查询这些计算好的数据将比查询原始的数据更快更便捷。这对于 Dashboard 场景非常适用,可以解决用户配置以及查询慢的问题。 预聚合以规则组 (Rule Group) 的形式存在, 相同组中的规则以一定的间隔顺序执行。聚合规则的名字必须符合 相应的 Prometheus 规范