> 技术文档 > 深入解析Python多服务器监控告警系统:从原理到生产部署_监控系统服务器部署

深入解析Python多服务器监控告警系统:从原理到生产部署_监控系统服务器部署


深入解析Python多服务器监控告警系统:从原理到生产部署

整体架构图

深入解析Python多服务器监控告警系统:从原理到生产部署_监控系统服务器部署

核心设计思想

  1. 无代理监控:通过SSH直接获取数据,无需在目标服务器安装代理
  2. 故障隔离:单台服务器故障不影响整体监控
  3. 多级检测:网络层→资源层→服务层层层递进
  4. 幂等设计:支持定时重复执行,避免状态累积

代码深度解析

1. 配置模块 - 灵活的参数管理

# 服务器配置列表SERVERS = [ { \"host\": \"192.168.0.224\", \"ssh_port\": 22, \"ssh_user\": \"root\", \"ssh_key\": \"/root/.ssh/server_monitor_key\" }, # 更多服务器...]# 监控阈值设置MEMORY_THRESHOLD = 90 # 内存阈值%CPU_THRESHOLD = 85 # CPU阈值%DISK_THRESHOLD = 95 # 磁盘阈值%# 检测参数DINGTALK_WEBHOOK = \"https://oapi.dingtalk.com/robot/send?access_token=\"PING_TIMEOUT = 3 # 网络检测超时(秒)CHECK_INTERVAL = 600 # 检查间隔(秒)
  • 支持多服务器配置,可扩展性强
  • 关键参数集中管理,便于维护
  • 支持不同服务器使用不同认证方式

2. 网络检测模块 - 基于TCP的连通性检查

def check_network(host): try: socket.setdefaulttimeout(PING_TIMEOUT) s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((host, 22)) # 检测SSH端口 s.close() return True except Exception: return False
  • 使用TCP连接检测替代ICMP ping,更贴近实际服务可用性
  • 检测SSH服务端口(22),确保监控功能可用
  • 设置超时时间防止阻塞

3. 指标采集模块 - SSH命令执行与解析

def get_server_metrics(server): # 创建SSH客户端 ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) try: # 多密钥类型支持 try: private_key = paramiko.RSAKey.from_private_key_file(server[\"ssh_key\"]) except: try: private_key = paramiko.Ed25519Key.from_private_key_file(server[\"ssh_key\"]) except: private_key = paramiko.ECDSAKey.from_private_key_file(server[\"ssh_key\"]) # 建立SSH连接 ssh.connect( hostname=server[\"host\"], port=server[\"ssh_port\"], username=server[\"ssh_user\"], pkey=private_key, timeout=15, look_for_keys=False, allow_agent=False ) # 获取主机名 stdin, stdout, stderr = ssh.exec_command(\"hostname\") hostname = stdout.read().decode().strip() or server[\"host\"] # CPU监控命令 stdin, stdout, stderr = ssh.exec_command( \"top -bn1 | grep \'Cpu(s)\' | awk -F\'[ ,]+\' \'{print $8}\' | tr -d \'%\' | awk \'{print 100 - $1}\'\" ) cpu_usage = float(stdout.read().decode().strip()) # 更多指标采集... finally: ssh.close() return hostname, alerts
  1. 多密钥算法支持:自动尝试RSA/Ed25519/ECDSA等算法
  2. 安全连接设置:禁用SSH agent和密钥搜索
  3. 主机名获取:优先使用服务器真实主机名
  4. 资源释放:finally块确保SSH连接关闭

4. 告警模块 - 钉钉机器人集成

def send_dingtalk_message(message): \"\"\"发送Markdown格式消息到钉钉机器人\"\"\" headers = {\"Content-Type\": \"application/json\"} # 创建Markdown格式消息 markdown_content = \"### 🚨 服务器监控告警\\n\" + message.replace(\"\\n\", \"\\n\\n\") data = { \"msgtype\": \"markdown\", \"markdown\": { \"title\": \"服务器监控告警\", \"text\": markdown_content } } try: response = requests.post( DINGTALK_WEBHOOK, data=json.dumps(data), headers=headers, timeout=10 ) if response.status_code == 200: print(\"钉钉消息发送成功\") else: print(f\"钉钉消息发送失败: {response.text}\") except Exception as e: print(f\"发送钉钉消息时出错: {str(e)}\")
  • 添加时间戳便于问题追踪
  • 包含直接访问监控面板的链接
  • 使用emoji增强可读性
  • 支持Markdown格式(加粗、换行等)

监控指标采集技术详解

1. CPU使用率采集

top -bn1 | grep \'Cpu(s)\' | awk -F\'[ ,]+\' \'{print $8}\' | tr -d \'%\' | awk \'{print 100 - $1}\'

命令解析

  1. top -bn1:非交互模式运行top命令
  2. grep \'Cpu(s)\':过滤CPU行
  3. awk处理:提取空闲CPU百分比
  4. 100 - 空闲值:计算实际使用率

2. 内存使用率采集

free | awk \'NR==2{printf \"%.2f\", $3*100/$2 }\'

计算原理

总内存 = $2已用内存 = $3使用率 = (已用内存 / 总内存) * 100

3. 磁盘使用率采集

df -h | awk \'$NF==\"/\"{printf \"%d\", $5}\'

关键参数

  • $NF==\"/\":只监控根分区
  • $5:使用率列(已去除%符号)
  • 可根据不同服务器挂载的分区自行调整

4. 进程监控

processes = [\"kubelet\", \"dockerd\", \"kube-proxy\"]for process in processes: stdin, stdout, stderr = ssh.exec_command(f\"pgrep -x {process}\") if not stdout.read().decode().strip(): missing_processes.append(process)

进程检测逻辑

  • 使用pgrep -x精确匹配进程名
  • 检查返回结果是否为空
  • 支持扩展添加关键进程

生产环境部署指南

系统架构建议

深入解析Python多服务器监控告警系统:从原理到生产部署_监控系统服务器部署

部署步骤

  1. 环境准备

    # 创建专用用户sudo useradd -m -s /bin/bash monitorsudo passwd monitor# 安装依赖sudo apt-get updatesudo apt-get install python3-pipsudo -u monitor pip install paramiko requests
  2. SSH密钥配置

    # 生成监控专用密钥sudo -u monitor ssh-keygen -t ed25519 -f /home/monitor/.ssh/server_monitor_key# 分发公钥到目标服务器for server in ${SERVERS[@]}; do sudo -u monitor ssh-copy-id -i /home/monitor/.ssh/server_monitor_key.pub ${server}done
  3. 配置文件调整

    # 修改服务器配置SERVERS = [ { \"host\": \"10.0.1.101\", \"ssh_port\": 22, \"ssh_user\": \"monitor\", # 使用专用账户 \"ssh_key\": \"/home/monitor/.ssh/server_monitor_key\" # 正确路径 }, # 更多服务器...]
  4. 系统服务化

    bash

    # 创建systemd服务文件sudo tee /etc/systemd/system/server-monitor.service <<EOF[Unit]Description=Server Monitoring ServiceAfter=network.target[Service]User=monitorExecStart=/usr/bin/python3 /opt/monitor/new_server_monitor.pyRestart=alwaysRestartSec=30[Install]WantedBy=multi-user.targetEOF# 启动服务sudo systemctl daemon-reloadsudo systemctl enable server-monitorsudo systemctl start server-monitor

日志管理方案

# 查看实时日志journalctl -u server-monitor -f# 日志轮转配置sudo tee /etc/logrotate.d/server-monitor <<EOF/var/log/server-monitor.log { daily missingok rotate 30 compress delaycompress notifempty create 640 monitor adm sharedscripts postrotate systemctl restart server-monitor > /dev/null endscript}EOF

我自己测试过的代码链接:https://download.csdn.net/download/qq_43479188/91173428?spm=1001.2014.3001.5501