Skip to content

4. 属性映射(OTel → Langfuse)


1. 映射入口

Span 结束时,_LangfuseBatchSpanProcessor.on_end()(或 Simple 版本)调用:

  1. _should_skip_span() — 过滤无关 Span
  2. _transform_span_for_langfuse() — 重命名 + 属性映射
  3. 交给底层 OTLP Exporter 发送

映射逻辑在 _LangfuseMixin._map_attributes_to_langfuse()gen_ai.operation.name 分支


2. 操作类型 → Langfuse Observation 类型

gen_ai.operation.nameLangfuse 语义langfuse.observation.type
run_runnerTrace 容器 + 根 Observationspan
run_runner_cancelled取消的 Tracespan
run_agentAgent 执行 Spanspan
call_llmLLM 调用generation
execute_toolTool 调用span
其他通用 Spanspan

3. Trace 级映射(run_runner)

源属性前缀:trpc.python.agent(下文简称 {p}

源属性Langfuse 属性
{p}.runner.namelangfuse.trace.name
{p}.runner.user_idlangfuse.user.id
{p}.runner.session_idlangfuse.session.id
{p}.runner.inputlangfuse.trace.input + langfuse.observation.input
{p}.runner.outputlangfuse.trace.output + langfuse.observation.output
{p}.runner.* 其余字段聚合进 langfuse.trace.metadata JSON
{p}.state.begin/end/partialmetadata 中的 state_begin
{p}.cancellation.*metadata 中的 cancellation_reason

Span 重命名:名为 invocation 的 Span 会被改名为 {p}.runner.name 的值(如 [trpc-agent]: demo/weather_agent)。


4. Generation 映射(call_llm)

源属性Langfuse 属性
{p}.llm_requestlangfuse.observation.input
{p}.llm_responselangfuse.observation.output
llm_request.configlangfuse.observation.model.parameters(JSON)
gen_ai.request.modelgen_ai.request.model(保留)
gen_ai.usage.input_tokensgen_ai.usage.input_tokens
gen_ai.usage.output_tokensgen_ai.usage.output_tokens
{p}.instruction.namelangfuse.observation.prompt.name
{p}.instruction.versionlangfuse.observation.prompt.version
其他 {p}.*langfuse.observation.metadata JSON

Langfuse 根据 langfuse.observation.prompt.name/version 自动关联 Instruction 与 Generation。


5. Tool Span 映射(execute_tool)

源属性Langfuse 属性
{p}.tool_call_argslangfuse.observation.input
{p}.tool_responselangfuse.observation.output
gen_ai.tool.namelangfuse.observation.metadata 中的 tool_name
{p}.state.begin/endmetadata 中的 state_begin / state_end

6. Agent Span 映射(run_agent)

源属性Langfuse 属性
{p}.agent.inputlangfuse.observation.input
{p}.agent.outputlangfuse.observation.output

7. AgentTool 嵌套 Runner 特殊处理

{p}.runner.app_name 包含 AGENT_TOOL_APP_NAME_SUFFIX(Agent 作为 Tool 被调用)时:

  • 移除 langfuse.trace.name
  • 避免子 Runner 的 Span 覆盖根 Trace 名称(Langfuse 只记录第一个 trace.name

8. 旧版 Langfuse 兼容(compatibility_old_version=True)

新版属性旧版属性
langfuse.user.iduser.id
langfuse.session.idsession.id
langfuse.trace.inputinput.value
langfuse.trace.outputoutput.value
langfuse.trace.metadatalangfuse.metadata
Generation input/outputgen_ai.prompt / gen_ai.completion

适用于 Langfuse v3.90.0 之前的自托管实例。


9. 映射流程图

ReadableSpan (OTel 原始)

    ├─ gen_ai.operation.name == "run_runner"?
    │       └─ _map_trace_level_attributes()

    ├─ == "run_agent"?
    │       └─ _map_agent_observation_attributes()

    ├─ == "call_llm"?
    │       └─ _map_generation_attributes()

    ├─ == "execute_tool"?
    │       └─ _map_tool_observation_attributes()

    └─ else
            └─ _map_span_observation_attributes()  # 透传 + type=span


Transformed ReadableSpan → OTLP Export → Langfuse

10. 与 cc_to_langfuse 映射对比

cc_to_langfusetrpc-agent
langfuse.trace(...) SDK 调用langfuse.trace.* Span attributes
container.generation(...)langfuse.observation.type=generation + input/output attributes
container.span(...)langfuse.observation.type=span
代码显式构造 Trace 树OTel Span 父子关系 + Langfuse OTel 解析
usage_details={"input":N,"output":M}gen_ai.usage.input_tokens / output_tokens

tRPC-Agent 不需要 在业务代码里调用 Langfuse SDK;所有语义通过 OTel attributes 表达。