使用 Python 的 psutil 库获取 CPU 使用率,结合钉钉群自定义机器人的 Webhook 地址发送 HTTP POST 请求即可实现报警。该方案适合单机或少量服务器监控,主要风险在于 Webhook 地址泄露和脚本进程意外退出。
先说结论:通过 Python 脚本定时采集 CPU 数据,触发阈值后调用钉钉机器人接口发送消息,是轻量级监控的通用做法。
- 适合:个人项目、小型集群、无现有监控体系的临时需求
- 先准备:钉钉群自定义机器人 Webhook 地址、服务器 Python 环境
- 验收:手动触发脚本确认钉钉群收到消息、检查脚本进程存活
命令速用版
安装依赖库并运行基础监控脚本,以下命令需在服务器终端执行:
pip install psutil requests
python monitor_cpu.py脚本核心逻辑参考片段:
import psutil, requests, time, hmac, hashlib, base64, urllib.parse
WEBHOOK = "https://oapi.dingtalk.com/robot/send?access_token=YOUR_TOKEN"
SECRET = "YOUR_SECRET" # 钉钉机器人安全设置中的加签密钥
THRESHOLD = 80.0 # CPU 阈值百分比
def sign(secret, timestamp):
string_to_sign = f"{timestamp}\n{secret}"
hmac_code = hmac.new(secret.encode(), string_to_sign.encode(), digestmod=hashlib.sha256).digest()
return urllib.parse.quote_plus(base64.b64encode(hmac_code).decode())
def check_cpu():
percent = psutil.cpu_percent(interval=1)
if percent > THRESHOLD:
timestamp = str(round(time.time() * 1000))
sign_param = sign(SECRET, timestamp)
url = f"{WEBHOOK}×tamp={timestamp}&sign={sign_param}"
data = {"msgtype": "text", "text": {"content": f"警告:CPU 使用率 {percent}% 超过阈值 {THRESHOLD}%"}}
requests.post(url, json=data)
if __name__ == "__main__":
check_cpu()为什么会这样
CPU 监控报警的本质是周期性采集指标并与设定阈值比对,命中条件后通过 HTTP 协议推送通知。
Python 的 psutil 库跨平台兼容性好,能直接读取操作系统层面的 CPU 占用数据。钉钉自定义机器人提供标准的 Webhook 接口,支持接收 JSON 格式消息。两者结合无需部署复杂监控系统,适合资源受限或快速搭建场景。安全机制上,钉钉要求请求携带时间戳和签名,防止 Webhook 被恶意调用。
分步处理
按顺序完成环境准备、机器人配置、脚本编写和定时任务设置,每步完成后需检查对应状态。
1. 安装 Python 依赖
在服务器执行安装命令,确保 psutil 和 requests 库可用。验证方法为进入 Python 交互环境尝试 import 这两个模块,无报错即为成功。
2. 配置钉钉机器人
在钉钉群设置中添加自定义机器人,安全设置建议选择“加签”模式。复制 Webhook 地址和 Secret 密钥,不要将 Secret 泄露给无关人员。适用场景为需要接收报警的运维群或通知群。
3. 编写监控脚本
将速用版代码保存为 monitor_cpu.py,替换 WEBHOOK 和 SECRET 为实际值。调整 THRESHOLD 数值,一般建议设置在 70% 到 90% 之间,具体视业务负载而定。操作动作是编辑文件,验证结果是本地运行脚本无语法错误。
4. 配置定时任务
Linux 系统使用 crontab 设置每分钟执行一次。命令示例:*/1 * * * * /usr/bin/python3 /path/to/monitor_cpu.py。风险边界是 cron 任务可能因环境变量问题导致脚本找不到模块,建议在 crontab 中使用 Python 绝对路径。
怎么验证是否生效
通过人为制造高负载或直接修改脚本阈值触发报警,观察钉钉群消息和服务器日志。
1. 消息接收验证
临时将脚本中的 THRESHOLD 改为 0.1,运行脚本。检查钉钉群是否收到“警告:CPU 使用率...”消息。若未收到,检查 Webhook 地址是否正确、服务器是否能访问外网。
2. 进程存活验证
执行ps -ef | grep monitor_cpu查看进程是否存在。若使用 cron,检查/var/log/cron或journalctl -u cron确认任务调度记录。风险边界是脚本崩溃后不会自动重启,建议配合 systemd 或 supervisord 管理长运行脚本。
常见坑
配置过程中容易在签名算法、网络权限和频率限制上遇到问题,需提前规避。
- 签名错误:钉钉机器人开启加签后,请求必须携带正确的 timestamp 和 sign 参数,否则返回 401 错误。
- 频率限制:钉钉自定义机器人存在发送频率限制,短时间内高频报警可能导致消息被拦截,脚本中应增加发送间隔控制。
- 网络不通:服务器若无外网权限,无法请求钉钉 API,需检查防火墙或代理配置。
- 进程假死:脚本长期运行可能因内存泄漏或异常退出停止监控,需配置进程守护。
常见问题
钉钉机器人收不到消息怎么办?
首先检查 Webhook 地址是否复制完整,其次确认服务器能 ping 通 oapi.dingtalk.com。若开启加签,需核对 Secret 是否匹配,签名算法错误会导致接口返回 401。
脚本需要一直运行还是定时执行?
建议通过 crontab 定时执行,每分钟一次即可。长期运行的进程脚本需处理异常捕获,否则一旦报错退出将失去监控能力,定时任务能自动重试。
如何避免报警消息刷屏?
在脚本中增加冷却时间逻辑,例如发送一次报警后休眠 5 分钟不再发送。或者在钉钉机器人设置中开启关键词过滤,但最好在代码层面控制发送频率。
参考来源
- 钉钉开放平台:自定义机器人接入文档,https://open.dingtalk.com/document/robots/custom-robot-access
- Python 包索引:psutil 库页面,https://pypi.org/project/psutil/