Distribución Microsoft OpenTelemetry

Distribución de Microsoft OpenTelemetry es una distribución unificada de observabilidad que proporciona una única experiencia de incorporación para recopilar trazas, métricas y registros de aplicaciones agénticas y no agénticas. Admite observabilidad para Microsoft Agent 365, Microsoft Foundry, Azure Monitor y cualquier back-end compatible con openTelemetry Protocol (OTLP). La distribución admite .NET, Node.js y Python, y reemplaza la configuración fragmentada en varias pilas de observabilidad por una importación y una llamada de configuración.

Ventajas clave

La distribución Microsoft OpenTelemetry proporciona estas ventajas:

  • Un paquete, una API: reemplace varios paquetes de exportador e instrumentación por una sola dependencia.
  • Compatibilidad con múltiples back-end: enviar telemetría a Azure Monitor, cualquier punto de conexión compatible con el Protocolo OpenTelemetry (OTLP), como Datadog, Grafana o New Relic, y Microsoft Agent 365 al mismo tiempo.
  • Instrumentaciones integradas: Use instrumentación automática para HTTP, bases de datos, SDK de Azure, Azure Functions y mucho más sin ninguna configuración adicional.
  • Basado en estándares: se basa en OpenTelemetry, el marco de observabilidad estándar del sector.
  • Boilerplate mínimo: Asegúrese de agregar una importación y una llamada de función a su punto de entrada de la aplicación.

Instalación y configuración

En esta guía se muestra cómo agregar observabilidad a tu aplicación con la Distro de Microsoft OpenTelemetry. La distribución recopila automáticamente seguimientos, métricas y registros con instrumentaciones integradas y exporta la telemetría a Azure Monitor, cualquier punto de conexión de OpenTelemetry Protocol (OTLP) o Microsoft Agent 365.

Instalación de la biblioteca

Para empezar a trabajar con la Distribución de OpenTelemetry de Microsoft, instale la biblioteca adecuada para su plataforma de desarrollo mediante el administrador de paquetes de su lenguaje de programación.

Prerequisites: Python 3.10 o posterior.

pip install microsoft-opentelemetry

Configuración

El exportador del Agente 365 no usa un cadena de conexión. Detecta su punto de conexión automáticamente en función del inquilino. Para habilitar la exportación al Agente 365, establezca el destino del exportador y proporcione un solucionador de tokens que devuelva un token de acceso para un identificador de agente y un identificador de inquilino determinado.

Llame a use_microsoft_opentelemetry() para habilitar la observabilidad.

from microsoft.opentelemetry import use_microsoft_opentelemetry
from microsoft.opentelemetry.a365.hosting.token_cache_helpers import AgenticTokenCache

token_cache = AgenticTokenCache()

use_microsoft_opentelemetry(
    enable_a365=True,
    a365_token_resolver=lambda agent_id, tenant_id: (
        (t := asyncio.run(token_cache.get_observability_token(agent_id, tenant_id)))
        and t.token or None
    ),
)

Para la resolución de tokens personalizada (en lugar de la resolución de tokens predeterminada), consulte Resolución de tokens manual.

Puede personalizar el comportamiento del exportador pasando los kwargs opcionales a365_* a use_microsoft_opentelemetry().

Parameter Description Predeterminado
a365_use_s2s_endpoint Cuando True usa la ruta de acceso del punto de conexión de servicio a servicio. False
a365_max_queue_size Tamaño máximo de cola para el procesador por lotes. 2048
a365_scheduled_delay_ms Retraso en milisegundos entre lotes de exportación. 5000
a365_exporter_timeout_ms Tiempo de espera en milisegundos para la operación de exportación. 30000
a365_max_export_batch_size Tamaño máximo del lote para las operaciones de exportación. 512

Propagación del contexto

Para mantener la observabilidad entre las operaciones distribuidas del Agente 365, debe propagar el contexto. Al propagar el contexto a través de los agentes y servicios, asegúrese de que los seguimientos, los registros y las métricas se correlacionan correctamente en todo el ciclo de vida de la solicitud. Esta correlación es necesaria para una experiencia de supervisión completa y eficaz Microsoft Agente 365.

Atributos de equipaje

Use BaggageBuilder para establecer información contextual que fluye a través de todos los intervalos de una solicitud. El SDK implementa un SpanProcessor que copia todos los elementos de contexto no vacíos a tramos recién iniciados sin modificar los atributos ya presentes.

from microsoft.opentelemetry.a365.core import BaggageBuilder

with (
    BaggageBuilder()
    .tenant_id("tenant-123")
    .agent_id("agent-456")
    .conversation_id("conv-789")
    .build()
):
    # Any spans started in this context will receive these as attributes
    pass

Para rellenar automáticamente el BaggageBuilder desde el TurnContext, use la herramienta populate del paquete microsoft-opentelemetry. Este asistente extrae automáticamente los detalles del autor de la llamada, el agente, el inquilino, el canal y la conversación de la actividad.

from microsoft.opentelemetry.a365.core import BaggageBuilder
from microsoft.opentelemetry.a365.hosting.scope_helpers.populate_baggage import populate

builder = BaggageBuilder()
populate(builder, turn_context)

with builder.build():
    # Baggage is auto-populated from the TurnContext activity
    pass

Middleware para gestión de equipaje

Si el agente usa el paquete de integración de hospedaje, registre el middleware de equipaje para rellenar automáticamente el equipaje para cada solicitud entrante. Este paso quita la necesidad de llamar BaggageBuilder manualmente en cada controlador de actividad.

En Python, registre el middleware de bagaje a través de ObservabilityHostingManager.configure() en lugar de hacerlo directamente en el adaptador.

from microsoft.opentelemetry.a365.hosting import ObservabilityHostingManager, ObservabilityHostingOptions

options = ObservabilityHostingOptions(enable_baggage=True)
ObservabilityHostingManager.configure(adapter.middleware_set, options)

El middleware omite la configuración de la información de contexto para las respuestas asincrónicas (eventos ContinueConversation) para evitar sobrescribir la información de contexto que la solicitud de origen ya ha establecido.

Validar que el flujo de datos se está produciendo en el producto

Para ver la telemetría del agente en Microsoft Purview o Microsoft Defender, asegúrese de que se cumplen los siguientes requisitos:

Instrumentación automática

La distribución de OpenTelemetry de Microsoft combina canalizaciones de OpenTelemetry estándar con instrumentación seleccionada por Microsoft. La distribución puede recopilar telemetría de aplicaciones, telemetría de infraestructura y telemetría de agente o telemetría de IA generativa en función del idioma y la configuración.

Categoría Lo que cubre
Canalizaciones de señal Seguimientos, métricas y registros.
Detección de recursos Servicio, host, nube y contexto de Azure en tiempo de ejecución donde sea compatible.
Instrumentación de infraestructura HTTP, ASP.NET Core, SDK de Azure, clientes de base de datos y marcos de registro donde estén disponibles.
Instrumentación de IA generativa OpenAI, Azure OpenAI, Kernel semántico, LangChain, SDK de Agentes de OpenAI y Framework de Agentes, donde esté disponible.
Ámbitos de agentes manuales Invocación del agente, ejecución de herramientas, inferencia y telemetría de salida, cuando sea compatible.
Exportadores y procesadores Azure Monitor, Microsoft Agent 365, OTLP, salida de consola, procesadores de trazas, procesadores de registro y lectores de métricas.

Cobertura de instrumentación

Language Instrumentación de aplicaciones comunes Instrumentación de agentes comunes y de inteligencia artificial generativa
Python Recursos de OpenTelemetry, procesadores, lectores, registro, métricas y seguimientos. Kernel semántico, SDK de agentes de OpenAI, Agent Framework, LangChain, herramientas del Agente 365 de Microsoft y alcances del Agente 365 de Microsoft.
Node.js HTTP, SDK de Azure, Azure Functions, MongoDB, MySQL, PostgreSQL, Redis, Bunyan y Winston. SDK de agentes de OpenAI, LangChain, contexto del Agente 365 de Microsoft y alcances del Agente 365 de Microsoft.
.NET ASP.NET Core, HttpClient, SQL Client, SDK de Azure, detección de recursos, métricas y registros. Kernel semántico, OpenAI y Azure OpenAI, Agent Framework, elementos del Agente 365 de Microsoft y ámbitos del Agente 365 de Microsoft.

La instrumentación automática escucha las señales de telemetría emitidas por bibliotecas y frameworks admitidos. La instrumentación manual se usa cuando una aplicación necesita describir operaciones específicas del agente, como la invocación, la ejecución de herramientas, la inferencia o la salida asincrónica.

Agregue orígenes, medidores, procesadores o lectores personalizados de OpenTelemetry cuando la aplicación emita telemetría que no esté cubierta por las instrumentaciones integradas.

Bibliotecas de instrumentación integradas

La instrumentación automática escucha la telemetría emitida por marcos admitidos y la reenvía a través de la canalización de OpenTelemetry de la Distro. En escenarios de agente, establezca equipaje como el identificador de inquilino y el identificador del agente antes de que el marco instrumentado cree intervalos.

Marco de referencia Python Node.js .NET
Núcleo Semántico (Kernel semántico) Soportado No soportado Soportado
SDK de OpenAI y OpenAI Agents Soportado Soportado Soportado
Marco de trabajo del agente Soportado No soportado Soportado
LangChain Soportado Soportado No aparece en la lista

Núcleo Semántico (Kernel semántico)

from microsoft.opentelemetry import use_microsoft_opentelemetry

def token_resolver(agent_id, tenant_id):
    return "your-token"

use_microsoft_opentelemetry(
    enable_a365=True,
    a365_token_resolver=token_resolver,
    instrumentation_options={
        "semantic_kernel": {"enabled": True},
    },
)

OpenAI

from microsoft.opentelemetry import use_microsoft_opentelemetry

def token_resolver(agent_id, tenant_id):
    return "your-token"

use_microsoft_opentelemetry(
    enable_a365=True,
    a365_token_resolver=token_resolver,
    instrumentation_options={
        "openai_agents": {"enabled": True},
    },
)

Marco de trabajo del agente

from microsoft.opentelemetry import use_microsoft_opentelemetry

def token_resolver(agent_id, tenant_id):
    return "your-token"

use_microsoft_opentelemetry(
    enable_a365=True,
    a365_token_resolver=token_resolver,
    instrumentation_options={
        "agent_framework": {"enabled": True},
    },
)

LangChain

from microsoft.opentelemetry import use_microsoft_opentelemetry

def token_resolver(agent_id, tenant_id):
    return "your-token"

use_microsoft_opentelemetry(
    enable_a365=True,
    a365_token_resolver=token_resolver,
    instrumentation_options={
        "langchain": {"enabled": True},
    },
)

Instrumentación manual

Use la instrumentación manual cuando la instrumentación automática no describa la operación del agente con suficiente detalle. Los ámbitos manuales permiten a una aplicación describir las actividades comunes del agente de forma coherente entre los lenguajes.

Ámbito Usado para
InvokeAgentScope Inicio y finalización de una invocación de agente.
ExecuteToolScope Una llamada de herramienta realizada por un agente.
InferenceScope Una operación de inferencia del modelo de IA.
OutputScope Salida que debe registrarse una vez que el ámbito de origen se haya completado.

Reutilizar los mismos valores de identidad de solicitud y de agente en los ámbitos de una solicitud para que la telemetría relacionada pueda correlacionarse.

Invocación del agente

from microsoft.opentelemetry.a365.core import (
    AgentDetails,
    Channel,
    InvokeAgentScope,
    InvokeAgentScopeDetails,
    Request,
    ServiceEndpoint,
)

agent_details = AgentDetails(
    agent_id="agent-456",
    agent_name="Email Assistant",
    agent_description="An AI agent powered by Azure OpenAI",
    agentic_user_id="auid-123",
    agentic_user_email="agent@contoso.com",
    agent_blueprint_id="blueprint-789",
    tenant_id="tenant-123",
)

request = Request(
    content="Please help me organize my emails",
    session_id="session-42",
    conversation_id="conv-xyz",
    channel=Channel(name="msteams"),
)

scope_details = InvokeAgentScopeDetails(
    endpoint=ServiceEndpoint(hostname="myagent.contoso.com", port=443),
)

with InvokeAgentScope.start(
    request=request,
    scope_details=scope_details,
    agent_details=agent_details,
) as scope:
    scope.record_input_messages(["Please help me organize my emails"])

    # Run the agent invocation.

    invoke_scope.record_output_messages(["I found 15 urgent emails."])

Ejecución de herramientas

from microsoft.opentelemetry.a365.core import (
    ExecuteToolScope,
    ServiceEndpoint,
    ToolCallDetails,
    ToolType,
)

tool_details = ToolCallDetails(
    tool_name="email-search",
    arguments={"query": "from:manager@contoso.com"},
    tool_call_id="tool-call-456",
    description="Search emails by criteria",
    tool_type=ToolType.FUNCTION.value,
    endpoint=ServiceEndpoint(
        hostname="tools.contoso.com",
        port=8080,
        protocol="https",
    ),
)

with ExecuteToolScope.start(
    request=request,
    details=tool_details,
    agent_details=agent_details,
) as scope:
    result = search_emails(tool_details.arguments)
    scope.record_response(result)

Inferencia

from microsoft.opentelemetry.a365.core import (
    InferenceCallDetails,
    InferenceOperationType,
    InferenceScope,
)

inference_details = InferenceCallDetails(
    operationName=InferenceOperationType.CHAT,
    model="gpt-4o-mini",
    providerName="azure-openai",
)

with InferenceScope.start(
    request=request,
    details=inference_details,
    agent_details=agent_details,
) as scope:
    scope.record_input_messages(["Summarize the following emails for me."])
    response = call_llm()
    scope.record_output_messages([response.text])
    scope.record_input_tokens(response.usage.input_tokens)
    scope.record_output_tokens(response.usage.output_tokens)
    scope.record_finish_reasons(["stop"])

Salida

from microsoft.opentelemetry.a365.core import OutputScope, Response, SpanDetails

# Capture this before exiting the originating InvokeAgentScope context.
parent_context = invoke_scope.get_span_context()
response = Response(
    messages=["Here is your organized inbox."],
)

with OutputScope.start(
    request=request,
    response=response,
    agent_details=agent_details,
    user_details=None,
    span_details=SpanDetails(parent_context=parent_context),
) as scope:
    pass

La documentación del producto debe definir los requisitos de validación específicos del producto para estos ámbitos.

Validación local

La validación local confirma que la aplicación genera telemetría antes de validar un destino específico del producto. Use la salida de la consola o un punto de conexión de OTLP local para comprobar que se crean seguimientos, métricas y registros.

Valida con un punto de conexión OTLP local

Configure la distribución para enviar telemetría a un recopilador local u otro punto de conexión compatible con OTLP.

export OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317
from microsoft.opentelemetry import use_microsoft_opentelemetry

use_microsoft_opentelemetry()

Validar con salida local

Use la salida local cuando desee confirmar la instrumentación antes de enviar datos de telemetría a un destino remoto.

export ENABLE_A365_OBSERVABILITY_EXPORTER=false
from microsoft.opentelemetry import use_microsoft_opentelemetry

def token_resolver(agent_id, tenant_id):
    return "local-validation-token"

use_microsoft_opentelemetry(
    enable_a365=True,
    a365_token_resolver=token_resolver,
)

# Run instrumented application code.

Revise la salida local para intervalos de orígenes esperados, como solicitudes HTTP, llamadas a OpenAI o Azure OpenAI, ámbitos de invocación de agentes, ámbitos de ejecución de herramientas o ámbitos de inferencia. La validación específica del destino pertenece a la documentación del producto para ese destino.

Configuración manual de la autenticación

Al usar el exportador del Agente 365, debe proporcionar un mecanismo para suministrar un token de autenticación. El solucionador de tokens funciona por lote de exportación mediante el identificador del agente y el identificador de inquilino del contexto de equipaje activo. La distribución admite tres enfoques.

Resolución manual de tokens

Use un resolvedor manual cuando adquiera tokens fuera del pipeline de Agent Framework, o cuando desarrolle aplicaciones que no sean de Agent Framework.

El solucionador debe ser sincrónico. Adquiere el token en tu controlador de actividad asincrónica y guárdalo para el resolver.

from microsoft.opentelemetry import use_microsoft_opentelemetry
from microsoft.opentelemetry.a365.runtime import get_observability_authentication_scope

_cached_token: str | None = None

def my_token_resolver(agent_id: str, tenant_id: str) -> str | None:
    return _cached_token

use_microsoft_opentelemetry(enable_a365=True, a365_token_resolver=my_token_resolver)

@AGENT_APP.activity("message", auth_handlers=["AGENTIC"])
async def on_message(context: TurnContext, _state: TurnState):
    global _cached_token
    _cached_token = await AGENT_APP.auth.exchange_token(
        context,
        scopes=get_observability_authentication_scope(),
        auth_handler_id="AGENTIC",
    )

Caché de tokens agentic con aplicaciones de Agent Framework

En el caso de las aplicaciones de Agent Framework, el sistema registra automáticamente IExporterTokenCache<AgenticTokenStruct> mediante la inyección de dependencias cuando no se establece uno personalizado TokenResolver. El agente llama RegisterObservability() a en tiempo de ejecución para proporcionar credenciales y la memoria caché controla la adquisición y actualización de tokens.

from microsoft.opentelemetry import use_microsoft_opentelemetry
from microsoft.opentelemetry.a365.hosting.token_cache_helpers import AgenticTokenCache, AgenticTokenStruct
from microsoft.opentelemetry.a365.runtime import get_observability_authentication_scope

token_cache = AgenticTokenCache()

_cached_tokens: dict[tuple[str, str], str | None] = {}

# Keep the sync resolver side-effect free; refresh the cache in the async request handler.
def sync_token_resolver(agent_id: str, tenant_id: str) -> str | None:
    return _cached_tokens.get((agent_id, tenant_id))

use_microsoft_opentelemetry(enable_a365=True, a365_token_resolver=sync_token_resolver)

@AGENT_APP.activity("message", auth_handlers=["AGENTIC"])
async def on_message(context: TurnContext, _state: TurnState):
    agent_id = context.activity.recipient.id
    tenant_id = context.activity.recipient.tenant_id
    token_cache.register_observability(
        agent_id=agent_id,
        tenant_id=tenant_id,
        token_generator=AgenticTokenStruct(
            authorization=AGENT_APP.auth,
            turn_context=context,
        ),
        observability_scopes=get_observability_authentication_scope(),
    )
    _cached_tokens[(agent_id, tenant_id)] = await token_cache.get_observability_token(
        agent_id, tenant_id,
    )

Almacenar atributos de validación

Para una validación correcta del almacén, el agente debe implementar InvokeAgentScope, InferenceScopey ExecuteToolScope. Los atributos siguientes son obligatorios o opcionales para cada ámbito.

InvokeAgentScope

Atributo Status
gen_ai.agent.id Required
gen_ai.agent.name Required
gen_ai.operation.name Required
gen_ai.input.messages Required
gen_ai.output.messages Required
gen_ai.conversation.id Required
microsoft.tenant.id Required
microsoft.a365.agent.blueprint.id Required
microsoft.agent.user.id Required
microsoft.agent.user.email Required
microsoft.channel.name Required
user.id Required
user.email Required
client.address Required
server.address Required
server.port Required
error.type Optional
gen_ai.agent.description Optional
gen_ai.agent.version Optional
microsoft.a365.agent.platform.id Optional
microsoft.channel.link Optional
microsoft.conversation.item.link Optional
microsoft.session.id Optional
microsoft.session.description Optional
user.name Optional
microsoft.a365.caller.agent.id Optional
microsoft.a365.caller.agent.name Optional
microsoft.a365.caller.agent.blueprint.id Optional
microsoft.a365.caller.agent.platform.id Optional
microsoft.a365.caller.agent.user.email Optional
microsoft.a365.caller.agent.user.id Optional
microsoft.a365.caller.agent.version Optional

ExecuteToolScope

Atributo Status
gen_ai.agent.id Required
gen_ai.agent.name Required
gen_ai.operation.name Required
gen_ai.tool.name Required
gen_ai.tool.call.id Required
gen_ai.tool.call.arguments Required
gen_ai.tool.call.result Required
gen_ai.tool.type Required
gen_ai.conversation.id Required
microsoft.tenant.id Required
microsoft.a365.agent.blueprint.id Required
microsoft.agent.user.id Required
microsoft.agent.user.email Required
microsoft.channel.name Required
user.id Required
user.email Required
client.address Required
error.type Optional
gen_ai.agent.description Optional
gen_ai.agent.version Optional
gen_ai.tool.description Optional
microsoft.a365.agent.platform.id Optional
microsoft.channel.link Optional
microsoft.conversation.item.link Optional
microsoft.session.id Optional
microsoft.session.description Optional
server.address Optional
server.port Optional
user.name Optional

InferenceScope

Atributo Status
gen_ai.agent.id Required
gen_ai.agent.name Required
gen_ai.operation.name Required
gen_ai.input.messages Required
gen_ai.output.messages Required
gen_ai.request.model Required
gen_ai.provider.name Required
gen_ai.conversation.id Required
microsoft.tenant.id Required
microsoft.a365.agent.blueprint.id Required
microsoft.agent.user.id Required
microsoft.agent.user.email Required
microsoft.channel.name Required
user.id Required
user.email Required
client.address Required
error.type Optional
gen_ai.agent.description Optional
gen_ai.agent.version Optional
gen_ai.response.finish_reasons Optional
gen_ai.usage.input_tokens Optional
gen_ai.usage.output_tokens Optional
microsoft.a365.agent.platform.id Optional
microsoft.a365.agent.thought.process Optional
microsoft.channel.link Optional
microsoft.conversation.item.link Optional
microsoft.session.id Optional
microsoft.session.description Optional
server.address Optional
server.port Optional
user.name Optional

OutputScope

Atributo Status
gen_ai.agent.id Required
gen_ai.agent.name Required
gen_ai.operation.name Required
gen_ai.output.messages Required
gen_ai.conversation.id Required
microsoft.tenant.id Required
microsoft.a365.agent.blueprint.id Required
microsoft.agent.user.id Required
microsoft.agent.user.email Required
microsoft.channel.name Required
user.id Required
user.email Required
client.address Required
gen_ai.agent.description Optional
gen_ai.agent.version Optional
microsoft.a365.agent.platform.id Optional
microsoft.channel.link Optional
microsoft.conversation.item.link Optional
microsoft.session.id Optional
microsoft.session.description Optional
user.name Optional

Prueba tu agente con observabilidad

Después de implementar la observabilidad, compruebe que se captura la telemetría:

  1. Ir a https://admin.cloud.microsoft/#/agents/all.
  2. Seleccione el agente y, a continuación, seleccione Actividad.
  3. Compruebe que aparecen sesiones y llamadas a herramientas.

Aplicaciones de ejemplo y configuración avanzada

Para ver ejemplos de trabajo y opciones de configuración avanzadas, consulte los repositorios de GitHub para cada idioma:

Solución de problemas

En esta sección se describen los problemas comunes al implementar y usar la distribución de OpenTelemetry Microsoft con el Agente 365.

Sugerencia

La Guía de Resolución de Problemas del Agente 365 contiene recomendaciones de alto nivel para la solución de problemas, mejores prácticas y enlaces a contenido de solución de problemas para cada parte del ciclo de vida del desarrollo del Agente 365.

Los datos de observabilidad no aparecen

Síntomas:

  • El agente está huyendo
  • No hay telemetría en el centro de administración
  • No se puede ver la actividad de los agentes

Causa principal:

  • La exportación del agente 365 no está habilitada
  • Errores de configuración
  • Problemas con la resolución de tokens

Soluciones: Prueba los siguientes pasos para resolver el problema:

  • Comprobación de que la exportación del Agente 365 está habilitada

    Debe habilitar explícitamente el exportador del Agente 365. Cuando no se establece, la distro podría revertir a un exportador de consola o no exportar nada. Habilite en el código:

    from microsoft.opentelemetry import use_microsoft_opentelemetry
    
    use_microsoft_opentelemetry(
        enable_a365=True,
        a365_enable_observability_exporter=True,
        a365_token_resolver=my_token_resolver,
    )
    

    O bien, establezca la variable de entorno:

    export ENABLE_A365_OBSERVABILITY_EXPORTER=true
    

    Note

    ENABLE_A365_OBSERVABILITY_EXPORTER es un botón de alternancia secundario que solo surte efecto cuando enable_a365=True se establece en el código. También puede controlarlo a través del a365_enable_observability_exporter kwarg.


  • Comprobar la configuración del resolutor de tokens

    El exportador requiere un solucionador de tokens válido que devuelva un token de portador para cada solicitud de exportación. Si falta el solucionador de tokens o devuelve null, la exportación se omite silenciosamente.

  • Habilitar la exportación de consola y verificar la telemetría localmente

    Agregue un exportador de consola para comprobar que la telemetría se está generando antes de llegar al punto de conexión del Agente 365:

    use_microsoft_opentelemetry(enable_a365=True, enable_console=True)
    

  • Habilitación del registro detallado

    import logging
    
    logging.basicConfig(level=logging.DEBUG)
    

  • Comprobación de los registros de errores de exportación

    Use el az webapp log tail comando para buscar registros de errores relacionados con la observabilidad:

    az webapp log tail --name <your-app-name> --resource-group <your-resource-group> | Select-String "observability"
    

Falta el identificador de inquilino o el identificador del agente: intervalos omitidos

Síntomas: El sistema quita silenciosamente los intervalos y nunca los exporta. Algunas plataformas registran un recuento de intervalos omitidos o un mensaje como No spans with tenant/agent identity found. Otros los quitan sin registrarlos.

Resolución:

  • Antes de la exportación, las particiones de la distro se organizan según la identidad del arrendatario y del agente. Los tramos que carecen de un identificador de cliente o de agente se descartan y nunca se envían al servicio.
  • Asegúrese BaggageBuilder de que está configurado con el identificador de inquilino y el identificador del agente antes de crear intervalos. Estos valores se propagan a través del contexto de OpenTelemetry y se adjuntan a todos los intervalos creados dentro del ámbito del equipaje. Para obtener la API específica de la plataforma, consulte Atributos de equipaje.
  • Si usa el middleware de equipaje o el asistente de contexto del paquete de integración de hospedaje, confirme que la TurnContext actividad tiene un destinatario válido con la identidad del agente.

Error de resolución de tokens: exportación omitida o no autorizada

Síntomas: El solucionador de tokens devuelve null o produce un error. En función de la plataforma, la exportación se omite por completo o se produce un error con HTTP 401.

Resolución:

  • Se requiere el resolutor de tokens. Si falta, el exportador genera un error al iniciarse. Asegúrese de que se proporciona un solucionador de tokens y devuelva un token Bearer válido.
  • Asegúrese de que el identificador de inquilino y el identificador de agente correctos se pasen a BaggageBuilder, ya que estos valores se reenvían al resolutor de tokens.
  • Para los agentes hospedados Azure, compruebe que la identidad administrada tiene el permiso de API necesario para el ámbito de observabilidad.
  • Para aplicaciones .NET que usan el paquete de hospedaje de Agent Framework, el intercambio de token se controla automáticamente a través de la inyección de dependencias. Si faltan tokens, confirme que Microsoft.Agents.A365.Observability.Hosting está instalado y registrado.

HTTP 401 No autorizado

Síntomas: Se produce un error en la exportación con HTTP 401. El exportador no vuelve a intentar este error.

Resolución:

  • Compruebe que la audiencia del token coincide con el alcance del endpoint de observabilidad.
  • Compruebe que la resolución de tokens no devuelve un token de usuario delegado, un token para una audiencia incorrecta o un token expirado.

HTTP 403 Prohibido

Síntomas: Se produce un error en la exportación con HTTP 403. El exportador no vuelve a intentar este error.

Causa principal: Un error HTTP 403 puede tener diferentes causas. Compruebe las siguientes resoluciones en orden.

Resolución:

  • Missing license: compruebe que el inquilino tiene una de las siguientes licencias asignadas en Centro de administración de Microsoft 365:

    • Test: Microsoft 365 E7
    • Microsoft 365 E7
    • Microsoft Agente 365 Frontier
  • Permiso que falta Agent365.Observability.OtelWrite : debe conceder este permiso a su identidad (identidad administrada o registro de aplicaciones). Sin ella, se produce un error en la exportación de telemetría con HTTP 403.

    Conceda el permiso mediante una de las siguientes opciones.

    Option A: CLI del agente 365 (requiere a365.config.json y a365.generated.config.json en el directorio de configuración, una cuenta de administrador global y Agent 365 CLI v1.1.139-preview o posterior)

    a365 setup admin --config-dir "<path-to-config-dir>"
    

    Opción B: Entra Portal (no se requieren archivos de configuración; requiere acceso de administrador global al registro de la aplicación de plano técnico)

    1. Vaya a Portal Entra>Registros de aplicaciones> y seleccione la aplicación Blueprint.
    2. Vaya a Permisos de API>Agregar un permiso>APIs que mi organización utiliza>9b975845-388f-4429-889e-eab1ef63949cbuscar.
    3. Seleccione Permisos delegados> y verifique Agent365.Observability.OtelWrite>Agregar permisos.
    4. Repita los pasos del 2 al 3, esta vez seleccione permisos de aplicación> y verifique Agent365.Observability.OtelWrite>Agregar permisos.
    5. Haga clic en Conceder consentimiento del administrador y confirme.

    Tanto Agent365.Observability.OtelWrite (Delegado) como Agent365.Observability.OtelWrite (Aplicación) deben mostrar Granted estado.

HTTP 429 / 5xx: errores transitorios

Síntomas: La exportación produce un error con un código de estado HTTP transitorio, como 429 o 5xx.

Resolución:

  • Estos errores suelen ser transitorios y se resuelven por sí mismos. Las distribuciones de Python y JavaScript vuelven a intentarlo automáticamente en códigos de estado HTTP 408, 429 y 5xx. La distribución .NET no vuelve a intentarlo automáticamente.
  • Si los errores persisten, compruebe el panel de estado del servicio.
  • Considere la posibilidad de reducir la frecuencia de exportación aumentando el retraso programado entre lotes o el tamaño máximo del lote de exportación. Para Python y JavaScript, use los parámetros exporterOptions o a365_* documentados en los repositorios GitHub. Para .NET, use o.Agent365.Exporter.ScheduledDelayMilliseconds y o.Agent365.Exporter.MaxExportBatchSize.

Tiempo de espera de exportación

Síntomas: Se agota el tiempo de espera de los intentos de exportación.

Resolución:

  • Verifique la conectividad de la red al endpoint de observabilidad.

  • El tiempo de espera de solicitud HTTP predeterminado es de 30 segundos en todas las plataformas. Si los tiempos de espera se producen con frecuencia, aumente el valor de tiempo de espera en las opciones del exportador:

    use_microsoft_opentelemetry(
        enable_a365=True,
        a365_token_resolver=my_token_resolver,
        # No direct timeout kwarg — set via environment variable or exporterOptions if supported
    )
    

    Consulte el repositorio Python para obtener la lista completa de opciones de a365_*.


La exportación se realiza correctamente, pero la telemetría no aparece en Defender o Purview

Symptoms: Los registros muestran una exportación correcta (HTTP 200), pero la telemetría no está visible en Microsoft Defender o Microsoft Purview.

Resolución:

  • Compruebe que cumple los requisitos previos para ver los registros exportados:
  • La telemetría puede tardar varios minutos en actualizarse después de una exportación correcta. Espere antes de investigar más.
  • Verifique que las etiquetas contengan atributos microsoft.tenant.id y gen_ai.agent.id válidos. Los atributos de identidad que faltan provocan que los fragmentos se eliminen del lado del servidor, aunque la exportación HTTP devuelva un estado 200.