Grafana 告警配置 #
告警系统概述 #
Grafana 告警系统允许你基于数据源中的数据定义告警规则,当条件满足时自动发送通知。
text
┌─────────────────────────────────────────────────────────────┐
│ 告警系统架构 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ │
│ │ 数据源 │ Prometheus / InfluxDB / MySQL │
│ └──────┬──────┘ │
│ │ │
│ ▼ │
│ ┌─────────────┐ │
│ │ 告警规则 │ 定义触发条件 │
│ └──────┬──────┘ │
│ │ │
│ ▼ │
│ ┌─────────────┐ │
│ │ 评估引擎 │ 周期性评估规则 │
│ └──────┬──────┘ │
│ │ │
│ ▼ │
│ ┌─────────────┐ │
│ │ 告警状态 │ OK → Pending → Firing → Resolved │
│ └──────┬──────┘ │
│ │ │
│ ▼ │
│ ┌─────────────┐ │
│ │ 通知渠道 │ 邮件、Slack、钉钉、Webhook 等 │
│ └─────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
告警状态流转 #
text
┌─────────────────────────────────────────────────────────────┐
│ 告警状态流转 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────┐ │
│ │ OK │ 正常状态 │
│ └────┬────┘ │
│ │ │
│ 条件触发 │
│ │ │
│ ▼ │
│ ┌─────────┐ │
│ │ Pending │ 等待确认(持续时间) │
│ └────┬────┘ │
│ │ │
│ 持续时间到达 │
│ │ │
│ ▼ │
│ ┌─────────┐ │
│ │ Firing │ 触发告警,发送通知 │
│ └────┬────┘ │
│ │ │
│ 条件恢复 │
│ │ │
│ ▼ │
│ ┌─────────┐ │
│ │ Resolved│ 已恢复,发送恢复通知 │
│ └────┬────┘ │
│ │ │
│ ▼ │
│ ┌─────────┐ │
│ │ OK │ 回到正常状态 │
│ └─────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
告警规则配置 #
创建告警规则 #
text
┌─────────────────────────────────────────────────────────────┐
│ 创建告警规则步骤 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 1. 进入 Alerting → Alert rules │
│ │
│ 2. 点击 "New alert rule" │
│ │
│ 3. 配置规则: │
│ ├── 规则名称 │
│ ├── 数据源和查询 │
│ ├── 表达式和条件 │
│ ├── 评估行为 │
│ └── 文件夹和分组 │
│ │
│ 4. 保存规则 │
│ │
└─────────────────────────────────────────────────────────────┘
规则配置详解 #
yaml
Alert Rule:
Name: High CPU Usage
Query:
Data source: Prometheus
Query: 100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
Expression:
Type: Classic condition
Condition: WHEN last() OF query(A) IS ABOVE 80
Evaluation:
Evaluate every: 1m
For: 5m
Annotations:
Summary: High CPU usage detected on {{ $labels.instance }}
Description: CPU usage is {{ $value }}%
Runbook URL: https://wiki.example.com/runbooks/high-cpu
Labels:
severity: warning
team: infrastructure
表达式类型 #
text
┌─────────────────────────────────────────────────────────────┐
│ 表达式类型 │
├─────────────────────────────────────────────────────────────┤
│ │
│ Classic condition(经典条件): │
│ ├── WHEN last() OF query(A) IS ABOVE 80 │
│ ├── WHEN avg() OF query(A) IS BELOW 10 │
│ └── 支持函数:last(), avg(), min(), max(), sum(), count() │
│ │
│ Math(数学表达式): │
│ ├── $A > 80 │
│ ├── $A + $B > 100 │
│ └── 支持数学运算和函数 │
│ │
│ Reduce(聚合): │
│ ├── 将时间序列聚合为单个值 │
│ ├── Mode: Strict / Replace non-numeric │
│ └── Function: Last, Mean, Min, Max, Sum, Count │
│ │
│ Resample(重采样): │
│ └── 改变数据的时间分辨率 │
│ │
│ Threshold(阈值): │
│ ├── $A > 80 │
│ └── 支持多阈值配置 │
│ │
└─────────────────────────────────────────────────────────────┘
评估行为 #
text
┌─────────────────────────────────────────────────────────────┐
│ 评估行为配置 │
├─────────────────────────────────────────────────────────────┤
│ │
│ Evaluate every(评估间隔): │
│ ├── 多久评估一次规则 │
│ ├── 示例:1m, 5m, 10m │
│ └── 建议:根据数据采集频率设置 │
│ │
│ For(持续时间): │
│ ├── 条件持续多久才触发告警 │
│ ├── 示例:0s, 1m, 5m, 10m │
│ └── 作用:避免瞬时波动触发告警 │
│ │
│ 配置示例: │
│ ├── 评估间隔:1m │
│ ├── 持续时间:5m │
│ └── 含义:连续 5 次评估都满足条件才触发 │
│ │
└─────────────────────────────────────────────────────────────┘
告警标签和注解 #
yaml
Labels(标签):
severity: critical | warning | info
team: infrastructure | application | database
environment: production | staging | development
service: api | web | worker
Annotations(注解):
summary: 简短描述
description: 详细描述
runbook_url: 操作手册链接
dashboard_url: 相关仪表板链接
grafana_folder: Grafana 文件夹
使用模板变量 #
text
┌─────────────────────────────────────────────────────────────┐
│ 模板变量 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 标签值: │
│ {{ $labels.instance }} 实例名称 │
│ {{ $labels.job }} 任务名称 │
│ {{ $labels.service }} 服务名称 │
│ │
│ 指标值: │
│ {{ $value }} 当前值 │
│ {{ $values.A }} 查询 A 的值 │
│ {{ $values.A.Labels }} 查询 A 的标签 │
│ │
│ 时间: │
│ {{ .Time }} 告警时间 │
│ {{ .StartsAt }} 开始时间 │
│ {{ .EndsAt }} 结束时间 │
│ │
│ 示例: │
│ Summary: High CPU on {{ $labels.instance }} │
│ Description: CPU is at {{ $value }}% │
│ │
└─────────────────────────────────────────────────────────────┘
通知渠道配置 #
Contact Point(联系点) #
text
┌─────────────────────────────────────────────────────────────┐
│ 联系点类型 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 即时通讯: │
│ ├── Slack Slack 频道 │
│ ├── Discord Discord 频道 │
│ ├── Telegram Telegram 群组 │
│ ├── DingTalk 钉钉机器人 │
│ ├── WeCom 企业微信 │
│ └── Feishu 飞书机器人 │
│ │
│ 邮件: │
│ └── Email 邮件通知 │
│ │
│ 自动化: │
│ ├── Webhook HTTP 回调 │
│ ├── PagerDuty 事件管理平台 │
│ ├── Opsgenie 事件管理平台 │
│ ├── VictorOps 事件管理平台 │
│ └── Kafka Kafka 消息队列 │
│ │
│ 其他: │
│ └── Pushover 移动推送 │
│ │
└─────────────────────────────────────────────────────────────┘
配置邮件通知 #
text
┌─────────────────────────────────────────────────────────────┐
│ 邮件配置 │
├─────────────────────────────────────────────────────────────┤
│ │
│ Contact point: │
│ ├── Name: Email Team │
│ ├── Type: Email │
│ └── Addresses: team@example.com, oncall@example.com │
│ │
│ SMTP 配置(grafana.ini): │
│ [smtp] │
│ enabled = true │
│ host = smtp.example.com:587 │
│ user = grafana@example.com │
│ password = ******** │
│ from_address = grafana@example.com │
│ from_name = Grafana Alerting │
│ │
└─────────────────────────────────────────────────────────────┘
配置 Slack 通知 #
yaml
Contact Point:
Name: Slack Team
Type: Slack
Integration settings:
Webhook URL: https://hooks.slack.com/services/xxx/xxx/xxx
Channel: #alerts
Username: Grafana
Icon URL: https://grafana.com/img/fav32.png
Optional settings:
Mention users: @here
Mention groups: @oncall
Token: xoxb-xxx-xxx-xxx
配置钉钉通知 #
yaml
Contact Point:
Name: DingTalk Team
Type: DingTalk
Integration settings:
Webhook URL: https://oapi.dingtalk.com/robot/send?access_token=xxx
Secret: SECxxx (加签密钥)
Message Type: Text / Link / Markdown
Message content:
Title: {{ .CommonLabels.alertname }}
Content: |
告警名称: {{ .CommonLabels.alertname }}
告警级别: {{ .CommonLabels.severity }}
告警详情: {{ .CommonAnnotations.description }}
配置 Webhook 通知 #
yaml
Contact Point:
Name: Custom Webhook
Type: Webhook
Integration settings:
URL: https://api.example.com/alerts
HTTP Method: POST
Authorization Header: Bearer xxx
Message content:
Body: |
{
"alertname": "{{ .CommonLabels.alertname }}",
"severity": "{{ .CommonLabels.severity }}",
"instance": "{{ .CommonLabels.instance }}",
"value": "{{ $value }}",
"summary": "{{ .CommonAnnotations.summary }}"
}
通知策略 #
通知策略配置 #
text
┌─────────────────────────────────────────────────────────────┐
│ 通知策略结构 │
├─────────────────────────────────────────────────────────────┤
│ │
│ Root Policy(根策略): │
│ ├── 默认匹配所有告警 │
│ └── 设置默认联系点和分组 │
│ │
│ Child Policies(子策略): │
│ ├── 根据标签匹配特定告警 │
│ ├── 覆盖父策略设置 │
│ └── 可嵌套多层 │
│ │
│ 匹配顺序: │
│ ├── 从根策略开始 │
│ ├── 按顺序检查子策略 │
│ └── 使用第一个匹配的策略 │
│ │
└─────────────────────────────────────────────────────────────┘
策略配置示例 #
yaml
Notification Policy:
Root:
Group by: ['alertname', 'instance']
Group wait: 30s
Group interval: 5m
Repeat interval: 12h
Contact point: Default Team
Child Policies:
- Matcher:
severity: critical
Contact point: Critical Team
Group wait: 10s
Group interval: 1m
Repeat interval: 1h
- Matcher:
team: database
Contact point: DBA Team
Group by: ['alertname']
- Matcher:
severity: warning
team: application
Contact point: App Team
Repeat interval: 4h
分组设置 #
text
┌─────────────────────────────────────────────────────────────┐
│ 分组设置说明 │
├─────────────────────────────────────────────────────────────┤
│ │
│ Group by(分组依据): │
│ ├── 按指定标签分组告警 │
│ ├── 相同标签值的告警分为一组 │
│ └── 示例:['alertname', 'instance'] │
│ │
│ Group wait(组等待时间): │
│ ├── 等待多长时间收集同组告警 │
│ ├── 然后一起发送通知 │
│ └── 示例:30s │
│ │
│ Group interval(组间隔): │
│ ├── 同一组告警发送通知的最小间隔 │
│ └── 示例:5m │
│ │
│ Repeat interval(重复间隔): │
│ ├── 告警持续触发时重复发送通知的间隔 │
│ └── 示例:12h │
│ │
└─────────────────────────────────────────────────────────────┘
告警静默 #
创建静默规则 #
text
┌─────────────────────────────────────────────────────────────┐
│ 静默规则配置 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 创建步骤: │
│ 1. 进入 Alerting → Silences │
│ 2. 点击 "New silence" │
│ 3. 配置匹配器和持续时间 │
│ 4. 保存 │
│ │
│ 配置示例: │
│ ├── Matchers: instance = server-01 │
│ ├── Start: 2024-01-15 10:00 │
│ ├── Duration: 2h │
│ ├── Reason: Scheduled maintenance │
│ └── Created by: admin │
│ │
└─────────────────────────────────────────────────────────────┘
静默匹配器 #
text
┌─────────────────────────────────────────────────────────────┐
│ 匹配器语法 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 精确匹配: │
│ instance = server-01 │
│ │
│ 正则匹配: │
│ instance =~ server-.* │
│ │
│ 排除匹配: │
│ instance != server-01 │
│ instance !~ server-.* │
│ │
│ 多条件匹配: │
│ instance = server-01, severity = critical │
│ │
└─────────────────────────────────────────────────────────────┘
告警规则示例 #
系统监控告警 #
yaml
High CPU Usage:
Query: 100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
Condition: WHEN last() OF query(A) IS ABOVE 80
For: 5m
Labels:
severity: warning
team: infrastructure
Annotations:
summary: High CPU usage on {{ $labels.instance }}
description: CPU usage is {{ $value }}%
High Memory Usage:
Query: (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100
Condition: WHEN last() OF query(A) IS ABOVE 90
For: 5m
Labels:
severity: critical
team: infrastructure
Annotations:
summary: High memory usage on {{ $labels.instance }}
description: Memory usage is {{ $value }}%
Disk Space Low:
Query: (1 - (node_filesystem_avail_bytes{fstype!="tmpfs"} / node_filesystem_size_bytes{fstype!="tmpfs"})) * 100
Condition: WHEN last() OF query(A) IS ABOVE 85
For: 5m
Labels:
severity: warning
team: infrastructure
Annotations:
summary: Disk space low on {{ $labels.instance }}
description: Disk {{ $labels.mountpoint }} usage is {{ $value }}%
应用监控告警 #
yaml
High Error Rate:
Query: sum(rate(http_requests_total{status=~"5.."}[5m])) / sum(rate(http_requests_total[5m])) * 100
Condition: WHEN last() OF query(A) IS ABOVE 5
For: 2m
Labels:
severity: critical
team: application
Annotations:
summary: High error rate detected
description: Error rate is {{ $value }}%
High Latency:
Query: histogram_quantile(0.95, sum(rate(http_request_duration_seconds_bucket[5m])) by (le))
Condition: WHEN last() OF query(A) IS ABOVE 1
For: 5m
Labels:
severity: warning
team: application
Annotations:
summary: High latency detected
description: P95 latency is {{ $value }}s
Service Down:
Query: up{job="my-service"}
Condition: WHEN last() OF query(A) IS BELOW 1
For: 1m
Labels:
severity: critical
team: application
Annotations:
summary: Service {{ $labels.job }} is down
description: Instance {{ $labels.instance }} is not responding
数据库监控告警 #
yaml
MySQL Down:
Query: mysql_up
Condition: WHEN last() OF query(A) IS BELOW 1
For: 1m
Labels:
severity: critical
team: database
Annotations:
summary: MySQL is down
description: MySQL instance {{ $labels.instance }} is not responding
MySQL Too Many Connections:
Query: mysql_global_status_threads_connected / mysql_global_variables_max_connections * 100
Condition: WHEN last() OF query(A) IS ABOVE 80
For: 2m
Labels:
severity: warning
team: database
Annotations:
summary: MySQL connection usage high
description: Connection usage is {{ $value }}%
Redis Down:
Query: redis_up
Condition: WHEN last() OF query(A) IS BELOW 1
For: 1m
Labels:
severity: critical
team: database
Annotations:
summary: Redis is down
description: Redis instance {{ $labels.instance }} is not responding
告警管理 #
查看告警状态 #
text
┌─────────────────────────────────────────────────────────────┐
│ 告警状态视图 │
├─────────────────────────────────────────────────────────────┤
│ │
│ Alerting → Alert rules: │
│ ├── 查看所有告警规则 │
│ ├── 查看规则状态 │
│ └── 编辑/删除规则 │
│ │
│ Alerting → Alert groups: │
│ ├── 按分组查看告警 │
│ ├── 查看告警详情 │
│ └── 操作告警(静默、确认) │
│ │
│ Dashboard Panel: │
│ ├── 面板上显示告警状态 │
│ └── 点击查看告警详情 │
│ │
└─────────────────────────────────────────────────────────────┘
告警操作 #
text
┌─────────────────────────────────────────────────────────────┐
│ 告警操作 │
├─────────────────────────────────────────────────────────────┤
│ │
│ Silence(静默): │
│ ├── 暂时停止告警通知 │
│ ├── 设置持续时间 │
│ └── 添加静默原因 │
│ │
│ Pause(暂停): │
│ ├── 暂停告警规则评估 │
│ └── 不再触发新告警 │
│ │
│ Test(测试): │
│ ├── 测试告警规则 │
│ └── 发送测试通知 │
│ │
└─────────────────────────────────────────────────────────────┘
最佳实践 #
告警设计原则 #
text
┌─────────────────────────────────────────────────────────────┐
│ 告警设计原则 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 1. 可操作性 │
│ └── 每个告警都应该有明确的处理方式 │
│ │
│ 2. 避免告警疲劳 │
│ ├── 合理设置阈值 │
│ ├── 使用持续时间过滤瞬时波动 │
│ └── 分组和去重 │
│ │
│ 3. 清晰的描述 │
│ ├── 告警名称简洁明了 │
│ ├── 描述包含关键信息 │
│ └── 提供处理文档链接 │
│ │
│ 4. 合理的严重级别 │
│ ├── Critical: 需要立即处理 │
│ ├── Warning: 需要关注 │
│ └── Info: 仅供参考 │
│ │
│ 5. 分层告警 │
│ ├── 基础设施层 │
│ ├── 应用层 │
│ └── 业务层 │
│ │
└─────────────────────────────────────────────────────────────┘
阈值设置建议 #
text
┌─────────────────────────────────────────────────────────────┐
│ 阈值设置参考 │
├─────────────────────────────────────────────────────────────┤
│ │
│ CPU 使用率: │
│ ├── Warning: > 80% │
│ └── Critical: > 95% │
│ │
│ 内存使用率: │
│ ├── Warning: > 85% │
│ └── Critical: > 95% │
│ │
│ 磁盘使用率: │
│ ├── Warning: > 85% │
│ └── Critical: > 95% │
│ │
│ 错误率: │
│ ├── Warning: > 1% │
│ └── Critical: > 5% │
│ │
│ 响应时间(P95): │
│ ├── Warning: > 500ms │
│ └── Critical: > 2s │
│ │
└─────────────────────────────────────────────────────────────┘
通知策略建议 #
text
┌─────────────────────────────────────────────────────────────┐
│ 通知策略建议 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 分组: │
│ ├── 按服务/应用分组 │
│ └── 避免过多单独通知 │
│ │
│ 频率: │
│ ├── Critical: 立即通知,1 小时重复 │
│ ├── Warning: 5 分钟后通知,4 小时重复 │
│ └── Info: 批量通知 │
│ │
│ 渠道: │
│ ├── Critical: 电话/短信 + IM │
│ ├── Warning: IM + 邮件 │
│ └── Info: 邮件 │
│ │
│ 升级: │
│ ├── 长时间未处理自动升级 │
│ └── 通知更高级别人员 │
│ │
└─────────────────────────────────────────────────────────────┘
下一步 #
掌握了告警配置后,接下来学习 高级主题,了解 Provisioning、插件开发等高级功能!
最后更新:2026-03-29