2. Prometheus 基础回顾:PromQL 核心语法、数据类型与标签匹配

在 Kubernetes 集群生命周期运维中,Prometheus 是延迟水位与异常事件监控的数据基座。本节将系统回顾 PromQL 的三大支柱:核心语法、四种指标数据类型以及标签匹配机制。掌握这些基础,才能精准编写出反映集群真实状态的查询表达式。

2.1 指标数据类型:Counter / Gauge / Histogram / Summary

Prometheus 的指标采集端(Exporter)暴露的数据分为四种类型,每种类型对应不同的业务语义和 PromQL 聚合方式。下表从语义、典型场景和常用 PromQL 函数三个维度进行对比:

类型 语义 典型场景 常用 PromQL 函数
Counter 只增不减的累计值(重启归零) 请求总数、错误总数、CPU 时间片 rate()、increase()、topk()
Gauge 可增可减的瞬时值 内存使用量、Pod 副本数、队列深度 avg()、max()、min()、delta()
Histogram 分桶统计 + 总和 + 计数 请求延迟分布、响应大小分布 histogram_quantile()、rate()
Summary 客户端预计算的分位数 + 总和 + 计数 延迟分位数(P99/P95)、已聚合的 SLA 指标 直接读取 _quantile 标签
运维避坑:Counter 类型在 Pod 重启后归零,必须使用 rate() 或 increase() 计算每秒/每分钟增量,否则直接求和会得到错误的总量。Gauge 类型则可以直接聚合,无需考虑时间窗口。

2.2 PromQL 核心语法:选择器与时间范围

PromQL 的查询表达式由指标名称、标签匹配器和时间范围三部分组成。以下是最常用的三种选择器形式:

  • 瞬时向量选择器:返回当前最新值。
    kube_pod_status_phase{phase="Running"}
  • 范围向量选择器:返回过去一段时间内的样本序列。
    kube_pod_status_phase{phase="Running"}[5m]
  • 偏移修饰符:查询历史时刻的数据。
    kube_pod_status_phase{phase="Running"} offset 1h

范围向量不能直接用于算术运算,必须配合 rate()、avg_over_time() 等聚合函数使用。例如,计算过去 5 分钟 Pod 重启的平均速率:

rate(kube_pod_restart_total[5m])

2.3 标签匹配:精确匹配、正则匹配与负匹配

标签是 Prometheus 数据模型的灵魂。在 PromQL 中,标签匹配器支持四种操作符,用于筛选目标时间序列:

匹配器 语法 示例 说明
精确相等 = namespace="production" 完全匹配标签值
精确不等 != namespace!="kube-system" 排除特定标签值
正则匹配 =~ pod=~"nginx-.*" 匹配正则表达式
正则排除 !~ pod!~"coredns-.*" 排除匹配正则的序列
实战技巧:在 Kubernetes 监控中,经常使用 pod=~".*" 匹配所有 Pod,或用 container!="" 过滤掉 pause 容器。正则匹配性能低于精确匹配,在告警规则中应优先使用 = 和 !=。

2.4 四种数据类型与 PromQL 聚合的关系

下图展示了四种数据类型在 PromQL 聚合链路中的位置与转换关系,帮助理解从原始指标到监控面板的完整路径:

Prometheus 指标数据类型与 PromQL 聚合链路 Counter Gauge Histogram Summary PromQL 聚合函数层 rate() / increase() / avg() / histogram_quantile() / delta() 延迟水位监控 异常事件告警 容量与趋势分析 Counter 和 Histogram 必须经过 rate() 转换后才能用于延迟水位计算;Gauge 和 Summary 可直接聚合

2.5 常用 PromQL 函数速查

在集群生命周期运维中,以下 PromQL 函数出现频率最高,建议熟记:

  • rate():计算 Counter 类型在指定时间窗口内的每秒平均增长率。适用于 QPS、错误率。
    rate(http_requests_total{status="500"}[5m])
  • increase():计算 Counter 在时间窗口内的增量。适用于查看过去 1 小时错误总数。
    increase(kube_pod_restart_total[1h])
  • histogram_quantile():从 Histogram 中计算分位数。适用于 P99 延迟。
    histogram_quantile(0.99, rate(http_request_duration_seconds_bucket[5m]))
  • avg() / max() / min():对 Gauge 类型进行聚合。适用于集群平均内存使用率。
    avg(node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100
  • delta():计算 Gauge 在时间窗口内的差值。适用于查看节点温度变化。
    delta(node_cpu_temperature_celsius[10m])

2.6 标签匹配实战:过滤 Kubernetes 资源

在 K8s 环境中,Prometheus 自动为指标附加了丰富的标签(如 namespace、pod、container、node)。以下是一个典型的延迟水位查询,展示如何组合标签匹配与 PromQL 函数:

# 查询 production 命名空间中,所有 nginx Pod 的 P99 延迟(过去 5 分钟)
histogram_quantile(
  0.99,
  sum by (le, pod) (
    rate(
      nginx_ingress_controller_request_duration_seconds_bucket{
        namespace="production",
        pod=~"nginx-.*"
      }[5m]
    )
  )
)
常见错误:在 histogram_quantile() 中忘记使用 sum by (le, ...) 会导致分位数计算错误。必须保留 le 标签(Histogram 的桶边界标签),否则 Prometheus 无法正确聚合桶计数。