Skip to content

参考:指标类型、PromQL 函数与易错点

基于 Prometheus 3.x · 核于 2026-08

速查

  • 四大指标类型:Counter(单调递增,rate)/ Gauge(瞬时值,直接读)/ Histogram(分桶,服务端聚合分位数)/ Summary(客户端预算分位数,不可聚合)。
  • PromQL 三查询:即时向量(无 [])/ 范围向量([5m],需套函数)/ 标量。
  • 三大速率函数rate(平均,告警用)/ irate(末两点,大屏用)/ increase(窗口总增量)。
  • 聚合顺序:先 ratesumhistogram_quantilesum by (le)quantile
  • 告警流水线:Alerting Rule(for: 5m)→ Alertmanager(group_by 分组 / inhibit 抑制 / route 路由)。
  • Service Discovery:K8s SD(role: pod/service/node/endpoint)+ relabel(keep/drop/replace)。
  • relabel 两阶段relabel_configs(抓取前,目标层)/ metric_relabel_configs(抓取后,样本层,删高基数 label)。
  • 存储:本地 TSDB(2h chunk,默认 15 天);长期/HA 靠 remote_write 到 Thanos/Mimir/Cortex/VictoriaMetrics。
  • 高可用:跑两实例 + Alertmanager 集群去重;存储层去重靠 Thanos/Mimir。

一、四大指标类型速查

类型行为典型指标怎么查关键函数
Counter单调递增(重启归零)请求数、错误数、字节发送rate/increase 算速率rate/irate/increase/resets/changes
Gauge可增可减CPU%、内存、温度、队列长度直接读或滑动窗口avg_over_time/max_over_time/min_over_time/changes/deriv
Histogram分桶累计延迟分布、响应体大小histogram_quantile 算分位数histogram_quantile/rate(_bucket)
Summary客户端预算分位数延迟分位数(单实例)直接读 _quantile无(不可聚合)

二、PromQL 函数清单

速率类(用于 Counter)

函数含义用途
rate(v[5m])窗口内每秒平均速率告警、稳态监控
irate(v[5m])最后两点每秒速率实时大屏(灵敏)
increase(v[1h])窗口内总增量「过去 1h 新增多少」
resets(v[5m])窗口内 counter 重置次数诊断重启
changes(v[5m])窗口内值变化次数Gauge 变化频率

滑动窗口类(用于 Gauge)

函数含义
avg_over_time(v[5m])窗口平均值
max_over_time(v[5m])窗口最大值
min_over_time(v[5m])窗口最小值
sum_over_time(v[5m])窗口求和
quantile_over_time(0.99, v[5m])窗口分位数(要小心成本)
stddev_over_time(v[5m])窗口标准差
predict_linear(v[1h], 3600)线性预测 1h 后的值(磁盘满预警)

聚合类

函数含义
sum/avg/min/max求和/平均/最小/最大
count时序条数
count_values("label", v)按 value 计数并打 label
topk(3, v)/bottomk(3, v)取 Top/Bottom N
quantile(0.99, v)即时分位数(注意:和 histogram_quantile 不同,作用于即时向量)
by/without分组维度(保留/排除某些 label)

数学与时间类

函数含义
abs/ceil/floor/round取整
clamp_min(v, 0)/clamp_max(v, 100)限幅
time()/timestamp(v)当前时间戳 / 样本时间戳
vector(0)标量转向量(凑数用)
scalar(v)向量转标量

Histogram 专用

promql
histogram_quantile(0.99, sum by (le) (rate(http_duration_bucket[5m])))
// 注意:先 rate(每桶速率)→ sum by le(跨实例合并桶计数)→ histogram_quantile(算分位数)

三、告警规则模板

yaml
groups:
  - name: service-alerts
    interval: 30s
    rules:
      # ① 服务可用性:up == 0 持续 1 分钟
      - alert: ServiceDown
        expr: up == 0
        for: 1m
        labels: { severity: critical }
        annotations:
          summary: "{{ $labels.job }} 在 {{ $labels.instance }} 不可达"

      # ② 高错误率:5xx 占比 > 1% 持续 5 分钟
      - alert: HighErrorRate
        expr: |
          sum by (service) (rate(http_requests_total{code=~"5.."}[5m]))
            / sum by (service) (rate(http_requests_total[5m])) > 0.01
        for: 5m
        labels: { severity: warning }
        annotations:
          summary: "{{ $labels.service }} 错误率 {{ $value | humanizePercentage }}"

      # ③ P99 延迟:> 500ms 持续 10 分钟
      - alert: HighLatencyP99
        expr: |
          histogram_quantile(0.99,
            sum by (le, service) (rate(http_duration_seconds_bucket[5m]))
          ) > 0.5
        for: 10m
        labels: { severity: warning }

      # ④ 资源预警:磁盘 4h 后将满
      - alert: DiskWillFill
        expr: predict_linear(node_filesystem_avail_bytes[1h], 4*3600) < 0
        for: 5m
        labels: { severity: critical }

四、scrape_configs 常见配置

yaml
scrape_configs:
  # 静态目标
  - job_name: node
    static_configs:
      - targets: ['node1:9100', 'node2:9100']

  # K8s Pod 自动发现 + relabel
  - job_name: k8s-pods
    kubernetes_sd_configs:
      - role: pod
    relabel_configs:
      - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
        action: keep
        regex: "true"
      - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_port]
        target_label: __address__
        regex: (.+):(?:\d+);(\d+)
        replacement: $1:$2
    metric_relabel_configs:
      - regex: 'user_id|trace_id'
        action: labeldrop              # 删高基数 label

  # 短任务经 Pushgateway
  - job_name: pushgateway
    honor_labels: true                  # 保留 Pushgateway 上的 job/instance 标签
    static_configs:
      - targets: ['pushgateway:9091']

五、易错点清单

  • 「Counter 直接读有意义」:错。counter 一直涨,必须 rate/increasehttp_requests_total 读出来 100 万没信息量,rate(...[5m]) 才有意义。
  • 「rate 和 irate 没区别」:错。rate 是窗口平均(稳,告警用),irate 是末两点(灵但抖,大屏用)。流量突降时 irate 易误报。
  • 「Histogram 和 Summary 等价」:错。Histogram 服务端聚合(可跨实例合并 P99),Summary 客户端预算(不可跨实例合并)——生产几乎只用 Histogram
  • 「先 sum 后 rate」:错。聚合速率要ratesum(每条时序先算速率再求和);反过来把 counter 加和再 rate 语义错乱。
  • 「histogram_quantile 先 quantile 后 sum」:错。必须sum by (le)histogram_quantile——先把各实例的桶计数加起来再算分位数,否则得到「P99 的 P99」错误结果。
  • 「Prometheus 做日志/追踪」:错。Prometheus 只做指标。日志归 ELK/Loki,追踪归 Jaeger/Tempo。
  • 「把 user_id 做 label」:错。高基数 label 会让时序数爆炸,吃光 TSDB 内存——user_id/session_id/trace_id 这些归日志/追踪,绝不做 label。
  • 「Pull 适合短任务」:错。短任务(Cron/Lambda)跑几秒就退出,Prometheus 抓不到——用 Pushgateway 中转,且只用于短任务。
  • 「原版 Prometheus 高可用」:错。原版单节点无副本去重——跑两实例 + Alertmanager 集群去重,存储层去重靠 Thanos/Mimir。
  • 「Summary 比 Histogram 准」:错。两者精度都取决于桶/分位配置;Summary 不能跨实例聚合是硬伤,集群场景一律 Histogram。
  • 「promQL 里用 SQL」:错。PromQL 是独立语言,没有 JOIN/ORDER BY,向量匹配用 on/ignoring,分组用 by/without
  • 「远程读写是 Push 模型」:理解偏差。remote_write 是 Prometheus 主动转发样本到远端(采集仍为 Pull),远端只做存储/查询,不影响 Pull 哲学。

权威链接