Nodejs监控方案

BFF 上线后,未提供监控能力,无法主动发现报错、接口性能等,需要有相应的指标监控 BFF 程序运行状况。

本方案以监控 BFF (Nest.js 应用),描述从指标制定到查看数据面板的过程。

目标

BFF 的监控主要包含系统监控、服务监控、业务监控、报警响应四大类

监控指标

类型 指标类 指标名 描述
系统监控 容器指标 容器 CPU Pod CPU 使用率
进程指标 进程 CPU 进程 CPU 使用率
服务监控 HTTP 指标 接口 QPS 所有接口请求量
接口 P99 延时 接口响应时间,取前 99%
接口 P95 延时 接口响应时间,取前 99%
接口成功率 http 状态码 200
RPC指标 同HTTP指标 /
Spex指标 同HTTP指标 /
业务监控 业务指标 根据业务具体场景而定 /

报警响应

  • 支持报警规则配置
  • 支持邮件通知业务 owner

架构设计

img

主要架构模块

按功能类别主要划分为三个类模块。

  1. 监控 SDK
    • 以项目(Project)维度, 每个项目按初始化参数创建一个 SDK 类实例,用于配置追踪与上报的类别信息。
    • 负责具体类别的数据处理与指标收集,并提供给 Prometheus
    • 业务方直接引入使用,不需要关心指标采集逻辑
  2. 监控面板
    • 以项目(Project)维度, 每个项目创建自己的监控大盘
    • 负责将数据归类并展示对应的可视化图表
  3. 告警
    1. 监听上报数据,支持告警阈值规则配置
    2. 负责告警异常到指定 owner

技术选型

  • 基于 nest 实现监控 SDK
  • 普罗米修斯提供数据采集能力
  • Grafana 提供可视化数据展示
  • AlertManager 提供告警能力

核心流程设计

SDK 设计

img

Controller 设计

  • Method
    • 提供 get 方法,供普罗米修斯访问
  • Router
    • 提供 /metrics 接口,暴露采集到的所有指标给普罗米修斯

Service 设计

Service 基于 prom-client 进行封装,是 SDK 的核心逻辑,提供了对指标的采集

  • 默认指标
    • 导出 Prom-client 采集的默认指标
  • SDK 自动采集的指标
    • QPS
    • 接口耗时
    • 接口错误数
  • 暴露给业务方的方法
    • 基础 API
      • 耗时统计
      • 次数统计(包含异常次数、成功次数)
      • Spex 统计(预留)
      • RPC 统计(预留)
    • 高级 API
      • Histogram(柱状图):统计数据的分布情况(比如 Http_response_time 的时间分布)
      • Summary(摘要):主要用于表示一段时间内数据采样结果(请求持续的时间或响应大小)
      • Gauges(瞬态):最简单的度量指标,监测瞬间状态(监控硬盘容量或者内存的使用量)
      • Counters(累加态):从数据量0开始累积计算,在理想状态下只能是永远的增长不会降低

拦截器设计

拦截器的作用主要是全局采集我们所需要的指标,同时不让业务方感知

img

  • HttpRequests 拦截器
    • 所有请求都会通过 httpRequests 拦截器,在这里进行以下指标收集
    • QPS
    • 接口耗时
  • Exception 拦截器
    • 所有未捕获异常都会经过 Exception 拦截器,在这里进行一下指标收集
    • 接口错误数

如何接入

应用框架应该如何接入

  • 应用框架需要默认依赖该 SDK

现有项目应该如何接入

  • 在现有服务中新增依赖该 SDK
  • 将 SDK 中的 Module 注册到 main 中
  • 并在启动模版中添加对 8081 端口的监控
  • 在 main 中引入拦截器

*监控面板设计*

*面板上需要体现出哪些指标*

*通用指标展示*

  • CPU
  • 内存
  • QPS
  • 接口耗时
  • 接口错误率

其余指标展示(可选)

  • MySQL 数据库指标
    • Shopee 线上的数据库已经装有对应 exporter ,无需手动导出指标数据
  • Spex 指标
  • RPC 指标

*如何展示指标*

目前普罗米修斯支持的类型有下面几类

  • Histogram(柱状图):统计数据的分布情况(比如 Http_response_time 的时间分布)
  • Summary(摘要):主要用于表示一段时间内数据采样结果(请求持续的时间或响应大小)
  • Gauges(瞬态):最简单的度量指标,监测瞬间状态(监控硬盘容量或者内存的使用量)
  • Counters(累加态):从数据量0开始累积计算,在理想状态下只能是永远的增长不会降低

指标展示分类如下

指标 类型
CPU Gauges(瞬态) & Summary(摘要)
内存 Gauges(瞬态) & Summary(摘要)
QPS Gauges(瞬态)
接口耗时 Histogram(柱状图)P99、P90
接口错误率 Histogram(柱状图)P99、P90
数据库成功率 Histogram(柱状图)
Spex 指标 Histogram(柱状图)P99、P90
RPC 指标 Histogram(柱状图)P99、P90

*告警设计*

*哪些指标需要告警*

告警可以让我们及时响应线上异常,避免问题被动发现

通常我们会对重要或者紧急的线上指标进行告警响应,以下指标需要我们进行告警

  • CPU
  • 内存
  • 接口错误率
  • 数据库 I/O 异常
  • Spex 异常
  • RPC 异常

*告警策略*

指标名 介绍 告警阈值 告警方式
CPU 进程 CPU 使用率 >= 80%,持续5分钟 sea talk & 邮件
Memory 进程 Mem 使用率 >= 80%,持续5分钟 sea talk & 邮件
接口错误率 任何一个接口的错误率 每分钟 > 0% 邮件
每分钟 > 5% sea talk
数据库异常 数据库 I/O 异常 每分钟 > 0 邮件
每分钟 > 10 sea talk
Spex 异常 任何一个 Spex 异常 每分钟 > 0 邮件
每分钟 > 10 sea talk
RPC 异常 任何一个 RPC 异常 每分钟 > 0 邮件
每分钟 > 10 sea talk