2026.06.06 | youres | 28次围观
为什么选择Slack做网站告警通知
邮件告警有延迟,钉钉、企业微信需要企业资质,而Slack Webhook配置是最简单的HTTP回调——只需一个curl命令就能把告警推送到指定频道,无需SDK,无需认证,跨平台通用。
对于运维团队来说,把网站重定向异常(301循环、302临时跳转、重定向次数超限)实时推送到Slack,比邮件快得多,也比钉钉/企业微信更容易集成到现有自动化流程里。
前置条件:获取Slack Webhook URL
在Slack工作区依次进入:Settings & Administration → Manage Apps → Custom Integrations → Incoming Webhooks → Add to Slack,选择目标频道后,会生成一个类似这样的URL:
https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX
保存好这个URL,后续所有curl告警请求都往这个地址发。
实战脚本一:基础重定向异常Slack告警
先写一个最基础的脚本:用curl检测目标URL的重定向次数,超过阈值就发Slack告警。
#!/bin/bash
TARGET_URL="https://example.com"
WEBHOOK_URL="https://hooks.slack.com/services/你的Webhook地址"
MAX_REDIRECTS=3
redirect_count=$(curl -s -o /dev/null -w "%{num_redirects}" -L --max-redirs 10 "$TARGET_URL")
if [ "$redirect_count" -gt "$MAX_REDIRECTS" ]; then
curl -s -X POST -H "Content-type: application/json" \
--data "{\"text\":\"警报 重定向异常告警:$TARGET_URL 跳转次数 ${redirect_count} 次,超过阈值 ${MAX_REDIRECTS} 次\"}" \
"$WEBHOOK_URL"
fi
这个脚本的核心逻辑:用curl -w "%{num_redirects}"拿到重定向次数,超过阈值就用curl POST一个JSON到Slack Webhook。
实战脚本二:带字段格式化的富文本告警
Slack支持Block Kit格式,比纯文本效果好得多。下面这个脚本用Block Kit格式化告警消息:
#!/bin/bash
TARGET_URL="https://example.com"
WEBHOOK_URL="https://hooks.slack.com/services/你的Webhook地址"
http_code=$(curl -s -o /dev/null -w "%{http_code}" -L "$TARGET_URL")
final_url=$(curl -s -o /dev/null -w "%{url_effective}" -L "$TARGET_URL")
redirect_count=$(curl -s -o /dev/null -w "%{num_redirects}" -L "$TARGET_URL")
if [ "$http_code" -ne 200 ]; then
curl -s -X POST -H "Content-type: application/json" \
--data "{
\"blocks\": [
{
\"type\": \"header\",
\"text\": {\"type\": \"plain_text\", \"text\": \"警报 网站重定向告警\"}
},
{
\"type\": \"section\",
\"fields\": [
{\"type\": \"mrkdwn\", \"text\": \"*目标URL:* $TARGET_URL\"},
{\"type\": \"mrkdwn\", \"text\": \"*最终状态码:* $http_code\"},
{\"type\": \"mrkdwn\", \"text\": \"*重定向次数:* $redirect_count\"},
{\"type\": \"mrkdwn\", \"text\": \"*最终地址:* $final_url\"}
]
}
]
}" \
"$WEBHOOK_URL"
fi
Block Kit格式的告警在Slack里显示为一个卡片,包含标题和4个字段,比纯文本直观很多。
实战脚本三:告警分级+频道路由
真实场景里,警告和严重告警应该推送到不同频道。下面这个脚本实现告警分级路由:
#!/bin/bash
TARGET_URL="https://example.com"
WEBHOOK_WARN="https://hooks.slack.com/services/警告频道Webhook"
WEBHOOK_CRIT="https://hooks.slack.com/services/严重告警频道Webhook"
redirect_count=$(curl -s -o /dev/null -w "%{num_redirects}" -L --max-redirs 10 "$TARGET_URL")
time_redirect=$(curl -s -o /dev/null -w "%{time_redirect}" -L "$TARGET_URL")
if [ "$redirect_count" -gt 5 ]; then
# 严重告警:重定向次数>5,推送到严重告警频道
curl -s -X POST -H "Content-type: application/json" \
--data "{\"text\":\"🔴 严重:$TARGET_URL 重定向 ${redirect_count} 次,疑似重定向循环\"}" \
"$WEBHOOK_CRIT"
elif [ "$(echo "$time_redirect > 1" | bc)" -eq 1 ]; then
# 警告:重定向耗时>1秒,推送到警告频道
curl -s -X POST -H "Content-type: application/json" \
--data "{\"text\":\"🟡 警告:$TARGET_URL 重定向耗时 ${time_redirect}s\"}" \
"$WEBHOOK_WARN"
fi
关键注意事项
- Slack Webhook只支持POST:必须用
-X POST,且Content-type设为application/json - JSON里的双引号要转义:在Shell脚本里,JSON的双引号写成
\" - curl的
-s参数不能省:否则curl的进度条输出会混进告警消息里 - Webhook URL要保密:不要把Webhook URL写进公开仓库,建议用环境变量传入
与钉钉/企业微信告警的对比
| 对比项 | Slack Webhook | 钉钉机器人 | 企业微信机器人 |
|---|---|---|---|
| 配置难度 | 最简单 | 简单 | 中等 |
| 消息格式 | Block Kit(富文本) | Markdown | 纯文本/图文 |
| 是否需要认证 | 无需认证 | 可选加签 | 需CorpID/Secret |
| 适用场景 | 技术团队、开源项目 | 国内企业 | 国内企业 |
相关文章推荐
版权声明
本文仅代表个人观点。
本文系AI辅助作者原创,未经许可,转载请保留原文链接。

发表评论