2. 使用PromQL查询基础指标
任务目标
本案例要求使用PromQL查询Prometheus已采集的基础指标,重点获取CPU使用率与内存使用率,并理解Gauge、Counter等核心指标类型。你将通过一个可直接运行的PromQL表达式集合完成查询,并明确判定查询结果是否有效。
前置环境
本案例假设你已有一个可访问的Prometheus实例(默认端口9090),且已通过node_exporter采集到目标主机指标。若尚未部署,可执行以下命令快速启动一个带node_exporter的测试环境:
# 启动node_exporter(采集主机指标,默认端口9100)
./node_exporter &
# 启动Prometheus,并在prometheus.yml的scrape_configs中添加:
# - job_name: 'node'
# static_configs:
# - targets: ['localhost:9100']
核心概念:指标类型
| 类型 | 语义 | 典型查询方式 |
|---|---|---|
| Gauge | 可增可减的当前值(如CPU温度、内存使用量) | 直接查询当前值,或使用avg_over_time等聚合 |
| Counter | 只增不减的累计值(如CPU总耗时、网络字节数) | 使用rate()或increase()计算速率/增量 |
关键完整代码:PromQL查询集
以下PromQL表达式可直接在Prometheus的Graph页面或通过HTTP API执行。所有查询均基于node_exporter的标准指标名。
# 1. CPU使用率(百分比,Gauge结果)
# 计算非空闲CPU时间占比,按实例和CPU核聚合
100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
# 2. 内存使用率(百分比,Gauge结果)
# 使用node_memory_MemTotal_bytes与node_memory_MemAvailable_bytes计算
(1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100
# 3. 查看所有指标类型(验证用)
# 返回指标名与类型,确认node_cpu_seconds_total为Counter,node_memory_MemTotal_bytes为Gauge
prometheus_tsdb_head_series
# 4. 验证Counter类型:CPU总耗时速率(每秒CPU秒数)
rate(node_cpu_seconds_total{mode="user"}[5m])
运行与验证方法
执行方式:将上述任一表达式粘贴到Prometheus UI的“Graph”页面的查询框中,点击“Execute”;或通过HTTP API调用:
curl 'http://localhost:9090/api/v1/query?query=100%20-%20(avg%20by%20(instance)%20(rate(node_cpu_seconds_total%7Bmode%3D%22idle%22%7D%5B5m%5D))%20*%20100)'
通过条件:
- CPU使用率查询返回0-100之间的数值(例如
12.5),且刷新后数值会变化,说明Gauge类型动态反映当前状态。 - 内存使用率查询返回合理百分比(如
45.3),且数值小于100。 - 在Prometheus UI的“Status”→“TSDB Status”中,确认
node_cpu_seconds_total类型为Counter,node_memory_MemTotal_bytes类型为Gauge。 - 若查询返回空结果或报错,检查node_exporter是否运行、target是否处于UP状态(Status→Targets)。
常见问题
- CPU使用率超过100%? 若未按核数归一化,多核机器可能显示>100%。上述表达式使用
avg by (instance)已自动取平均,不会超100%。 - 内存使用率不准确? 确保使用
MemAvailable_bytes而非MemFree_bytes,后者忽略缓存,会高估使用率。 - rate()与increase()区别?
rate()返回每秒平均速率,适合绘制曲线;increase()返回区间内总增量,适合计算总量。本案例使用rate()。