Skip to content

PromQL

核心概念与数据类型

理解 PromQL,首先要了解它的几种数据类型指标类型

类型说明
瞬时向量一组时间序列,每个序列在同一时间戳有一个样本值,如 node_cpu_seconds_total
区间向量一组时间序列,每个序列包含一段时间范围内的多个样本值,如 node_cpu_seconds_total[5m]
标量一个简单的浮点数值,如 1.234
字符串一个简单的字符串值(在 PromQL 中较少直接使用)

Prometheus 的指标主要有四种类型,它们在查询时的用法各异:

  • Counter:只增不减的计数器,适用于表示累积值,如请求总数、CPU 使用总时间。通常需结合 rate()increase() 函数使用,以获取其增长速率。
  • Gauge:可增可减的仪表盘,适用于表示当前状态,如内存使用量、CPU 温度。可直接查看其数值,或使用 delta()predict_linear() 等函数。
  • Histogram:直方图,用于观察样本值的分布情况(如请求持续时间、响应大小),它会预先定义好桶(bucket)来计数。常与 histogram_quantile() 函数结合计算分位数。
  • Summary:摘要,同样用于统计和分析样本的分布情况。与 Histogram 类似,但分位数计算在客户端完成。

常用函数、运算符与语法要点

1. 常用函数

PromQL 提供了丰富的内置函数来处理数据:

函数说明示例
rate()计算区间向量内指标的平均增长速率rate(http_requests_total[5m])
irate()计算区间向量内指标的瞬时增长速率(灵敏度更高)irate(http_requests_total[5m])
increase()计算区间向量内指标的绝对增长量increase(http_requests_total[1h])
sum()对指标值进行求和sum(rate(http_requests_total[5m]))
avg()对指标值求平均值avg(rate(http_requests_total[5m]))
by在聚合时,按指定标签分组sum(rate(http_requests_total[5m])) by (instance)
without在聚合时,移除指定标签sum(rate(http_requests_total[5m])) without (instance)
topk()返回前 N 个最高的指标值topk(5, http_requests_total)
bottomk()返回前 N 个最低的指标值bottomk(5, http_requests_total)
histogram_quantile()计算直方图指标的分位数histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m]))
delta()计算区间向量中时间序列第一个和最后一个值的差delta(cpu_temp_celsius[2h])
predict_linear()预测时间序列在未来一段时间后的值predict_linear(node_filesystem_free_bytes[1h], 4*3600)

2. 运算符

PromQL 支持多种运算符:

  • 数学运算符+(加)、-(减)、*(乘)、/(除)、%(取余)、^(幂运算)。
  • 布尔运算符==(相等)、!=(不相等)、>(大于)、<(小于)、>=(大于等于)、<=(小于等于)。使用 bool 修饰符可以返回 0(false)或 1(true),而不是过滤数据。
  • 集合运算符and(交集)、or(并集)、unless(差集)。
  • 操作符优先级:从高到低依次为 ^ > *, /, % > +, - > ==, !=, >, <, >=, <= > and, unless > or

3. 匹配器和选择器

过滤时间序列时,匹配器非常关键:

  • =:选择与字符串完全相等的标签。
  • !=:选择不等于字符串的标签。
  • =~:选择与正则表达式匹配的标签。
  • !~:选择与正则表达式不匹配的标签。

范围向量选择器用于查询一段时间内的数据,时间单位可以是 s(秒)、m(分)、h(小时)、d(天)、w(周)、y(年),例如 http_requests_total[5m]

使用 offset 修饰符可以查询时间偏移前的数据,例如 http_requests_total offset 5m 表示查询 5 分钟前的数据。

经典查询示例

节点资源监控

  • CPU 使用率:计算节点 CPU 非空闲模式的平均使用率。

    bash
    (1 - avg(rate(node_cpu_seconds_total{mode="idle"}[5m])) by (instance)) * 100
  • 内存使用率:计算节点内存使用百分比。

    bash
    (node_memory_MemTotal_bytes - (node_memory_MemFree_bytes + node_memory_Buffers_bytes + node_memory_Cached_bytes)) / node_memory_MemTotal_bytes * 100
  • 磁盘空间使用率:预测磁盘空间在未来一段时间后的剩余情况(如 4 小时后)。

    bash
    predict_linear(node_filesystem_free_bytes[1h], 4 * 3600)

容器与 Kubernetes 监控

  • Pod CPU 使用率:按 Pod 名称分组计算 CPU 使用率。

    bash
    sum by(pod_name) (rate(container_cpu_usage_seconds_total{pod_name=~"$pod_name"}[1m]))
  • Pod 内存占用:按 Pod 名称分组计算内存工作集大小(单位 MiB)。

    bash
    sum by(pod_name) (container_memory_working_set_bytes{pod_name=~"$pod_name"}) / 1048576
  • 各 Namespace Pod 数量:统计不同命名空间下运行中的 Pod 数量。

    bash
    count(kube_pod_container_status_running) by (namespace)

服务与业务监控

  • HTTP 请求速率:计算每秒请求速率。

    bash
    rate(http_requests_total[5m])
  • 95% 请求延迟:计算过去 5 分钟内 HTTP 请求持续时间的 95% 分位数。

    bash
    histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m]))
  • 错误率:计算非 200 状态码请求的比率。

    bash
    rate(http_requests_total{status!~"2.."}[5m]) / rate(http_requests_total[5m])