本文引用的文件
本文件面向AI有声书生成平台,系统性说明监控与日志体系的设计与实践,覆盖以下方面:
后端采用Koa框架,监控与日志能力通过独立服务模块与中间件注入到应用生命周期中;数据库监控脚本用于观测生成流程状态。
graph TB
subgraph "应用层"
APP["应用入口<br/>server/src/app.ts"]
ROUTER["路由注册<br/>app.ts"]
end
subgraph "监控与日志服务"
SENTRY["Sentry服务<br/>server/src/services/sentry.service.ts"]
WINSTON["Winston日志服务<br/>server/src/services/logger.service.ts"]
end
subgraph "中间件"
ERR["错误处理中间件<br/>server/src/middleware/errorHandler.ts"]
PERF["性能监控中间件<br/>app.ts 引入"]
end
subgraph "数据库监控脚本"
MON1["监控书籍进度<br/>server/monitor-book.js"]
MON2["监控生成流程<br/>server/monitor-generation.js"]
MON3["监控进度概览<br/>server/monitor-progress.js"]
end
APP --> ROUTER
APP --> SENTRY
APP --> WINSTON
APP --> ERR
APP --> PERF
ROUTER --> MON1
ROUTER --> MON2
ROUTER --> MON3
图表来源
章节来源
章节来源
下图展示Sentry与Winston在应用中的集成位置与调用链路。
sequenceDiagram
participant Client as "客户端"
participant Koa as "Koa应用<br/>server/src/app.ts"
participant SentryMW as "Sentry错误中间件"
participant Handler as "业务处理器"
participant Winston as "Winston日志中间件"
participant SentrySvc as "Sentry服务"
Client->>Koa : "HTTP请求"
Koa->>SentryMW : "进入Sentry错误中间件"
Koa->>Winston : "进入Winston日志中间件"
Winston->>Winston : "记录请求开始时间"
Koa->>Handler : "执行业务逻辑"
alt 发生异常
Handler-->>SentryMW : "抛出异常"
SentryMW->>SentrySvc : "captureException(含method/url/user)"
SentryMW-->>Koa : "继续抛出异常"
else 正常返回
Handler-->>Winston : "正常返回"
Winston->>Winston : "计算耗时并记录HTTP日志"
end
Koa-->>Client : "响应"
图表来源
错误过滤
内置过滤器可忽略特定无意义的网络连接拒绝错误,降低噪声
flowchart TD
Start(["初始化Sentry"]) --> CheckDSN{"是否配置DSN?"}
CheckDSN --> |否| Skip["跳过初始化并记录提示"]
CheckDSN --> |是| Init["初始化Sentry<br/>设置采样率/集成/过滤器"]
Init --> Ready["Sentry就绪"]
Ready --> OnError["捕获异常"]
OnError --> Scope["设置上下文/标签/用户"]
Scope --> Capture["上报Sentry"]
图表来源
章节来源
HTTP请求日志中间件
异常时记录错误信息与堆栈
flowchart TD
ReqStart["请求开始"] --> Calc["计算耗时"]
Calc --> Normal{"正常返回?"}
Normal --> |是| LogHTTP["写入HTTP日志文件"]
Normal --> |否| LogErr["写入错误日志文件<br/>包含错误与堆栈"]
LogHTTP --> Done["结束"]
LogErr --> Done
图表来源
章节来源
自定义错误类型:AppError、UnauthorizedError、ForbiddenError、NotFoundError、BadRequestError、QuotaExceededError
flowchart TD
Try["执行业务逻辑"] --> Catch{"是否抛错?"}
Catch --> |否| Next["继续下一个中间件/处理器"]
Catch --> |是| BuildResp["构造错误响应体<br/>设置状态码/消息"]
BuildResp --> DevEnv{"是否开发环境?"}
DevEnv --> |是| AddStack["附加堆栈信息"]
DevEnv --> |否| SkipStack["不附加堆栈"]
AddStack --> Return["返回响应"]
SkipStack --> Return
图表来源
章节来源
monitor-progress.js:按5秒间隔轮询书籍状态与进度
flowchart TD
Start(["开始监控"]) --> Loop["循环N次"]
Loop --> Query["查询书籍状态与章节统计"]
Query --> Print["打印状态/进度/章节统计"]
Print --> Check{"状态=completed/failed?"}
Check --> |是| End["结束并输出最终统计"]
Check --> |否| Sleep["等待固定间隔"]
Sleep --> Loop
图表来源
章节来源
中间件顺序对可观测性至关重要:错误处理中间件应尽早拦截;Sentry中间件负责异常上报;Winston中间件负责日志记录;性能中间件负责指标采集
graph LR
Start["应用启动"] --> InitSentry["initSentry()"]
InitSentry --> ConnectDB["连接数据库"]
ConnectDB --> TestRedis["测试Redis连接"]
TestRedis --> TestStorage["测试存储连接"]
TestStorage --> InitWS["初始化WebSocket"]
InitWS --> Routes["注册路由"]
Routes --> Middlewares["中间件链路"]
Middlewares --> SentryMW["Sentry错误中间件"]
Middlewares --> WinstonMW["Winston日志中间件"]
Middlewares --> PerfMW["性能监控中间件"]
图表来源
章节来源
章节来源
章节来源
本监控与日志体系以Sentry与Winston为核心,配合统一错误处理中间件与性能监控中间件,实现了从异常捕获、日志记录到指标采集的全链路可观测性。数据库监控脚本进一步增强了生成流程的可见性。建议后续完善:
章节来源