从‘它又挂了‘到‘一切正常‘:我是如何用Prometheus+Grafana为我的小破站搭建监控告警的

张开发
2026/4/8 14:37:38 15 分钟阅读

分享文章

从‘它又挂了‘到‘一切正常‘:我是如何用Prometheus+Grafana为我的小破站搭建监控告警的
从服务又崩了到秒级响应我的低成本监控系统搭建实录凌晨三点手机突然震动。迷迷糊糊抓起来一看是服务器内存告警的钉钉消息。十分钟后当我通过预案脚本完成服务重启看着Grafana仪表盘上重新跳动的指标曲线时突然想起半年前那个手忙脚乱的夜晚——同样是服务崩溃但那次直到用户投诉邮件堆满收件箱我才发现已经宕机了四小时。这种从被动救火到主动防御的转变全靠一套花费不到两杯咖啡钱的监控体系。如果你也在用云服务器运行个人博客、Side Project或者小型API服务这套组合方案可能正是你需要的Prometheus负责抓取和存储指标Grafana实现可视化Alertmanager处理告警通知。最妙的是它们全部开源且对资源消耗极低1核2G的服务器就能流畅运行。1. 为什么你的小项目更需要监控很多人认为监控是大厂的玩具其实恰恰相反。大厂有专职运维团队和成熟的监控平台而个人开发者往往要独自面对所有突发状况。我统计过自己项目的故障类型隐性故障接口返回500错误但前端没有展示占比42%资源耗尽内存泄漏导致服务崩溃占比31%依赖故障数据库连接超时占比19%网络问题CDN节点异常占比8%没有监控时这些问题的发现平均需要47分钟部署监控后95%的问题能在5分钟内被捕获。更关键的是合理的告警规则能帮你过滤掉80%的非紧急通知避免狼来了效应。真实案例我的Node.js应用曾因为一个未处理的Promise rejection导致内存泄漏。设置监控前这个问题平均每周导致一次服务重启添加内存使用率告警后第二次异常增长时就定位到了问题代码。2. 搭建你的监控铁三角2.1 Prometheus指标收集引擎在Docker时代部署Prometheus只需要一个配置文件和一串命令# prometheus.yml 核心配置示例 global: scrape_interval: 15s scrape_configs: - job_name: node static_configs: - targets: [192.168.1.100:9100] # node_exporter地址 - job_name: nginx metrics_path: /nginx_status static_configs: - targets: [localhost:9113] # nginx_exporter地址启动命令docker run -d --nameprometheus \ -p 9090:9090 \ -v /path/to/prometheus.yml:/etc/prometheus/prometheus.yml \ prom/prometheus关键配置技巧抓取间隔业务类指标建议15s基础设施指标可放宽到1m内存优化添加--storage.tsdb.retention.time7d限制数据保留时间服务发现小规模部署用static_configs即可超过10个实例建议用file_sd2.2 Grafana可视化利器安装Grafana后第一件事是导入现成的仪表盘模板。推荐这些适合小团队的模板ID监控对象仪表盘ID关键指标Linux主机1860CPU/内存/磁盘/网络Nginx12708QPS/响应时间/4xx5xx错误MySQL7362查询性能/连接数/慢查询Node.js11159内存堆栈/事件循环延迟配置数据源时有个隐藏技巧在Prometheus的scrape_configs中添加Grafana的job可以监控Grafana自身的性能- job_name: grafana metrics_path: /metrics static_configs: - targets: [grafana:3000]2.3 Alertmanager告警中枢告警规则配置示例保存为alerts.ymlgroups: - name: host-alerts rules: - alert: HighMemoryUsage expr: (node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes 0.85 for: 5m labels: severity: warning annotations: summary: 高内存使用 ({{ $value | humanizePercentage }}) description: {{ $labels.instance }} 内存使用超过85%持续5分钟通知渠道配置对比渠道响应速度配置复杂度信息量推荐场景邮件慢低高非紧急通知钉钉快中中国内团队首选Telegram快中中国际项目Slack中高高已有Workspace3. 针对常见服务的监控实践3.1 Web服务监控三板斧对于运行NginxNode.jsMySQL的典型Web栈建议部署这些exporterNginx监控docker run -d --name nginx-exporter \ -p 9113:9113 \ -e NGINX_STATUS_URLhttp://nginx/status \ nginx/nginx-prometheus-exporter关键指标nginx_http_requests_total统计不同状态码的请求量nginx_http_request_duration_seconds响应时间分布Node.js应用监控 安装prom-client包后添加埋点const client require(prom-client); const collectDefaultMetrics client.collectDefaultMetrics; collectDefaultMetrics({ timeout: 5000 }); app.get(/metrics, async (req, res) { res.set(Content-Type, client.register.contentType); res.end(await client.register.metrics()); });MySQL监控docker run -d --name mysqld-exporter \ -p 9104:9104 \ -e DATA_SOURCE_NAMEexporter:password(mysql:3306)/ \ prom/mysqld-exporter3.2 告警规则设计的黄金法则经过多次调整我发现这些规则组合效果最佳必设基础告警- alert: InstanceDown expr: up 0 for: 1m labels: severity: critical - alert: HighLoad expr: node_load5 count by (instance)(node_cpu_seconds_total{modeidle}) for: 5m业务级告警根据API特性调整- alert: APIErrorRate expr: sum(rate(http_requests_total{status~5..}[1m])) by (endpoint) / sum(rate(http_requests_total[1m])) by (endpoint) 0.05 for: 2m经验之谈避免通知疲劳的关键是设置合理的for时长。我建议基础设施告警用5分钟阈值业务告警用2分钟给短暂波动留出缓冲时间。4. 低成本运维的进阶技巧4.1 资源优化方案在2GB内存的服务器上运行全套监控的方案# 限制容器内存使用单位可以是b,k,m,g docker run -d --memory512m --cpus0.5 prom/prometheus docker run -d --memory256m grafana/grafana监控组件资源占用实测数据组件空闲内存高负载时内存推荐配置Prometheus120MB450MB512MBGrafana80MB150MB256MBnode_exporter15MB25MB32MB4.2 数据保留与备份策略对于个人项目推荐这种分层存储方案热数据Prometheus本地保留7天温数据每周备份到对象存储如AWS S3# 使用prometheus-backup工具 docker run -v prom_data:/prometheus \ -e S3_BUCKETmy-monitoring-backups \ prometheus-backup冷数据每月导出重要指标到CSV长期存档4.3 异常检测的智能玩法除了静态阈值还可以用PromQL的预测功能# 预测磁盘将在4天后写满 predict_linear(node_filesystem_free_bytes[6h], 4*86400) 0 # 检测流量异常增长 abs(delta(http_requests_total[5m])) 3 * stddev_over_time(http_requests_total[1h])最近半年这套监控系统帮我拦截了17次潜在故障平均每月减少3.2小时的故障处理时间。最意外的是通过分析Grafana的历史图表我发现自己的博客在每周四上午10点会出现规律性的CPU使用高峰——原来那是搜索引擎爬虫的固定抓取时间。

更多文章