Prometheus 监控告警配置最佳实践

架构概述

Prometheus 监控体系包含以下核心组件:

  • Prometheus Server:数据采集与存储
  • Exporters:指标暴露器(node_exporter、mysqld_exporter 等)
  • Alertmanager:告警管理与路由
  • Grafana:可视化展示

基础配置

prometheus.yml 核心配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
global:
scrape_interval: 15s
evaluation_interval: 15s
external_labels:
monitor: 'production'
env: 'prod'

alerting:
alertmanagers:
- static_configs:
- targets:
- alertmanager:9093

rule_files:
- "rules/*.yml"

scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']

- job_name: 'node'
static_configs:
- targets: ['node-exporter:9100']
relabel_configs:
- source_labels: [__address__]
target_label: instance
regex: '(.+):(.+)'
replacement: '${1}'

告警规则设计

rules/alerts.yml 示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
groups:
- name: system_alerts
rules:
# CPU 使用率告警
- alert: HighCPUUsage
expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
for: 5m
labels:
severity: warning
annotations:
summary: "实例 {{ $labels.instance }} CPU 使用率过高"
description: "CPU 使用率当前为 {{ $value }}%"

# 内存使用率告警
- alert: HighMemoryUsage
expr: (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100 > 85
for: 5m
labels:
severity: warning
annotations:
summary: "实例 {{ $labels.instance }} 内存使用率过高"
description: "内存使用率当前为 {{ $value }}%"

# 磁盘空间告警
- alert: DiskSpaceLow
expr: (node_filesystem_avail_bytes / node_filesystem_size_bytes) * 100 < 15
for: 10m
labels:
severity: critical
annotations:
summary: "实例 {{ $labels.instance }} 磁盘空间不足"
description: "{{ $labels.mountpoint }} 可用空间仅剩 {{ $value }}%"

# 服务宕机告警
- alert: ServiceDown
expr: up == 0
for: 1m
labels:
severity: critical
annotations:
summary: "服务 {{ $labels.job }} 宕机"
description: "实例 {{ $labels.instance }} 无法访问"

Alertmanager 配置

alertmanager.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
global:
smtp_smarthost: 'smtp.163.com:465'
smtp_from: 'weijiantu@163.com'
smtp_auth_username: 'weijiantu@163.com'
smtp_auth_password: 'YOUR_AUTH_CODE'

route:
group_by: ['alertname', 'severity']
group_wait: 30s
group_interval: 5m
repeat_interval: 4h
receiver: 'default-receiver'
routes:
- match:
severity: critical
receiver: 'critical-receiver'
repeat_interval: 1h

receivers:
- name: 'default-receiver'
email_configs:
- to: 'tuwj@pcl.ac.cn'
send_resolved: true

- name: 'critical-receiver'
email_configs:
- to: 'tuwj@pcl.ac.cn'
send_resolved: true
webhook_configs:
- url: 'http://webhook-server:8080/alert'

告警分级策略

级别 响应时间 通知方式 示例
critical 5 分钟内 邮件 + 短信 + 电话 服务宕机、磁盘满
warning 30 分钟内 邮件 + IM CPU/内存高负载
info 工作时间 邮件 配置变更、维护通知

监控面板建议

核心指标 Dashboard

  1. 系统概览

    • CPU/Memory/Disk 使用率趋势
    • 网络流量统计
    • 服务在线状态
  2. 应用监控

    • QPS/RT 指标
    • 错误率统计
    • 慢查询分析
  3. 业务指标

    • 订单量/交易额
    • 用户活跃度
    • 转化率漏斗

常见问题排查

告警不触发

1
2
3
4
5
6
7
8
# 检查规则加载
curl http://localhost:9090/api/v1/rules

# 验证 PromQL
curl 'http://localhost:9090/api/v1/query?query=up'

# 查看 Alertmanager 状态
curl http://localhost:9093/api/v1/status

告警风暴

  • 增加 for 持续时间
  • 调整 group_interval
  • 使用抑制规则(inhibit_rules)

最佳实践总结

  1. 告警要有意义:避免噪音,只告警需要人工介入的问题
  2. 分级明确:不同级别对应不同响应策略
  3. 文档完善:每条告警附带处理指南
  4. 定期演练:验证告警链路有效性
  5. 持续优化:根据误报/漏报调整阈值