监控CDN状态的脚本如何编写?从原理到实战全解析
目录导读
- 为什么需要自建CDN监控脚本?
- CDN监控脚本的核心检测维度
- 脚本编写的前置准备:API与工具选择
- 实战:四种CDN监控脚本编写方法
- 方案A:基于HTTP状态码的被动监控
- 方案B:Ping + DNS解析的主动探测
- 方案C:利用CDN厂商API获取实时数据
- 方案D:结合Prometheus+Grafana的工业级方案
- 脚本优化与告警集成技巧
- 常见问题QA
为什么需要自建CDN监控脚本?
即便云服务商(如阿里云、腾讯云、Cloudflare)提供了控制台监控,但实际运维中常遇到:

- 数据延迟:厂商面板通常有5-15分钟延迟,无法实时感知节点故障
- 粒度不足:无法区分“单个用户访问慢”还是“全网节点异常”
- 多厂商整合:混合使用AWS CloudFront + 阿里云CDN时,需统一监控面板
- 成本控制:发现异常流量突增(如DDoS)可及时触发清理策略
真实案例:某电商平台在双11期间,仅依赖厂商监控导致15分钟后才发现华北节点宕机,损失百万GMV,自建脚本将发现时间压缩到30秒内。
CDN监控脚本的核心检测维度
一个完整的CDN监控脚本应覆盖以下指标:
| 维度 | 检测方法 | 关键指标 |
|---|---|---|
| 可用性 | HTTP HEAD请求 | 状态码200/403/503,响应时间<2000ms |
| 性能 | 多区域下载测试 | DNS解析时间、TCP连接时间、首字节时间 |
| 缓存命中 | 对比回源量 | x-cache: HIT/MISS 头部 |
| 证书健康 | SSL过期日检测 | 剩余天数<30触发告警 |
| 流量模式 | 带宽/请求数突变 | 环比前1小时增长>200%报警 |
脚本编写的前置准备:API与工具选择
必备工具清单
- 语言:Python 3.8+(推荐requests, socket, ssl库)
- 网络工具:curl(命令行测试)、ping、traceroute
- 数据存储:InfluxDB(时序数据)或直接输出JSON
- 告警通道:邮件(smtplib)、企业微信机器人、钉钉Webhook
获取CDN核心信息方式
# 示例:获取响应头中的缓存状态
import requests
headers = {
'User-Agent': 'CDN-Monitor/1.0',
'Cache-Control': 'no-cache'
}
resp = requests.get('https://cdn.example.com/a.jpg', headers=headers, timeout=5)
print(resp.headers.get('X-Cache')) # HIT / MISS / EXPIRED
实战:四种CDN监控脚本编写方法
方案A:基于HTTP状态码的被动监控(基础版)
#!/usr/bin/env python3
import requests
import time
import smtplib
def check_cdn_status(url='https://static.yourdomain.com'):
try:
start = time.time()
r = requests.get(url, timeout=10, allow_redirects=False)
latency = round((time.time() - start) * 1000, 2)
# 判断异常
if r.status_code != 200:
return {'status': 'DOWN', 'code': r.status_code}
if latency > 3000:
return {'status': 'SLOW', 'latency': latency}
return {'status': 'OK', 'latency': latency}
except requests.Timeout:
return {'status': 'TIMEOUT'}
except Exception as e:
return {'status': 'ERROR', 'msg': str(e)}
# 每60秒检测一次
while True:
result = check_cdn_status()
if result['status'] != 'OK':
print(f"[ALERT] CDN异常: {result}")
time.sleep(60)
方案B:多区域Ping+DNS解析(需分布点)
推荐整合腾讯云SCF或AWS Lambda部署在全球节点:
#!/bin/bash
# 使用curl测试多地CDN边缘节点
REGIONS=("us-east" "eu-west" "ap-northeast")
for region in ${REGIONS[@]}; do
curl -o /dev/null -s -w "%%{http_code}:%%{time_total}s" \
--resolve "cdn.example.com:443:${region}.cdn.example.com" \
https://cdn.example.com/test.jpg
done
方案C:调用CDN厂商API(示例:Cloudflare)
import requests
CLOUDFLARE_API_TOKEN = "YOUR_API_TOKEN"
ZONE_ID = "your_zone_id"
url = f"https://api.cloudflare.com/client/v4/zones/{ZONE_ID}/analytics/dashboard"
headers = {"Authorization": f"Bearer {CLOUDFLARE_API_TOKEN}"}
response = requests.get(url, headers=headers).json()
# 提取downtime、bandwidth、threats等指标
print(response['result']['totals']['bandwidth'])
方案D:Prometheus Exporter(生产环境推荐)
# 创建一个简单的HTTP服务暴露指标 # 配合Prometheus + Grafana实现可视化监控
脚本优化与告警集成技巧
避免误报的3个关键点
- 重试机制:连续3次失败才触发告警(使用计数器+时间窗口)
- 分时段阈值:凌晨可放宽延迟告警阈值,避免无意义噪音
- 关联检测:同时检查多个区域节点,单节点异常可能为本地网络问题
告警通道配置示例(企业微信机器人)
import json
import requests
def send_wechat_msg(content):
url = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOU-KEY"
data = {"msgtype": "markdown", "markdown": {"content": content}}
requests.post(url, data=json.dumps(data))
日志聚合方法
推荐结构:{timestamp}|{region}|{node_ip}|{status}|{latency}|{cache_hit}
使用 logging.handlers.RotatingFileHandler 自动切割日志。
常见问题QA
Q1:我的CDN节点分布在全球,脚本该如何测试准确?
A:采用三层架构:
- 云端节点(AWS Lambda@Edge)负责边缘探测
- 本地服务器负责主域名回源检测
- 第三方API(如Uptime Robot)做备用验证
Q2:如何避免脚本本身被CDN错误地封禁?
A:需设置合理请求头:
headers = {
'User-Agent': 'InternalMonitor/1.0',
'X-Monitor-Token': 'your-secret-token'
}
并在CDN配置白名单中放行该User-Agent。
Q3:脚本发现CDN节点异常后,如何处理?
A:推荐自动化流程:
- 自动切换DNS流量到备用节点(通过Cloudflare API或Aliyun DNS)
- 调用CDN厂商“节点刷新”接口强制清除缓存
- 发送告警通知运维人员排查源站是否正常
Q4:免费版CDN是否也能监控?
A:可以,例如Cloudflare免费版支持API获取缓存状态,但部分高阶指标(如各节点延迟)需付费版,可使用第三方工具如Checkly或Pingdom的免费层级做补充。
构建CDN监控闭环
一个成熟的CDN监控脚本应具备:
- 自动发现:通过API获取所有POP节点列表
- 动态阈值:基于历史数据的异常检测
- 自愈能力:触发CDN切换或源站降级
- 可视化:输出到Grafana看板展示SLO达标率
推荐组合方案:Python脚本 + Prometheus + Grafana + 企业微信告警,可覆盖90%的CDN监控场景,手动部署?可以用Docker Compose一键启动监控栈。