从‘它又挂了’到‘稳如老狗’:我是如何用Prometheus+Grafana给自家小项目做监控告警的

张开发
2026/4/19 18:57:02 15 分钟阅读

分享文章

从‘它又挂了’到‘稳如老狗’:我是如何用Prometheus+Grafana给自家小项目做监控告警的
从‘它又挂了’到‘稳如老狗’我是如何用PrometheusGrafana给自家小项目做监控告警的去年某个深夜我的个人博客突然宕机直到第二天早上收到读者留言才发现。这种后知后觉的体验让我下定决心搭建一套监控系统。经过反复试错最终用PrometheusGrafana组合实现了成本近乎为零的监控方案——现在每当服务异常Telegram告警消息会立即推送到手机修复响应时间从小时级缩短到分钟级。1. 为什么小项目更需要监控很多人认为监控是企业级系统的专利其实个人项目面临的风险更直接没有专职运维团队服务崩溃往往要等用户反馈才发现。我的博客使用VPS部署遇到过内存泄漏、磁盘写满、数据库连接耗尽等各种问题每次都是用户先发现。小型监控系统的核心价值在于即时感知服务异常立即通知而非被动等待投诉趋势预判通过历史数据发现潜在问题如磁盘每日增长1%故障复盘异常时的系统状态有据可查典型监控指标示例指标类型采集目标告警阈值示例系统资源CPU/内存/磁盘使用率CPU 80%持续5分钟服务健康HTTP响应状态码5xx错误率 1%业务指标每日注册用户数同比下跌超过30%2. 零成本搭建Prometheus数据采集Prometheus作为监控系统的大脑负责定时抓取和存储指标数据。在个人服务器上部署只需单个二进制文件# 下载最新版Prometheus示例为Linux amd64 wget https://github.com/prometheus/prometheus/releases/download/v2.47.0/prometheus-2.47.0.linux-amd64.tar.gz tar xvfz prometheus-*.tar.gz cd prometheus-*配置文件中定义监控目标以Node Exporter和Nginx为例# prometheus.yml 关键配置 scrape_configs: - job_name: node static_configs: - targets: [localhost:9100] # Node Exporter端口 - job_name: nginx metrics_path: /nginx_status static_configs: - targets: [localhost:80]启动命令建议用systemd托管# /etc/systemd/system/prometheus.service [Unit] DescriptionPrometheus Monitoring Afternetwork.target [Service] ExecStart/opt/prometheus/prometheus \ --config.file/opt/prometheus/prometheus.yml \ --storage.tsdb.retention.time30d Restartalways [Install] WantedBymulti-user.target提示生产环境建议启用--web.enable-lifecycle参数支持配置热更新3. Grafana看板让数据会说话原始数据需要可视化才能快速解读。Grafana的仪表盘功能可以将Prometheus数据转化为直观图表我的看板布局分为三个区域A. 系统资源区顶部CPU负载曲线1/5/15分钟内存使用量堆叠图Buffers/Cached/Used磁盘IOPS和带宽时序图B. 服务状态区中部HTTP请求成功率2xx/3xx/4xx/5xx接口响应时间百分位P50/P95/P99数据库连接池使用率C. 业务指标区底部每日活跃用户数API调用频次热力图关键事务执行耗时导入现成仪表盘可以快速起步推荐ID1860的Node Exporter全指标看板# 通过grafana-cli导入仪表盘 grafana-cli plugins install grafana-piechart-panel systemctl restart grafana-server4. 告警配置从被动到主动监控系统的终极价值在于及时告警。我的告警规则分为三个级别紧急级P0服务不可用实例存活状态up0HTTP可访问性检测失败数据库连接失败重要级P1性能劣化接口P99延迟 500ms错误率突增200%磁盘剩余空间 10%提示级P2趋势异常内存使用量周环比增长50%日志错误数连续3小时递增告警通知通过Alertmanager推送到Telegram# alertmanager.yml 配置示例 route: receiver: telegram receivers: - name: telegram telegram_configs: - bot_token: 123456:ABC-DEF1234 chat_id: 987654321 parse_mode: HTML实际收到的告警消息示例[P1] 高内存使用告警 实例: webserver-1 指标: 内存使用率 85% (当前值: 87.2%) 持续时间: 10分钟 首次触发: 2024-03-20 14:05:025. 避坑指南那些我踩过的雷配置陷阱1Prometheus的scrape_interval设置过短导致资源耗尽。对于个人项目30s的采集间隔足够更短间隔会导致存储空间快速增长TSDB压缩效率降低监控目标负载升高频繁暴露指标配置陷阱2未设置合理的告警静默规则。曾经因为没配置维护窗口半夜收到磁盘空间告警后发现只是日志轮转延迟# 合理的告警抑制规则 inhibit_rules: - source_match: severity: critical target_match: severity: warning equal: [alertname]性能优化技巧为Prometheus添加SSD磁盘TSDB随机读写密集限制指标采集数量避免非必要metrics设置适当的保留周期个人项目30天足够# 查看采集指标占用空间 du -sh prometheus/data/ # 清理过期数据 prometheus-tsdb clean --storage.tsdb.pathdata/这套系统已经稳定运行8个月最直观的变化是服务可用性从95%提升到99.9%故障平均修复时间MTTR从2小时降至8分钟。更重要的是终于可以安心睡觉了——当服务真的出问题时手机会第一时间震动提醒。

更多文章