Day 084 — 监控告警系统 练习清单
✅ 今日学习目标
- [ ] 理解监控系统架构设计
- [ ] 掌握 psutil 库的使用方法
- [ ] 学会设计告警规则引擎
- [ ] 能够构建完整的监控服务
📝 基础练习
练习 1:系统指标采集
目标:使用 psutil 采集系统指标
要求: 1. 编写函数采集 CPU、内存、磁盘、网络四项指标 2. 将采集结果格式化输出 3. 计算并显示系统健康评分(0-100分)
提示:
def calculate_health_score(cpu, mem, disk):
"""
健康评分规则:
- CPU < 50%: 25分, 50-80%: 15分, >80%: 5分
- 内存 < 60%: 25分, 60-80%: 15分, >80%: 5分
- 磁盘 < 70%: 25分, 70-85%: 15分, >85%: 5分
- 网络正常: 25分
"""
pass
验证标准: - 运行后能正确采集所有指标 - 健康评分计算正确 - 输出格式清晰易读
练习 2:告警规则实现
目标:实现一个简单的告警规则类
要求:
1. 创建 SimpleAlertRule 类,支持以下属性:
- name: 规则名称
- metric: 指标名称
- threshold: 阈值
- operator: 比较运算符(>, <, >=, <=, ==)
2. 实现 check(value) 方法,返回是否触发告警
3. 测试不同场景
验证标准:
rule = SimpleAlertRule("CPU高", "cpu", 90, ">")
assert rule.check(95) == True
assert rule.check(85) == False
练习 3:告警通知
目标:实现多种通知渠道
要求:
1. 创建 Notifier 基类
2. 实现 ConsoleNotifier(控制台输出)
3. 实现 FileNotifier(写入日志文件)
4. 实现 EmailNotifier(模拟邮件发送)
验证标准: - 三种通知器都能正常工作 - 日志文件格式正确 - 支持动态添加/移除通知器
🚀 进阶练习
练习 4:告警去重与聚合
目标:实现告警去重机制
要求:
1. 实现 AlertDeduplicator 类
2. 支持配置去重时间窗口(默认5分钟)
3. 相同规则在窗口内只触发一次
4. 记录去重统计信息
验证标准:
dedup = AlertDeduplicator(window_minutes=5)
assert dedup.should_alert("CPU高") == True
assert dedup.should_alert("CPU高") == False # 5分钟内重复
# 等待5分钟后
assert dedup.should_alert("CPU高") == True
练习 5:趋势检测
目标:实现指标趋势告警
要求: 1. 监控指标的变化率 2. 当指标在指定时间内增长超过阈值时触发告警 3. 例如:内存使用率在1小时内增长超过20%
提示:
class TrendDetector:
def __init__(self, metric, window_minutes, increase_percent):
self.history = []
def record(self, value):
"""记录当前值"""
pass
def check(self):
"""检查趋势"""
# 计算窗口内变化率
pass
练习 6:巡检报告生成
目标:生成完整的巡检报告
要求: 1. 从数据库查询历史指标 2. 计算各项指标的统计值(平均、最大、最小) 3. 统计告警次数和类型 4. 生成格式化的报告
验证标准: - 报告包含所有关键指标 - 统计数据准确 - 格式清晰,适合人类阅读
🎯 挑战练习
练习 7:分布式监控设计
目标:设计支持多服务器的监控系统
思考问题: 1. 如何收集多台服务器的指标? 2. 如何处理网络延迟和数据丢失? 3. 如何实现监控数据的集中存储和查询? 4. 如何设计高可用的监控架构?
输出: - 画出系统架构图 - 写出关键模块的设计文档 - 说明技术选型和理由
练习 8:Web 监控面板
目标:使用 Flask 创建简单的 Web 监控面板
要求: 1. 显示当前系统状态(CPU、内存、磁盘) 2. 显示历史趋势图表 3. 显示告警列表 4. 支持配置告警规则
技术栈: - Flask:Web 框架 - Chart.js:图表库 - SQLite:数据存储
📋 自我检查清单
完成所有练习后,检查以下内容:
- [ ] 能够独立使用 psutil 采集系统指标
- [ ] 能够设计灵活的告警规则
- [ ] 能够实现告警去重和聚合
- [ ] 能够生成格式化的巡检报告
- [ ] 理解监控系统的整体架构
- [ ] 了解常见的监控方案(Prometheus、Zabbix)
💡 常见问题
Q1: psutil.cpu_percent(interval=1) 为什么需要等待?
A: cpu_percent 需要两次采样才能计算使用率。第一次调用返回 0,第二次调用返回相对于第一次的增长量。interval=1 表示等待1秒后再采样。
Q2: 如何避免监控本身消耗过多资源?
A:
- 降低采集频率(如每60秒采集一次)
- 避免在生产环境使用 interval 参数(会阻塞)
- 使用异步采集
Q3: 如何处理监控服务本身崩溃?
A: - 使用 systemd 管理监控服务,自动重启 - 实现健康检查机制 - 记录崩溃日志
✅ 完成所有基础练习后,你已经掌握了监控告警系统的核心知识!
🚀 挑战练习是可选的,适合想深入学习的同学。