已解决:实时服务器健康监控:Grafana 到 Telegram 集成
Source: Dev.to
为什么这很重要
作为一名 DevOps 工程师,你了解其中的流程:时刻保持警惕、不断收到电子邮件警报、处理复杂的仪表盘,以及偶尔出现的“用户报告”事件。这种被动的做法:
- 增加停机时间并损害声誉。
- 产生警报疲劳。
- 在你可能永远不会使用的 SaaS 功能上浪费预算。
想象一下,您可以通过熟悉的消息应用程序即时在手机上收到关键的服务器健康警报。 本教程将手把手教你构建这样的一整套工作流。
前置条件
- Grafana – 运行中的实例(v7.0 或更高),已配置仪表盘和数据源(例如 Prometheus、Node Exporter)。
- Telegram – 已安装桌面或移动端应用的账户。
- Telegram Bot – 能够通过 BotFather 创建/管理机器人。
- CLI access – 可以运行
curl的服务器(或本地机器)。 - 基础的服务器管理知识以及对 Grafana 告警规则创建的熟悉程度。
第 1 步 – 创建专用 Telegram 机器人
| 操作 | 详细说明 |
|---|---|
| 启动 BotFather | 打开 Telegram,搜索 @BotFather,并开始聊天。 |
| 创建新机器人 | 发送 /newbot 并按照提示操作。选择一个显示名称(例如 TechResolve Alerts)和一个以 bot 结尾的用户名(例如 techresolve_alerts_bot)。 |
| 保存机器人令牌 | BotFather 会返回类似 123456789:AAH‑u0vj2o‑K0j5g_3x9t_1aB9‑P9L0k7m 的 HTTP API 令牌。请安全保存——Grafana 需要使用它。 |
| 与机器人发起聊天 | 搜索你的机器人用户名,打开对话并发送任意消息(例如 “Hello”)。此步骤是必需的,因为机器人只能向已交互的聊天发送消息。 |
| 获取聊天 ID | 使用 curl 获取更新并提取聊天 ID。将 YOUR_BOT_TOKEN 替换为你刚才保存的令牌: |
curl -s "https://api.telegram.org/botYOUR_BOT_TOKEN/getUpdates" \
| grep -oP '"chat":{"id":\K[^,]*'
输出将是一个或多个数字 ID:
- 私人聊天 → 你的个人聊天 ID(正数)。
- 群组聊天 → 群组聊天 ID(通常为负数,例如
-123456789)。
复制相应的 ID 以供下一步使用。
第 2 步 – 配置 Grafana 的 Telegram 通知渠道
-
打开通知渠道
- 在 Grafana 中,点击 Alerting(铃铛)图标 → Notification channels。
-
添加新渠道
- 点击 Add channel。
-
填写设置
| 字段 | 值 / 备注 |
|---|---|
| Name | 描述性名称,例如 Telegram Alerts。 |
| Type | 从下拉列表中选择 Telegram。 |
| Bot Token | 粘贴步骤 1 中的令牌。 |
| Chat ID | 粘贴步骤 1 中的聊天 ID。 |
| Optional | • Send notification on resolved – 当问题解决时收到消息。 • Include image – 附加带有警报的图表快照。 |
| Message Template | (可选)使用 Go 模板自定义消息 – 详见后面的 “Advanced: Custom Telegram Message Templates” 部分。 |
-
测试渠道
- 点击底部的 Test。你应该在 Telegram 聊天中收到 “Test notification”。
- 如果没有收到,请检查:
- Bot Token 和 Chat ID 是否正确。
- Grafana 服务器能否访问
api.telegram.org(外部互联网访问)。
-
保存 渠道。
第3步 – 创建使用 Telegram 通道的警报规则
- 导航到仪表板 包含您想监控的指标(例如 CPU 使用率、内存、磁盘 I/O)。
- 打开面板的警报标签(或创建新面板)。
- 定义警报条件(例如 “当
node_cpu_seconds_total> 80 % 持续 5 分钟”)。 - 添加通知 → 选择您刚创建的 Telegram 警报 通道。
- 保存仪表板 – 警报规则现已生效,当条件触发时会向 Telegram 推送通知。
高级:自定义 Telegram 消息模板(Go 模板)
Grafana 允许您使用 Go 的模板语法来构建丰富的消息。示例模板:
{{ define "telegram.default.message" }}
🚨 *{{ .Title }}* 🚨
{{ if .State }}*State:* {{ .State }}{{ end }}
{{ if .Message }}*Message:* {{ .Message }}{{ end }}
*Labels:* {{ range $key, $value := .Labels }}{{ $key }}={{ $value }} {{ end }}
*Annotations:* {{ range $key, $value := .Annotations }}{{ $key }}={{ $value }} {{ end }}
{{ if .EvalMatches }}
*Metrics:* {{ range .EvalMatches }}
- {{ .Metric }} = {{ .Value }}{{ end }}
{{ end }}
[View Dashboard]({{ .RuleUrl }})
{{ end }}
- 将此 放入 Telegram 渠道的 Message Template(消息模板)字段中。
- 使用
*bold*、_italic_或`code`进行 Markdown 格式化(Telegram 只支持其子集)。
故障排查清单
| 问题 | 解决方案 |
|---|---|
| Bot Token 拼写错误? | 重新从 BotFather 复制。 |
| Chat ID 错误? | 在向机器人发送新消息后,重新运行 curl 命令。 |
| Grafana 无法连接 Telegram? | 确认防火墙/NAT 规则允许对 api.telegram.org 的出站 HTTPS。 |
| 没有触发警报? | 确保警报规则的评估间隔和条件阈值设置合理。 |
| 消息格式损坏? | 先测试一个简单的模板;然后逐步添加 Go 模板逻辑。 |
回顾
通过遵循这些步骤,你现在拥有:
- 一个可以接收消息的 Telegram 机器人。
- 一个已连接到该机器人的 Grafana 通知渠道。
- 告警规则,可将实时服务器健康通知直接推送到你的移动设备。
享受更快的事件响应、降低告警疲劳,并拥有更精简的监控体系——无需昂贵的 SaaS 订阅。 🎉
Source: …
为服务器健康设置 Grafana 警报(Telegram 集成)
1. 编辑面板
- 将鼠标悬停在需要设置警报的面板上(例如 CPU 使用率 图表)。
- 点击 编辑 图标(铅笔)。
2. 进入警报标签页
在面板编辑器中,点击 Alert 标签(铃铛图标)。
3. 创建警报规则
- 点击 Create Alert。
- 填写必填字段:
| 字段 | 描述 |
|---|---|
| Name | 为警报起一个清晰的名称(例如 High CPU Usage – Server X)。 |
| Evaluate every | Grafana 检查条件的频率(例如 1m)。 |
| For | 条件必须持续多久才会触发警报(例如 5m)。 |
4. 定义查询和条件
查询
选择数据源并编写获取指标的查询。
示例(Prometheus):
avg(node_cpu_seconds_total{mode="idle",instance="server-x:9100"}) by (instance)
随后可以将其转换为当 100 - (AVG_IDLE_CPU_PERCENTAGE) > 80 时触发。
条件
设置警报阈值。
WHEN last() OF A IS ABOVE 80
5. 配置通知
- 在 Send to 部分,从下拉列表中选择你的 Telegram Alerts 通道。
- (可选)为此警报添加自定义消息——它会覆盖通道的默认模板。
6. 保存警报
点击面板编辑器右上角的 Save。
7. 为其他指标重复上述操作
为以下指标创建类似的警报:
- 内存使用率
- 磁盘空间
- 网络错误
根据实际运营需求调整阈值和消息内容。
使用 Go 模板发送丰富的 Telegram 消息
Grafana 的告警引擎支持 Go 模板,允许您编写动态、上下文丰富的通知。
示例消息模板
将以下内容添加到 Telegram 通知渠道(或单个告警规则)的 Message Template 字段中:
{{ range .Alerts }}
🔥 ALERTING 🔥
{{ .Labels.alertname }} on {{ .Labels.instance }} is FIRING!
Severity: {{ .Labels.severity | default "critical" }}
Summary: {{ .Annotations.summary }}
Description: {{ .Annotations.description }}
Value: {{ .ValueString }}
Dashboard: {{ .DashboardURL }}
Panel: {{ .PanelURL }}
{{ end }}
模板拆解
{{ .Alerts }}– 包含本次通知中所有触发的告警的切片。{{ .Labels }}– 访问来自 Prometheus 指标或 Grafana 告警的标签(例如alertname、instance、severity)。{{ .Annotations }}– 在告警规则中定义的自定义键‑值对(例如summary、description)。{{ .ValueString }}– 触发告警的实际数值。{{ .DashboardURL }}/{{ .PanelURL }}– 返回 Grafana 的直接链接,便于快速调查。
提示: 在告警规则中定义注解,例如:
annotations:
summary: "CPU 利用率过高"
description: "检查消耗过多 CPU 的进程。考虑扩容或优化应用程序。"
常见问题与故障排除
| 问题 | 描述 | 解决方案 |
|---|---|---|
| Bot Token 或 Chat ID 错误 | Bot token 拼写错误或 Chat ID 错误。 | 确认 token 完全正确,并确保 Chat ID 属于 bot 已经收到消息的聊天。使用群组的 Chat ID 前,请先将 bot 加入相应群组。 |
| Grafana 网络连接问题 | Grafana 无法访问 api.telegram.org。 | 检查防火墙、代理和 DNS 设置。查看 Grafana 日志中的网络错误。 |
| Telegram API 速率限制 | 每分钟发送的警报过多可能导致临时封禁。 | 设计有意义的警报,避免频繁触发。 |
| 告警规则逻辑缺陷 | 查询或阈值错误导致漏报或噪声告警。 | 仔细检查 Prometheus 查询、评估周期和条件逻辑。 |
后续步骤
- 警报分组与静音: 通过对相关警报进行分组或在维护窗口期间静音来降低噪音。
- 值班集成: 将 Telegram 警报连接到 Grafana OnCall、PagerDuty 或其他升级工具,实现 24/7 覆盖。
- 高级模板: 为消息添加更多上下文(例如,运行手册、工单系统链接)。
您已经将 Grafana 与 Telegram 集成,为团队提供即时、可操作的服务器健康通知,无需依赖电子邮件或昂贵的 SaaS 解决方案。