trace 是 bro CLI 的一个技能,本身不实现机制,所有机制都位于 bro CLI 中,该技能只负责策略。使用前提是 bro 已在 PATH 中,或通过 npx -y @broject/bro@0 调用。
用途:钩子层会把每个工具调用后的事件按会话记录到 <git-common>/bro/hooks/trace/<session>.jsonl。bro trace export 会将这些日志中尚未导出的尾部内容推送到 OTLP 端点,适合需要将会话追踪发送到 OTel 后端(如 Langfuse、Phoenix)的场景,也用于按 bead/molecule 进行成本归因或调试。
主要能力:通过 OTLP/HTTP JSON 以 POST <endpoint>/v1/traces 方式推送,每个会话对应一个 trace,每条日志行对应一个 span,日志字段作为 bro.* 属性。trace/.export.json 中的游标记录导出进度,重复导出只发送增量;span id 为内容哈希,服务端可据此去重。命令包括:bro trace export(推送所有日志的新行)、bro trace export --session <id>(仅推送指定会话)、bro trace export --dry-run(打印请求载荷但不发送)、bro trace export --json(输出机器可读摘要及最近错误)。
使用方式与策略:默认关闭,直到解析到端点。端点可通过 bro.config.* 中的 telemetry.otlp.endpoint 或标准环境变量 OTEL_EXPORTER_OTLP_TRACES_ENDPOINT / OTEL_EXPORTER_OTLP_ENDPOINT 指定(环境变量优先)。OTEL_EXPORTER_OTLP_HEADERS(k=v,k2=v2 格式)和 OTEL_SERVICE_NAME 以相同方式合并。BRO_TELEMETRY=0 会无条件禁用。设置端点后,工具后钩子最多每 telemetry.otlp.flushMs(默认 60 秒)分离启动一次 bro trace export,代理不会等待其完成。收集器不可用、DNS 失败或 5xx 只会丢失该批次,游标的 lastError 是唯一记录,钩子路径按约定保持静默。失败属于游标状态而非退出:POST 失败会保留游标,下次刷新重发(至少一次)。手动运行 bro trace export --json 可查看 lastError/lastErrorAt,手动命令失败时以非零退出码返回。
归因仅限日志记录内容:span 携带 bro.session 及日志行记录的字段;bead/agent 仅在会话于 bro 的 spawn pins 下运行时出现,日志中不存在的字段不会成为属性。
限制:未提供端点时导出不做任何事;环境变量优先于配置文件;失败批次可能丢失但会重发;钩子路径静默不报错;手动命令才返回非零退出码。