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()。