mongodb-log

MongoDB Log & Metric Analyzer 项目设计

1.文档定位

本文说明当前版本实际采用的产品设计、系统架构、数据流、功能拆分、核心算法、资源边界和验证方式。它面向以下读者:

本文描述的是「当前实现」,不是早期设想。发生冲突时,判断优先级为:

  1. 当前源码和自动化测试。
  2. CLAUDE.md 中的硬约束。
  3. 本文与用户指南。
  4. README.md 中的概览说明。

2.项目目标与边界

2.1 核心目标

项目解决的是运维人员在个人电脑上离线分析 MongoDB 诊断文件的问题,包含两个相互独立但共用运行外壳的工作区:

2.2 明确不做的事情

2.3 运行假设

3.总体设计原则

3.1 本地优先

浏览器页面、后端服务、分析计算和文件存储全部位于同一台电脑。页面通过本机 REST API 访问 Spring Boot 服务,不引入远端依赖。

3.2 流式和有界优先

Log 按行读取,FTDC 按 BSON 文档和 Block 读取。系统尽量只保留聚合值、固定容量明细和当前解码 Block,避免把完整输入展开到内存。

3.3 精确统计与有界展示分离

需要业务精确性的统计基于全部有效数据计算;只有明细保留和图表点数受限。例如:

3.4 缺失值不等于零

MongoDB 不同版本、日志格式和配置提供的字段不同。所有可选指标都按字段是否存在判断;缺失字段展示为「日志未提供」,不会补成零。

3.5 发布完整结果,不暴露半成品

JSON、JSONL、FTDC catalog 和索引先写临时文件,再原子移动到正式位置。FTDC 工作目录在全部文件建索引成功后才整体发布到任务目录。

3.6 证据和结论分离

页面提供测量值、聚合结果和排查线索,但不把线索写成确定根因。例如出现 COLLSCAN 时,只建议结合索引、过滤条件和集合规模继续核对。

4.系统架构

浏览器
└── Vue 3 单页应用
    ├── MongoDB Log 工作区
    ├── MongoDB Metric 工作区
    └── 内存与数据维护入口
            │ HTTP/JSON/Multipart
            ▼
Spring Boot 本地服务
├── web        REST 接口、参数校验、统一错误响应
├── task       上传、任务状态、异步执行、恢复与删除
├── parser     Log 与 FTDC 格式解析
├── analysis   聚合、诊断、FTDC 序列查询与降采样
├── report     脱敏 Markdown 报告
├── storage    JSON/JSONL、catalog、二进制索引
└── config     单线程执行器、解析器装配、浏览器启动
            │
            ▼
本地 data 目录
├── Log 任务元数据和结果
└── FTDC 任务元数据、源副本、catalog 和 blocks.idx

4.1 后端分层职责

包 核心职责 设计要点
config 组装解析器、创建任务执行器、启动浏览器 只负责运行配置,不承载业务逻辑
web REST API、参数校验、错误映射 Controller 不直接实现解析算法
task 任务创建、状态迁移、后台执行、清理 Log 与 FTDC 生命周期分开建模
parser 输入格式识别和字段提取 解析失败显式分类,不静默丢弃
analysis 统计、诊断、序列合并与降采样 完整统计与有界输出分离
storage 任务与结果持久化 临时文件加原子移动,删除前校验路径
report 生成 AI 可读报告 只读取已持久化结果,并统一脱敏

4.2 前端分层职责

位置 核心职责
App.vue 工作区切换、Log 任务状态、结果视图和全局页面状态
api/*.js REST 请求、错误消息和文件下载
components/ Log 上传、任务列表、统计、诊断、慢查询详情、通用图表
components/ftdc/ FTDC 上传、任务列表、指标组选取和图表
utils/format.js 时间、字节、时长、百分比格式化
utils/queryExplanation.js 基于实际字段生成保守的查询解读

5.公共任务模型与并发设计

5.1 状态机

Log 和 FTDC 都采用相同的四态模型:

QUEUED → RUNNING → COMPLETED
                 ↘ FAILED

5.2 单线程任务执行器

TaskExecutorConfig 创建一个守护单线程执行器。Log 分析和 FTDC 建索引共用它,因此上传任务按队列顺序处理,不会同时争抢大量内存和磁盘带宽。

5.3 FTDC 公平串行许可

FTDC 建索引、序列查询以及内部分页/导出组件共用 FtdcOperationGate。它使用公平的单许可 Semaphore,确保重型 FTDC 操作串行执行,并在异常后释放许可。

5.4 前端轮询

6.MongoDB Log 功能设计

6.1 上传与任务创建

功能

用户可以为任务命名,并上传普通文本、结构化 JSON 或 .gz 日志。多个文件按选择顺序合并为一个分析任务。

设计点

核心类

6.2 文件流式读取

功能

后台逐文件、逐行解析日志,并持续更新处理字节数和行数。

设计点

核心类

6.3 格式路由与解析结果

功能

同一任务可以包含 MongoDB 结构化日志和旧版单行日志。

设计点

CompositeLogParser 去除 BOM 后检查行首:

每一行都返回 ParseOutcome,状态为:

状态 含义 是否可以携带部分字段
SUCCESS 已完整解析当前支持字段 是
PARTIAL 主体可用,但部分字段无效或缺失 是
SKIPPED 空行或非 MongoDB 日志 否
FAILED 看起来是目标格式,但结构或关键字段无效 否

错误码进入 parseErrors 聚合,页面披露失败、部分解析和跳过数量。

6.4 结构化日志解析

功能

解析 MongoDB 4.4 及以上常见结构化日志字段,同时兼容字段增减。

设计点

核心类

6.5 旧版单行日志解析

功能

解析旧版时间、级别、组件、上下文和消息格式,并从消息中提取慢查询、连接和心跳信息。

设计点

核心类

6.6 查询模式归一化

功能

把字面值不同但结构相同的查询归入同一模式。

设计点

核心类

6.7 慢查询聚合

功能

基于所有成功提取耗时的慢查询生成统计。

输出

八档耗时区间

Key 范围
lt_100ms <100ms
100ms_500ms 100ms-500ms
500ms_1s 500ms-1s
1s_3s 1s-3s
3s_10s 3s-10s
10s_30s 10s-30s
30s_60s 30s-60s
gte_60s >=60s

边界采用左闭右开,最后一档无上限。每档记录数量、占比、总耗时、平均耗时和最大耗时。

CPU 设计

连接数设计

旧版连接消息中的当前连接数按 UTC 小时聚合为平均值。没有样本的小时不会自动补零。

核心类

6.8 Top 5000 与 Top 50

全局 Top 5000

TopSlowQueryCollector 使用固定容量最小堆:

这保证 Top 5000 是从全部慢查询中精确选取,不是抽样。

Top 50 查询模式

6.9 运行诊断

功能

运行诊断独立于慢查询汇总,输出到 diagnostics.json,不会改变旧的 summary.json 口径。

诊断范围

有界策略

近似计数器满时对全部候选计数减一并移除零值,这是有界高频项估计,不应解释为完整精确枚举。

慢查询线索规则

当前实现会标记:

这些规则只生成线索,不生成自动根因。

核心类

6.10 结果持久化和恢复

目录

data/
├── tasks-index.json
├── tasks/<task-id>/
│   ├── metadata.json
│   ├── summary.json
│   ├── diagnostics.json
│   └── top-slow-queries.jsonl
└── work/<task-id>/

设计点

核心类

6.11 结果页面

慢查询分析视图

慢查询详情

竞态处理

6.12 Markdown 报告

功能

用户可下载当前 Log 任务的 Markdown 报告,供人工检查或交给 AI 二次分析。

内容

隐私设计

核心类

7.MongoDB Metric 功能设计

7.1 上传与任务创建

功能

一个任务上传 1~20 个非空 FTDC 文件,文件按内容验证,不依赖扩展名。

设计点

核心类

7.2 外层 BSON 扫描

功能

逐文档读取 FTDC 文件,定位 type=1 指标 Block。

设计点

7.3 Block 解压和结构验证

功能

解压一个 Block,读取 baseline、Schema、样本数量、delta 偏移和零游程信息。

硬上限

项目 上限
声明解压长度 10,000,000 字节
单 Block 样本数 100,000
指标数 × 样本数 1,000,000

设计点

Baseline 展平

核心类

7.4 Catalog 与二进制索引

功能

建索引阶段只保存以后定位和恢复指标列所需的信息,不保存完整展开时间序列。

Catalog

catalog.json 保存:

blocks.idx

二进制索引保存:

发布方式

核心类

7.5 指标分组

功能

产品只允许按指标组查询,避免用户一次触发大量零散请求。

分组规则

核心类

7.6 按需列解码

功能

查询一个指标组时,每个 Block 只恢复时间列和该组实际存在的指标列。

设计点

完整性校验

查询前重新核对每个源副本的文件大小和 SHA-256。副本被外部改动后立即拒绝查询,避免索引指向错误数据。

核心类

7.7 多文件时间序列合并

功能

多个 FTDC 文件可以包含交叠时间范围,查询结果必须按时间有序且去重。

设计点

7.8 原始值与相邻差值

原始值

直接返回 FTDC 恢复后的累计值或即时值。

相邻差值

7.9 完整统计与降采样

完整统计

遍历全部有效点时同步计算:

这些值不从降采样结果反推。

降采样

7.10 时间断裂

功能

当 FTDC 采样中断时,在图表中插入 null,防止折线跨越空白时间连接。

算法

7.11 Metric 前端工作流

任务阶段

查询阶段

图表阶段

7.12 内部保留但未公开的组件

源码中存在单指标查询、原始值分页和 GZip CSV 导出服务:

当前 FtdcTaskController 没有为它们声明 REST 路由,前端也没有入口。因此它们属于内部已测试组件,不属于当前发布的产品功能。文档、AI 改写和 API 兼容性判断都必须保持这个区分。

7.13 FTDC 存储布局

data/ftdc/
├── tasks-index.json
├── tasks/<task-id>/
│   ├── metadata.json
│   ├── catalog.json
│   ├── blocks.idx
│   └── source/<uploaded-file>
└── work/<task-id>/

FTDC 必须保留源副本以支持后续按需解码,因此磁盘占用与上传文件总量接近,并额外增加 catalog 和索引。删除任务只删除应用托管副本,不触碰用户原文件。

8.系统级功能

8.1 JVM 堆内存显示

/api/system/memory 返回 JVM 已用堆、最大堆和使用百分比。页面启动后立即读取,并每 5 秒刷新。该数值是 JVM 堆,不代表进程总 RSS 或系统内存。

8.2 清空全部数据

8.3 单任务删除

8.4 自动打开浏览器

应用启动完成后尝试打开当前配置的本地地址。桌面能力不可用或打开失败只写警告,不影响服务继续运行。可通过 mongodblog.open-browser=false 禁用。

9.REST API 设计

9.1 Log API

方法 路径 用途 关键限制
POST /api/tasks 创建 Log 任务 Multipart,文件不能为空
GET /api/tasks 获取任务列表 按创建时间倒序
GET /api/tasks/{taskId} 获取任务状态 活动任务用于轮询
DELETE /api/tasks/{taskId} 删除终态任务 活动任务返回冲突
GET /api/tasks/{taskId}/summary 获取慢查询汇总 仅已完成任务
GET /api/tasks/{taskId}/diagnostics 获取运行诊断 历史任务可能不存在
GET /api/tasks/{taskId}/slow-queries 分页筛选 Top 5000 size 为 1~200
GET /api/tasks/{taskId}/slow-query-points 获取散点轻量数据 只返回保留明细
GET /api/tasks/{taskId}/slow-queries/{queryId} 获取单条详情 重新解析保留原始行
GET /api/tasks/{taskId}/report.md 下载 Markdown 报告 UTF-8 附件

9.2 Metric API

方法 路径 用途 关键限制
POST /api/ftdc-tasks 创建 FTDC 任务 1~20 个非空文件
GET /api/ftdc-tasks 获取任务列表 按创建时间倒序
GET /api/ftdc-tasks/{taskId} 获取任务状态 活动任务用于轮询
DELETE /api/ftdc-tasks/{taskId} 删除终态任务 活动任务返回冲突
GET /api/ftdc-tasks/{taskId}/groups 获取指标组 任务必须完成
GET /api/ftdc-tasks/{taskId}/groups/{groupId}/series 查询指标组 maxPoints 为 1~1,200,view 为 raw 或 delta

9.3 系统 API

方法 路径 用途
GET /api/system/memory 获取 JVM 堆使用情况
DELETE /api/system/data 清空全部终态任务和托管数据

9.4 错误模型

统一返回:

{
  "code": "INVALID_REQUEST",
  "message": "可读错误信息",
  "details": {}
}

主要映射:

HTTP 状态 错误码 场景
400 INVALID_REQUEST 参数、文件数量或范围无效
404 NOT_FOUND 任务、指标组或明细不存在
409 TASK_NOT_READY 请求未完成任务的结果
409 TASK_ACTIVE 删除活动任务或活动时清空数据
413 UPLOAD_TOO_LARGE Multipart 超过 12 GB
422 FTDC_FORMAT_ERROR FTDC 内容损坏或超出格式边界
500 TASK_DELETE_FAILED 托管数据删除失败

10.构建与交付设计

10.1 技术栈

10.2 构建链路

mvn clean package
├── clean:删除旧构建产物
├── prepare-package:在 web 目录执行 npm ci
├── prepare-package:执行 npm run build
├── copy-resources:复制本次前端静态资源
└── spring-boot-maven-plugin:生成可执行 JAR

最终产物为 target/mongodb-log-analyzer.jar。发布目录还应包含三个平台启动脚本。

11.测试与验证设计

11.1 后端单元测试重点

11.2 后端集成测试重点

11.3 前端测试重点

11.4 验证命令

mvn test
cd web
npm test -- --run
npm run build
cd ..
mvn clean package

真实 FTDC 验收测试需要外部样本路径,未配置时会按条件跳过;不能把跳过描述成已使用真实样本验证。

12.安全、隐私和删除边界

12.1 网络边界

12.2 路径边界

12.3 数据边界

13.当前权衡和已知限制

13.1 为简单性接受的权衡

13.2 需要维护者特别注意的限制

14.修改设计时的同步要求

任何功能改动都必须同时检查以下位置:

  1. CLAUDE.md 中是否存在不可破坏的统计、资源或隐私约束。
  2. 后端模型、解析器、聚合器、存储格式和 Controller 是否一致。
  3. 前端 API、状态、组件和错误提示是否一致。
  4. 单元测试、集成测试和前端测试是否覆盖新边界。
  5. README.md、用户指南、本文和 AI 改写指南是否需要同步。
  6. 已完成并验证后是否更新 ROADMAP.md。

更具体的 AI 开发流程见 AI 二次改写指南 。