bug: v3 → v4 migration Step 4 fails on large traces with Invalid string length, even with batchSize=1

该错误出现在自托管 Langfuse 从 v3 升级到 v4 时执行 Step 4 迁移( 20260701_v4_step_4_backfill_events_full_from_dataset_run_items ),当单个 trace 的观测数据过大,ClickHouse 客户端在构造 ins

快速结论:该错误出现在自托管 Langfuse 从 v3 升级到 v4 时执行 Step 4 迁移(20260701_v4_step_4_backfill_events_full_from_dataset_run_items),当单个 trace 的观测数据过大,ClickHouse 客户端在构造 insert 请求时用一个字符串拼接全部值,触发 Invalid string length。批量调小无效,因为问题发生在单条 trace 的编码阶段;需要等待官方修复或调整迁移记录状态。

适用环境:自托管 Langfuse v4.27.0;ClickHouse 26.3.17.1;Worker 依赖 @clickhouse/client@1.23.1。Issue 未提供操作系统、Python、CUDA、显卡信息。

最快修复方案:暂无确认的一步修复方案。Issue 回复称该问题将通过 PR #20131 修复,并预计在 1–2 天内发布对应的开源版本,升级到包含该修复的版本是明确方向;修复发布前,可优先尝试由维护者确认的临时处理,即根据 background_migrations 表中 Step 4 对应行的状态调整该行,以恢复或重跑迁移。

注意事项:直接修改 background_migrations 表属于维护者建议的临时手段,Issue 中未给出完整的字段修改值,操作前应先备份该表并确认当前迁移状态;同时应确认升级版本确实包含 PR #20131 的修复,不要仅凭版本号猜测。

问题场景

用户在自托管 Langfuse 上执行 v3 → v4 数据库迁移。Step 1–3 正常完成,Step 4 处理到某个关联大 trace 的 dataset run item 时失败。该 trace 的 observations 输入输出合计为 880.46 MiB,后续还有 808.26 MiB 和 520.10 MiB 的 trace,说明不是单条数据偶发。将 batchSize 从 200 降到 10 再降到 1,均未绕过错误。

报错原文

[Backfill Events DRIs] Starting events_full backfill from dataset_run_items_rmt with config: {"pollIntervalMs":30000,"maxRetries":1,"batchSize":1,"maxDescendantsPerDri":50000,"lookbackDays":90}
[Backfill Events DRIs] Processing batch of 1 DRIs (cursor: [REDACTED])
[Backfill Events DRIs] Fetched 1766 observations and 1 traces for 1 DRIs
[Backfill Events DRIs] Failed to process batch (failure 1/1) Invalid string length
RangeError: Invalid string length
    at Array.join (<anonymous>)
    at NodeValuesEncoder.encodeValues (/app/worker/node_modules/.pnpm/@clickhouse+client@1.23.1/node_modules/@clickhouse/client/dist/utils/encoder.js:28:18)
    at ClickHouseClient.insert (/app/worker/node_modules/.pnpm/@clickhouse+client@1.23.1/node_modules/@clickhouse/client/dist/common/client.js:222:28)
    at BackfillEventsFullFromDatasetRunItems.insertEnrichedSpans (/app/worker/dist/backgroundMigrations/backfillEventsFullFromDatasetRunItems.js:326:48)

原因分析

最可能的原因是单个 trace 的 1,766 条 observation 数据在 insertEnrichedSpans 中被序列化为一个超大值集合,ClickHouse 客户端的 NodeValuesEncoder.encodeValues 通过 Array.join 拼接字符串时超过 V8 的字符串长度上限,抛出 RangeError: Invalid string length。由于编码发生在单个 batch 内部,batchSize=1 仍会触发,说明降低批量大小不是有效规避方式。Issue 中报告 880.46 MiB 是输入输出字节长度之和,并非压缩存储大小或最终请求大小,因此实际编码时还可能叠加其他字段与转义开销。

环境排查

  • 确认 Langfuse 版本是否仍为 v4.27.0,以及是否已升级到包含 PR #20131 修复的版本。
  • 确认 Worker 依赖仍为 @clickhouse/client@1.23.1,并检查升级后是否随版本更新。
  • 确认 ClickHouse 版本为 26.3.17.1 或明确记录实际版本。
  • 检查 background_migrations 表中 Step 4 迁移对应的行,记录其状态、重试次数和游标值,供恢复迁移时比对。
  • 确认失败 trace 及其关联 dataset run item 的数据量,尤其是 observations 的输入输出总字节数,判断是否属于同一类超大 trace。

解决步骤

  1. 先停止重试 Step 4,避免反复失败并继续占用额外 ClickHouse 存储。
  2. 查询 background_migrations 表,定位 20260701_v4_step_4_backfill_events_full_from_dataset_run_items 对应记录,记录当前状态和游标。
  3. 等待或升级到包含 PR #20131 修复的 Langfuse 开源版本,再重新启动迁移;Issue 回复预计对应版本在 1–2 天内发布。
  4. 如果升级前必须尝试恢复,可将 background_migrations 表中 Step 4 记录的状态和游标反馈给维护者,按其确认的方式调整该行;可优先尝试从失败前的位置重跑,而不是从零重跑整个迁移。
  5. 迁移完成后检查所有 spans 及相关 experiment attributes 是否完整,尤其核查上述大 trace 对应的 dataset run item。

验证方法

重新运行 Step 4 后,Worker 日志不应再出现 Invalid string length 或 Failed to process batch;迁移状态应推进至完成。随后抽查此前失败的大 trace 及其 dataset run item,确认 observations、spans 和 experiment attributes 均已回填,并核对 background_migrations 表中 Step 4 记录为完成状态。

参考来源

langfuse/langfuse #19840

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 34666

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注