Files

412 lines
16 KiB
Markdown
Raw Permalink Normal View History

2026-05-16 13:24:02 +08:00
# 监控与日志
<cite>
**本文引用的文件**
- [src/log.ts](file://src/log.ts)
- [src/index.ts](file://src/index.ts)
- [src/server.ts](file://src/server.ts)
- [src/class/options.ts](file://src/class/options.ts)
- [src/class/httphandler.ts](file://src/class/httphandler.ts)
- [src/class/websockethandler.ts](file://src/class/websockethandler.ts)
- [src/websocket.ts](file://src/websocket.ts)
- [src/signaling.ts](file://src/signaling.ts)
- [src/swagger.ts](file://src/swagger.ts)
- [client/src/logger.js](file://client/src/logger.js)
- [client/public/js/stats.js](file://client/public/js/stats.js)
- [package.json](file://package.json)
- [run.bat](file://run.bat)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考量](#性能考量)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本指南聚焦于视频信令服务器的监控与日志配置,覆盖以下方面:
- 日志系统配置日志级别、输出格式与时序、HTTP访问日志策略
- 性能监控指标:连接数统计、内存使用、请求响应时间与错误率
- 分布式追踪:请求链路跟踪与性能瓶颈定位思路
- 告警规则:阈值设定、通知渠道与故障恢复建议
- 工具集成Prometheus、Grafana、ELK Stack 的对接要点
- 日志分析与故障诊断:常见问题与监控解决方案
## 项目结构
该项目采用分层与职责分离的设计:
- 应用入口负责解析命令行参数、创建HTTP/HTTPS服务器、启动WebSocket信令服务
- Express服务器负责HTTP路由、静态资源、Swagger文档与HTTP信令接口
- WebSocket服务器负责实时信令消息的收发与连接生命周期管理
- 日志模块提供统一的日志级别控制与格式化输出
- 客户端侧提供前端调试日志开关与媒体统计展示
```mermaid
graph TB
A["应用入口<br/>src/index.ts"] --> B["Express服务器<br/>src/server.ts"]
A --> C["WebSocket信令<br/>src/websocket.ts"]
B --> D["HTTP信令路由<br/>src/signaling.ts"]
D --> E["HTTP处理器<br/>src/class/httphandler.ts"]
C --> F["WebSocket处理器<br/>src/class/websockethandler.ts"]
A --> G["日志模块<br/>src/log.ts"]
B --> H["Swagger文档<br/>src/swagger.ts"]
I["客户端调试日志<br/>client/src/logger.js"] -.-> A
```
**图表来源**
- [src/index.ts:13-108](file://src/index.ts#L13-L108)
- [src/server.ts:14-89](file://src/server.ts#L14-L89)
- [src/websocket.ts:6-117](file://src/websocket.ts#L6-L117)
- [src/signaling.ts:1-24](file://src/signaling.ts#L1-L24)
- [src/class/httphandler.ts:1-120](file://src/class/httphandler.ts#L1-L120)
- [src/class/websockethandler.ts:1-66](file://src/class/websockethandler.ts#L1-L66)
- [src/log.ts:1-51](file://src/log.ts#L1-L51)
- [src/swagger.ts:16-65](file://src/swagger.ts#L16-L65)
- [client/src/logger.js:1-30](file://client/src/logger.js#L1-L30)
**章节来源**
- [src/index.ts:13-108](file://src/index.ts#L13-L108)
- [src/server.ts:14-89](file://src/server.ts#L14-L89)
- [src/websocket.ts:6-117](file://src/websocket.ts#L6-L117)
- [src/signaling.ts:1-24](file://src/signaling.ts#L1-L24)
- [src/class/httphandler.ts:1-120](file://src/class/httphandler.ts#L1-L120)
- [src/class/websockethandler.ts:1-66](file://src/class/websockethandler.ts#L1-L66)
- [src/log.ts:1-51](file://src/log.ts#L1-L51)
- [src/swagger.ts:16-65](file://src/swagger.ts#L16-L65)
- [client/src/logger.js:1-30](file://client/src/logger.js#L1-L30)
## 核心组件
- 日志模块:提供日志级别枚举、动态级别设置、时间戳格式化与不同级别输出
- HTTP服务器基于Express启用Morgan进行HTTP访问日志支持多种格式
- WebSocket信令基于ws维护连接组、广播与心跳检测
- HTTP信令处理器基于会话与连接ID管理提供offer/answer/candidate等信令存取
- Swagger文档自动生成API文档便于监控与排障时查阅接口规范
**章节来源**
- [src/log.ts:1-51](file://src/log.ts#L1-L51)
- [src/server.ts:14-89](file://src/server.ts#L14-L89)
- [src/websocket.ts:6-117](file://src/websocket.ts#L6-L117)
- [src/class/httphandler.ts:1-120](file://src/class/httphandler.ts#L1-L120)
- [src/class/websockethandler.ts:1-66](file://src/class/websockethandler.ts#L1-L66)
- [src/swagger.ts:16-65](file://src/swagger.ts#L16-L65)
## 架构总览
下图展示了从请求进入、HTTP处理、WebSocket处理到日志输出的整体流程。
```mermaid
sequenceDiagram
participant Client as "客户端"
participant HTTP as "HTTP服务器<br/>src/server.ts"
participant Sig as "HTTP信令路由<br/>src/signaling.ts"
participant Hdl as "HTTP处理器<br/>src/class/httphandler.ts"
participant WS as "WebSocket服务器<br/>src/websocket.ts"
participant WSH as "WebSocket处理器<br/>src/class/websockethandler.ts"
participant Log as "日志模块<br/>src/log.ts"
Client->>HTTP : "HTTP请求"
HTTP->>Sig : "路由到/signaling"
Sig->>Hdl : "调用处理器(如创建会话/获取offer)"
Hdl-->>HTTP : "响应(200/4xx)"
HTTP-->>Client : "HTTP响应"
Client->>WS : "WebSocket连接"
WS->>WSH : "on('connection')"
WSH-->>Log : "记录连接/断开/消息"
WSH-->>Client : "信令消息(offer/answer/candidate)"
```
**图表来源**
- [src/server.ts:14-89](file://src/server.ts#L14-L89)
- [src/signaling.ts:1-24](file://src/signaling.ts#L1-L24)
- [src/class/httphandler.ts:398-641](file://src/class/httphandler.ts#L398-L641)
- [src/websocket.ts:27-115](file://src/websocket.ts#L27-L115)
- [src/class/websockethandler.ts:145-206](file://src/class/websockethandler.ts#L145-L206)
- [src/log.ts:30-50](file://src/log.ts#L30-L50)
## 详细组件分析
### 日志系统配置
- 日志级别
- 支持 none/error/warn/log/info 五级,可通过运行参数或环境变量设置
- 默认级别为 info当级别为 none 时不输出任何日志
- 输出格式
- 自动添加ISO时间戳与大写的级别前缀
- 使用不同console方法区分 error/warn/info/log
- HTTP访问日志
- 通过 Morgan 中间件启用,支持 combined/dev/short/tiny 或禁用
- 日志级别与Morgan日志可并行使用便于区分业务日志与访问日志
```mermaid
flowchart TD
Start(["设置日志级别"]) --> Parse["解析字符串级别<br/>parseLogLevel()"]
Parse --> Set["setLogLevel() 更新全局级别"]
Set --> Check{"当前级别是否允许输出?"}
Check --> |否| Exit["直接返回"]
Check --> |是| Format["formatTimestamp()<br/>拼装前缀"]
Format --> Emit{"根据级别选择输出方法"}
Emit --> Console["console.error/warn/info/log"]
Console --> End(["完成"])
```
**图表来源**
- [src/log.ts:11-24](file://src/log.ts#L11-L24)
- [src/log.ts:26-50](file://src/log.ts#L26-L50)
**章节来源**
- [src/log.ts:1-51](file://src/log.ts#L1-L51)
- [src/server.ts:18-20](file://src/server.ts#L18-L20)
- [src/index.ts:28](file://src/index.ts#L28)
- [package.json:9](file://package.json#L9)
- [run.bat:8](file://run.bat#L8)
### HTTP访问日志与路由
- 访问日志
- 通过 Morgan 中间件以配置项启用,支持多种格式
- 可通过运行参数控制,避免生产环境产生过多日志
- 信令路由
- 提供会话创建、连接管理、offer/answer/candidate获取与推送
- 使用会话ID作为安全约束确保接口访问受控
```mermaid
sequenceDiagram
participant Client as "客户端"
participant Server as "Express服务器"
participant Router as "HTTP信令路由"
participant Handler as "HTTP处理器"
Client->>Server : "GET /signaling/connection"
Server->>Router : "匹配路由"
Router->>Handler : "checkSessionId() 校验"
Handler-->>Router : "返回连接列表"
Router-->>Server : "JSON响应"
Server-->>Client : "HTTP 200"
```
**图表来源**
- [src/server.ts:25-86](file://src/server.ts#L25-L86)
- [src/signaling.ts:6-24](file://src/signaling.ts#L6-L24)
- [src/class/httphandler.ts:128-145](file://src/class/httphandler.ts#L128-L145)
**章节来源**
- [src/server.ts:14-89](file://src/server.ts#L14-L89)
- [src/signaling.ts:1-24](file://src/signaling.ts#L1-L24)
- [src/class/httphandler.ts:128-145](file://src/class/httphandler.ts#L128-L145)
### WebSocket信令与连接管理
- 连接生命周期
- 建立连接时注册,断开时清理;记录连接/断开/消息等事件
- 1对多模式
- host与participants角色分工offer/answer/candidate按角色路由
- 支持广播与定向消息,便于扩展聊天、白板等场景
- 心跳与超时
- 定期发送ping并检查lastActivity超时自动断开降低僵尸连接占用
```mermaid
classDiagram
class WSSignaling {
+server
+wss
+constructor(server, mode)
}
class WebSocketHandler {
+reset(mode)
+add(ws)
+remove(ws)
+onConnect(ws, connectionId)
+onDisconnect(ws, connectionId)
+onOffer(ws, message)
+onAnswer(ws, message)
+onCandidate(ws, message)
+onBroadcast(ws, message)
+onMessage(ws, message)
+AddHeartbeat(ws, connectionId)
+RemoveHeartbeat(ws)
}
WSSignaling --> WebSocketHandler : "委托处理"
```
**图表来源**
- [src/websocket.ts:15-117](file://src/websocket.ts#L15-L117)
- [src/class/websockethandler.ts:63-479](file://src/class/websockethandler.ts#L63-L479)
**章节来源**
- [src/websocket.ts:6-117](file://src/websocket.ts#L6-L117)
- [src/class/websockethandler.ts:145-338](file://src/class/websockethandler.ts#L145-L338)
### HTTP处理器与会话/连接模型
- 会话与连接
- 会话ID唯一标识一次通话或交互连接ID标识具体端点
- 支持私有模式下的双向配对与公共模式下的广播
- 信令存储
- offer/answer/candidate按连接ID与会话ID存储支持按时间过滤
- 超时与清理
- 基于lastRequestedTime定期清理超时会话释放资源
```mermaid
flowchart TD
S["创建会话(createSession)"] --> C["创建连接(createConnection)"]
C --> O["接收/存储offer"]
C --> A["接收/存储answer"]
C --> K["接收/存储candidate"]
O --> R["按fromtime过滤返回(getOffer)"]
A --> R2["按fromtime过滤返回(getAnswer)"]
K --> R3["按fromtime过滤返回(getCandidate)"]
T["超时检测(_checkForTimedOutSessions)"] --> Del["删除会话(_deleteSession)"]
```
**图表来源**
- [src/class/httphandler.ts:664-675](file://src/class/httphandler.ts#L664-L675)
- [src/class/httphandler.ts:739-783](file://src/class/httphandler.ts#L739-L783)
- [src/class/httphandler.ts:218-232](file://src/class/httphandler.ts#L218-L232)
- [src/class/httphandler.ts:200-213](file://src/class/httphandler.ts#L200-L213)
**章节来源**
- [src/class/httphandler.ts:106-120](file://src/class/httphandler.ts#L106-L120)
- [src/class/httphandler.ts:218-232](file://src/class/httphandler.ts#L218-L232)
- [src/class/httphandler.ts:398-641](file://src/class/httphandler.ts#L398-L641)
### 客户端日志与媒体统计
- 客户端调试日志
- 提供enable/disable与多级别输出便于前端问题定位
- 媒体统计
- 基于RTCStats计算比特率、帧率等指标辅助性能分析
**章节来源**
- [client/src/logger.js:1-30](file://client/src/logger.js#L1-L30)
- [client/public/js/stats.js:7-91](file://client/public/js/stats.js#L7-L91)
## 依赖关系分析
- 运行时依赖
- Express、ws、morgan、swagger-ui-express、uuid等
- 开发与测试
- Jest、ts-jest、mock-socket等
- 构建与打包
- TypeScript编译、pkg打包静态资源
```mermaid
graph LR
P["package.json"] --> E["express"]
P --> W["ws"]
P --> M["morgan"]
P --> S["swagger-ui-express"]
P --> U["uuid"]
P --> J["jest/ts-jest"]
P --> T["typescript"]
```
**图表来源**
- [package.json:14-46](file://package.json#L14-L46)
**章节来源**
- [package.json:14-46](file://package.json#L14-L46)
## 性能考量
- 连接数统计
- WebSocket侧通过连接集合与连接组统计当前活跃连接数
- HTTP侧通过会话与连接映射统计会话数量与连接数
- 内存使用
- 信令消息以Map/Set存储需关注超时清理与消息大小
- 前端媒体统计可辅助判断网络拥塞与编码开销
- 请求响应时间与错误率
- HTTP接口响应时间可通过中间件埋点或外部APM采集
- 错误率可通过HTTP状态码分布统计
- 轮询与长连接
- HTTP轮询模式下应限制轮询频率避免CPU与带宽浪费
- WebSocket心跳与超时可减少无效连接占用
[本节为通用性能指导,无需特定文件引用]
## 故障排查指南
- 常见问题
- 会话不存在HTTP处理器校验session-id缺失或过期导致404
- 连接ID冲突私有模式下重复使用连接ID会触发400
- WebSocket超时长时间无活动将被自动断开
- 文件上传失败服务端重命名异常导致500
- 排查步骤
- 启用更细粒度日志info/log复现问题并核对日志时间线
- 使用Swagger查看接口规范确认请求头与参数
- 检查WebSocket消息类型与路由逻辑确认角色与目标参与者
- 对比前后两次RTCStats定位带宽与帧率异常
**章节来源**
- [src/class/httphandler.ts:128-145](file://src/class/httphandler.ts#L128-L145)
- [src/class/httphandler.ts:747-763](file://src/class/httphandler.ts#L747-L763)
- [src/class/websockethandler.ts:404-430](file://src/class/websockethandler.ts#L404-L430)
- [src/server.ts:74-82](file://src/server.ts#L74-L82)
## 结论
本项目提供了清晰的日志体系与信令处理能力结合Morgan访问日志与Swagger文档能够满足日常运维与排障需求。建议在生产环境中
- 明确日志级别与轮转策略避免磁盘与IO压力
- 引入APM或Prometheus/Grafana进行指标采集与可视化
- 建立告警规则与通知通道,配合健康检查与自动恢复机制
- 使用分布式追踪定位跨服务链路瓶颈
[本节为总结性内容,无需特定文件引用]
## 附录
### 日志系统配置清单
- 日志级别
- 可选none/error/warn/log/info
- 默认info
- 输出格式
- ISO时间戳 + 大写级别前缀
- 区分 error/warn/info/log
- HTTP访问日志
- 可选combined/dev/short/tiny 或 none
- 通过运行参数控制
**章节来源**
- [src/log.ts:1-51](file://src/log.ts#L1-L51)
- [src/server.ts:18-20](file://src/server.ts#L18-L20)
- [src/index.ts:28](file://src/index.ts#L28)
### 性能监控指标定义
- 连接数
- WebSocket活跃连接数基于连接集合统计
- HTTP会话数与连接数基于会话映射统计
- 内存使用
- 服务端关注Map/Set规模与消息队列长度
- 客户端:媒体统计辅助判断编码与传输效率
- 请求响应时间与错误率
- 通过中间件或外部APM采集
- 错误率基于HTTP状态码分布
**章节来源**
- [src/class/websockethandler.ts:20-37](file://src/class/websockethandler.ts#L20-L37)
- [src/class/httphandler.ts:42-84](file://src/class/httphandler.ts#L42-L84)
- [client/public/js/stats.js:7-91](file://client/public/js/stats.js#L7-L91)
### 分布式追踪配置建议
- 链路跟踪
- 在HTTP入口与WebSocket消息处理处打点
- 关键节点:创建会话、创建连接、发送/接收offer/answer/candidate
- 瓶颈定位
- 结合日志时间戳与追踪ID定位慢查询与阻塞点
- 媒体统计与网络指标联动分析
[本节为通用实践建议,无需特定文件引用]
### 告警规则与通知
- 阈值建议
- 连接数:单节点并发连接数峰值阈值
- 错误率HTTP 5xx占比、WebSocket断连率
- 响应时间P95/P99延迟阈值
- 通知渠道
- 邮件、IM、电话分级告警
- 故障恢复
- 自动扩容、熔断降级、快速回滚
[本节为通用实践建议,无需特定文件引用]
### 监控工具集成要点
- Prometheus
- 暴露指标端点,采集连接数、内存、请求速率与错误率
- Grafana
- 仪表板展示趋势、告警与热力图
- ELK Stack
- 收集HTTP与业务日志建立检索与聚合分析
[本节为通用实践建议,无需特定文件引用]