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

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

整体架构图

image-20250626180939436

核心设计思想

  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 Trueexcept 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精确匹配进程名
  • 检查返回结果是否为空
  • 支持扩展添加关键进程

生产环境部署指南

系统架构建议

image-20250626181927407

部署步骤

  1. 环境准备

    # 创建专用用户
    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
    
  2. SSH密钥配置

    # 生成监控专用密钥
    sudo -u monitor ssh-keygen -t ed25519 -f /home/monitor/.ssh/server_monitor_key# 分发公钥到目标服务器
    for server in ${SERVERS[@]}; dosudo -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 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 {dailymissingokrotate 30compressdelaycompressnotifemptycreate 640 monitor admsharedscriptspostrotatesystemctl restart server-monitor > /dev/nullendscript
}
EOF

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/912265.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/912265.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JUC:10.线程、monitor管程、锁对象之间在synchronized加锁的流程(未完)

一、monitor管程工作原理&#xff1a; 首先&#xff0c;synchronized是一个对象锁&#xff0c;当线程运行到某个临界区&#xff0c;这个临界区使用synchronized对对象obj进行了上锁&#xff0c;此时底层发生了什么&#xff1f; 1.当synchronized对obj上锁后&#xff0c;synch…

Elasticsearch(ES)分页

Elasticsearch&#xff08;简称 ES&#xff09;本身不适合传统意义上的“深分页”&#xff0c;但提供了多种分页方式&#xff0c;每种适用不同场景。我们来详细讲解&#xff1a; 一、基本分页&#xff08;from size&#xff09; 最常用的分页方式&#xff0c;类似 SQL 的 LIM…

原生微信小程序:用 `setData` 正确修改数组中的对象项状态(附实战技巧)

&#x1f4cc; 背景介绍 在微信小程序开发中&#xff0c;我们经常需要修改数组中某个对象的某个字段&#xff0c;比如&#xff1a; 列表中的某一项展开/收起多选状态切换数据列表中的临时标记等 一个常见的场景是&#xff1a; lists: [{ show: true }, { show: true }, { s…

Oracle 临时表空间相关操作

一、临时表空间概述 临时表空间&#xff08;Temporary Tablespace&#xff09;是Oracle数据库中用于存储临时数据的特殊存储区域&#xff0c;其数据在会话结束或事务提交后自动清除&#xff0c;重启数据库后彻底消失。主要用途包括&#xff1a; 存储排序操作&#xff08;如OR…

从静态到动态:Web渲染模式的演进和突破

渲染模式有好多种&#xff0c;了解下web的各种渲染模式&#xff0c;对技术选型有很大的参考作用。 一、静态HTML时代 早期&#xff08;1990 - 1995年&#xff09;网页开发完全依赖手工编写HTML&#xff08;HyperText Markup Language&#xff09;和CSS&#xff08;层叠样式表…

Flask(六) 数据库操作SQLAlchemy

文章目录 一、准备工作二、最小化可运行示例✅ 补充延迟绑定方式&#xff08;推荐方式&#xff09; 三、数据库基本操作&#xff08;增删改查&#xff09;1. 插入数据&#xff08;增&#xff09;2. 查询数据&#xff08;查&#xff09;3. 更新数据&#xff08;改&#xff09;4.…

PYTHON从入门到实践7-获取用户输入与while循环

# 【1】获取用户输入 # 【2】python数据类型的转换 input_res input("请输入一个数字\n") if int(input_res) % 10 0:print("你输入的数是10的倍数") else:print("你输入的数不是10的倍数") # 【3】while循环&#xff0c;适合不知道循环多少次…

学习笔记(C++篇)—— Day 8

1.STL简介 STL(standard template libaray-标准模板库)&#xff1a;是C标准库的重要组成部分&#xff0c;不仅是一个可复用的组件库&#xff0c;而且是一个包罗数据结构与算法的软件框架。 2.STL的六大组件 先这样&#xff0c;下一部分是string的内容&#xff0c;内容比较多&a…

ant+Jmeter+jenkins接口自动化,如何实现把执行失败的接口信息单独发邮件?

B站讲的最好的自动化测试教程&#xff0c;工具框架附项目实战一套速通&#xff0c;零基础完全轻松掌握&#xff01;自动化测试课程、web/app/接口 实现AntJMeterJenkins接口自动化失败接口邮件通知方案 要实现只发送执行失败的接口信息邮件通知&#xff0c;可以通过以下步骤实…

恶意Python包“psslib“实施拼写错误攻击,可强制关闭Windows系统

Socket威胁研究团队发现一个名为psslib的恶意Python包&#xff0c;该软件包伪装成提供密码安全功能&#xff0c;实则会突然关闭Windows系统。这个由化名umaraq的威胁行为者开发的软件包&#xff0c;是对知名密码哈希工具库passlib的拼写错误仿冒&#xff08;typosquatting&…

云原生灰度方案对比:服务网格灰度(Istio ) 与 K8s Ingress 灰度(Nginx Ingress )

服务网格灰度与 Kubernetes Ingress 灰度是云原生环境下两种主流的灰度发布方案&#xff0c;它们在架构定位、实现方式和适用场景上存在显著差异。以下从多个维度对比分析&#xff0c;并给出选型建议&#xff1a; 一、核心区别对比 维度服务网格灰度&#xff08;以 Istio 为例…

科技如何影响我们的生活?

科技已成为我们生活中不可或缺的一部分&#xff0c;彻底改变了我们工作、沟通和生活的方式。从智能手机到智能家居&#xff0c;科技已渗透到我们生活的每个角落。无论是用手机闹钟开启新的一天&#xff0c;通过 Alexa 开关灯光&#xff0c;还是打开 Uber 或 Lyft 打车上班&…

Re--攻防世界-基础android

Jadx 可以看到有账号密码输入 进入checkPassword函数 分析一下&#xff1a; 对每个字符 pass[len] 进行以下计算 pass[len] (char) (((255 - len) - 100) - pass[len]); 解密脚本 def decrypt_password(): password [] for len in range(12): c (255 - le…

InnoDB表空间结构-系统表空间

系统表空间整体结构 页号为7的SYS类型页结构

如何构建知识库

构建个人知识库是一个系统化的过程&#xff0c;需要结合工具选择、信息管理和持续优化。以下是分步骤的实用指南&#xff0c;包含现代工具和方法的建议&#xff1a; 一、明确知识库定位&#xff08;Why&#xff09; ​核心目标​ 学习型&#xff1a;支持学术研究/职业发展&…

3 大语言模型预训练数据-3.2 数据处理-3.2.2 冗余去除——2.SimHash算法文本去重实战案例:新闻文章去重场景

SimHash算法文本去重实战案例&#xff1a;新闻文章去重场景 一、案例背景与目标二、具体实现步骤与示例1. **待去重文本示例**2. **步骤1&#xff1a;文本预处理与特征提取**3. **步骤2&#xff1a;特征向量化与哈希映射**4. **步骤3&#xff1a;特征向量聚合**5. **步骤4&…

MSPM0G3507之GPIO配置报错 #Sysconfig报错

声明&#xff1a;本文完全免费阅读&#xff0c;如果你发现某天文章被设置了“VIP权限”&#xff0c;请私信我解除&#xff08;非笔者所为&#xff09;。 一、问题现象 在打开sysconfig后&#xff0c;GPIO这里会报错。 Unable to render selection Error:launchPadShortcut:Vali…

2025年检测相机十大品牌测评:工业级精度与场景化解决方案解析

一、引言 在工业自动化与智能制造领域&#xff0c;检测相机作为质量管控的核心硬件&#xff0c;正以“高精度、高速度、高适应性”的特性重塑生产流程。这类设备通过光学成像与智能算法结合&#xff0c;实现对工件表面缺陷、尺寸偏差、装配精度的精准检测&#xff0c;效率较传…

Python异步编程深度解析

一、异步编程范式演进 同步阻塞的困境&#xff1a;GIL限制与线程切换开销 事件循环本质&#xff1a;单线程并发模型 协程优势&#xff1a;比线程更轻量的执行单元 IO密集型场景&#xff1a;网络请求/文件操作的最佳实践 二、核心语法精要 import asyncioasync def fetch_…

网络缓冲区

用户态网络缓冲区 网络缓冲区原理为什么需要用户态网络缓冲区Linux下如何接收和发送数据包用户态网络缓冲区设计的本质 网络缓冲区代码实现 网络缓冲区原理 为什么需要用户态网络缓冲区 在网络开发中&#xff0c;我们经常使用到read/write/recv/send等系统调用接口&#xff0…