本文目录导读:
- 第一阶段:确立监控的四个核心层面
- 第二阶段:选择技术栈(推荐三种方案)
- 第三阶段:具体搭建步骤(以“Prometheus + Grafana”为例)
- 第四阶段:关键告警策略(避免告警疲劳)
- 常见问题与避坑指南
- 总结:最小可行方案(MVP)
搭建一个全栈项目的监控告警系统,核心目标是快速发现故障、定位根因、并通知到人,一个完整的方案通常涵盖前端、后端、基础设施(服务器/数据库)、以及业务层面。
以下是一套从零到一、兼顾成本和实用性的搭建指南,分为轻量级方案(适合中小团队)和企业级方案(适合大流量/高要求场景)。
第一阶段:确立监控的四个核心层面
在动手前,先明确要监控什么:
- 基础设施层:CPU、内存、磁盘、网络 I/O、服务器宕机。
- 应用层(后端):API 响应时间、错误率(5xx/4xx)、QPS、JVM(Java)/Node Event Loop(Node.js)指标。
- 前端层:页面加载时间(FCP/LCP)、JS 报错率、API 请求失败率、白屏时间。
- 业务层:登录失败率、下单成功率、支付超时率(通常需要埋点)。
第二阶段:选择技术栈(推荐三种方案)
开源全家桶(推荐,成本低,可控性高)
组合:Prometheus + Grafana + Alertmanager + Loki/Promtail(日志)
- 数据采集:Node Exporter(服务器)、cAdvisor(容器/性能)、业务代码集成 Prometheus Client SDK。
- 可视化:Grafana 统一看板。
- 告警引擎:Alertmanager(管理告警去重、分组、静默)。
- 日志采集:Loki(轻量级日志聚合,对应 ELK)。
- 前端监控:Sentry(开源,专门做 JS 错误追踪)。
商业 SaaS(开箱即用,适合小团队没运维)
组合:Datadog / New Relic / 听云 / 阿里云 ARMS
- 优点:插拔式接入,自带全栈 tracing(链路追踪)。
- 缺点:按数据量收费,费用较高。
自建轻量级(适合只有几台服务器的小项目)
组合:夜莺(Nightingale) + Categraf + VictoriaMetrics
- 特点:国产开源,对国内用户友好,兼容 Prometheus 生态,单机就能运行。
第三阶段:具体搭建步骤(以“Prometheus + Grafana”为例)
这是最经典的“全能型”方案。
Step 1:基础设施监控
- 安装 Node Exporter:在所有服务器上执行。
wget https://github.com/prometheus/node_exporter/releases/latest/download/node_exporter-linux-amd64.tar.gz tar -xzf node_exporter-*.tar.gz && ./node_exporter
- 配置 Prometheus:在
prometheus.yml中添加抓取目标。scrape_configs: - job_name: 'node_exporter' static_configs: - targets: ['ip1:9100', 'ip2:9100']
Step 2:后端应用监控(以 Node.js 为例)
-
代码接入:安装
prom-client。const Prometheus = require('prom-client'); const httpRequestDuration = new Prometheus.Histogram({ name: 'http_request_duration_seconds', help: 'Duration of HTTP requests in seconds', labelNames: ['method', 'route', 'status_code'], buckets: [0.05, 0.1, 0.5, 1, 3, 5] // 性能敏感度 }); // 在中间件里记录每一次请求 app.use((req, res, next) => { const end = httpRequestDuration.startTimer(); res.on('finish', () => { end({ method: req.method, route: req.path, status_code: res.statusCode }); }); next(); }); // 暴露 /metrics 端点给 Prometheus 抓取 app.get('/metrics', async (req, res) => { res.set('Content-Type', Prometheus.register.contentType); res.end(await Prometheus.register.metrics()); }); -
配置告警规则:在 Prometheus 中定义。
# alert.rules.yml groups: - name: api_error rules: - alert: HighErrorRate expr: rate(http_request_duration_seconds_count{status_code=~"5.."}[5m]) > 0.1 for: 2m annotations: summary: "API 5xx 错误率超过 10%" runbook_url: "https://your-wiki.com/runbook"
Step 3:前端监控(Sentry + lighthouse)
- 错误监控(Sentry):
- 在 Sentry SaaS 或自建 Sentry 中创建一个项目。
- 前端引入 SDK:
import * as Sentry from "@sentry/vue"; // 或 react Sentry.init({ dsn: "你的 DSN", tracesSampleRate: 1.0, // 性能监控采样率 replaysSessionSampleRate: 0.1, // 回放录制 }); - 告警配置:在 Sentry 后台设置“Alert Rules”(如:某错误 5 分钟内超过 10 次)。
- 性能监控:集成
web-vitals库,将 LCP、FID、CLS 数据上报到 Prometheus 或商业看板。
Step 4:告警通知(Grafana / Alertmanager)
- 配置 Alertmanager:支持多种接收器。
receivers: - name: 'webhook' webhook_configs: - url: 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx' # 企业微信群机器人 - name: 'email' email_configs: - to: 'ops@company.com' from: 'alert@company.com' smarthost: 'smtp.exmail.qq.com:465' route: receiver: 'webhook' - 配置 Grafana 告警(比直接配 Prometheus 更直观):
- 进入 Grafana → Alerting → Contact Points。
- 添加钉钉/企微/飞书 Webhook。
- 创建告警规则:CPU > 80% 且持续 5 分钟” → 通知
@on-call值班人员。
Step 5:整合可视化
在 Grafana 中导入 Dashboards:
- Node Exporter Full(ID:1860)——看服务器大盘。
- Spring Boot / Node.js(按语言搜索)——看应用性能。
- 自己组装:左边放 CPU/内存趋势,中间放 API 延迟,右边放错误率。
第四阶段:关键告警策略(避免告警疲劳)
不要什么异常都报警,推荐三条铁律:
- 基于“速率”而非“绝对值”:
- ❌ 错误:
error_count > 10(流量波谷时会误报,波峰时又不报)。 - ✅ 正确:
rate(error_count[5m]) > 0.05(5分钟内错误比例超过5%)。
- ❌ 错误:
- 持续异常才告警:
- 设置
for: 2m,临时抖动不通知。
- 设置
- 分级告警:
- P0(业务不可用):电话/短信 -> 5 分钟无人响应升级。
- P1(响应慢):群消息 + @负责人。
- P2(磁盘快满,但还没满):日报/周报。
常见问题与避坑指南
- 数据量过大怎么办?
- 降采样:Prometheus 的
record规则,1 分钟数据保留 7 天,1 小时数据保留 90 天。 - 或使用 VictoriaMetrics(支持更高效的压缩和长期存储)。
- 降采样:Prometheus 的
- 没有运维人员值班?
- 使用 PagerDuty(海外)或 蓝鲸告警(国内)做排班轮询、升级策略。
- 全链路追踪(Tracing)怎么搞?
- 如果用了微服务,必须上 Jaeger 或 Zipkin。
- 配合 OpenTelemetry 标准:
opentelemetry-js/opentelemetry-java,自动标注跨服务调用耗时。 - 告警触发时,直接关联 Trace ID,快速定位慢在哪段代码。
- 如何追踪日志?
- 配合 Loki(Grafana 全家桶)或 ELK。
- 告警规则里加入
label: severity=critical,告警消息附带日志链接。
最小可行方案(MVP)
如果团队只有 2-3 个人,可以这样起步:
- 基础设施:安装 Node Exporter 到所有服务器,用 Prometheus 采集。
- 应用错误:后端集成
prom-client,前端集成 Sentry(免费额度足够)。 - 可视化:做好 Grafana Dashboard,至少能看 CPU / 内存 / 5xx错误率 这三张图。
- 通知:配置 Webhook 到企业微信群,加上
@all。 - 留存:数据保留 15 天(硬盘不够时只保留核心指标)。
这样做完后,基本上能做到服务器死机 1 分钟内收到通知、接口错误率飙升马上知道、前端白屏 30 秒内触发告警。
标签: 告警搭建