如果你配置了 Grafana 的报警,会发现它发送出来的模板消息往往非常晦涩,而且对接国内沟通工具(如企业微信机器人)经常会出现复杂的鉴权签名问题,需要写一大段中间层代码来转译。这显然不够”自动化”。

这时候,一个能让自动化流程变得更加直观的工具就该登场了——n8n

n8n 是什么?

n8n 是一个开源的工作流自动化平台,类似 Zapier 或 IFTTT,但它可以自部署、完全免费、数据不出服务器。它提供了可视化的节点编排界面,通过拖拽就能把各种服务串联起来。

核心优势:

  • 开源自部署,数据安全可控
  • 400+ 内置集成节点(HTTP、Webhook、数据库、邮件、各种 IM)
  • 可视化编排,不需要写代码
  • 强大的 JavaScript Function 节点实现自定义逻辑
  • 支持 Cron 定时触发、Webhook 事件触发、手动触发

Docker 一键部署

1
2
3
4
5
6
docker run -d \
--name n8n \
-p 5678:5678 \
-v n8n_data:/home/node/.n8n \
-e N8N_SECURE_COOKIE=false \
n8nio/n8n

访问 http://your-ip:5678 进入工作流编辑器。首次登录需要创建一个管理员账号。

实战:搭建智能报警管道

场景:当 Grafana 检测到异常 → Webhook 触发 n8n → 解析告警内容 → 根据严重程度分流 → 发送到不同通知渠道。

节点 1:Webhook 触发器

  • 类型:Webhook
  • 路径:/grafana-alert
  • 方法:POST
  • 响应模式:立即响应(200 OK)

将这个 Webhook URL 填入 Grafana 的 Alerting → Contact points 中作为 Webhook 类型。

节点 2:Function 节点清洗数据

Grafana 发出的 Webhook 格式冗长且嵌套深。用 JavaScript Function 节点清洗:

1
2
3
4
5
6
7
8
9
10
11
12
const body = $input.first().json;
const alerts = body.alerts || [];

const parsed = alerts.map(a => ({
title: a.annotations?.summary || "未知告警",
severity: a.labels?.severity || "warning",
currentValue: a.values?.B || "N/A",
dashboard: a.labels?.alertname || "",
time: new Date().toLocaleString("zh-CN")
}));

return parsed.map(p => ({ json: p }));

节点 3:IF 条件分流

根据 severity 字段分流处理策略:

  • critical → 发送到企业微信群 + 邮件 + 手机推送
  • warning → 仅发送到企业微信群
  • 其他 → 仅记录日志

节点 4:企业微信机器人

1
2
3
4
5
6
7
8
9
10
{
"method": "POST",
"url": "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY",
"body": {
"msgtype": "markdown",
"markdown": {
"content": "## 🚨 服务器告警\n> 标题: {{$json.title}}\n> 严重程度: {{$json.severity}}\n> 当前值: {{$json.currentValue}}"
}
}
}

节点 5:邮件通知

使用内置的 Email 节点,配置 SMTP(如 Gmail 或 QQ 邮箱),发送包含完整告警信息的邮件。

进阶:定时主动巡检

除了被动接收告警,还可以创建主动巡检的工作流:

  • Cron 触发器:每 30 分钟执行一次
  • HTTP Request 节点:调用 Prometheus API 查询关键指标
  • IF 判断:如果任一指标超阈值 → 触发通知链路
  • 数据库节点:将巡检结果写入 PostgreSQL,后续用于趋势分析

总结

n8n 最大的价值在于,它把”写胶水代码”的低价值工作,变成了拖拽节点的高效编排。一个下午搭建的报警管道,能替代过去需要上千行 Python 脚本才能实现的复杂逻辑。对于个人运维来说,n8n + Grafana + Prometheus 这套组合,基本可以实现完全的无人值守运维。