PromQL数据分析指南
PromQL(Prometheus Query Language)是 Prometheus 用于查询和分析时间序列数据的强大语言。通过 PromQL,你可以从 Prometheus 中提取、聚合和操作时间序列数据,从而进行监控、告警和数据分析。以下是使用 PromQL 进行数据分析的详细指南:
1. PromQL 基础概念
在开始使用 PromQL 之前,需要了解一些基本概念:
- 时间序列(Time Series):
- 时间序列是由指标名称(Metric Name)和一组标签(Labels)唯一标识的数据流。
- 例如:
http_requests_total{method="GET", status="200"}
。
- 指标类型:
- Counter:单调递增的计数器(如请求总数)。
- Gauge:可增可减的仪表盘(如 CPU 使用率)。
- Histogram:直方图,用于统计数据的分布(如请求延迟)。
- Summary:摘要,用于统计数据的分布(如请求延迟)。
2. PromQL 基本语法
PromQL 支持多种查询和操作符,以下是常用的语法:
(1) 查询时间序列
- 查询所有时间序列:
1
http_requests_total
- 根据标签过滤:
1
http_requests_total{method="GET", status="200"}
(2) 范围查询
- 查询过去 5 分钟的数据:
1
http_requests_total[5m]
(3) 聚合操作
- 求和(Sum):
1
sum(http_requests_total)
- 按标签分组求和:
1
sum(http_requests_total) by (method)
- 平均值(Avg):
1
avg(http_requests_total)
- 最大值(Max):
1
max(http_requests_total)
- 最小值(Min):
1
min(http_requests_total)
(4) 数学运算
- 加法:
1
http_requests_total{method="GET"} + http_requests_total{method="POST"}
- 除法:
1
rate(http_requests_total[5m]) / 100
(5) 函数
rate()
:计算时间序列的增长率(适用于 Counter 类型)。1
rate(http_requests_total[5m])
increase()
:计算时间序列的增长量(适用于 Counter 类型)。1
increase(http_requests_total[5m])
irate()
:计算时间序列的瞬时增长率。1
irate(http_requests_total[5m])
histogram_quantile()
:计算直方图的分位数。1
histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m]))
3. 常见数据分析场景
以下是使用 PromQL 进行数据分析的常见场景和示例:
(1) 计算请求速率
- 每秒请求数(QPS):
1
rate(http_requests_total[5m])
(2) 计算错误率
- 错误请求的比例:
1
sum(rate(http_requests_total{status=~"5.."}[5m])) / sum(rate(http_requests_total[5m]))
(3) 计算 CPU 使用率
- CPU 使用率:
1
100 - (avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100
(4) 计算内存使用率
- 内存使用率:
1
(node_memory_MemTotal_bytes - node_memory_MemFree_bytes) / node_memory_MemTotal_bytes * 100
(5) 计算请求延迟
- 95% 的请求延迟:
1
histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m]))
(6) 计算磁盘使用率
- 磁盘使用率:
1
(node_filesystem_size_bytes{mountpoint="/"} - node_filesystem_free_bytes{mountpoint="/"}) / node_filesystem_size_bytes{mountpoint="/"} * 100
4. 高级数据分析
(1) 多指标联合查询
- 计算每个实例的请求速率和错误率:
1
2
3rate(http_requests_total{instance="localhost:9090"}[5m])
/
rate(http_requests_total{instance="localhost:9090", status=~"5.."}[5m])
(2) 预测未来趋势
- 使用
predict_linear()
预测磁盘空间耗尽时间:1
predict_linear(node_filesystem_free_bytes{mountpoint="/"}[1h], 3600 * 24) < 0
(3) 时间偏移
- 比较当前和 1 小时前的请求速率:
1
rate(http_requests_total[5m]) - rate(http_requests_total[5m] offset 1h)
5. 可视化与告警
(1) 可视化
- 使用 Grafana 等工具将 PromQL 查询结果可视化。
- 示例:在 Grafana 中创建一个面板,显示 CPU 使用率:
1
100 - (avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100
(2) 告警
- 使用 Prometheus 的告警规则(Alerting Rules)定义告警条件。
- 示例:当 CPU 使用率超过 80% 时触发告警:
1
2
3
4
5
6
7
8
9
10
11groups:
- name: example
rules:
- alert: HighCpuUsage
expr: 100 - (avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100 > 80
for: 5m
labels:
severity: critical
annotations:
summary: "High CPU usage detected"
description: "CPU usage is above 80% for more than 5 minutes."
6. 最佳实践
- 合理选择时间范围:
- 根据分析需求选择合适的时间范围(如
[5m]
、[1h]
)。
- 根据分析需求选择合适的时间范围(如
- 避免过度聚合:
- 聚合操作会丢失细节,根据需求选择合适的聚合粒度。
- 使用标签过滤:
- 通过标签过滤减少查询的数据量,提高查询性能。
- 监控查询性能:
- 复杂的查询可能影响 Prometheus 的性能,定期优化查询。
总结
PromQL 是 Prometheus 的核心查询语言,通过它可以灵活地查询和分析时间序列数据。掌握 PromQL 的基本语法和常见场景,可以帮助你更好地进行监控、告警和数据分析。结合 Grafana 等可视化工具,可以更直观地展示分析结果。