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修正。