先看现象。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 上能看到长度标记,排查不再依赖被截断的片段。

可观测平台存的是摘要不是原文,长内容一定要另存,否则关键时刻永远缺那一段。报错文案容易误导,真正的原因往往在相邻那一层的日志里。

作者 9823189