出事你总是最后一个知道,这是没有告警体系的站长常态。先划清边界:这个系列之前讲过服务器可用性监控那篇,管的是机器死活——HTTP 状态码异常、页面关键词消失就报警。这篇管另一层:服务器活得好好的,但 SEO 业务指标出偏了——抓取量腰斩、5xx 占比抬头、核心词排名掉出前十。两层监控互补,别指望一套管完。
告警触发器设计是关键,分两类阈值。绝对阈值适用于有明确红线的指标:5xx 占比超过 2% 直接报。相对偏差适用于天然波动的指标:抓取量、收录量每天上下浮动百分之十几很正常,跟前一天比会天天误报,正确做法是和近 7 日均值比、偏差超过四成才报,并且连续两天越限才发消息。阈值宁松勿紧——告警疲劳比漏报更致命,报三次狼来了之后,真狼来了你也懒得点开。
import csv, statistics, datetime
def load_crawl(path="crawl_daily.csv"):
rows = list(csv.reader(open(path)))[1:] # date,count
return {r[0]: int(r[1]) for r in rows}
def check_crawl_drop():
d = load_crawl()
today = max(d)
yesterday = sorted(d)[-2]
hist = [d[k] for k in sorted(d)[-8:-1]] # 前7天
if len(hist) < 7:
return None
mean7 = statistics.mean(hist)
dev = (d[yesterday] - mean7) / mean7
if dev < -0.4: # 跌破七日均值四成
return "抓取量 {} 为 {},7日均值 {:.0f},偏离 {:.0%}".format(
yesterday, d[yesterday], mean7, dev)
return None
告警通道用企业微信群机器人:群里右键添加机器人,拿到一个 webhook 地址,往这个地址 POST 一段 JSON 就能在群里发消息。markdown 类型消息支持标题、加粗、引用、链接,还有三种字体颜色,warning 橙红色标异常数字特别醒目;内容上限 4096 字节——注意是字节不是字数,中文一个字占三个字节,正文控制在千字以内最保险。两条硬规矩:每个机器人每分钟最多 20 条消息,超限接口报 45009 错误;webhook 地址等同密码,泄露了谁都能往你群里塞垃圾消息。
import requests, time
WEBHOOK = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=你的key"
def alert(md):
payload = {"msgtype": "markdown",
"markdown": {"content": md[:3800]}}
r = requests.post(WEBHOOK, json=payload, timeout=10)
if r.json().get("errcode") != 0:
print("send fail:", r.text) # 45009=触发限流
def send_alert(text):
md = ("## <font color=\"warning\">SEO 异动</font>\n"
"> " + text + "\n"
"> 时间:" + time.strftime("%F %H:%M") + "\n"
"[查看日志明细](http://your-server/seo/daily.html)")
alert(md)
msg = check_crawl_drop()
if msg:
send_alert(msg)
验证方法:先手动触发一条测试消息确认 webhook 通了,再把昨天的抓取量改成极端值跑一遍检测逻辑,看群里能不能收到格式正确的告警。上线后还要做一件事——告警冷却。同一个指标一天最多报一次,用个时间戳文件记录上次告警时间即可,不然指标在阈值附近震荡,企业微信一小时内被刷二十条,这个群就废了。告警跑顺之后每月复盘一次阈值,太安静说明阈值太松,天天响说明太紧,微调到每周零星一两声,就是健康状态。
相关阅读:告警是巡检的兜底。《SEO 自动化总清单:日、周、月、季各该跑什么》的日常动作都有本篇的企业微信告警盯着,人不在电脑前,异常也会来找你。
A5创业网 版权所有