Better Stack + Server酱:服务宕机时推送到微信
效果:Better Stack 拨测到服务宕机或故障时,自动将告警推送到你的微信。
前置条件
- Server酱 SendKey(30 秒获取教程)
- Better Stack 账号,已创建至少一个 Monitor
配置步骤
方式一:直连(固定文案,最快)
在 Better Stack 的 Integrations 中添加 Webhook,URL 填写以下地址(BetterStack%E5%91%8A%E8%AD%A6 是「BetterStack告警」的 URL 编码):
https://sctapi.ftqq.com/你的SENDKEY.send?title=BetterStack%E5%91%8A%E8%AD%A6
Server酱 服务端优先读取 URL query 中的 title 参数。配置完成后,Better Stack 每次触发 incident 时,你的微信会收到一条标题为「BetterStack告警」的消息。
直连方式的限制:Better Stack POST 的 JSON body 不会被解析为 Server酱 的 desp 正文,你只能收到固定标题,看不到 incident 详情。需要故障信息写入正文时,用下面的中转方式。
方式二:中转(带 incident 详情)
用一层中转(如 Cloudflare Workers 或云函数)接收 Better Stack 的 webhook,解析 JSON 后提取 incident 信息,再转发给 Server酱。中转服务向 Server酱 发送的请求格式如下:
curl -X POST "https://sctapi.ftqq.com/你的SENDKEY.send" \
--data-urlencode "title=【故障】${incident_name}" \
--data-urlencode "desp=状态:${incident_state}
URL:${incident_url}
时间:${incident_time}"
其中 ${incident_name} 等变量由中转服务从 Better Stack POST 的 JSON 中提取。如果你使用 Server酱³,端点改为 https://你的UID.push.ft07.com/send/你的SENDKEY.send,UID 是 SendKey 中 sctp 与 t 之间的数字。
完整示例
以下 Cloudflare Workers 脚本接收 Better Stack webhook,将完整 JSON 作为正文转发到 Server酱:
export default {
async fetch(request) {
const body = await request.text();
await fetch("https://sctapi.ftqq.com/你的SENDKEY.send", {
method: "POST",
headers: { "Content-Type": "application/x-www-form-urlencoded" },
body: new URLSearchParams({
title: "BetterStack告警",
desp: body
})
});
return new Response("ok");
}
};
部署后,在 Better Stack 的 Webhook URL 中填入 Workers 地址即可。收到第一条消息后,你可以查看完整 JSON 结构,再按需解析提取字段。
常见问题
直连方式收不到消息怎么办?
确认 SendKey 正确、URL 中中文已 urlencode。Server酱 返回 JSON 中 code 为 0 表示成功。更多排查见 常见问题与排查。
免费额度够用吗?
Server酱 免费版每天 5 条,每分钟上限 50 条。Better Stack 的 incident 触发频率通常不高,日常使用足够。订阅会员目前特价最低 3 元/月,一天最多可发 1000 条(价格详情)。
频率限制是多少?
每分钟 50 条。如果多个 monitor 同时触发告暴,可能需要在 Better Stack 侧合并通知或调整重试间隔。
Better Stack 的 webhook 发了什么数据?
Better Stack 向配置的 URL POST 一段 JSON,包含 incident 的结构化信息。使用中转方式时,可以在 Workers 中打印 request.text() 查看完整内容。
Server酱 支持推送到哪些通道?
Server酱 支持推送到微信服务号/企业微信/钉钉/飞书等多个通道,详见 /getting-started/channels/。