diff --git a/packages/opentelemetry-instrumentation-langchain/opentelemetry/instrumentation/langchain/__init__.py b/packages/opentelemetry-instrumentation-langchain/opentelemetry/instrumentation/langchain/__init__.py index 395e6a98ac..795ef8318f 100644 --- a/packages/opentelemetry-instrumentation-langchain/opentelemetry/instrumentation/langchain/__init__.py +++ b/packages/opentelemetry-instrumentation-langchain/opentelemetry/instrumentation/langchain/__init__.py @@ -229,16 +229,18 @@ def __call__( run_manager = kwargs.get("run_manager") if run_manager: run_id = run_manager.run_id - span_holder = self._callback_manager.spans[run_id] - - extra_headers = kwargs.get("extra_headers", {}) - - # Inject tracing context into the extra headers - ctx = set_span_in_context(span_holder.span) - TraceContextTextMapPropagator().inject(extra_headers, context=ctx) - - # Update kwargs to include the modified headers - kwargs["extra_headers"] = extra_headers + span_holder = self._callback_manager.spans.get(run_id) + + if span_holder: + extra_headers = kwargs.get("extra_headers", {}) + ctx = set_span_in_context(span_holder.span) + TraceContextTextMapPropagator().inject(extra_headers, context=ctx) + kwargs["extra_headers"] = extra_headers + else: + logger.debug( + "No span found for run_id %s, skipping header injection", + run_id + ) # In legacy chains like LLMChain, suppressing model instrumentations # within create_llm_span doesn't work, so this should helps as a fallback