云计算百科
云计算领域专业知识百科平台

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

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

整体架构图

image-20250626180939436

核心设计思想

  • 无代理监控:通过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精确匹配进程名
    • 检查返回结果是否为空
    • 支持扩展添加关键进程

    生产环境部署指南

    系统架构建议

    image-20250626181927407

    部署步骤

  • 环境准备

    # 创建专用用户
    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" # 正确路径
    },
    # 更多服务器…
    ]

  • 系统服务化

    bash

    # 创建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

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

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » 深入解析Python多服务器监控告警系统:从原理到生产部署
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!