← 返回 Day 84 正文

Day 84 · 练习与清单

Day 084 — 监控告警系统 练习清单

✅ 今日学习目标


📝 基础练习

练习 1:系统指标采集

目标:使用 psutil 采集系统指标

要求: 1. 编写函数采集 CPU、内存、磁盘、网络四项指标 2. 将采集结果格式化输出 3. 计算并显示系统健康评分(0-100分)

提示:

python
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. 测试不同场景

验证标准:

python
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. 记录去重统计信息

验证标准:

python
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%

提示:

python
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:数据存储


📋 自我检查清单

完成所有练习后,检查以下内容:


💡 常见问题

Q1: psutil.cpu_percent(interval=1) 为什么需要等待?

A: cpu_percent 需要两次采样才能计算使用率。第一次调用返回 0,第二次调用返回相对于第一次的增长量。interval=1 表示等待1秒后再采样。

Q2: 如何避免监控本身消耗过多资源?

A: - 降低采集频率(如每60秒采集一次) - 避免在生产环境使用 interval 参数(会阻塞) - 使用异步采集

Q3: 如何处理监控服务本身崩溃?

A: - 使用 systemd 管理监控服务,自动重启 - 实现健康检查机制 - 记录崩溃日志


✅ 完成所有基础练习后,你已经掌握了监控告警系统的核心知识!

🚀 挑战练习是可选的,适合想深入学习的同学。