promql是prometheus专用时间序列查询语言,用于从监控数据中提取关键指标;需理解指标名与标签结构,用rate()/irate()处理计数器,通过聚合与函数计算业务指标如错误率、p95延迟和内存使用率。

PromQL 是 Prometheus 专门设计的时间序列查询语言,核心目标就是从海量监控数据中快速定位、过滤、计算出真正反映系统状态的关键指标。它不依赖复杂语法,但需要理解指标结构和常见操作逻辑。
看清指标名和标签,是提取关键指标的第一步
每个监控数据都由指标名(metric name)和一组标签(label)共同标识。比如 node_cpu_seconds_total{cpu="0",mode="idle"} 中,node_cpu_seconds_total 是指标名,cpu 和 mode 是标签,值决定了具体是哪一路 CPU 的空闲时间。
实际使用中,先查指标名再加标签过滤最高效:
- 直接输入指标名,如 node_load1,可看到所有节点的 1 分钟负载原始数据
- 用 {job="node-exporter"} 筛选来源,避免混入其他采集任务的数据
- 用 {mode=~"user|system"} 匹配多个 CPU 模式,比写两条语句更简洁
- 排除干扰项时,{instance!="192.168.1.100:9100"} 或 {endpoint!~"/health.*"} 很实用
用 rate()、irate() 计算变化率,把计数器变成可用指标
像 http_requests_total 这类 Counter 类型指标只增不减,直接看数值没意义。必须用速率函数转换成“每秒请求数”这类业务可读指标。
推荐组合:
- rate(http_requests_total[5m]):适合稳定流量,取 5 分钟窗口内平均增长率
- irate(http_requests_total[5m]):适合突增场景,用最近两个点估算瞬时速率
- 搭配 sum by(instance) 可汇总单机总请求数,sum without(instance) 可看全局总量
聚合与维度控制,让结果更聚焦业务视角
原始数据往往带有多余维度(如 cpu、device、path),影响趋势判断或告警触发。PromQL 提供灵活的聚合方式:
- avg without(cpu) (rate(node_cpu_seconds_total[2m])):去掉 CPU 维度,得到单节点整体 CPU 使用率
- 1 - avg without(mode) (rate(node_cpu_seconds_total{mode="idle"}[2m])):用空闲率反推总体使用率
- topk(3, sum by(job) (rate(http_requests_total[1h]))):找出过去一小时请求量最高的三个服务
结合函数做实用计算,直接输出业务含义
光有原始速率还不够,常需进一步加工:
- 错误率 = rate(http_requests_total{status=~"5.."}[5m]) / rate(http_requests_total[5m])
- 延迟 P95 = histogram_quantile(0.95, sum by(le) (rate(http_request_duration_seconds_bucket[5m])))
- 内存使用率 = (node_memory_MemTotal_bytes - node_memory_MemFree_bytes) / node_memory_MemTotal_bytes
这些表达式可以直接填入 Grafana 面板或 Alertmanager 告警规则,无需额外后处理。











