PromQL专注时间序列监控数据提取与加工,核心包括指标标签结构、瞬时/区间向量区分、聚合运算(by/without)及计数器正确处理(rate/increase)。

PromQL 是 Prometheus 的核心查询语言,它不追求通用编程能力,而是专注解决“从时间序列中精准提取和加工监控数据”这件事。掌握基础查询和聚合运算,就覆盖了 80% 以上的日常使用场景——比如看当前 CPU 使用率、算过去五分钟的错误率、汇总各服务的请求总量。
指标与标签:理解数据结构的起点
每个时间序列都由一个指标名(如 http_requests_total)和一组键值对标签(如 {method="POST", status="500"})共同唯一标识。标签不是附加信息,而是维度本身——method="GET" 和 method="POST" 就是两条完全独立的时间序列。
查询时直接写指标名,会返回所有匹配该名称的序列:
http_requests_total
加花括号可按标签精确筛选:
http_requests_total{job="api", status=~"4.."} (匹配所有 4xx 状态码)
node_disk_io_time_seconds_total{device!="sda"} (排除 sda 磁盘)
瞬时向量 vs 区间向量:选对数据类型才不会报错
瞬时向量代表“此刻”的快照,例如 up 或 node_memory_free_bytes,适合查当前状态;区间向量则带时间范围,用方括号表示,例如:
http_requests_total[5m] —— 过去 5 分钟内所有采样点
rate(http_requests_total[5m]) —— 每秒平均增长率(专用于计数器)
注意:rate()、increase()、avg_over_time() 这类函数必须作用于区间向量,直接套在瞬时向量上会报错。
聚合运算:从明细到汇总的关键一步
聚合不是简单求和,而是按维度归并。核心在于 by 和 without:
- sum(http_requests_total) by (job, method) —— 按 job 和 method 分组求和
- avg(rate(http_requests_total[5m])) without (instance) —— 去掉 instance 标签后取平均,得到每个 job 的整体均值
- topk(3, sum(rate(http_requests_total[5m])) by (service)) —— 找出请求量前三的服务
常用聚合函数包括:sum、avg、max、min、count、count_values(统计某值出现次数),它们都默认作用于瞬时向量,但配合 rate() 等函数就能处理趋势数据。
常见陷阱与实用建议
很多问题其实源于细节疏忽:
- 计数器要用 rate() 或 increase(),别直接用原始值做除法——因为计数器会重置,原始值无业务意义
- irate() 对最新两个点敏感,适合排查瞬时毛刺;rate() 更平滑,适合告警和长期趋势
- 聚合前务必确认标签一致性,比如 env="prod" 和 environment="production" 是两条不同序列,无法被同一 by(env) 合并
- 避免过度聚合:先用 sum by(job) 看全局,再加 method 下钻,比一上来就 by(job, method, status) 更易定位问题

















