Prometheus查询示例详解:从基础到高级应用
引言
Prometheus作为一款强大的监控系统,其查询语言PromQL是用户与监控数据交互的核心工具。本文将深入浅出地讲解PromQL的各种查询示例,帮助读者掌握从基础到高级的查询技巧。
基础时间序列选择
简单指标查询
最基本的查询是直接通过指标名称获取时间序列数据。例如,查询所有http_requests_total
指标的时间序列:
http_requests_total
带标签过滤的查询
Prometheus的强大之处在于可以通过标签进行精细过滤。例如,查询特定job和handler的HTTP请求:
http_requests_total{job="apiserver", handler="/api/comments"}
范围向量查询
要获取一段时间内的数据而非瞬时值,可以使用范围向量选择器。例如获取过去5分钟的数据:
http_requests_total{job="apiserver", handler="/api/comments"}[5m]
注意:范围向量结果不能直接绘制成图形,但可以在控制台视图中查看。
正则表达式匹配
PromQL支持使用正则表达式进行灵活匹配。例如匹配所有job名称以"server"结尾的指标:
http_requests_total{job=~".*server"}
也可以排除特定模式,如排除所有4xx状态码:
http_requests_total{status!~"4.."}
子查询详解
子查询允许在指定时间范围内执行内部查询。例如计算过去30分钟内,每1分钟间隔的5分钟请求速率:
rate(http_requests_total[5m])[30m:1m]
更复杂的嵌套子查询示例(注意:不必要的子查询会影响性能):
max_over_time(deriv(rate(distance_covered_total[5s])[30s:5s])[10m:])
函数与运算符应用
速率计算
计算HTTP请求的每秒速率(基于最近5分钟数据):
rate(http_requests_total[5m])
聚合操作
按job维度聚合所有实例的请求速率:
sum by (job) (
rate(http_requests_total[5m])
)
指标运算
假设有两个相关指标,可以执行数学运算。例如计算每个实例的未使用内存(MiB):
(instance_memory_limit_bytes - instance_memory_usage_bytes) / 1024 / 1024
按应用和进程聚合未使用内存:
sum by (app, proc) (
instance_memory_limit_bytes - instance_memory_usage_bytes
) / 1024 / 1024
TopK查询
找出CPU使用率最高的3个应用和进程组合:
topk(3, sum by (app, proc) (rate(instance_cpu_time_ns[5m])))
计数统计
统计每个应用的运行实例数量:
count by (app) (instance_cpu_time_ns)
采样限制
当需要探索指标的标签时,可以使用限制返回样本数量的函数:
返回前10个时间序列:
limitk(10, app_foo_metric_bar)
或者按比例采样(约10%的时间序列):
limit_ratio(0.1, app_foo_metric_bar)
最佳实践建议
- 对于计数器指标,总是使用
rate()
或irate()
函数处理 - 避免不必要的子查询,它们会显著增加查询负载
- 在聚合前考虑指标的基数,避免生成过多时间序列
- 使用
by
或without
子句明确指定聚合维度 - 对于探索性查询,使用限制函数控制返回结果量
总结
PromQL提供了强大而灵活的数据查询能力,从简单的指标选择到复杂的聚合运算,能够满足各种监控场景的需求。掌握这些查询技巧,将帮助你更好地利用Prometheus进行系统监控和故障排查。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考