1.1 Alertmanager 简介
什么是 Alertmanager
Alertmanager 是 Prometheus 监控系统的重要组成部分,专门负责处理由 Prometheus 服务器发送的告警。它提供了告警的去重、分组、路由和通知功能,是现代化监控体系中不可或缺的组件。
主要功能特性
- 告警去重:自动识别和合并重复的告警
- 告警分组:将相关告警组织在一起,减少通知噪音
- 告警路由:根据标签将告警路由到不同的接收器
- 通知管理:支持多种通知渠道(邮件、Slack、Webhook等)
- 告警抑制:在特定条件下抑制某些告警
- 静默管理:临时禁用特定告警的通知
- 高可用性:支持集群部署,确保服务可靠性
应用场景
- 基础设施监控:服务器、网络设备告警管理
- 应用程序监控:业务指标异常告警
- 容器化环境:Kubernetes 集群监控告警
- 微服务架构:分布式系统告警协调
- DevOps 流程:CI/CD 流水线告警集成
1.2 核心概念与术语
告警(Alert)
告警是 Prometheus 根据告警规则生成的事件,包含以下关键信息:
yaml
# 告警示例
alert:
labels:
alertname: "HighCPUUsage"
instance: "server-01:9100"
job: "node-exporter"
severity: "warning"
annotations:
summary: "High CPU usage detected"
description: "CPU usage is above 80% for more than 5 minutes"
startsAt: "2024-01-15T10:30:00Z"
endsAt: "0001-01-01T00:00:00Z" # 0值表示告警仍在触发
generatorURL: "http://prometheus:9090/graph?g0.expr=..."
标签(Labels)
标签是键值对,用于标识和分类告警:
- alertname:告警规则名称
- instance:告警来源实例
- job:监控任务名称
- severity:告警严重程度
- team:负责团队
- service:相关服务
注解(Annotations)
注解提供告警的描述性信息:
- summary:告警摘要
- description:详细描述
- runbook_url:处理手册链接
- dashboard_url:相关仪表板链接
接收器(Receiver)
接收器定义了告警的通知目标和方式:
yaml
receivers:
- name: 'web-team'
email_configs:
- to: 'web-team@company.com'
subject: 'Alert: {{ .GroupLabels.alertname }}'
slack_configs:
- api_url: 'https://hooks.slack.com/services/...'
channel: '#web-alerts'
路由(Route)
路由决定告警如何分发到不同的接收器:
yaml
route:
group_by: ['alertname', 'cluster']
group_wait: 10s
group_interval: 10s
repeat_interval: 1h
receiver: 'default'
routes:
- match:
team: web
receiver: 'web-team'
- match:
severity: critical
receiver: 'oncall-team'
分组(Grouping)
分组将相关告警合并,减少通知数量:
- group_by:分组依据的标签
- group_wait:等待同组告警的时间
- group_interval:同组告警的发送间隔
- repeat_interval:重复发送间隔
抑制(Inhibition)
抑制规则防止在特定条件下发送某些告警:
yaml
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'instance']
静默(Silence)
静默临时禁用匹配条件的告警通知:
yaml
silence:
matchers:
- name: "alertname"
value: "HighCPUUsage"
- name: "instance"
value: "server-01:9100"
startsAt: "2024-01-15T10:00:00Z"
endsAt: "2024-01-15T18:00:00Z"
createdBy: "admin@company.com"
comment: "Planned maintenance"
1.3 架构设计与工作原理
整体架构
Alert Rules Notification Channels Data Sources Prometheus Ecosystem CPU Alert Memory Alert Disk Alert Email Slack Webhook SMS Node Exporter Container Exporter Application Exporter Prometheus Server Alertmanager Grafana
工作流程
- 告警生成:Prometheus 根据告警规则评估指标数据
- 告警发送:Prometheus 将触发的告警发送给 Alertmanager
- 告警接收:Alertmanager 接收并验证告警
- 去重处理:识别和合并重复告警
- 分组处理:根据配置将告警分组
- 路由匹配:根据标签匹配路由规则
- 抑制检查:检查是否有抑制规则适用
- 静默检查:检查是否有静默规则适用
- 通知发送:向匹配的接收器发送通知
- 状态管理:跟踪告警状态和通知历史
数据流图
Prometheus Alertmanager Receiver Send Alert Deduplicate Group Alerts Apply Routes Check Inhibition Check Silence Send Notification Acknowledge Alert Resolution Send Resolved Alert Send Resolution Notification Prometheus Alertmanager Receiver
核心组件
1. API 服务器
- 接收来自 Prometheus 的告警
- 提供 REST API 接口
- 处理静默和配置管理
2. 通知管理器
- 管理通知发送逻辑
- 处理重试和失败恢复
- 跟踪通知状态
3. 配置管理器
- 加载和验证配置文件
- 支持配置热重载
- 提供配置验证
4. 存储引擎
- 存储告警状态
- 管理静默规则
- 持久化通知历史
1.4 与 Prometheus 的集成
Prometheus 配置
在 Prometheus 配置文件中指定 Alertmanager:
yaml
# prometheus.yml
alerting:
alertmanagers:
- static_configs:
- targets:
- alertmanager-01:9093
- alertmanager-02:9093
timeout: 10s
api_version: v2
rule_files:
- "alert_rules/*.yml"
告警规则示例
yaml
# alert_rules/node_alerts.yml
groups:
- name: node_alerts
rules:
- alert: HighCPUUsage
expr: 100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
for: 5m
labels:
severity: warning
team: infrastructure
annotations:
summary: "High CPU usage on {{ $labels.instance }}"
description: "CPU usage is {{ $value }}% on {{ $labels.instance }}"
runbook_url: "https://wiki.company.com/runbooks/high-cpu"
- alert: HighMemoryUsage
expr: (node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100 > 90
for: 10m
labels:
severity: critical
team: infrastructure
annotations:
summary: "High memory usage on {{ $labels.instance }}"
description: "Memory usage is {{ $value }}% on {{ $labels.instance }}"
runbook_url: "https://wiki.company.com/runbooks/high-memory"
- alert: DiskSpaceLow
expr: (node_filesystem_size_bytes - node_filesystem_free_bytes) / node_filesystem_size_bytes * 100 > 85
for: 15m
labels:
severity: warning
team: infrastructure
annotations:
summary: "Low disk space on {{ $labels.instance }}"
description: "Disk usage is {{ $value }}% on {{ $labels.instance }} ({{ $labels.mountpoint }})"
runbook_url: "https://wiki.company.com/runbooks/disk-space"
集成验证
验证 Prometheus 与 Alertmanager 的连接:
bash
# 检查 Prometheus 目标状态
curl http://prometheus:9090/api/v1/targets | jq '.data.activeTargets[] | select(.job=="alertmanager")'
# 检查告警规则
curl http://prometheus:9090/api/v1/rules | jq '.data.groups[].rules[] | select(.type=="alerting")'
# 检查活跃告警
curl http://prometheus:9090/api/v1/alerts
1.5 部署模式
单实例部署
适用于小规模环境或测试环境:
yaml
# docker-compose.yml
version: '3.8'
services:
alertmanager:
image: prom/alertmanager:latest
ports:
- "9093:9093"
volumes:
- ./alertmanager.yml:/etc/alertmanager/alertmanager.yml
- alertmanager-data:/alertmanager
command:
- '--config.file=/etc/alertmanager/alertmanager.yml'
- '--storage.path=/alertmanager'
- '--web.external-url=http://localhost:9093'
volumes:
alertmanager-data:
高可用集群
适用于生产环境:
yaml
# 集群配置示例
version: '3.8'
services:
alertmanager-01:
image: prom/alertmanager:latest
ports:
- "9093:9093"
volumes:
- ./alertmanager.yml:/etc/alertmanager/alertmanager.yml
command:
- '--config.file=/etc/alertmanager/alertmanager.yml'
- '--storage.path=/alertmanager'
- '--web.external-url=http://alertmanager-01:9093'
- '--cluster.listen-address=0.0.0.0:9094'
- '--cluster.peer=alertmanager-02:9094'
- '--cluster.peer=alertmanager-03:9094'
alertmanager-02:
image: prom/alertmanager:latest
ports:
- "9094:9093"
volumes:
- ./alertmanager.yml:/etc/alertmanager/alertmanager.yml
command:
- '--config.file=/etc/alertmanager/alertmanager.yml'
- '--storage.path=/alertmanager'
- '--web.external-url=http://alertmanager-02:9093'
- '--cluster.listen-address=0.0.0.0:9094'
- '--cluster.peer=alertmanager-01:9094'
- '--cluster.peer=alertmanager-03:9094'
alertmanager-03:
image: prom/alertmanager:latest
ports:
- "9095:9093"
volumes:
- ./alertmanager.yml:/etc/alertmanager/alertmanager.yml
command:
- '--config.file=/etc/alertmanager/alertmanager.yml'
- '--storage.path=/alertmanager'
- '--web.external-url=http://alertmanager-03:9093'
- '--cluster.listen-address=0.0.0.0:9094'
- '--cluster.peer=alertmanager-01:9094'
- '--cluster.peer=alertmanager-02:9094'
1.6 性能特性
处理能力
- 告警吞吐量:单实例可处理数千个告警/秒
- 并发连接:支持数百个并发 HTTP 连接
- 内存使用:基础运行需要 64MB,建议 256MB+
- 存储需求:告警状态和静默数据通常 < 100MB
扩展性
- 水平扩展:支持多实例集群部署
- 负载均衡:Prometheus 可配置多个 Alertmanager 实例
- 数据同步:集群间自动同步告警状态和静默
- 故障转移:自动处理实例故障和恢复
可靠性
- 持久化存储:告警状态持久化到磁盘
- 优雅关闭:支持优雅关闭和重启
- 配置验证:启动时验证配置文件
- 健康检查:提供健康检查端点
1.7 版本演进
主要版本特性
v0.15.x
- 引入 API v2
- 改进 Web UI
- 增强集群功能
v0.20.x
- 支持 UTF-8 标签
- 改进模板系统
- 增强安全特性
v0.24.x(当前稳定版)
- 改进性能和稳定性
- 增强监控指标
- 优化内存使用
v0.25.x(最新版)
- 支持新的通知渠道
- 改进 API 功能
- 增强配置验证
兼容性
- 向后兼容:配置文件格式保持向后兼容
- API 版本:支持 v1 和 v2 API
- Prometheus 集成:与 Prometheus 2.x 完全兼容
本章小结
本章介绍了 Alertmanager 的基础概念和架构设计:
核心要点
- 功能定位:Alertmanager 是 Prometheus 生态系统中的告警管理组件
- 核心概念:掌握告警、标签、路由、接收器等基本概念
- 架构设计:理解组件架构和数据流程
- 集成方式:了解与 Prometheus 的集成配置
- 部署模式:支持单实例和高可用集群部署
关键特性
- 智能处理:去重、分组、路由功能
- 灵活配置:丰富的配置选项和规则
- 多渠道通知:支持多种通知方式
- 高可用性:集群部署和故障转移
- 可扩展性:支持自定义开发和集成
下一步学习
在下一章中,我们将学习如何安装和部署 Alertmanager,包括:
- 单机部署方法
- 容器化部署
- Kubernetes 部署
- 高可用集群配置
下一章: 安装部署与环境配置