17.11.4 常见故障场景与处置SOP

在Prometheus监控与告警的日常运维中,常见故障多集中在采集链路、存储性能、告警可达性与可视化等环节。以下为典型故障场景与处置SOP,强调“现象—定位—处置—验证—复盘”的闭环流程,并提供可执行命令、配置示例与练习。

文章图片

1. 目标采集失败(Targets Down)#

现象:Grafana面板断图、告警触发,Prometheus Targets页面显示Down。
定位
- 检查Target标签与服务发现是否正确(job、instance、relabel)。
- 通过curl访问/exporter端口确认网络与端口连通。
- 查看exporter日志是否报错(权限、路径、依赖缺失)。

处置示例

# 1) 确认Prometheus抓取目标
curl -s http://prometheus:9090/api/v1/targets | jq '.data.activeTargets[]|{job:.labels.job,instance:.labels.instance,health:.health,lastError:.lastError}'

# 2) 直接访问目标Exporter
curl -s http://10.0.0.12:9100/metrics | head

# 3) 检查防火墙/安全组
sudo ss -lntp | grep 9100
sudo iptables -L -n | grep 9100

修正配置示例(/etc/prometheus/prometheus.yml):

scrape_configs:
  - job_name: "node"
    static_configs:
      - targets: ["10.0.0.12:9100"]
    relabel_configs:
      - source_labels: [__address__]
        target_label: instance

验证:Targets恢复为UP,采集时间戳刷新。
复盘:补齐服务发现规则审核流程,增加自检探针。


2. 指标突然缺失或出现空洞#

现象:时序曲线断点,告警缺乏数据。
定位
- 检查Prometheus自身日志是否存在TSDB错误。
- 检查抓取间隔与超时是否合理。
- 查看被采集实例CPU/内存是否过载导致响应超时。

处置示例

# 查看Prometheus日志(systemd)
sudo journalctl -u prometheus -n 200 --no-pager

# 检查TSDB状态
curl -s http://prometheus:9090/api/v1/status/tsdb | jq '.data'

# 调整采集超时(演示)
sudo sed -i 's/scrape_timeout: 10s/scrape_timeout: 15s/' /etc/prometheus/prometheus.yml
sudo systemctl reload prometheus

验证:时序数据连续,Prometheus状态正常。
复盘:制定资源基线与高峰期容量预案。


3. 告警未触达或延迟触达#

现象:告警规则触发但通知缺失或延迟。
定位
- 检查Alertmanager日志与告警路由配置。
- 验证接收方(邮件/钉钉/企业微信)接口状态。
- 检查防抑制、静默规则是否误生效。

处置示例

# 检查Alertmanager配置与运行状态
curl -s http://alertmanager:9093/api/v2/status | jq '.'

# 测试告警路由匹配
curl -s http://prometheus:9090/api/v1/alerts | jq '.data.alerts[]|{labels:.labels,state:.state}'

配置示例(/etc/alertmanager/alertmanager.yml):

route:
  receiver: "webhook"
  group_by: ["alertname", "instance"]
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 2h

receivers:
  - name: "webhook"
    webhook_configs:
      - url: "http://notify:8080/alert"

验证:测试告警可达,告警链路时延可控。
复盘:定期演练告警通道,建立通知SLA。


4. Prometheus存储膨胀与磁盘告警#

现象:磁盘用量激增,TSDB压缩慢或崩溃。
定位
- 检查指标数量、标签基数与高频采集任务。
- 查看TSDB compaction耗时与chunk数量。
- 分析高基数指标(如动态label)。

处置示例

# 查看Prometheus磁盘占用
du -sh /var/lib/prometheus
du -sh /var/lib/prometheus/* | sort -h | tail

# 检查高基数指标(示例PromQL)
# 预期:找出label组合数最多的指标
curl -G http://prometheus:9090/api/v1/query \
  --data-urlencode 'query=topk(5, count by (__name__)({__name__=~".+"}))' | jq '.data'

配置示例(/etc/prometheus/prometheus.yml):

global:
  scrape_interval: 30s
  evaluation_interval: 30s

# 减少高基数label
scrape_configs:
  - job_name: "app"
    metric_relabel_configs:
      - source_labels: [user_id]
        action: drop

验证:磁盘使用率下降,compaction恢复正常。
复盘:建立指标接入审核与容量规划制度。


5. 查询变慢或Grafana面板超时#

现象:PromQL查询延迟高,面板加载失败。
定位
- 确认PromQL是否存在高基数聚合。
- 检查PrometheusCPU/内存与磁盘IO。
- 排查Grafana数据源连接超时。

处置示例

# Prometheus查询性能统计
curl -s http://prometheus:9090/api/v1/status/tsdb | jq '.data.headStats'

# 示例:用记录规则预聚合
cat >/etc/prometheus/rules/recording.yml <<'EOF'
groups:
- name: app_rules
  rules:
  - record: job:http_request_duration_seconds:avg5m
    expr: rate(http_request_duration_seconds_sum[5m]) / rate(http_request_duration_seconds_count[5m])
EOF

# 重新加载配置
curl -X POST http://prometheus:9090/-/reload

验证:面板响应恢复,查询时延下降。
复盘:制定查询规范与面板设计准则。


6. 服务发现异常(SD失效)#

现象:新实例未纳入监控或批量丢失。
定位
- 检查SD配置(K8s/Consul/Nacos)权限与API可用性。
- 查看Prometheus日志中SD报错。
- 检查label匹配与relabel规则。

处置示例

# 以Kubernetes SD为例,验证API访问
kubectl get endpoints -n monitoring

# Prometheus日志查看SD错误
sudo journalctl -u prometheus -n 200 --no-pager | grep -i discovery

配置示例(/etc/prometheus/prometheus.yml):

scrape_configs:
- job_name: "k8s-pods"
  kubernetes_sd_configs:
  - role: pod
  relabel_configs:
  - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
    action: keep
    regex: true

验证:实例重新发现,Targets恢复正常。
复盘:建立配置变更审批与回滚预案。


7. 高可用同步异常(双写/多副本)#

现象:HA Prometheus数据不一致,告警重复。
定位
- 查看副本抓取配置是否一致。
- 检查Alertmanager去重label设置。
- 确认外部标签external_labels是否正确。

处置示例

# Prometheus HA配置示例(/etc/prometheus/prometheus.yml)
global:
  external_labels:
    cluster: "prod"
    replica: "a"   # 另一台为 b

Alertmanager去重示例

route:
  group_by: ["alertname", "cluster"]

验证:告警去重生效,时序数据一致。
复盘:固化HA部署模板,定期校验一致性。


8. Prometheus进程异常退出#

现象:服务重启频繁或崩溃。
定位
- 检查日志是否存在OOM或panic。
- 查看系统资源与磁盘错误。
- 确认升级版本兼容性。

处置示例

# 查看OOM
dmesg | grep -i oom | tail

# 查看Prometheus版本与启动参数
/opt/prometheus/prometheus --version
ps -ef | grep prometheus

# systemd资源限制调整
sudo systemctl edit prometheus

systemd覆盖配置示例

[Service]
MemoryMax=4G
LimitNOFILE=65536

验证:进程稳定运行,指标采集恢复。
复盘:升级前进行灰度与回滚演练。


SOP执行要点
- 统一故障工单模板:现象、影响范围、定位过程、处置步骤、验证结果、复盘计划。
- 明确告警升级路径与责任人值班机制。
- 形成标准化排查清单,避免经验依赖。
- 定期演练故障场景,持续优化SOP与指标体系。


练习与演练
1. 人为关闭node_exporter进程,按SOP完成“定位—处置—验证”,记录用到的命令。
2. 修改scrape_timeout为1s并触发数据空洞,恢复后观察TSDB状态变化。
3. 在Alertmanager中新增一个测试接收器,触发测试告警并验证到达时间。
4. 创建一个高基数label(如user_id),观察磁盘增长并通过metric_relabel_configs修正。