从原理到生产部署解析Python多服务器监控告警系统开发
作者:ζั͡山 ั͡有扶苏 ั͡✾
这篇文章将从原理到生产部署带大家深入解析Python多服务器监控告警系统开发过程,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
整体架构图
核心设计思想
- 无代理监控:通过SSH直接获取数据,无需在目标服务器安装代理
- 故障隔离:单台服务器故障不影响整体监控
- 多级检测:网络层→资源层→服务层层层递进
- 幂等设计:支持定时重复执行,避免状态累积
代码深度解析
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
- 多密钥算法支持:自动尝试RSA/Ed25519/ECDSA等算法
- 安全连接设置:禁用SSH agent和密钥搜索
- 主机名获取:优先使用服务器真实主机名
- 资源释放: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}'
命令解析:
top -bn1
:非交互模式运行top命令grep 'Cpu(s)'
:过滤CPU行awk
处理:提取空闲CPU百分比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
精确匹配进程名 - 检查返回结果是否为空
- 支持扩展添加关键进程
生产环境部署指南
系统架构建议
部署步骤
环境准备
# 创建专用用户 sudo useradd -m -s /bin/bash monitor sudo passwd monitor # 安装依赖 sudo apt-get update sudo apt-get install python3-pip sudo -u monitor pip install paramiko requests
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
配置文件调整
# 修改服务器配置 SERVERS = [ { "host": "10.0.1.101", "ssh_port": 22, "ssh_user": "monitor", # 使用专用账户 "ssh_key": "/home/monitor/.ssh/server_monitor_key" # 正确路径 }, # 更多服务器... ]
系统服务化
# 创建systemd服务文件 sudo tee /etc/systemd/system/server-monitor.service <<EOF [Unit] Description=Server Monitoring Service After=network.target [Service] User=monitor ExecStart=/usr/bin/python3 /opt/monitor/new_server_monitor.py Restart=always RestartSec=30 [Install] WantedBy=multi-user.target EOF # 启动服务 sudo systemctl daemon-reload sudo systemctl enable server-monitor sudo 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
到此这篇关于从原理到生产部署解析Python多服务器监控告警系统开发的文章就介绍到这了,更多相关Python多服务器监控内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!