Files
deepseek-harness/.agents/notes/implemented/architecture/2026-09-25-session-log-otel-byte-limits.zh.md
T

2.7 KiB

Agent Note: Session 日志的 OTLP 字符串与有界请求

Status: implemented

English | 中文

问题

Session 日志包含嵌套 JSON 和大型工具结果。产品采集端接收带名称和字符串内容的记录,并限制请求大小;仅按数量分批的 SDK 无法约束 UTF-8 编码与 JSON 转义后的字节数。

决策

Session OTel 后端拥有 Session 日志 reporter。产品服务仅负责产品事件,不依赖 Session 类型,也不创建无人使用的 Session 队列。每条规范事件对应 eventName: "session-log",属性包含 sessionId 和 JSON 字符串形式的事件值 content;序列化不保留 JSONL 键顺序。脱敏在序列化前执行,复制的 envelope 不含 payload。

Session 日志使用独立 provider 和字节/条数队列。每条记录使用 SDK 序列化器计量一次,包含完整 envelope;其总和保守约束合并请求大小。顺序组包避免候选批次的完整序列化和递归重复编码。单条超限记录只产生一次诊断,不阻塞后续事件。每个 HTTP 请求在结束前始终占有传输槽位,即使其监测期限已经触发;关闭期限到期后停止剩余队列。scope 名称/版本和显式传输选项仍由后端拥有。

遥测恢复决策 继续约束脱敏、捕获和尽力交接。本决策替代其仅使用 SDK 队列/聚合的规则:SDK 批次期限无法拥有拆成多个 HTTP 请求的操作。后端调度完整请求,SDK 仍负责传输和重试。反馈授权和独立的 DeepSeek 模型请求附加路径不变。

考虑过的替代方案

整个 Session 合为一个字符串。 拒绝,因为即使每条事件都能放入请求,大型 Session 仍会超过请求上限。每条事件对应一条记录,既保留事件身份又允许分批。

截断超限记录或仅在客户端分片。 拒绝,因为截断会丢失内容,而分片需要采集端重组协议。显式拒绝保留一条事件对应一条记录的含义。

计算压缩字节数或字符数。 拒绝,因为采集端限制可能作用于解压后内容,而字符数不包含 UTF-8 和转义开销。计量完整未压缩请求提供保守上限。

影响

产品事件和 Session 记录不共享请求或队列,两个包也不相互导入。保守的逐记录 envelope 计量可能比精确合并计量产生更小批次。队列溢出、超限拒绝、退出和传输失败可能丢失数据;不新增持久 outbox 或确认机制。测试覆盖字节上限、线性计量、慢请求串行调度、元数据、脱敏复制隔离和反馈授权回放。