PromQL
核心概念与数据类型
理解 PromQL,首先要了解它的几种数据类型和指标类型:
| 类型 | 说明 |
|---|---|
| 瞬时向量 | 一组时间序列,每个序列在同一时间戳有一个样本值,如 node_cpu_seconds_total |
| 区间向量 | 一组时间序列,每个序列包含一段时间范围内的多个样本值,如 node_cpu_seconds_total[5m] |
| 标量 | 一个简单的浮点数值,如 1.234 |
| 字符串 | 一个简单的字符串值(在 PromQL 中较少直接使用) |
Prometheus 的指标主要有四种类型,它们在查询时的用法各异:
- Counter:只增不减的计数器,适用于表示累积值,如请求总数、CPU 使用总时间。通常需结合
rate()或increase()函数使用,以获取其增长速率。 - Gauge:可增可减的仪表盘,适用于表示当前状态,如内存使用量、CPU 温度。可直接查看其数值,或使用
delta()、predict_linear()等函数。 - Histogram:直方图,用于观察样本值的分布情况(如请求持续时间、响应大小),它会预先定义好桶(bucket)来计数。常与
histogram_quantile()函数结合计算分位数。 - Summary:摘要,同样用于统计和分析样本的分布情况。与 Histogram 类似,但分位数计算在客户端完成。
常用函数、运算符与语法要点
1. 常用函数
PromQL 提供了丰富的内置函数来处理数据:
| 函数 | 说明 | 示例 |
|---|---|---|
rate() | 计算区间向量内指标的平均增长速率 | rate(http_requests_total[5m]) |
irate() | 计算区间向量内指标的瞬时增长速率(灵敏度更高) | irate(http_requests_total[5m]) |
increase() | 计算区间向量内指标的绝对增长量 | increase(http_requests_total[1h]) |
sum() | 对指标值进行求和 | sum(rate(http_requests_total[5m])) |
avg() | 对指标值求平均值 | avg(rate(http_requests_total[5m])) |
by | 在聚合时,按指定标签分组 | sum(rate(http_requests_total[5m])) by (instance) |
without | 在聚合时,移除指定标签 | sum(rate(http_requests_total[5m])) without (instance) |
topk() | 返回前 N 个最高的指标值 | topk(5, http_requests_total) |
bottomk() | 返回前 N 个最低的指标值 | bottomk(5, http_requests_total) |
histogram_quantile() | 计算直方图指标的分位数 | histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m])) |
delta() | 计算区间向量中时间序列第一个和最后一个值的差 | delta(cpu_temp_celsius[2h]) |
predict_linear() | 预测时间序列在未来一段时间后的值 | predict_linear(node_filesystem_free_bytes[1h], 4*3600) |
2. 运算符
PromQL 支持多种运算符:
- 数学运算符:
+(加)、-(减)、*(乘)、/(除)、%(取余)、^(幂运算)。 - 布尔运算符:
==(相等)、!=(不相等)、>(大于)、<(小于)、>=(大于等于)、<=(小于等于)。使用bool修饰符可以返回0(false)或1(true),而不是过滤数据。 - 集合运算符:
and(交集)、or(并集)、unless(差集)。 - 操作符优先级:从高到低依次为
^>*, /, %>+, ->==, !=, >, <, >=, <=>and, unless>or。
3. 匹配器和选择器
过滤时间序列时,匹配器非常关键:
=:选择与字符串完全相等的标签。!=:选择不等于字符串的标签。=~:选择与正则表达式匹配的标签。!~:选择与正则表达式不匹配的标签。
范围向量选择器用于查询一段时间内的数据,时间单位可以是 s(秒)、m(分)、h(小时)、d(天)、w(周)、y(年),例如 http_requests_total[5m]。
使用 offset 修饰符可以查询时间偏移前的数据,例如 http_requests_total offset 5m 表示查询 5 分钟前的数据。
经典查询示例
节点资源监控
CPU 使用率:计算节点 CPU 非空闲模式的平均使用率。
bash(1 - avg(rate(node_cpu_seconds_total{mode="idle"}[5m])) by (instance)) * 100内存使用率:计算节点内存使用百分比。
bash(node_memory_MemTotal_bytes - (node_memory_MemFree_bytes + node_memory_Buffers_bytes + node_memory_Cached_bytes)) / node_memory_MemTotal_bytes * 100磁盘空间使用率:预测磁盘空间在未来一段时间后的剩余情况(如 4 小时后)。
bashpredict_linear(node_filesystem_free_bytes[1h], 4 * 3600)
容器与 Kubernetes 监控
Pod CPU 使用率:按 Pod 名称分组计算 CPU 使用率。
bashsum by(pod_name) (rate(container_cpu_usage_seconds_total{pod_name=~"$pod_name"}[1m]))Pod 内存占用:按 Pod 名称分组计算内存工作集大小(单位 MiB)。
bashsum by(pod_name) (container_memory_working_set_bytes{pod_name=~"$pod_name"}) / 1048576各 Namespace Pod 数量:统计不同命名空间下运行中的 Pod 数量。
bashcount(kube_pod_container_status_running) by (namespace)
服务与业务监控
HTTP 请求速率:计算每秒请求速率。
bashrate(http_requests_total[5m])95% 请求延迟:计算过去 5 分钟内 HTTP 请求持续时间的 95% 分位数。
bashhistogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m]))错误率:计算非 200 状态码请求的比率。
bashrate(http_requests_total{status!~"2.."}[5m]) / rate(http_requests_total[5m])
