[bot] Spring AI tool/function execution produces no span — only the surrounding chat model call is traced
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Aptitud para principiantes
- 38/100
- Tipo de issue
- Nueva funcionalidad
- Claridad
- Bastante claro
- Estado de actividad
- Tranquilo
- Stack tecnológico
- java
- Área
- ai, observability
Línea de trabajo
Comienza con BraintrustSpringAI.java y los archivos auto/*InstrumentationModule.java correspondientes en springai_1_0_0 y springai_2_0_0, y luego compara con TracingToolExecutor de langchain_1_8_0. Traza la ruta de ejecución de ToolCallingManager y ToolCallback de Spring AI. Se considera terminado cuando cada invocación de herramienta local tiene un span dedicado en ambos módulos compatibles, junto con los spans existentes de llamadas al modelo.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Summary
Both Spring AI instrumentation modules (springai_1_0_0, springai_2_0_0) only wrap OpenAiChatModel.Builder/AnthropicChatModel.Builder construction (BraintrustSpringAI.wrap()). Spring AI's own local tool-execution machinery — ToolCallingManager/DefaultToolCallingManager, the auto-registered ToolCallingAdvisor, and ToolCallback/MethodToolCallback/FunctionToolCallback — is never touched by either module. When a model response triggers a tool call, Spring AI resolves and invokes the corresponding Java method in-process, but that invocation produces no span: only the LLM call that requested the tool and the follow-up LLM call that consumes the result are traced, with the actual tool execution invisible in between.
This is distinct from the already-filed streaming-reassembly bugs (#78 Anthropic SSE tool_use/thinking blocks, #79 OpenAI SSE tool_calls delta-merging) — those are about the LLM span's own tool_calls output being malformed during streaming. This gap is about the absence of a separate span for the tool's actual execution, which is the "tool-calling during model execution" surface itself, comparable to langchain_1_8_0's TracingToolExecutor which does instrument LangChain4j's equivalent local tool execution.
What is missing
A full-repo search for ToolCalling, ToolCallback, and toolCall under both springai_1_0_0 and springai_2_0_0 returns zero matches. BraintrustSpringAI.java in both modules exposes exactly one entry point:
public static <T> T wrap(OpenTelemetry openTelemetry, T chatModelBuilder) { ... }
which only instruments chat model construction. Neither module registers any instrumentation for:
ToolCallingManager.executeToolCalls()— the method that actually resolves and invokes tool callbacks in response to a model's tool-call requestToolCallingAdvisor— theChatClientadvisor auto-registered whenever tools are present, which drives the resolve/execute loopToolCallback.call()(and itsMethodToolCallback/FunctionToolCallbackimplementations) — the actual per-tool invocation point
For comparison, langchain_1_8_0 instruments LangChain4j's analogous local-execution surface via TracingToolExecutor, producing a dedicated span per tool call — Spring AI has no equivalent.
Braintrust docs status
- Spring AI integration is not documented on Braintrust's integrations page at https://www.braintrust.dev/docs/integrations/ai-providers: not_found
- Braintrust's general tracing docs (https://www.braintrust.dev/docs/instrument/trace-llm-calls) describe function/tool calling as part of LLM span capture, not as a separately-spanned execution step: not_found for a documented tool-execution span pattern this gap would need to follow
Upstream sources
- Spring AI tool calling reference: https://docs.spring.io/spring-ai/reference/api/tools.html — documents
ToolCallingManager,ToolCallingAdvisor(auto-registered in theChatClientadvisor chain), andToolCallback/MethodToolCallback/FunctionToolCallbackas the current (Spring AI 1.x/2.x) tool-execution architecture - Spring AI OpenAI chat reference: https://docs.spring.io/spring-ai/reference/api/chat/openai-chat.html — confirms function/tool calling support for the exact provider this repo already instruments
Local files inspected
braintrust-sdk/instrumentation/springai_1_0_0/src/main/java/dev/braintrust/instrumentation/springai/v1_0_0/BraintrustSpringAI.java— singlewrap(OpenTelemetry, T chatModelBuilder)entry point (line 61); no tool-calling instrumentationbraintrust-sdk/instrumentation/springai_1_0_0/src/main/java/dev/braintrust/instrumentation/springai/v1_0_0/auto/SpringAIOpenAIInstrumentationModule.javaandSpringAIAnthropicInstrumentationModule.java— only instrument the two chat model buildersbraintrust-sdk/instrumentation/springai_2_0_0/src/main/java/dev/braintrust/instrumentation/springai/v2_0_0/BraintrustSpringAI.java,SpringAIOpenAI.java,SpringAIAnthropic.java, and theirauto/*InstrumentationModule.java— same scope as 1.0.0, no tool-calling instrumentation- Full-repo grep for
ToolCalling,ToolCallback,toolCallscoped to both Spring AI modules — zero matches braintrust-sdk/instrumentation/langchain_1_8_0/— confirmed as the comparison point: this module does instrument LangChain4j's equivalent local tool-execution surface (TracingToolExecutor)
- Lenguaje dominante
- Java
- Estrellas
- 21
- Forks
- 5
- Merge medio
- 2 d 7 h
- PR fusionados (30 d)
- 8
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de braintrustdata/braintrust-sdk-java
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
Todos los issues de braintrustdata/braintrust-sdk-java
Issues similares
-
executions.Query — startDate and timeRange filters are sent with inverted comparison operators Abiertoarea/plugin
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
kestra-io/plugin-kestra#190 ·
-
litertlm-android AAR ships no consumer ProGuard rules → "mid == null" SIGABRT in minified apps Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100
google-ai-edge/LiteRT-LM#3739 ·
-
Add canonical URLs and a sitemap Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
integra-team-red/meet-map#249 ·
-
[Studio][Bug] Cancelled create-user dialog keeps the password and admin switch for the next attempt Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
apache/rocketmq-dashboard#5064 ·
-
Consent portal: creating a duplicate Purpose shows a generic error instead of "already exists" Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
wso2/dpdp-accelerator#287 ·