Grafana 告警与 Webhook 集成教程
Grafana 内置了强大的告警系统,可以基于面板查询条件自动触发告警,并通过多种渠道发送通知。本文将介绍如何在 Grafana 中创建告警规则、配置联系点和通知策略,以及与常用平台的 Webhook 集成方法。
一、Grafana 告警架构
Grafana 告警系统由三个核心组件构成:
- Alert Rules(告警规则):定义触发告警的条件表达式。
- Contact Points(联系点):定义告警通知的发送方式和目标。
- Notification Policies(通知策略):定义告警如何路由到不同的联系点。
二、创建告警规则
进入 Grafana 左侧菜单「Alerting」→「Alert rules」→「Create alert rule」。
2.1 定义查询条件
选择数据源(如 Prometheus),编写查询表达式:
# 示例:CPU 使用率超过 80%
100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
# 示例:可用内存低于 200MB
node_memory_MemAvailable_bytes / 1048576
2.2 设置告警条件
- 在「Expressions」中添加条件:选择「Reduce」将范围向量缩减为单一值(Last/Mean/Max)。
- 添加「Threshold」条件:设置阈值,如「Is above 80」。
- 设置评估间隔(Evaluation interval)和持续时间(Pending period):如每 1 分钟评估一次,持续 5 分钟后触发告警。
2.3 添加标签和注解
# 标签(用于路由)
severity = critical
team = ops
# 注解(用于通知内容)
summary = CPU 使用率超过 80%
description = 实例 {{ $labels.instance }} 的 CPU 使用率为 {{ $values.A }}%
三、配置联系点
进入「Alerting」→「Contact points」→「Add contact point」。
3.1 邮件通知
选择「Email」集成类型,需要先在 grafana.ini 中配置 SMTP:
[smtp]
enabled = true
host = smtp.your-domain.com:587
user = alert@your-domain.com
password = your_smtp_password
from_address = alert@your-domain.com
from_name = Grafana Alert
重启 Grafana 后即可使用邮件通知。在联系点中填入收件人邮箱地址。
3.2 Telegram 通知
选择「Telegram」集成类型:
- Bot API Token:通过 Telegram @BotFather 创建机器人获取。
- Chat ID:通过给机器人发送消息后访问
https://api.telegram.org/botYOUR_TOKEN/getUpdates获取。 - 可选:自定义消息模板。
3.3 通用 Webhook
选择「Webhook」集成类型:
- URL:Webhook 接收端点地址。
- HTTP Method:通常选择 POST。
- Username/Password:如果需要基本认证。
Grafana 发送的 Webhook 请求体格式为 JSON,包含告警状态、标签、注解等完整信息。
3.4 Slack 通知
选择「Slack」集成类型:
- Recipient:频道名称或用户 ID。
- Token:Slack Bot Token 或 Incoming Webhook URL。
四、通知策略配置
进入「Alerting」→「Notification policies」,配置告警的路由规则:
- Default policy:未匹配任何规则的告警发送到默认联系点。
- Nested policy:根据告警标签匹配不同的路由规则。
示例路由配置:
severity=critical→ 发送到「紧急通知」联系点(邮件 + Telegram)。severity=warning→ 发送到「普通通知」联系点(仅邮件)。team=dev→ 发送到「开发组」联系点(Slack)。
分组与静默
- Group by:按标签对告警分组,同组告警合并为一条通知。
- Group wait:收到新告警后等待合并的时间。
- Mute timings:设置静默时段,如夜间不发送非紧急告警。
五、自定义 Webhook 接收服务
你可以编写一个简单的服务来接收 Grafana Webhook 并处理告警。以下是 Python Flask 示例:
# webhook_receiver.py
from flask import Flask, request, jsonify
import json
app = Flask(__name__)
@app.route('/webhook', methods=['POST'])
def webhook():
data = request.json
alerts = data.get('alerts', [])
for alert in alerts:
status = alert.get('status')
labels = alert.get('labels', {})
annotations = alert.get('annotations', {})
print(f"[{status}] {labels.get('alertname')}: {annotations.get('summary')}")
# 在此添加自定义处理逻辑(发短信、调用 API 等)
return jsonify({"status": "ok"}), 200
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5001)
六、告警模板自定义
在「Alerting」→「Contact points」中编辑联系点时,可以自定义消息模板。Grafana 使用 Go 模板语法:
{{ define "custom_alert" }}
告警名称: {{ .CommonLabels.alertname }}
严重程度: {{ .CommonLabels.severity }}
状态: {{ .Status }}
{{ range .Alerts }}
实例: {{ .Labels.instance }}
摘要: {{ .Annotations.summary }}
详情: {{ .Annotations.description }}
触发时间: {{ .StartsAt.Format "2006-01-02 15:04:05" }}
{{ end }}
{{ end }}
七、测试告警
配置完成后进行测试:
- 在联系点配置页面点击「Test」按钮发送测试通知。
- 创建一条容易触发的临时告警规则(如
vector(1) > 0),验证通知链路。 - 检查 Grafana 日志排查问题:
journalctl -u grafana-server -f | grep -i alert
八、告警静默
进入「Alerting」→「Silences」→「Create silence」:
- 选择持续时间或指定开始和结束时间。
- 添加标签匹配器来精确控制哪些告警被静默。
- 适用场景:计划维护期间、已知问题调查期间。
九、常见问题
告警不触发
检查告警规则的状态(Normal/Pending/Firing),确认查询返回的数据是否满足阈值条件。在规则编辑页面可以预览查询结果。
通知发送失败
检查联系点的测试结果,查看 Grafana 日志中的错误信息。常见原因是 SMTP 配置不正确或 Webhook URL 不可达。
总结
Grafana 的告警系统提供了灵活的规则定义和丰富的通知渠道,可以与 AlertManager 互补使用。通过 Webhook 集成,你可以将告警对接到几乎任何通知平台。选购搬瓦工 VPS 请参考 全部方案,使用优惠码 NODESEEK2026 可享受 6.77% 的循环折扣。