快速结论:该报错发生在 Langfuse 自托管部署中,当 Dashboard 图表使用按类型(usageType/costType)统计用量或成本的指标时,ClickHouse 查询因 ARRAY JOIN 与 SELECT/GROUP BY 中重复使用别名而失败。优先排查 Dashboard 中是否使用了 usageByType 或 costByType 相关的指标组件。
适用环境:Langfuse v4.0.0(自托管);ClickHouse 作为后端数据库;查询链路涉及 tRPC 路由 dashboard.chart 及 ClickHouse 事件视图 events_core(v2 events_observations 视图)。
最快修复方案:暂无确认的一步修复方案。Issue 中给出的临时规避方法是:移除 Dashboard 中使用 usageByType 或 costByType 指标的组件,因为只有这些指标会触发 pairExpand/ARRAY JOIN 路径。
注意事项:该变通方案仅能规避问题,并不能修复根因。彻底修复需要修改 queryBuilder.ts 中构建 SELECT 子句的逻辑,让 pairExpand 维度输出裸引用(如 usageType)而不是重复的 AS 别名;该修复尚未经过验证,属于推测方案。
问题场景
用户在 Langfuse 自托管环境(v4.0.0)中打开 Dashboard 并选择任一图表时触发。问题根源是 Dashboard 查询中使用了按用量类型(usageByType)或成本类型(costByType)的统计指标。这类指标在 v2 数据模型(events_observations 视图)中定义,需要通过 ARRAY JOIN 展开 map 类型的 usage_details 和 cost_details 字段,并在查询中引入 usageType/costType 维度别名。
该问题影响所有按类型展示用量/成本拆分的 Dashboard 组件。用户截图中可以看到 Dashboard 页面加载失败,同时后端日志持续输出 ClickHouse 查询错误和 tRPC INTERNAL_SERVER_ERROR。
报错原文
ClickHouse query failed with non-retryable error: Duplicate alias in ARRAY JOIN: usageType: While processing SELECT usageType AS usageType, toDate(start_time) AS time_dimension, sum(usage_value) AS sum_usageByType FROM events_core AS events_observations ARRAY JOIN mapKeys(usage_details) AS usageType, mapValues(usage_details) AS usage_value WHERE (environment IN _CAST(['staging', 'development', 'production'], 'Array(String)')) AND (type IN _CAST(['GENERATION', 'AGENT', 'TOOL', 'CHAIN', 'RETRIEVER', 'EVALUATOR', 'EMBEDDING', 'GUARDRAIL'], 'Array(String)')) AND (provided_model_name IN _CAST(['gpt-4o-2024-11-20', 'gpt-5-4-mini', 'openai/gpt-5-4-mini'], 'Array(String)')) AND (project_id = '6ae1df47-ddd9-4c97-ae31-983ee501e264') AND (start_time >= _CAST('1787171055.395', 'DateTime64(3)')) AND (start_time <= _CAST('1787775855.395', 'DateTime64(3)')) GROUP BY usageType AS usageType, toDate(start_time) AS time_dimension ORDER BY toDate(start_time) AS time_dimension ASC WITH FILL FROM toDate(_CAST('1787171055.395', 'DateTime64(3)')) TO toDate(_CAST('1787775855.395', 'DateTime64(3)')) STEP toIntervalDay(1).
Duplicate alias in ARRAY JOIN: costType
tRPC route failed on dashboard.chart: Internal error. Please check error logs in your self-hosted deployment.
原因分析
根据 Issue 中的代码追踪分析,问题出在查询构建器(queryBuilder.ts)生成 SQL 的逻辑上。当查询使用 usageByType 或 costByType 指标时,数据模型会在 ARRAY JOIN 子句中通过 mapKeys() 引入 usageType/costType 别名(例如 ARRAY JOIN mapKeys(usage_details) AS usageType)。
但与此同时,构建 SELECT 子句的 buildOuterDimensionsPart、buildSingleLevelDimensionsPart 和 buildInnerDimensionsPart 三个函数都会对 pairExpand 类型的维度输出形如 usageType AS usageType 的表达式。ClickHouse 不允许在 ARRAY JOIN 已定义别名后,在 SELECT 子句中再次对同一列执行 AS 重命名,于是抛出 “Duplicate alias in ARRAY JOIN” 错误。
GROUP BY 子句(buildGroupByClause)反而正确输出了裸别名(仅 usageType 不带 AS),问题集中在 SELECT 子句的重复 AS 分配。该错误仅影响 v2 的 events_observations 视图,因为 pairExpand 类型的 costType/usageType 维度只在 v2 数据模型中定义。
环境排查
- 确认 Langfuse 版本:自托管 v4.0.0(该问题在 v4.0.0 中报告)
- 确认 Dashboard 中是否已添加使用 usageByType 或 costByType 指标的可视化组件
- 检查后端日志中 dashboard.chart tRPC 路由是否持续报 INTERNAL_SERVER_ERROR
- 确认 ClickHouse 后端日志中是否出现 “Duplicate alias in ARRAY JOIN” 错误
- 查看事件数据所依赖的视图版本是否为 v2(events_observations)
解决步骤
- 临时规避(已验证可行):编辑 Dashboard,移除所有使用 usageByType(按用量类型统计)或 costByType(按成本类型统计)指标的组件。因为只有这两类指标会触发 pairExpand/ARRAY JOIN 路径,移除后 Dashboard 应恢复正常。
- 代码修复(推测方案,可优先尝试):修改 web/src/features/query/server/queryBuilder.ts 中的三个函数——
buildOuterDimensionsPart、buildSingleLevelDimensionsPart和buildInnerDimensionsPart——对 pairExpand 类型的维度,将${d.alias} as ${d.alias ?? d.sql}改为输出裸引用(仅 usageType/costType,不带 AS 别名)。因为 ARRAY JOIN 已经建立了别名,SELECT 中不需要也不能再次 AS。 - 验证修复:修改后重新构建前端代码,部署到自托管环境;在 Dashboard 中添加使用 usageByType 或 costByType 的图表组件,确认不再触发 ClickHouse 报错。
验证方法
在 Dashboard 中添加任意使用按类型(usageType 或 costType)统计用量/成本的图表,切换时间范围后观察:
- Dashboard 图表能否正常加载,不再出现加载失败或空白状态
- 自托管后端日志中不再出现 “Duplicate alias in ARRAY JOIN” ClickHouse 错误
- tRPC 路由 dashboard.chart 不再返回 INTERNAL_SERVER_ERROR,而是返回正常统计数据
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。


![[Feature Request]: Add MonkeyOCRv2 as a document parsing backend (working adapter included)](https://www.chat-gpts.plus/wp-content/uploads/2026/09/18671-00b219e6-768x403.jpg)