Bug: NonRecordingSpan crashes with 'NonRecordingSpan object has no attribute context' when observability exporter is enabled

Abierto
#257 2 comentarios 0 reacciones 1 asignado Ver en GitHub

@nikhilNava ya está trabajando en esto.

Desde el 27/5/2026.

Evaluación

Este issue todavía no se ha evaluado.

Descripción

Description

When ENABLE_A365_OBSERVABILITY_EXPORTER=true is set and the token resolver returns None for the first turn (e.g., agentic auth not yet established), the OpenTelemetry TracerProvider returns a NonRecordingSpan instead of a real Span. Multiple locations in the A365 observability code access .context directly on the span object, which does not exist on NonRecordingSpan — only get_span_context() is available.

This causes the agent to crash on the very first scope creation with:

Exception caught : 'NonRecordingSpan' object has no attribute 'context'

Reproduction

  1. Deploy a Python agent with ENABLE_A365_OBSERVABILITY_EXPORTER=true
  2. Ensure the token resolver returns None on the first turn (e.g., agentic auth token not yet cached)
  3. Send the first message via Teams @mention
  4. The agent crashes with the above error

Verified against opentelemetry-api==1.33.1:

from opentelemetry.trace import NonRecordingSpan, SpanContext

s = NonRecordingSpan(SpanContext(0, 0, False))
print(hasattr(s, 'context'))          # False
print(hasattr(s, 'get_span_context')) # True
s.context                              # AttributeError
s.get_span_context()                   # Works correctly

Affected Files

File Lines Pattern
libraries/microsoft-agents-a365-observability-core/.../opentelemetry_scope.py 161, 270 self._span.context.span_id
libraries/microsoft-agents-a365-observability-core/.../exporters/enriched_span.py 57 return self._span.context
libraries/microsoft-agents-a365-observability-core/.../exporters/agent365_exporter.py 333 ctx = sp.context

Root Cause

The Span interface in opentelemetry-api defines get_span_context() as the public method. The .context attribute is only available on the concrete ReadableSpan / recording span implementations but not on NonRecordingSpan. The A365 code uses .context (the attribute) instead of get_span_context() (the interface method), which works for recording spans but fails for non-recording spans.

Suggested Fix

Replace all span.context attribute accesses with span.get_span_context():

# Before (broken with NonRecordingSpan):
span_id = f"{self._span.context.span_id:016x}" if self._span.context else "unknown"

# After (safe for all span types):
sc = self._span.get_span_context()
span_id = f"{sc.span_id:016x}" if sc else "unknown"

Apply the same pattern to enriched_span.py and agent365_exporter.py.

Workaround

Set ENABLE_A365_OBSERVABILITY_EXPORTER=false and redeploy.

Environment

  • opentelemetry-api version: 1.33.1
  • Python 3.11+
  • Agent deployed to Azure App Service with Teams channel

Related

The same bug exists in microsoft/opentelemetry-distro-python (the upstream distro repo). Tracked there as https://github.com/microsoft/opentelemetry-distro-python/issues/166.

Lenguaje dominante
Python
Estrellas
41
Forks
23
Merge medio
7 h 43 min
PR fusionados (30 d)
3

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de microsoft/Agent365-python

Todos los issues de microsoft/Agent365-python

Issues similares

Más issues de Python

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.