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% 的循环折扣。

关于本站

搬瓦工VPS中文网(bwgvps.com)是非官方中文信息站,整理搬瓦工的方案、优惠和教程。我们不销售主机,不提供技术服务。

新手必读
搬瓦工优惠码

NODESEEK2026(优惠 6.77%)

购买时填入即可抵扣。