Files
deepseek-harness/packages/telemetry/session-telemetry-otel/README.zh.md
2026-08-05 16:18:58 +08:00

5.5 KiB
Raw Blame History

@deepseek-ai/dsh-session-telemetry-otel

English | 中文

遥测telemetryseam 的 OpenTelemetry 后端,也是部署方唯一要加载的条目。它原样组合 OTel JS SDKLoggerProviderBatchLogRecordProcessor → OTLP/HTTP 日志导出器),把 seam 交接过来的每条记录映射到 logger.emit()并使用两个插桩作用域instrumentation scopeledger 记录挂在 @deepseek-ai/dsh-session-telemetry-otel 下,运维记录挂在 @deepseek-ai/dsh-session-telemetry-otel/ops 下。资源身份(service.name/service.version)来自 dsh-llmAPP_IDENTITY,与归因标头同源;另有 user.id——本包自有的 harness home 匿名用户 idsrc/user-id.ts$DSH_HOME/.userid,首用生成随机 UUID删除该文件即重置身份随 Resource 每批导出携带一次而非逐条携带。

配置

- id: telemetry-otel
  name: '@deepseek-ai/dsh-session-telemetry-otel'
  config:
    shutdownTimeoutMillis: 3000 # optional; defaults to 3000
    exporter:                # passed verbatim to the SDK's OTLP/HTTP log exporter
      url: https://collector.example.com/v1/logs
      headers:
        authorization: !!js `Bearer ${process.env.OTLP_TOKEN}`
    processor: {}            # optional; passed verbatim to BatchLogRecordProcessor

exporter.url 是必填项、没有默认值,并且必须能解析为 http(s)shutdownTimeoutMillis 是由 DSH 管理的有限正数外层截止时间,默认值为 3000 msprocessor.maxExportBatchSize 不是正整数时也会在插件加载时失败,因为 SDK 会接受该值,随后却在关闭时挂起。两个 SDK 配置块都整体透传passthroughOTLPExporterNodeConfigBase 的每个字段(headerstimeoutMilliscompressionkeepAlive 等)都会到达导出器;批处理、导出节奏(scheduledDelayMillis)、重试、队列上限,以及持续失败下的丢失策略,都是通过 processor 调节的 SDK 行为。该后端不实现 flush():常规 flush 由批处理器负责。但在关闭期间OTel 会先等待 exporter.forceFlush(),再进入受 exportTimeoutMillis 限制的处理器完成 promise如果该传输 promise 始终不结算本包package会在 shutdownTimeoutMillis 到期时放弃等待,沿协调器现有的失败隔离路径记录关闭失败,并让应用继续拆卸。该截止时间无法取消 SDK 传输,因此届时仍待处理的记录可能在进程退出时丢失。从 cordis.yml 中删除该配置块即为退出方式:无残留状态,也没有 enabled 开关。

哪些数据会离开本机

记录携带完整的 event.data,内容以 seam 的 telemetry/record waterfall瀑布式事件返回的结果为准用户与 assistant 消息内容、工具参数与工具结果(命令输出、文件内容)、完整的系统提示词与工具 schemarequest/header、todo 文本、压缩compaction摘要、钩子的 stderrSummary,以及会话 cwd一个本地路径。seam 不带任何脱敏规则:未挂载 telemetry/record 监听器时,导出的就是捕获原样的副本,因此向可信边界之外导出的部署方要挂载自己的规则(见 seam README)。无论如何,提供方凭据都不会出现:适配器的 API key 是构造函数参数而非会话事件,因此它们在结构上就不存在于日志中,也就不存在于遥测中。

字段映射

seam 记录 → SDK 日志记录:timetimestamp/observedTimestampseverityseverityNumber/severityTextINFO 9 / WARN 13 / ERROR 17body → 结构化日志 bodyattributes 原样照搬。接收端基于 (session.id, event.seq) 去重、按严重级别告警,并通过 shutdown 记录的缺失检测崩溃(一个曾有活动、没有 shutdown 运维记录、且已然陈旧的会话,就是未干净结束的会话)。该标记的含义是遥测干净地停止了对该会话的观察:它在会话自身 dispose资源释放时发出对于届时仍在运行的会话则在应用关闭时发出标记之后又出现该会话的更多事件说明发生的是遥测重载而不是会话重启。跨谱系lineage的流并不自足恢复的会话在其自身 id 的流上从上一个进程停止之处继续fork 出的会话,其流从继承边界开始,前缀位于父会话的流中,由接收端基于 session.parent_id + session.seed_length 拼接。继续而非回放的一个后果:流中一个开启后再未关闭的轮次,标志着上一个进程死在了该轮次之内。恢复时本地日志会以合成的关闭事件修复,但这些修复绝不导出:导出的流忠实于崩溃进程实际发出的内容,其后干净的 shutdown 标记也只证明恢复后进程自身的退出。

模型体验

无。该后端只把 seam 脱敏后的记录转发进 OTel SDK 流水线;它绝不向模型请求贡献任何内容。

KV Cache 影响

无;本包既不组装也不发送提供方请求。

已知限制与暂缓事项

  • 上游实验性源码树@opentelemetry/sdk-logs 仍从上游实验性experimental源码树发布SDK API 的变动只会落在本包也仅落在本包seam 契约不动。
  • 真实 collector 行为属于 SDK 导出器身份验证、TLS、限流及其他真实 OTLP 部署行为遵循上游 SDK不由本包自有兼容层处理。