先看现象。Langfuse 自托管 3.2 里 trace 的 output 只保留前 2000 字符,排查一次长回答的格式错误时关键部分正好被截掉,界面上也没有任何提示。
排查方向其实有限,先把可能性排一排。服务端对单字段有截断上限。另一种情况是SDK 序列化时也会截断超长字符串。
还有一种情况,被截断的字段没有标记。
另外,采样策略把部分 trace 直接丢弃。
先在 SDK 侧打印完整输出长度
python -c "import json;s=json.dumps({'output':'x'*5000});print(len(s))"
随后查服务端的截断配置项
python -c "print('LANGFUSE_TRUNCATION_LIMIT')"
接着把完整输出另存一份到对象存储
python -c "print({'bucket':'trace-full','key':'2026-11-13/abc.json'})"
末了在 metadata 里记录原始长度与摘要
python -c "import json;print(json.dumps({'len':5000,'head':'...'}))"
这类改动我都写进变更记录,过两周再出问题时能对上号。
恢复的判定其实很直接。本地留档里能查到完整输出,trace 上能看到长度标记,排查不再依赖被截断的片段。
可观测平台存的是摘要不是原文,长内容一定要另存,否则关键时刻永远缺那一段。报错文案容易误导,真正的原因往往在相邻那一层的日志里。
