Python 脚本监控服务器 CPU 超过阈值怎么配置钉钉报警?

文章导读
使用 Python 的 psutil 库获取 CPU 使用率,结合钉钉群自定义机器人的 Webhook 地址发送 HTTP POST 请求即可实现报警。该方案适合单机或少量服务器监控,主要风险在于 Webhook 地址泄露和脚本进程意外退出。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

使用 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}&timestamp={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 这两个模块,无报错即为成功。

Python 脚本监控服务器 CPU 超过阈值怎么配置钉钉报警?

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 绝对路径。

怎么验证是否生效

通过人为制造高负载或直接修改脚本阈值触发报警,观察钉钉群消息和服务器日志。

Python 脚本监控服务器 CPU 超过阈值怎么配置钉钉报警?

1. 消息接收验证

临时将脚本中的 THRESHOLD 改为 0.1,运行脚本。检查钉钉群是否收到“警告:CPU 使用率...”消息。若未收到,检查 Webhook 地址是否正确、服务器是否能访问外网。

2. 进程存活验证

执行ps -ef | grep monitor_cpu查看进程是否存在。若使用 cron,检查/var/log/cronjournalctl -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/