promql

promql

热门

编写、验证和优化 Prometheus / Grafana Mimir / Grafana Cloud Metrics 的 PromQL。涵盖 `rate` vs `irate` vs `increase`、标签匹配器和正则表达式、`sum / avg / topk / by / without` 聚合、经典和原生 `histogram_quantile`、带除零保护的比率、用于数据过时的 `absent` / `changes`、时间偏移和 `predict_linear`、记录规则命名、SLO + 燃烧速率计算,以及基数排查指南。适用于编写指标查询、修复错误的 p95、构建错误预算告警、调试“查询缓慢”、查找导致基数爆炸的噪声标签,或将仪表盘查询迁移为记录规则——即使用户只说“计算错误率”、“p99 延迟”、“按服务求和”、“为什么这个查询慢”或“什么在填满 Mimir”而未提及 PromQL。

203Star
17Fork
更新于 2026/7/27
SKILL.md
readonly只读
name
promql
description

编写、验证和优化 Prometheus / Grafana Mimir / Grafana Cloud Metrics 的 PromQL。涵盖 `rate` vs `irate` vs `increase`、标签匹配器和正则表达式、`sum / avg / topk / by / without` 聚合、经典和原生 `histogram_quantile`、带除零保护的比率、用于数据过时的 `absent` / `changes`、时间偏移和 `predict_linear`、记录规则命名、SLO + 燃烧速率计算,以及基数排查指南。适用于编写指标查询、修复错误的 p95、构建错误预算告警、调试“查询缓慢”、查找导致基数爆炸的噪声标签,或将仪表盘查询迁移为记录规则——即使用户只说“计算错误率”、“p99 延迟”、“按服务求和”、“为什么这个查询慢”或“什么在填满 Mimir”而未提及 PromQL。

PromQL 查询模式

文档: https://prometheus.io/docs/prometheus/latest/querying/basics/

PromQL 返回瞬时向量区间向量标量

黄金法则: rate() / increase() 需要区间向量长度 ≥ 抓取间隔的 4 倍。60 秒抓取 → 至少使用 [5m]

前提条件

  • 一个可查询的 Prometheus / Mimir / Grafana Cloud 端点(/api/v1/query 或通过 Grafana Explore)
  • references/patterns.md 中的 PromQL 模式库

常见工作流程

1. 编写并验证查询

# 0. 指向你的 Prometheus/Mimir。对于 Grafana Cloud,使用指标端点
#    并在每个 curl 中添加基本认证(-u "<metrics_user>:<token>")。
PROM=http://localhost:9090   # 或 https://prometheus-prod-XX.grafana.net/api/prom

# 1. 草拟查询——例如“每个服务的 5xx 错误率”:
EXPR='sum(rate(http_requests_total{status_code=~"5.."}[5m])) by (service)'

# 2. 验证语法以及指标/标签是否存在
curl -sG --data-urlencode "query=${EXPR}" \
  "$PROM/api/v1/query" | jq '.status, (.data.result|length)'
# 期望: "success" 且结果数量 > 0。如果为 0——检查标签拼写和抓取活动:
curl -sG --data-urlencode "match[]=http_requests_total" "$PROM/api/v1/series" | jq '.data | length'

# 3. 合理性检查数值大小——打开 Grafana Explore,粘贴表达式,
#    确认数值与已知基准(k6 运行、日志计数等)相符。

2. 可直接复制的常见模式

按状态码的请求速率(先 rate 再聚合):

sum(rate(http_requests_total{job="api"}[5m])) by (status_code)

p95 延迟(内部聚合必须保留 le):

histogram_quantile(0.95,
  sum(rate(http_request_duration_seconds_bucket[5m])) by (le, service))

带除零保护的错误率:

sum(rate(http_requests_total{status_code=~"5.."}[5m]))
  / (sum(rate(http_requests_total[5m])) > 0)

完整模式库(记录规则、SLO 燃烧速率、时间偏移、基数排查、原生直方图):references/patterns.md

3. 将慢速仪表盘查询转换为记录规则

# 1. 选择慢速表达式,为其命名记录规则
groups:
  - name: http_request_rates
    interval: 1m
    rules:
      - record: job:http_request_duration_p95:rate5m
        expr: |
          histogram_quantile(0.95,
            sum(rate(http_request_duration_seconds_bucket[5m])) by (le, job))
# 2. 规则加载后,验证新指标是否存在
curl -sG --data-urlencode "query=job:http_request_duration_p95:rate5m" \
  "$PROM/api/v1/query" | jq '.data.result | length'   # → > 0

# 3. 验证它至少在一个样本窗口内与原始表达式匹配
# (两个查询在同一时间戳应产生相同的值。)

# 4. 将仪表盘面板表达式替换为记录规则指标。

常见错误

  • histogram_quantile 返回 NaN → 内部聚合中忘记 by (le)
  • “无数据” → 检查指标是否存在(/api/v1/series)且窗口长度 ≥ 抓取间隔的 4 倍
  • 速率数值错误 → 计数器在 rate() 之前被聚合(始终先 rate()
  • 查询超时 → 序列数量过多;使用 topk(...) + 记录规则 + 删除高基数标签(参见 references/patterns.md

资源