全栈项目监控告警怎么搭建?

访客 全栈框架 2

本文目录导读:

  1. 第一阶段:确立监控的四个核心层面
  2. 第二阶段:选择技术栈(推荐三种方案)
  3. 第三阶段:具体搭建步骤(以“Prometheus + Grafana”为例)
  4. 第四阶段:关键告警策略(避免告警疲劳)
  5. 常见问题与避坑指南
  6. 总结:最小可行方案(MVP)

搭建一个全栈项目的监控告警系统,核心目标是快速发现故障、定位根因、并通知到人,一个完整的方案通常涵盖前端、后端、基础设施(服务器/数据库)、以及业务层面

以下是一套从零到一、兼顾成本和实用性的搭建指南,分为轻量级方案(适合中小团队)和企业级方案(适合大流量/高要求场景)。


第一阶段:确立监控的四个核心层面

在动手前,先明确要监控什么:

  1. 基础设施层:CPU、内存、磁盘、网络 I/O、服务器宕机。
  2. 应用层(后端):API 响应时间、错误率(5xx/4xx)、QPS、JVM(Java)/Node Event Loop(Node.js)指标。
  3. 前端层:页面加载时间(FCP/LCP)、JS 报错率、API 请求失败率、白屏时间。
  4. 业务层:登录失败率、下单成功率、支付超时率(通常需要埋点)。

第二阶段:选择技术栈(推荐三种方案)

开源全家桶(推荐,成本低,可控性高)

组合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:基础设施监控

  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
  2. 配置 Prometheus:在 prometheus.yml 中添加抓取目标。
    scrape_configs:
      - job_name: 'node_exporter'
        static_configs:
          - targets: ['ip1:9100', 'ip2:9100']

Step 2:后端应用监控(以 Node.js 为例)

  1. 代码接入:安装 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());
    });
  2. 配置告警规则:在 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)
    1. 在 Sentry SaaS 或自建 Sentry 中创建一个项目。
    2. 前端引入 SDK:
      import * as Sentry from "@sentry/vue"; // 或 react
      Sentry.init({
        dsn: "你的 DSN",
        tracesSampleRate: 1.0, // 性能监控采样率
        replaysSessionSampleRate: 0.1, // 回放录制
      });
    3. 告警配置:在 Sentry 后台设置“Alert Rules”(如:某错误 5 分钟内超过 10 次)。
  • 性能监控:集成 web-vitals 库,将 LCP、FID、CLS 数据上报到 Prometheus 或商业看板。

Step 4:告警通知(Grafana / Alertmanager)

  1. 配置 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'
  2. 配置 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 延迟,右边放错误率。

第四阶段:关键告警策略(避免告警疲劳)

不要什么异常都报警,推荐三条铁律:

  1. 基于“速率”而非“绝对值”
    • ❌ 错误:error_count > 10(流量波谷时会误报,波峰时又不报)。
    • ✅ 正确:rate(error_count[5m]) > 0.05(5分钟内错误比例超过5%)。
  2. 持续异常才告警
    • 设置 for: 2m,临时抖动不通知。
  3. 分级告警
    • P0(业务不可用):电话/短信 -> 5 分钟无人响应升级。
    • P1(响应慢):群消息 + @负责人。
    • P2(磁盘快满,但还没满):日报/周报。

常见问题与避坑指南

  1. 数据量过大怎么办?
    • 降采样:Prometheus 的 record 规则,1 分钟数据保留 7 天,1 小时数据保留 90 天。
    • 或使用 VictoriaMetrics(支持更高效的压缩和长期存储)。
  2. 没有运维人员值班?
    • 使用 PagerDuty(海外)或 蓝鲸告警(国内)做排班轮询、升级策略。
  3. 全链路追踪(Tracing)怎么搞?
    • 如果用了微服务,必须上 JaegerZipkin
    • 配合 OpenTelemetry 标准:opentelemetry-js / opentelemetry-java,自动标注跨服务调用耗时。
    • 告警触发时,直接关联 Trace ID,快速定位慢在哪段代码。
  4. 如何追踪日志?
    • 配合 Loki(Grafana 全家桶)或 ELK
    • 告警规则里加入 label: severity=critical,告警消息附带日志链接。

最小可行方案(MVP)

如果团队只有 2-3 个人,可以这样起步:

  1. 基础设施:安装 Node Exporter 到所有服务器,用 Prometheus 采集。
  2. 应用错误:后端集成 prom-client,前端集成 Sentry(免费额度足够)。
  3. 可视化:做好 Grafana Dashboard,至少能看 CPU / 内存 / 5xx错误率 这三张图。
  4. 通知:配置 Webhook 到企业微信群,加上 @all
  5. 留存:数据保留 15 天(硬盘不够时只保留核心指标)。

这样做完后,基本上能做到服务器死机 1 分钟内收到通知、接口错误率飙升马上知道、前端白屏 30 秒内触发告警

标签: 告警搭建

抱歉,评论功能暂时关闭!