节点在线、应用在线、配置在线使用令牌查询
|
# APM 监控中心 - 星尘监控系统架构
> **版本**:v2.0 | **更新时间**:2026-07-15 | **文档状态**:最新稳定版
> 对应模块:APM 监控中心 / APM
> 相关文档:[APM-3-链路追踪统计](/NewLife/Stardust/Blob/master/Doc/APM-3-链路追踪统计.md) | [APM-17-监控接入API](/NewLife/Stardust/Blob/master/Doc/APM-17-监控接入API.md)
---
## 1. 概述
星尘(Stardust)是一个轻量级分布式监控平台,为企业提供应用性能监控(APM)能力。系统采用**客户端采样统计 + 服务端多级汇总**的架构,在保证监控精度的同时,大幅降低了网络传输和存储成本。
### 1.1 核心设计理念
与传统 APM 系统(如 SkyWalking、Jaeger)全量采集不同,星尘采用:
| 特性 | 传统 APM | 星尘 |
|------|---------|------|
| 数据采集 | 全量采集,服务端聚合 | 客户端采样+统计,服务端汇总 |
| 网络开销 | 高(每次调用上报) | 低(周期性批量上报统计) |
| 存储压力 | 极高 | 可控 |
| 实时性 | 高 | 分钟级 |
### 1.2 系统定位
- **目标用户**:企业内部部署
- **典型规模**:
- 应用数量:20~100 个
- 埋点总数(TraceItem):几十万个(建议控制在 10 万以内)
- 单应用埋点数:100~300 个(不建议超过 1000 个)
- 每日跟踪数据(TraceData):2000~5000 万行
- 每日埋点统计调用:10 亿+ 次
---
## 2. 系统架构
### 2.1 整体架构图
```
┌─────────────────────────────────────────────────────────────────────────────┐
│ 应用层(客户端) │
├─────────────────────────────────────────────────────────────────────────────┤
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ App A │ │ App B │ │ App C │ │ App ... │ │
│ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │
│ │ │ │ │ │
│ │ ┌──────────┴────────────────┴────────────────┘ │
│ │ │ StarTracer(每实例一个) │
│ │ │ - 自动埋点:DB/Redis/HTTP/WebAPI │
│ │ │ - 周期采样(默认60秒) │
│ │ │ - 本地统计:次数/耗时/错误 │
│ └─────┴──→ ProcessSpans() 上报 │
└───────────────────────────────────┬─────────────────────────────────────────┘
│ HTTP POST (JSON/GZip)
│ 每应用每分钟上报一次
▼
┌─────────────────────────────────────────────────────────────────────────────┐
│ 服务端(Stardust.Server) │
├─────────────────────────────────────────────────────────────────────────────┤
│ ┌─────────────────────────────────────────────────────────────────────┐ │
│ │ TraceController │ │
│ │ Report() / ReportRaw() → ProcessData() │ │
│ │ 1.过滤异常埋点 2.GetOrAddItem 3.生成TraceData 4.生成SampleData 5.批量插入│ │
│ └──────────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ┌─────────────────────────┼─────────────────────────┐ │
│ ▼ ▼ ▼ │
│ ┌─────────────────────────┐ ┌─────────────────────────┐ ┌────────────┐ │
│ │ TraceStatService │ │ AppDayStatService │ │ ItemStat │ │
│ │ 追踪统计服务 │ │ 应用天统计服务 │ │ 埋点统计 │ │
│ │ (80%资源占用) │ │ │ │ │ │
│ └─────────────────────────┘ └─────────────────────────┘ └────────────┘ │
└─────────────────────────────────────────────────────────────────────────────┘
```
### 2.2 数据流向
```
客户端采样周期(60秒) → SpanBuilder[] → TraceController.Report()
→ ProcessData → TraceData/SampleData(批量INSERT)
→ 统计队列 → TraceStatService(流式+批量)
→ TraceMinuteStat → TraceHourStat → TraceDayStat → AppDayStat
```
---
## 3. 客户端架构
### 3.1 StarTracer 核心组件
`StarTracer` 是星尘监控客户端的核心实现,继承自 `DefaultTracer`,位于 `Stardust\Monitors\StarTracer.cs`。
#### 核心职责
| 职责 | 说明 |
|------|------|
| 自动埋点 | 通过 DI 注入后,自动为 DB/Redis/HTTP/WebAPI 等建立埋点 |
| 本地统计 | 在采样周期内收集调用次数、耗时、错误等统计信息 |
| 数据上报 | 通过 `ProcessSpans()` 将统计数据上传到星尘服务端 |
| 参数同步 | 接收服务端下发的采样参数(周期、采样数等) |
#### 关键配置参数
| 参数 | 默认值 | 说明 |
|------|--------|------|
| `Period` | 60秒 | 采样周期,每周期上报一次 |
| `MaxSamples` | 1 | 每周期正常采样数 |
| `MaxErrors` | 10 | 每周期异常采样数 |
| `MaxFails` | 2880 | 最大失败队列长度(约2天) |
| `TrimSelf` | true | 剔除埋点上报自身的调用 |
| `EnableMeter` | true | 是否收集应用性能信息 |
### 3.2 上报数据结构
每个 `SpanBuilder` 包含该埋点在本周期内的统计信息:
```json
{
"Name": "/api/user/info",
"Total": 1000, // 本周期总次数
"Errors": 5, // 错误次数
"TotalCost": 15000, // 总耗时(ms)
"MaxCost": 200,
"MinCost": 5,
"Samples": [...] // 正常采样
}
```
**关键理解**:客户端在本地已完成统计汇总,一个埋点在一个周期内无论调用1000次还是10000次,都只上报一条 SpanBuilder。
---
## 4. 服务端架构
### 4.1 TraceController 数据接收
位于 `Stardust.Server\Controllers\TraceController.cs`。
#### 接口定义
| 接口 | 方法 | 说明 |
|------|------|------|
| `/Trace/Report` | POST | 接收普通埋点数据(JSON) |
| `/Trace/ReportRaw` | POST | 接收压缩后的大数据量(GZip) |
#### ProcessData 核心处理流程
```
1. 数据过滤:跟踪规则黑名单 / 应用排除项 / 时间范围 / 名称长度
2. 获取跟踪项:GetOrAddItem(已知性能瓶颈点,已有10分钟缓存)
3. 生成入库数据:TraceData + SampleData
4. 批量入库:支持自动分表
5. 加入统计队列:触发 TraceStatService / AppDayStatService / ItemStatService
```
### 4.2 TraceStatService 统计服务
位于 `Stardust.Server\Services\TraceStatService.cs`,是星尘服务端的**核心性能瓶颈**,占用约80%的服务器资源。
#### 双模式统计策略
| 模式 | 周期 | 方法 | 说明 |
|------|------|------|------|
| 流式计算 | **30秒** | `DoFlowStat()` | 增量累加,仅计算分钟级统计 |
| 批量计算 | **60秒** | `DoBatchStat()` | 覆盖计算,处理小时/天级统计 |
#### 多级统计汇总
```
TraceData → TraceMinuteStat(5分钟粒度)→ TraceHourStat → TraceDayStat → AppDayStat
```
#### 延迟队列机制
使用 `EntityDeferredQueue` 实现批量数据库更新:
| 队列 | 周期 | 说明 |
|------|------|------|
| MinuteQueue | 120秒 | 分钟统计,告警数据源 |
| AppMinuteQueue | 120秒 | 应用分钟统计 |
| HourQueue | 180秒 | 小时统计 |
| DayQueue | 180秒 | 天统计 |
---
## 5. 数据存储
### 5.1 核心数据表
| 表名 | 说明 | 分表策略 | 每日数据量 |
|------|------|----------|-----------|
| `TraceData` | 跟踪数据(原始) | 31张表(按天) | 2000~5000万行 |
| `SampleData` | 采样数据(明细) | 31张表(按天) | 几千万行 |
| `TraceMinuteStat` | 分钟统计 | 无 | < 200万行 |
| `TraceHourStat` | 小时统计 | 无 | < 20万行 |
| `TraceDayStat` | 天统计 | 无 | < 10万行 |
| `AppMinuteStat` | 应用分钟统计 | 无 | < 3万行 |
| `AppDayStat` | 应用天统计 | 无 | < 100行 |
| `TraceItem` | 跟踪项(埋点定义) | 无 | < 10万行 |
| `AppTracer` | 应用跟踪器配置 | 无 | < 1000行 |
### 5.2 分表策略
`TraceData` 和 `SampleData` 采用按天分表(31张循环)。
### 5.3 数据保留策略
| 保留天数 | 适用场景 |
|---------|---------|
| 3~7天 | 数据库压力大 |
| 7~15天 | 标准配置 |
| 15~30天 | 高配环境 |
### 5.4 数据库优化
- **MySQL 压缩表**:`ROW_FORMAT=COMPRESSED`
- **XCode 累加字段**:`UPDATE SET Total=Total+@Total`
- **延迟队列**:批量提交减少IO
---
## 6. 性能分析与优化
### 6.1 性能瓶颈点
| 瓶颈点 | 严重程度 | 说明 |
|--------|---------|------|
| 延迟队列 UPDATE | **严重** | 4个延迟队列批量提交,数据库CPU和IO高 |
| 流式计算频率 | 中等 | 每5秒执行一次,过于频繁 |
| GetOrAddItem | 中等 | 埋点查找/创建涉及数据库 |
### 6.2 已实施的优化
1. **参数调优**:恢复默认配置(5秒/30秒/60秒),支持动态调整
2. **流式计算精简**:仅计算分钟级统计,小时/天级交给批量计算
3. **延迟队列周期延长**:60秒 → 120~180秒
### 6.3 配置参数
| 参数 | 默认值 | 说明 |
|------|--------|------|
| MonitorFlowPeriod | 5秒 | 流式计算周期(推荐生产30秒) |
| MonitorBatchPeriod | 30秒 | 批量计算周期(推荐生产60秒) |
| MonitorSavePeriod | 60秒 | 落盘保存周期(**主要瓶颈**,推荐生产180秒) |
通过配置文件热更新:`appsettings.json` → `StarServer` 配置项。
---
## 7. 附录
### 7.1 关键代码位置
| 功能 | 文件路径 |
|------|---------|
| 客户端核心 | `Stardust\Monitors\StarTracer.cs` |
| 服务端接收 | `Stardust.Server\Controllers\TraceController.cs` |
| 追踪统计服务 | `Stardust.Server\Services\TraceStatService.cs` |
| 应用天统计服务 | `Stardust.Server\Services\AppDayStatService.cs` |
| 应用跟踪器 | `Stardust.Data\Monitors\应用跟踪器.Biz.cs` |
### 7.2 后续计划
| 项目 | 优先级 | 说明 |
|------|--------|------|
| 按需计算 | 高 | 用户查看时加速计算 |
| GetOrAddItem优化 | 中 | 延长缓存、批量预热 |
| 智能调度 | 中 | 根据负载动态调整频率 |
| 时序数据库支持 | 低 | 考虑 InfluxDB/TimescaleDB |
|