好的,基于上面提供的指标,我为您整理了一系列最常用的系统监控 PromQL 查询语句。这些是监控系统健康状态的黄金指标。 --- ## 一、CPU 相关 1. **CPU 使用率(所有核心平均)** ```promql (1 - avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[1m]))) * 100 ``` 2. **每个 CPU 模式的使用率(User, System, IOWait)** ```promql # User 模式使用率 avg by(instance) (rate(node_cpu_seconds_total{mode="user"}[1m])) * 100 # System 模式使用率 avg by(instance) (rate(node_cpu_seconds_total{mode="system"}[1m])) * 100 # IOWait 模式使用率 (CPU等待磁盘IO的时间) avg by(instance) (rate(node_cpu_seconds_total{mode="iowait"}[1m])) * 100 ``` --- ## 二、内存相关 3. **内存使用率** ```promql # 方法一: (总内存 - 可用内存) / 总内存 (node_memory_MemTotal_bytes{instance="$instance"} - node_memory_MemAvailable_bytes{instance="$instance"}) / node_memory_MemTotal_bytes{instance="$instance"} * 100 # 方法二: 使用率估算 (更推荐,因为MemAvailable更准确) (1 - node_memory_MemAvailable_bytes{instance="$instance"} / node_memory_MemTotal_bytes{instance="$instance"}) * 100 ``` 4. **可用内存(GB)** ```promql node_memory_MemAvailable_bytes{instance="$instance"} / 1024 / 1024 / 1024 ``` 5. **Swap 使用率** ```promql (1 - (node_memory_SwapFree_bytes{instance="$instance"} / node_memory_SwapTotal_bytes{instance="$instance"})) * 100 ``` --- ## 三、磁盘相关 6. **磁盘空间使用率(按挂载点)** ```promql # 注意:使用avail而不是free,因为某些文件系统会保留部分空间 (1 - node_filesystem_avail_bytes{instance="$instance", mountpoint!~"*/snap/*", fstype!="tmpfs"} / node_filesystem_size_bytes{instance="$instance", mountpoint!~"*/snap/*", fstype!="tmpfs"}) * 100 ``` 7. **磁盘 I/O 使用率(繁忙程度)** ```promql # 某个设备(sda)的IO利用率 rate(node_disk_io_time_seconds_total{instance="$instance", device="sda"}[1m]) * 100 ``` 8. **磁盘读写吞吐量(MB/s)** ```promql # 读吞吐量 rate(node_disk_read_bytes_total{instance="$instance", device=~"sd.*|nvme.*"}[1m]) / 1024 / 1024 # 写吞吐量 rate(node_disk_written_bytes_total{instance="$instance", device=~"sd.*|nvme.*"}[1m]) / 1024 / 1024 ``` 9. **磁盘 IOPS(每秒读写操作次数)** ```promql # 读IOPS rate(node_disk_reads_completed_total{instance="$instance", device=~"sd.*|nvme.*"}[1m]) # 写IOPS rate(node_disk_writes_completed_total{instance="$instance", device=~"sd.*|nvme.*"}[1m]) ``` --- ## 四、网络相关 10. **网络流量(MB/s)** ```promql # 入向流量 (接收) rate(node_network_receive_bytes_total{instance="$instance", device!~"lo|veth.*|docker.*|flannel.*|cali.*"}[1m]) / 1024 / 1024 # 出向流量 (发送) rate(node_network_transmit_bytes_total{instance="$instance", device!~"lo|veth.*|docker.*|flannel.*|cali.*"}[1m]) / 1024 / 1024 ``` 11. **网络错误率 & 丢包率** ```promql # 接收错误率 (错误包数/总包数) rate(node_network_receive_errs_total{instance="$instance"}[1m]) / rate(node_network_receive_packets_total{instance="$instance"}[1m]) * 100 # 接收丢包率 rate(node_network_receive_drop_total{instance="$instance"}[1m]) / rate(node_network_receive_packets_total{instance="$instance"}[1m]) * 100 ``` --- ## 五、系统负载与进程 12. **系统平均负载(1分钟)** ```promql node_load1{instance="$instance"} ``` 13. **系统平均负载(归一化,除以CPU核心数)** ```promql # 这是一个更直观的指标,>1 表示进程在排队 node_load1{instance="$instance"} / count by(instance) (node_cpu_seconds_total{mode="user", instance="$instance"}) ``` 14. **运行中的进程数** ```promql node_procs_running{instance="$instance"} ``` --- ## 六、Node Exporter 自身健康状态 15. **Node Exporter 是否存活** ```promql up{job="node_exporter", instance="$instance"} # 值为1表示健康,0表示宕机 ``` 16. **抓取耗时** ```promql scrape_duration_seconds{job="node_exporter", instance="$instance"} ``` --- ## 七、VMAgent 自身监控(关键!) 17. **VMAgent 远程写入队列状态** ```promql # 队列中待发送的数据量 (MB) - 如果持续很高,说明远端存储有压力或网络有问题 vmagent_remotewrite_pending_data_bytes{instance="$instance"} / 1024 / 1024 # 远程写入错误数 - 最重要的告警指标之一 rate(vmagent_remotewrite_errors_total{instance="$instance"}[5m]) ``` 18. **VMAgent 抓取目标状态** ```promql # 有多少个抓取目标是UP的 sum by(instance) (up{instance="$instance"}) # 总的抓取目标数 count by(instance) (up{instance="$instance"}) ``` 19. **VMAgent 内存使用量** ```promql # 进程常驻内存 (RSS) process_resident_memory_bytes{instance=~"$instance.*", job=~".*vmagent.*"} / 1024 / 1024 ``` 20. **VMAgent 文件描述符使用率** ```promql # 文件描述符使用率 process_open_fds{instance=~"$instance.*", job=~".*vmagent.*"} / process_max_fds{instance=~"$instance.*", job=~".*vmagent.*"} * 100 ``` --- ### 使用建议: 1. **告警规则**:将上述查询(如 CPU > 90%, 内存 > 85%, 磁盘空间 > 90%, `up == 0`, 远程写入错误 > 0)配置为告警规则。 2. ** Grafana 仪表盘**:使用这些查询来构建全面的系统监控仪表盘。 3. **时间范围**:`[1m]` 或 `[5m]` 是常用的速率计算窗口,可以根据监控系统的粒度进行调整。 4. **实例过滤**:上述查询中的 `{instance="$instance"}` 是 Grafana 变量语法,在实际的 Prometheus 或 Alertmanager 配置中,您可能需要根据环境进行调整或删除。 这些 PromQL 涵盖了系统监控中最核心的方面,可以帮助您全面了解主机和 vmagent 的运行状态。