light-sentry-sdk/docs/00-architecture.md

228 lines
10 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Light-Sentry 轻量级前端监控系统 - 架构设计文档
## 一、设计理念
### 1.1 核心原则
- **轻量优先**SDK < 10KB (gzip)服务端单节点可运行
- **插件化架构**核心极小功能通过插件扩展按需加载
- **性能友好**不阻塞主线程不影响页面性能
- **易于部署**docker-compose up 一键启动无需复杂运维
- **兼容 Sentry**接口兼容 Sentry 协议可平滑迁移
### 1.2 设计目标
| 指标 | 目标值 | 说明 |
|------|--------|------|
| SDK 核心体积 | < 5KB gzip | 只含事件总线和上报 |
| SDK 完整体积 | < 15KB gzip | 含错误+性能+网络插件 |
| 单节点承载 | 10万+ 事件/ | 1C2G 服务器 |
| 部署时间 | < 5 分钟 | docker-compose 一键部署 |
| 数据延迟 | < 30 | 从上报到可查询 |
---
## 二、整体架构
### 2.1 架构图
```
┌─────────────────────────────────────────────────────────────┐
│ 前端 SDK │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌──────────────┐ │
│ │ Error │ │ Perf │ │ Network │ │ Behavior │ │
│ │ Plugin │ │ Plugin │ │ Plugin │ │ Plugin │ │
│ └────┬────┘ └────┬────┘ └────┬────┘ └──────┬───────┘ │
│ └─────────────┴─────────────┴──────────────┘ │
│ │ │
│ ┌─────┴─────┐ │
│ │ Core │ │
│ │ (EventBus │ │
│ │ + Queue │ │
│ │ + Report)│ │
│ └─────┬─────┘ │
└──────────────────────────┼───────────────────────────────────┘
│ HTTP (beacon / fetch / img)
┌─────────────────────────────────────────────────────────────┐
│ Nginx 反向代理 │
│ 限流 · CORS · 负载均衡 · SSL 卸载 │
└──────────────────────────┬───────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ API 接入层 (Node.js) │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ 1. DSN 认证 (publicKey 校验) │ │
│ │ 2. 协议解析 (envelope / store / 自定义) │ │
│ │ 3. 数据清洗 (脱敏、过滤、去重) │ │
│ │ 4. 错误指纹计算 │ │
│ │ 5. 内存队列 + 批量写入 │ │
│ └───────────────────────────────────────────────────────┘ │
└──────────┬───────────────────────────┬──────────────────────┘
▼ ▼
┌─────────────────────┐ ┌───────────────────────┐
│ Loki (日志) │ │ MySQL (聚合数据) │
│ - 原始错误堆栈 │ │ - 项目配置 │
│ - 性能指标明细 │ │ - 错误聚合统计 │
│ - 用户行为日志 │ │ - 性能指标趋势 │
│ 保留: 7-30 天 │ │ - 告警规则 │
└─────────────────────┘ │ - 用户管理 │
└───────────┬───────────┘
┌─────────────────────────────────────────────────────────────┐
│ 查询 & 展示层 │
│ ┌──────────────┐ ┌──────────┐ ┌──────────────────────┐ │
│ │ 管理后台 │ │ 告警引擎 │ │ Grafana 仪表盘 │ │
│ │ (原生 JS) │ │ (规则引擎)│ │ (复用现有工具) │ │
│ │ - 项目管理 │ │ - 规则 │ │ - 错误趋势图 │ │
│ │ - 错误查询 │ │ - 收敛 │ │ - 性能仪表盘 │ │
│ │ - 性能分析 │ │ - 通知 │ │ - 自定义面板 │ │
│ └──────────────┘ └──────────┘ └──────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
```
### 2.2 模块职责
| 层级 | 模块 | 职责 | 技术选型 |
|------|------|------|----------|
| 采集层 | 前端 SDK | 数据采集队列上报 | TypeScript + 插件化 |
| 接入层 | API Server | 认证解析清洗入队 | Node.js + Express |
| 存储层 | Loki | 原始日志存储 | Grafana Loki |
| 存储层 | MySQL | 聚合数据配置用户 | MySQL 8.0 / SQLite |
| 计算层 | 聚合服务 | 错误聚合性能统计 | 定时任务 / 实时聚合 |
| 计算层 | 告警引擎 | 规则匹配告警通知 | 内置规则引擎 |
| 展示层 | 管理后台 | 项目管理数据查询 | 原生 HTML + JS |
| 展示层 | Grafana | 数据可视化 | Grafana |
---
## 三、数据流
### 3.1 错误上报流程
```
前端触发错误
ErrorPlugin 捕获
封装为标准事件格式
加入内存队列
批量/定时/页面隐藏 触发上报
sendBeacon / fetch / img 标签
Nginx (限流 + CORS)
API Server
├─ DSN 认证
├─ envelope 解析
├─ 数据清洗 (脱敏IP、UA)
├─ 计算错误指纹
└─ 写入内存队列
批量消费
├─ 写入 Loki (原始数据)
└─ 更新 MySQL 聚合表
Grafana / 管理后台 查询
告警引擎 检测规则
触发通知 (Webhook / 邮件)
```
### 3.2 性能指标流程
```
PerformancePlugin 监听性能指标
(FP / FCP / LCP / CLS / TTI / Long Task)
采样过滤 (默认 10% 采样率)
批量上报
API Server 接收
├─ 数据校验
└─ 写入 Loki
定时聚合任务 (每 5 分钟)
├─ 计算 P50 / P90 / P95 / P99
├─ 按项目 + 页面 + 小时 聚合
└─ 写入 MySQL 性能表
Grafana 展示趋势图
```
---
## 四、技术选型说明
### 4.1 为什么用 Loki 而不是 ES/ClickHouse
| 特性 | Loki | Elasticsearch | ClickHouse |
|------|------|---------------|------------|
| 部署复杂度 | 极低单二进制 | 需调优 | |
| 资源消耗 | 内存 + 磁盘 | 内存密集 | 中高 |
| 查询性能 | 中等日志足够 | | 极高 |
| 全文检索 | 支持Label + grep | 强大 | 支持 |
| Grafana 集成 | 原生 | 需配置 | 需配置 |
| 适合场景 | 日志错误追踪 | 全文检索复杂分析 | OLAP大数据量 |
**结论**轻量级监控Loki 足够用运维成本最低 Grafana 集成最好
### 4.2 为什么用 MySQL 存聚合数据?
- 成熟稳定运维简单
- 聚合后数据量不大每天几千~几万行
- 事务支持数据一致性好
- 管理后台查询方便
- 小项目甚至可以用 SQLite零运维
### 4.3 为什么前端用原生 JS
- 后台页面不复杂原生 JS 足够
- 无构建流程修改即生效
- 体积小加载快
- 不依赖前端框架生态长期维护成本低
---
## 五、与现有 Light-Sentry 的关系
### 5.1 现有能力
- Sentry 兼容接口store / envelope
- Loki 原始日志存储
- Grafana 仪表盘
- 项目管理后台
- Docker Compose 一键部署
- NEL (Network Error Logging) 支持
### 5.2 待完善能力
- 🚧 自研轻量 SDK
- 🚧 错误指纹聚合
- 🚧 性能指标聚合
- 🚧 告警引擎
- 🚧 map 解析
- 🚧 用户会话追踪
- 🚧 行为分析插件
---
## 六、文档目录
```
docs/
├── 00-architecture.md # 本文档 - 整体架构
├── 01-sdk-design.md # 前端 SDK 设计
├── 02-api-server.md # 服务端接入层设计
├── 03-data-aggregation.md # 数据聚合与存储设计
├── 04-alert-engine.md # 告警引擎设计
├── 05-admin-dashboard.md # 管理后台与可视化设计
└── 06-deployment.md # 部署与运维设计
```