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

 更新时间:2025年09月09日 09:51:57   作者:ζั͡山 ั͡有扶苏 ั͡✾  
这篇文章将从原理到生产部署带大家深入解析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多服务器监控内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python getopt详解及简单实例

    python getopt详解及简单实例

    这篇文章主要介绍了 python getopt详解及简单实例的相关资料,需要的朋友可以参考下
    2016-12-12
  • python使用Matplotlib画条形图

    python使用Matplotlib画条形图

    这篇文章主要为大家详细介绍了python使用Matplotlib画条形图,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-09-09
  • python爬取亚马逊书籍信息代码分享

    python爬取亚马逊书籍信息代码分享

    这篇文章主要介绍了python爬取亚马逊书籍信息代码分享,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • pytorch分类模型绘制混淆矩阵以及可视化详解

    pytorch分类模型绘制混淆矩阵以及可视化详解

    混淆矩阵是ROC曲线绘制的基础,同时它也是衡量分类型模型准确度中最基本,最直观,计算最简单的方法,下面这篇文章主要给大家介绍了关于pytorch分类模型绘制混淆矩阵以及可视化的相关资料,需要的朋友可以参考下
    2022-04-04
  • Python中的wordcloud库安装问题及解决方法

    Python中的wordcloud库安装问题及解决方法

    这篇文章主要介绍了Python中的wordcloud库安装问题及解决方法,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • tensorflow学习笔记之mnist的卷积神经网络实例

    tensorflow学习笔记之mnist的卷积神经网络实例

    这篇文章主要为大家详细介绍了tensorflow学习笔记之mnist的卷积神经网络实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-04-04
  • PyCharm中配置PySide2的图文教程

    PyCharm中配置PySide2的图文教程

    这篇文章主要介绍了PyCharm中配置PySide2的教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06
  • python实现日常记账本小程序

    python实现日常记账本小程序

    这篇文章主要为大家详细介绍了python实现日常记账本小程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • tensorflow中的梯度求解及梯度裁剪操作

    tensorflow中的梯度求解及梯度裁剪操作

    这篇文章主要介绍了tensorflow中的梯度求解及梯度裁剪操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-05-05
  • Python实现的递归神经网络简单示例

    Python实现的递归神经网络简单示例

    这篇文章主要介绍了Python实现的递归神经网络,是一篇摘录自github代码片段的文章,涉及Python递归与数学运算相关操作技巧,需要的朋友可以参考下
    2017-08-08

最新评论