PromQL 查询
PromQL(Prometheus Query Language)是 Prometheus 的查询语言。
基本查询
瞬时查询
promql
# 查询指标
http_requests_total
# 查询特定标签
http_requests_total{method="GET"}
# 多标签匹配
http_requests_total{method="GET", status="200"}
# 正则匹配
http_requests_total{method=~"GET|POST"}
# 排除匹配
http_requests_total{status!="500"}范围查询
promql
# 5分钟内的数据
http_requests_total[5m]
# 1小时内的数据
http_requests_total[1h]时间偏移
promql
# 5分钟前的数据
http_requests_total offset 5m
# 昨天的数据
http_requests_total offset 1d聚合操作
常用聚合
promql
# 求和
sum(http_requests_total)
# 按标签分组求和
sum by (method) (http_requests_total)
# 平均值
avg(http_requests_total)
# 最大/最小值
max(http_requests_total)
min(http_requests_total)
# 计数
count(http_requests_total)聚合示例
promql
# 按实例分组统计 QPS
sum by (instance) (rate(http_requests_total[5m]))
# 统计状态码分布
sum by (status) (http_requests_total)数学运算
promql
# 加法
http_requests_total + 100
# 减法
http_requests_total - 100
# 乘法
http_requests_total * 2
# 除法(计算错误率)
http_errors_total / http_requests_total * 100比较运算
promql
# 大于
http_requests_total > 100
# 小于
http_requests_total < 100
# 等于
http_requests_total == 100
# 范围
http_requests_total > 100 and http_requests_total < 1000内置函数
rate(速率)
计算每秒增长率。
promql
# 每秒请求数
rate(http_requests_total[5m])
# QPS
rate(http_requests_total[1m])irate(瞬时速率)
计算瞬时增长率。
promql
irate(http_requests_total[5m])increase(增量)
计算范围内的增量。
promql
# 1小时内的请求数
increase(http_requests_total[1h])其他常用函数
promql
# 绝对值
abs(http_requests_total)
# 向上取整
ceil(http_requests_total)
# 向下取整
floor(http_requests_total)
# 变化趋势
changes(http_requests_total[1h])
# 一天内最大值
max_over_time(http_requests_total[1d])
# 一天内最小值
min_over_time(http_requests_total[1d])
# 一天内平均值
avg_over_time(http_requests_total[1d])高级查询
多指标运算
promql
# 错误率
rate(http_errors_total[5m]) / rate(http_requests_total[5m]) * 100
# 内存使用率
(node_memory_MemTotal_bytes - node_memory_MemFree_bytes) / node_memory_MemTotal_bytes * 100
# CPU 使用率
100 - (avg by (instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)子查询
promql
# 过去1小时内,每5分钟的最大值
max_over_time(rate(http_requests_total[5m])[1h:5m])预测
promql
# 预测4小时后的值
predict_linear(http_requests_total[1h], 4*3600)实用查询示例
HTTP 指标
promql
# QPS
sum(rate(http_requests_total[5m]))
# 错误率
sum(rate(http_requests_total{status=~"5.."}[5m])) / sum(rate(http_requests_total[5m])) * 100
# P95 延迟
histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m]))
# 响应时间
rate(http_request_duration_seconds_sum[5m]) / rate(http_request_duration_seconds_count[5m])系统指标
promql
# CPU 使用率
100 - (avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
# 内存使用率
(node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100
# 磁盘使用率
(node_filesystem_size_bytes - node_filesystem_free_bytes) / node_filesystem_size_bytes * 100
# 网络流量
rate(node_network_receive_bytes_total[5m])最佳实践
- 使用 rate 而非 irate:rate 更平滑,适合告警
- 合理选择时间窗口:通常使用 5m 或 1m
- 使用标签分组:按业务维度聚合
- 避免高基数标签:如 user_id、request_id