一、基础监控架构设计
-
监控指标选择
- 核心资源:CPU利用率、内存使用率、磁盘空间与I/O、网络流量、进程状态等。
- 业务指标:HTTP服务状态码、数据库连接数、应用响应时间等。
- 容器化场景:Docker/Kubernetes容器资源使用、Pod健康状态。
-
工具与库选择
- 数据采集 :
psutil
(系统资源)、requests
(HTTP状态)、docker
(容器监控)。 - 告警通知 :
smtplib
(邮件)、requests
(Webhook)、twilio
(短信)。 - 数据存储与可视化:Prometheus(时序数据库)、Grafana(仪表盘)、InfluxDB(轻量级存储)。
- 数据采集 :
二、核心代码实现与配置
场景1:基础资源监控与告警
python
import psutil
import smtplib
from datetime import datetime
def monitor_system(thresholds):
# 采集指标
cpu_percent = psutil.cpu_percent(interval=1)
mem = psutil.virtual_memory()
disk = psutil.disk_usage('/')
# 告警判断
alerts = []
if cpu_percent > thresholds['cpu']:
alerts.append(f"CPU使用率过高:{cpu_percent}%")
if mem.percent > thresholds['mem']:
alerts.append(f"内存使用率过高:{mem.percent}%")
if disk.percent > thresholds['disk']:
alerts.append(f"磁盘使用率过高:{disk.percent}%")
# 发送告警
if alerts:
send_email(alerts)
def send_email(alerts):
sender = '[email protected]'
receivers = ['[email protected]']
message = f"""\
Subject: 服务器告警 - {datetime.now()}
\n检测到以下问题:\n""" + "\n".join(alerts)
with smtplib.SMTP('smtp.example.com', 587) as server:
server.starttls()
server.login(sender, 'password')
server.sendmail(sender, receivers, message)
# 配置阈值与定时执行
if __name__ == "__main__":
thresholds = {'cpu': 80, 'mem': 85, 'disk': 90}
monitor_system(thresholds)
配置说明:
-
使用
psutil
采集数据,通过SMTP协议发送邮件告警。 -
定时任务 :通过
crontab
每5分钟执行一次脚本:bash*/5 * * * * /usr/bin/python3 /path/to/monitor.py
场景2:HTTP服务状态监控
python
import requests
import sys
def check_http_status(url, expected_code=200):
try:
response = requests.get(url, timeout=10)
if response.status_code != expected_code:
send_alert(f"HTTP状态异常:{url} 返回 {response.status_code}")
except Exception as e:
send_alert(f"服务不可达:{url},错误:{str(e)}")
def send_alert(message):
# 集成Webhook(如钉钉、企业微信)
webhook_url = "https://oapi.dingtalk.com/robot/send?access_token=xxx"
headers = {'Content-Type': 'application/json'}
data = {"msgtype": "text", "text": {"content": message}}
requests.post(webhook_url, json=data, headers=headers)
# 调用示例
check_http_status("http://example.com/api/health")
扩展配置:
- 集成Zabbix:将脚本输出作为自定义监控项,配置Trigger触发告警。
- Prometheus监控 :使用
prometheus-client
库暴露指标,供Prometheus拉取。
场景3:日志分析与异常检测
python
import re
from collections import defaultdict
def analyze_logs(log_path, pattern=r'ERROR: (.*)'):
error_counts = defaultdict(int)
with open(log_path, 'r') as f:
for line in f:
match = re.search(pattern, line)
if match:
error_type = match.group(1)
error_counts[error_type] += 1
# 触发阈值告警
for error, count in error_counts.items():
if count > 10:
send_alert(f"错误类型 {error} 在日志中出现 {count} 次")
# 示例:监控Nginx错误日志
analyze_logs('/var/log/nginx/error.log')
优化方案:
- 使用
loguru
或ELK
栈(Elasticsearch+Logstash+Kibana)实现日志聚合。
三、高级场景与集成
-
容器化监控
-
使用
docker
库获取容器状态:pythonimport docker client = docker.from_env() for container in client.containers.list(): stats = container.stats(stream=False) print(f"容器 {container.name} CPU使用率:{stats['cpu_percent']}%")
-
集成Kubernetes:通过
kubernetes
库监控Pod资源。
-
-
自动化修复
-
检测到磁盘空间不足时,自动清理旧日志:
pythonif disk.percent > 90: os.system("find /var/log -name '*.log' -mtime +7 -exec rm {} \;")
-
-
可视化仪表盘
- Grafana配置:将数据存储至InfluxDB,配置仪表盘展示实时指标。
四、完整工具链推荐
工具/库 | 用途 | 文档链接 |
---|---|---|
psutil |
系统资源采集 | psutil.readthedocs.io/ |
prometheus-client |
暴露监控指标 | pypi.org/project/pro... |
Fabric |
批量远程命令执行 | www.fabfile.org/ |
AlertManager |
告警路由与去重 | prometheus.io/docs/alerti... |
五、总结
通过Python实现自动化运维监控,需结合具体场景选择工具链:
- 基础监控 :
psutil
+SMTP告警满足单机需求。 - 分布式系统:Prometheus+Grafana实现集群监控。
- 日志与业务监控:正则分析+ELK栈提升排查效率。
- 自动化修复:检测到问题后触发预定义脚本(如清理文件、重启服务)。
注意事项:
- 安全性:敏感信息(如密码)应使用环境变量或加密存储。
- 性能开销:监控脚本需优化资源占用,避免影响业务。
- 告警收敛:通过AlertManager等工具避免告警风暴。