9.10.4 监控指标与告警策略

本节围绕 Nacos 生产环境的监控指标体系与告警策略,覆盖核心组件、配置与注册中心链路、存储与网络、集群状态与容量、客户端与业务视角等层面,建立“可观测—可诊断—可处置”的闭环,并提供可执行示例、安装与排错步骤、练习。

一、监控目标与原则
- 指标分层:基础资源、Nacos 服务、存储依赖、客户端与业务。
- 指标类型:可用性、性能、容量、错误与告警。
- 告警原则:高信噪比、可定位、可恢复、避免雪崩告警。

二、监控架构原理草图(数据流)

文章图片

三、核心指标分类与示例采集
- 基础资源
- CPU/负载:node_load1/5/15node_cpu_seconds_total
- 内存:node_memory_MemAvailable_bytesnode_vmstat_oom_kill
- 磁盘:node_disk_io_time_seconds_totalnode_filesystem_avail_bytes
- 网络:node_network_receive_drop_totalnode_network_transmit_drop_total

  • Nacos 服务指标(服务端)
  • 进程健康:JVM 堆/非堆、GC 次数与停顿、线程数、FD 使用率
  • 服务注册:服务实例数、注册/注销QPS、心跳超时率
  • 配置管理:配置发布QPS、推送成功率、推送延迟、配置拉取延迟
  • 一致性与集群:节点存活数、leader 状态、同步延迟

  • 存储与依赖组件

  • DB 连接池:活跃/空闲/等待连接数、SQL 超时、慢查询
  • MySQL:主从延迟、锁等待、事务回滚

  • 客户端与业务视角

  • 客户端连接数、SDK 版本分布
  • 服务发现/配置生效延迟
  • 业务侧错误率与超时率

四、安装与采集配置示例(Prometheus + Exporters)

1) 安装 node_exporter(基础资源)

# 在 Nacos 节点上执行
useradd -r -s /sbin/nologin node_exporter
cd /opt
curl -LO https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz
tar -xzf node_exporter-1.7.0.linux-amd64.tar.gz
ln -s /opt/node_exporter-1.7.0.linux-amd64/node_exporter /usr/local/bin/node_exporter

cat >/etc/systemd/system/node_exporter.service <<'EOF'
[Unit]
Description=Node Exporter
After=network.target
[Service]
User=node_exporter
ExecStart=/usr/local/bin/node_exporter
Restart=always
[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable --now node_exporter

2) 安装 JMX Exporter(Nacos JVM 指标)

# 在 Nacos 节点上执行
mkdir -p /opt/jmx_exporter
cd /opt/jmx_exporter
curl -LO https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.20.0/jmx_prometheus_javaagent-0.20.0.jar

cat >/opt/jmx_exporter/nacos-jmx.yml <<'EOF'
startDelaySeconds: 0
ssl: false
lowercaseOutputName: true
lowercaseOutputLabelNames: true
rules:
  - pattern: 'java.lang:type=Memory'
  - pattern: 'java.lang:type=GarbageCollector,name=(.+)'
  - pattern: 'java.lang:type=Threading'
EOF

# 修改 Nacos 启动参数(示例为 nacos/bin/startup.sh)
# 在 JVM 参数中加入:
# -javaagent:/opt/jmx_exporter/jmx_prometheus_javaagent-0.20.0.jar=9404:/opt/jmx_exporter/nacos-jmx.yml

3) 开启 Nacos Actuator 指标(2.x 常用)

# 文件:nacos/conf/application.properties
management.endpoints.web.exposure.include=prometheus,health,info
management.endpoint.prometheus.enabled=true
management.server.port=8849

4) MySQL Exporter

# 在 MySQL 节点
useradd -r -s /sbin/nologin mysqld_exporter
curl -LO https://github.com/prometheus/mysqld_exporter/releases/download/v0.15.1/mysqld_exporter-0.15.1.linux-amd64.tar.gz
tar -xzf mysqld_exporter-0.15.1.linux-amd64.tar.gz
ln -s /opt/mysqld_exporter-0.15.1.linux-amd64/mysqld_exporter /usr/local/bin/mysqld_exporter

cat >/etc/.mysqld_exporter.cnf <<'EOF'
[client]
user=exporter
password=exporter_pass
EOF
chmod 600 /etc/.mysqld_exporter.cnf

cat >/etc/systemd/system/mysqld_exporter.service <<'EOF'
[Unit]
Description=MySQL Exporter
After=network.target
[Service]
User=mysqld_exporter
ExecStart=/usr/local/bin/mysqld_exporter --config.my-cnf=/etc/.mysqld_exporter.cnf
Restart=always
[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable --now mysqld_exporter

5) Prometheus 采集配置示例

# 文件:/etc/prometheus/prometheus.yml
global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'node'
    static_configs:
      - targets: ['10.0.0.11:9100','10.0.0.12:9100','10.0.0.13:9100']

  - job_name: 'nacos_jmx'
    static_configs:
      - targets: ['10.0.0.11:9404','10.0.0.12:9404','10.0.0.13:9404']

  - job_name: 'nacos_actuator'
    metrics_path: /nacos/actuator/prometheus
    static_configs:
      - targets: ['10.0.0.11:8849','10.0.0.12:8849','10.0.0.13:8849']

  - job_name: 'mysql'
    static_configs:
      - targets: ['10.0.0.21:9104']

五、关键命令与验证(含预期效果)

# 验证 node_exporter
curl -s http://10.0.0.11:9100/metrics | head -5
# 预期:返回 node_* 指标

# 验证 Nacos Actuator
curl -s http://10.0.0.11:8849/nacos/actuator/prometheus | head -5
# 预期:返回 nacos_* 或 spring_* 相关指标

# 验证 JMX exporter
curl -s http://10.0.0.11:9404/metrics | grep -E "jvm_memory|gc"
# 预期:返回 JVM 内存、GC 指标

# Prometheus 目标检查
curl -s http://prometheus:9090/api/v1/targets | jq '.data.activeTargets[] | {job:.labels.job,health:.health}'
# 预期:health=up

六、告警规则样例(Prometheus Rules)

# 文件:/etc/prometheus/rules/nacos-alerts.yml
groups:
- name: nacos-alerts
  rules:
  - alert: NacosNodeDown
    expr: up{job="nacos_actuator"} == 0
    for: 1m
    labels:
      severity: critical
    annotations:
      summary: "Nacos 节点不可达"
      description: "节点 {{ $labels.instance }} 连续 1 分钟不可达"

  - alert: NacosPushFailRateHigh
    expr: (rate(nacos_config_push_fail_total[5m]) / rate(nacos_config_push_total[5m])) > 0.01
    for: 5m
    labels:
      severity: high
    annotations:
      summary: "配置推送失败率过高"
      description: "失败率 >1% 持续 5 分钟"

  - alert: NacosGCPauseHigh
    expr: histogram_quantile(0.99, rate(jvm_gc_pause_seconds_bucket[5m])) > 0.5
    for: 5m
    labels:
      severity: medium
    annotations:
      summary: "GC 停顿过高"
      description: "P99 GC 停顿 > 500ms"

  - alert: MySQLConnectionsExhausted
    expr: mysql_global_status_threads_connected / mysql_global_variables_max_connections > 0.8
    for: 3m
    labels:
      severity: high
    annotations:
      summary: "MySQL 连接接近上限"
      description: "连接使用率 > 80%"

七、告警阈值建议与分级
- 节点存活数 < N/2 持续 1 分钟 → 严重告警
- 配置推送成功率 < 99% 持续 5 分钟 → 高优先级
- 服务注册失败率 > 1% 持续 10 分钟 → 中高
- GC 停顿 P99 > 500ms 持续 5 分钟 → 中
- DB 连接等待 > 5% 持续 3 分钟 → 高
- 磁盘使用率 > 80% 持续 30 分钟 → 中;> 90% 持续 10 分钟 → 高

八、排错流程与命令(常见故障)
1) 指标采集不到

# 检查端口与进程
ss -lntp | egrep '9100|9404|8849'
systemctl status node_exporter
systemctl status nacos

# 检查 Nacos Actuator 是否开启
grep -E "management\.endpoints|management\.server\.port" nacos/conf/application.properties

# 检查 Prometheus 抓取失败原因
curl -s http://prometheus:9090/api/v1/targets | jq '.data.activeTargets[] | {instance:.labels.instance,lastError:.lastError}'

2) 指标异常但业务正常

# 看是否是阈值设置过低或短时抖动
curl -s "http://prometheus:9090/api/v1/query?query=rate(nacos_config_push_fail_total[5m])"
# 调整告警窗口或阈值

3) 集群心跳不稳定

# 查看集群节点状态
curl -s "http://10.0.0.11:8848/nacos/v1/ns/operator/servers" | jq
# 检查网络延迟与丢包
ping -c 5 10.0.0.12
mtr -r -c 10 10.0.0.12

九、运维实践建议
- 关注“客户端感知指标”,避免只盯服务端资源。
- 以关键业务服务为维度设定 SLO/SLI。
- 定期演练告警链路,确保告警到达、处理及时。
- 持续优化阈值与策略,减少误报与漏报。
- 告警联动 Runbook:告警即附带常用排查命令与链接。

十、练习与自测
1) 在测试环境部署 node_exporter + JMX exporter,验证 Prometheus 目标均为 UP
2) 人为制造配置推送失败(停止一个 Nacos 节点),观察告警触发与恢复时间。
3) 调整 scrape_interval 从 15s 改为 5s,对比 Prometheus 资源消耗与告警敏感度变化。
4) 编写一条告警规则:当 node_filesystem_avail_bytes 低于 10% 且持续 10 分钟触发告警。