
Link prompts to observations with Google ADK
快速结论:当从 Langgraph 迁移到 Google ADK 并尝试通过 Langfuse 实现可观测性时,直接在 ADK 创建的 OpenTelemetry span 上设置属性(如 `langfuse.prompt.name`、`input.value`、`user_id`),而不是试图合并两个独立的观测(observation)。优先排查是否在正确的 span 上设置了所有必需的属性。
问题场景
用户使用 Google ADK 的 FastAPI 预构建应用 (`get_fast_api_app`) 并搭配 Langfuse 进行追踪。用户尝试将 prompt、input、output、session_id、user_id 等信息关联到已有的 trace 中,但发现这些字段缺失。用户参考了 #6588 讨论后,尝试通过 `trace_context` 添加字段,但过程不直接。
报错原文
some information are missing in the traces, such as the input, output, session_id and user_id
原因分析
Langfuse 和 Google ADK 没有内置的方法来合并两个独立的观测(observation)。问题在于尝试创建额外的自定义观测(例如通过 `trace_context` 或额外调用 `@observe`),而不是在 ADK 已创建的 span 上直接富集所有需要的元数据。这导致一些字段(如 input/output)没有被正确关联到主要的生成观测上。
环境排查
- 确认 Langfuse SDK 版本(建议使用最新版)。
- 确认 Google ADK 版本。
- 确认 OpenTelemetry 初始化顺序:Langfuse 实例化需要在 FastAPI 应用启动之后,以保证 tracer 正确初始化。
- 确认 `tracer_provider` 参数是否正确传入 `Langfuse` 构造函数。
解决步骤
- 直接在 ADK 创建的 span 上设置属性:不要创建额外的观测。使用 OpenTelemetry 的
start_as_current_span或获取当前活跃 span 后,通过set_attribute方法设置以下属性:langfuse.prompt.name— prompt 名称langfuse.prompt.version— prompt 版本input.value— 输入数据output.value— 输出数据(在 LLM 调用后设置)user_id— 用户标识session_id— 会话标识
- 确保属性设置在正确的 span 上:尽量在 LLM 调用生成的 span 上设置这些属性,这样 prompt 和所有可观测性字段会关联到同一个观测中。
- 如果使用
@observe(as_type="generation")装饰器:只调用一次 update 方法,且尽可能在输出可用之后(延迟调用)。过早或多次更新可能导致更新丢失。 - 避免创建额外的、不完整的观测:不要在 span 结束后再尝试通过 observation ID 更新,除非使用底层 SDK 方法。
- 为 generations/spans 设置唯一名称:以确保 trace 清晰且易于 evaluator 定位。
验证方法
在 Langfuse UI 中检查对应 trace 的详细视图,确认 input、output、session_id、user_id 以及 prompt 信息(name/version)是否完整显示在正确的观测下,而不是出现在独立的、不完整的观测中。



