节点在线、应用在线、配置在线使用令牌查询
大石头 authored at 2021-12-16 19:49:30
12.37 KiB
Stardust
# 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 |