引言
Prometheus 是一款开源的监控系统和时间序列数据库,广泛应用于各种系统的监控和告警。PromQL(Prometheus Query Language)是 Prometheus 用来查询和聚合时间序列数据的一种强大语言。本文将详细介绍 PromQL 的功能和语法,包括基本查询、向量操作、聚合函数等,并提供具体的代码示例。
PromQL 基础
PromQL 的设计旨在简化时间序列数据的查询和处理过程。PromQL 的核心概念包括:
- 向量:PromQL 处理的数据基本单位。
- 时间序列:具有相同标签集的一组向量。
- 标签:键值对形式的元数据,用于标识不同的时间序列。
基本查询
PromQL 支持通过标签选择器来过滤时间序列数据。
选择时间序列
up{job="node"}
这个查询返回所有带有 job=node
标签的时间序列,其中 up
表示监控目标的状态。
指定时间范围
up{job="node"}[5m]
这个查询返回过去 5 分钟内 up
指标的所有样本。
向量操作
向量操作允许对时间序列进行算术运算。
算术运算
node_memory_MemFree_bytes + node_memory_Buffers_bytes
这个查询计算了节点空闲内存加上缓冲区内存的总和。
比较运算
node_cpu{mode!="idle"} > 0.1
这个查询筛选出 CPU 使用率超过 10% 的时间序列。
聚合函数
PromQL 提供了多种内置的聚合函数,如 sum
, avg
, min
, max
, count
等。
聚合函数示例
sum(node_memory_MemTotal_bytes) by (instance)
这个查询计算每个实例的总内存,并按实例分组。
标签操作
标签操作允许对标签进行操作,如添加、删除或替换标签。
添加标签
node_memory_MemFree_bytes{env="production"}
这个查询返回 node_memory_MemFree_bytes
指标,并添加了一个 env=production
的标签。
删除标签
ignoring(job) sum(node_memory_MemFree_bytes)
这个查询计算所有 node_memory_MemFree_bytes
的总和,并忽略 job
标签。
时间偏移
时间偏移功能允许查询过去的时间点的数据。
时间偏移
irate(node_cpu_seconds_total{mode!="idle"}[5m]) offset 1h
这个查询返回过去 1 小时前的每分钟 CPU 使用率的增长率。
向量匹配
向量匹配用于连接两个向量,基于它们共有的标签。
向量匹配
node_memory_MemFree_bytes / on(instance) node_memory_MemTotal_bytes
这个查询计算每个实例的空闲内存占总内存的比例。
率和增量
PromQL 提供了 rate
和 irate
函数来计算速率和瞬时速率。
计算速率
rate(node_network_receive_bytes_total[5m])
这个查询计算过去 5 分钟内每个网络接口接收字节的平均速率。
窗口函数
窗口函数用于在固定的时间窗口内执行聚合。
窗口函数
increase(http_requests_total{status_code!~"5.."}[1h])
这个查询统计过去 1 小时内成功的 HTTP 请求总数。
综合示例
假设我们想要计算过去一小时内每个实例的平均 CPU 使用率,并将其与内存使用率相比较。
# 计算 CPU 使用率
cpu_usage_rate := irate(node_cpu_seconds_total{mode!="idle"}[5m])
# 计算内存使用率
memory_usage_rate := (
(node_memory_MemTotal_bytes - node_memory_MemFree_bytes)
/ node_memory_MemTotal_bytes
)
# 输出结果
(cpu_usage_rate * 100) vs (memory_usage_rate * 100)
结论
PromQL 是一种非常强大的查询语言,它使得查询和聚合时间序列数据变得简单直观。通过本文的学习,你应该能够掌握 PromQL 的基本用法,并能够编写复杂的查询来解决实际的监控问题。PromQL 的灵活性和表达力使得 Prometheus 成为一个非常有效的监控工具,适用于各种规模的系统。