Distribución Microsoft OpenTelemetry

La 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. Permite la observabilidad para Microsoft Agent 365, Microsoft Foundry, Azure Monitor y cualquier backend compatible con el protocolo OpenTelemetry (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.

Beneficios clave

Microsoft OpenTelemetry Distro proporciona los siguientes beneficios:

  • Un solo paquete, una sola API: reemplaza varios paquetes de exportadores y de instrumentación con 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.
  • Instrumentación integrada: use instrumentación automática para HTTP, bases de datos, SDK de Azure, Azure Functions y más, sin configuración adicional.
  • Basado en estándares: se basa en OpenTelemetry, el marco de observabilidad estándar del sector.
  • Plantilla mínima: 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

Esta guía indica cómo agregar observabilidad a su aplicación con Microsoft OpenTelemetry Distro. La Distribución recopila automáticamente trazas, métricas y registros mediante instrumentaciones integradas, y exporta la telemetría a Azure Monitor, a cualquier punto de conexión compatible con el protocolo OpenTelemetry (OTLP) o a Microsoft Agent 365.

Instalar biblioteca

Para empezar con la Distribución Microsoft OpenTelemetry, instale la biblioteca adecuada para su plataforma de desarrollo utilizando el gestor de paquetes de su idioma.

Requisitos previos: Python 3.10 o posterior.

pip install microsoft-opentelemetry

Configuración

El exportador de Agent 365 no utiliza una cadena de conexión. Detecta su punto de conexión automáticamente en función del inquilino. Para habilitar la exportación a Agent 365, establezca el destino del exportador y proporcione un resolvedor de token que devuelva un token de acceso para un id. de agente y un id. de inquilino determinados.

Llama 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 personalizada de tokens (en lugar de la resolución de tokens predeterminada), consulte Solución de tokens manual.

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

Parámetro Descripción Valor 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 de lote para operaciones de exportación. 512

Propagar contexto

Para mantener la observabilidad en operaciones distribuidas de Agent 365, propague el contexto. Cuando propaga el contexto a través de sus agentes y servicios, se asegura de que las trazas, los registros y las métricas estén correctamente correlacionados a lo largo de todo el ciclo de vida de la solicitud. Esta correlación es necesaria para una experiencia de supervisión completa y eficaz en Microsoft Agent 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 una SpanProcessor que copia de todas las entradas de equipaje no vacías en intervalos recién iniciados sin sobrescribir los atributos existentes.

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 el asistente populate en el 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 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 elimina la necesidad de llamar a BaggageBuilder manualmente en cada gestor de actividades.

En Python, registre el middleware de equipaje 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 los datos fluyen en el producto

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

Instrumentación automática

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

Categoría Lo que abarca
Canalizaciones de señal Seguimientos, métricas y registros.
Detección de recursos Contexto de tiempo de ejecución de servicio, host, nube y Azure donde sea compatible.
Instrumentación de infraestructura HTTP, ASP.NET Core, SDK de Azure, clientes de base de datos y marcos de registro donde se admiten.
Instrumentación de IA generativa OpenAI, Azure OpenAI, Kernel semántico, LangChain, SDK de OpenAI Agents y Agent Framework cuando se admiten.
Ámbitos de agentes manuales Invocación de agentes, ejecución de herramientas, inferencia y telemetría de salida donde se admita.
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 común de aplicaciones Instrumentación común de agentes e IA generativa
Python Recursos, procesadores, lectores, registros, métricas y trazas de OpenTelemetry. Kernel semántico, SDK de agentes de OpenAI, Agent Framework, LangChain, herramientas de Microsoft Agent 365 y ámbitos de Microsoft Agent 365.
Node.js HTTP, SDK de Azure, Azure Functions, MongoDB, MySQL, PostgreSQL, Redis, Bunyan y Winston. SDK de agentes de OpenAI, LangChain, contexto del Microsoft Agent 365 y ámbitos de Microsoft Agent 365.
.NET ASP.NET Core, HttpClient, SQL Client, SDK de Azure, detección de recursos, métricas y registros. Kernel semántico, SDK de agentes de OpenAI y Azure OpenAI, Agent Framework, herramientas de Microsoft Agent 365 y ámbitos de Microsoft Agent 365.

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

Agregue orígenes, contadores, procesadores o lectores personalizados de OpenTelemetry cuando su aplicación emita telemetría no cubierta por la instrumentación integrada.

Importante

La instrumentación automática rellena solo los atributos OpenTelemetry estándar. No incluye todos los atributos requeridos por Agent 365. Debe agregar atributos específicos de Microsoft a través de BaggageBuilder. Para ver qué atributos se requieren, consulte Atributos de validación de almacén.

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 distribución. 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 Python Node.js .NET
Kernel semántico Admitido No se admite Admitido
OpenAI y el SDK de OpenAI Agents Admitido Compatible Admitido
Agent Framework Admitido No se admite Admitido
LangChain Admitido Admitido No aparece en la lista

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},
    },
)

Agent Framework

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

Utilice instrumentación manual cuando la instrumentación automática no describa el funcionamiento del agente con suficiente detalle. Los ámbitos manuales permiten a una aplicación describir actividades comunes de agentes de manera coherente entre idiomas.

Ámbito Se usa para
InvokeAgentScope El inicio y la finalización de una invocación de agente.
ExecuteToolScope Una llamada de herramienta realizada por un agente.
InferenceScope Una operación de inferencia de 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 de 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"])

Opción Output

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 produce telemetría antes de que se valide un destino específico del producto. Utiliza la salida de consola o un punto de conexión OTLP local para comprobar que se crean trazas, métricas y registros.

Valida con un punto de conexión OTLP local

Configure la Distribución para enviar telemetría a un colector local o a 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 quiera confirmar la instrumentación antes de enviar 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 se encuentra en la documentación del producto correspondiente a ese destino.

Configurar manualmente la autenticación

Al usar el exportador del Agent 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 dos enfoques.

Sugerencia

Si estás desarrollando agentes con el SDK de agentes de Microsoft 365, consulte Configuración de autenticación de observabilidad para SDK de Agente para obtener instrucciones paso a paso sobre cómo configurar la adquisición de tokens OBO y S2S tanto para agentes agénticos como no agénticos.

Resolución manual de tokens

Utilice un solucionador manual cuando adquiera tokens fuera de la canalización de Agent Framework, cuando desarrolle aplicaciones que no sean de Agent Framework o cuando use autenticación servicio-a-servicio (S2S) (flujo de credenciales del cliente). Los agentes pueden generar un token por sí mismos, por ejemplo, usando Biblioteca de autenticación de Microsoft (MSAL) o cualquier otro método de adquisición de tokens, pero deben asegurarse de que el token tenga el alcance de observabilidad correcto (api://9b975845-388f-4429-889e-eab1ef63949c/Agent365.Observability.OtelWrite).

Nota

Para la autenticación de servicio a servicio (S2S), debe utilizar este enfoque manual de resolución de tokens. La caché de tokens agente solo admite flujos de autenticación en nombre de (OBO).

Los siguientes ejemplos muestran el patrón del solucionador de tokens OBO (on-behalf-of): el agente adquiere un token de usuario mediante el administrador de autenticación agéntica y lo intercambia por un token con alcance de observabilidad. Para ejemplos de S2S (servicio a servicio) y una comparación de autenticación OBO vs S2S, consulte Configuración de Autenticación de Observabilidad para el SDK de Agentes.

El solucionador debe ser sincrónico. Adquiera el token en su gestionador de actividad asíncrono (o mediante MSAL) y almacénalo en caché para el solucionador.

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 de agente con aplicaciones de Agent Framework

Para las aplicaciones de Agent Framework que usan autenticación on-behalf-of (OBO), la distribución registra automáticamente IExporterTokenCache<AgenticTokenStruct> mediante DI cuando no se configura un TokenResolver personalizado. El agente llama a RegisterObservability() en tiempo de ejecución para proporcionar credenciales y la memoria caché controla la adquisición y actualización de tokens.

Nota

Este enfoque solo admite flujos de autenticación en nombre de (OBO). Para la autenticación de servicio a servicio (S2S), use el solucionador de tokens manual en su lugar.

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,
    )

Atributos de validación de almacén

Para una validación del almacén con éxito, el agente debe implementar InvokeAgentScope, InferenceScope y ExecuteToolScope. Cada ámbito corresponde a una operación de intervalo en el esquema canónico:

Ámbito del SDK Operación de intervalo Código de referencia universal
InvokeAgentScope invoke_agent IA
ExecuteToolScope execute_tool ET
InferenceScope chat CH
OutputScope output_messages OM

Para obtener las listas completas de atributos requeridos y opcionales por alcance —incluyendo la semántica de cada atributo, orientación para elegir valores y cuáles atributos pueden consultarse mediante la búsqueda avanzada de Microsoft Defender— consulte la referencia de atributos de observabilidad de Agent 365. La columna Aplica a identifica a qué ámbito pertenece cada atributo, y la columna Obligatorio distingue los atributos obligatorios (M) de los opcionales (O).

Prueba del agente con observabilidad

Tras implementar la observabilidad, compruebe que se esté capturando la telemetría:

  1. Vaya a https://admin.cloud.microsoft/#/agents/all.
  2. Seleccione el agente y luego, Actividad.
  3. Compruebe que aparecen sesiones y llamadas a herramientas.

Aplicaciones de ejemplo y configuración avanzada

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

Solución de problemas

Esta sección describe problemas comunes al implementar y utilizar la Distribución Microsoft OpenTelemetry con Agent 365.

Problema Description
Los datos de observabilidad no aparecen No hay telemetría visible porque la exportación de Agent 365 no está habilitada, la configuración está incompleta o falla la resolución del token.
Falta el id. de inquilino o el del agente: intervalos omitidos Los tramos se filtran antes de la exportación cuando faltan los atributos de identidad obligatorios del inquilino o del agente.
Error de resolución de tokens: exportación omitida o no autorizada La exportación se omite o se rechaza cuando el solucionador de tokens no devuelve ningún token o presenta errores durante la adquisición del token.
HTTP 401 No autorizado Las solicitudes llegan al servicio, pero la autenticación falla porque el token no es válido, ha expirado o es para la audiencia equivocada.
HTTP 403 Prohibido Se produce un error en la autorización debido a que faltan licencias de inquilino o faltan permisos de escritura de observabilidad.
HTTP 403 Prohibido — Id. de agente no coincide El servicio rechaza la exportación cuando el id. del agente en la solicitud no coincide con la identidad del agente autorizado por el token.
Errores HTTP 429 o 5xx - Errores transitorios La limitación temporal o la inestabilidad de back-end interrumpen la exportación y pueden requerir reintentos o ajuste por lotes.
Tiempo de espera de exportación Las operaciones de exportación superan los límites de tiempo de espera debido a retrasos en la red o latencia de respuesta del punto de conexión.
La exportación es correcta, pero la telemetría no aparece en Defender ni en Purview. La ingesta de datos es correcta, pero la visibilidad se retrasa o bloquea por los requisitos previos posteriores y los requisitos del esquema.

Sugerencia

La Guía de solución de problemas de Agent 365 contiene recomendaciones generales, procedimientos recomendados y vínculos a recursos de solución de problemas para cada parte del ciclo de vida del desarrollo de Agent 365.

Los datos de observabilidad no aparecen

Síntomas:

  • El agente está en ejecución
  • No hay telemetría en el Centro de administración
  • No se puede ver la actividad del agente

Causa principal:

  • La exportación de Agent 365 no está habilitada
  • Errores de configuración
  • Problemas con el resolutor de tokens

Soluciones: pruebe los siguientes pasos para solucionar el problema:

  • Compruebe que la exportación de Agent 365 esté habilitada

    Debe habilitar explícitamente el exportador de Agent 365. Cuando no se establece, la distribución podría revertir a un exportador de consola o no exportar nada. Habilitarlo en 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 establezca la variable de entorno:

    export ENABLE_A365_OBSERVABILITY_EXPORTER=true
    

    Nota

    ENABLE_A365_OBSERVABILITY_EXPORTER es una opción secundaria que solo surte efecto cuando enable_a365=True se establece en el código. También puede controlarlo a través del kwarg a365_enable_observability_exporter.


  • Comprobar configuración de la resolución 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 en consola y comprobar 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 de Agent 365:

    use_microsoft_opentelemetry(enable_a365=True, enable_console=True)
    

  • Habilitar registro detallado

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

  • Revisa los registros para detectar 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 del agente: intervalos omitidos

Síntomas: el sistema descarta intervalos en silencio 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 descartan sin registro.

Resolución

  • Antes de la exportación, la distribución divide los segmentos por las identidades de los inquilinos y de los agentes. Intervalos que carecen de un identificador de inquilino o de agente se quitan y nunca se envían al servicio.
  • Asegúrese de que BaggageBuilder 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 la API específica de la plataforma, consulte Atributos de equipaje.
  • Si está usando el middleware de equipaje o activa el ayudante de contexto desde el paquete de integración de hospedaje, confirme que la actividad TurnContext 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 resolvedor de tokens devuelve null o genera un error. Dependiendo de la plataforma, la exportación se omite por completo o falla con HTTP 401.

Resolución

  • Se requiere el solucionador de tokens. Si falta, el exportador genera un error al iniciarse. Compruebe que se haya proporcionado un solucionador de tokens y devuelva un token de portador válido.
  • Asegúrese de que el id. de inquilino y el id. de agente correctos se pasen a BaggageBuilder, porque estos valores se envían al solucionador de tokens.
  • Para agentes hospedados en Azure, compruebe que la Identidad administrada tenga el permiso de API requerido 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: la exportación falla con HTTP 401. El exportador no reintenta en caso de este error.

Resolución

  • Compruebe que la audiencia del token coincide con el alcance del punto de conexión de observabilidad.
  • Compruebe que el solucionador de tokens no esté devolviendo un token de usuario delegado, un token para una audiencia incorrecta o un token caducado.

HTTP 403 Prohibido

Síntomas: la exportación falla con HTTP 403. El exportador no reintenta en caso de este error.

Causa raíz: un error HTTP 403 puede tener diferentes causas. Revise las siguientes soluciones en orden.

Resolución

  • Licencia que falta: compruebe que su cliente tenga asignada una de las siguientes licencias en el Centro de administración de Microsoft 365:

    • Prueba: Microsoft 365 E7
    • Microsoft 365 E7
    • Microsoft Agent 365 Frontier
  • Falta el permiso de Agent365.Observability.OtelWriteOtorgue el permiso a su identidad (Identidad administrada o registro de la aplicación). Sin ello, la exportación de telemetría falla con HTTP 403.

Conceder el permiso

Utilice cualquiera de estas opciones:

  • CLI de Agent 365

    Requiere una cuenta de Administrador global; ejecute desde el directorio del proyecto del agente que contiene a365.config.json o utilice --agent-name.

    a365 setup permissions bot
    

    O bien, sin un archivo de configuración:

    a365 setup permissions bot --agent-name "<agent-name>"
    
  • Entra Portal

    No se requieren archivos de configuración; se necesita acceso de Administrador global al registro de la aplicación de plano técnico.

    1. Vaya al portal de Entra>Registros de aplicaciones> y seleccione su aplicación de plano técnico.
    2. Vaya a Permisos de API>Agregar un permiso>API que usa mi organización> busca 9b975845-388f-4429-889e-eab1ef63949c.
    3. Seleccione Permisos delegados>, active Agent365.Observability.OtelWrite>Agregar permisos.
    4. Repita los pasos 2–3, esta vez seleccione Permisos de aplicación>, active Agent365.Observability.OtelWrite>Agregar permisos.
    5. Haga clic en Conceder consentimiento de administrador y confirme.

    Tanto Agent365.Observability.OtelWrite (Delegado) como Agent365.Observability.OtelWrite (Aplicación) muestra el estado Granted.

HTTP 403 Prohibido — Id. de agente no coincide

Síntomas: la exportación falla con HTTP 403 y un mensaje del servidor similar a 403 Forbidden, con errores de agent-ID-mismatch al llamar a los puntos de conexión de trazas de Agent 365.

Causa raíz: este error ocurre cuando usa el Id. del cliente de plano técnico en lugar del Id. del cliente de la instancia del agente al configurar los detalles del agente. El id. del agente en la URL de exportación no coincide con la identidad autorizada por el token, por lo que el punto de conexión de los seguimientos rechaza la solicitud.

Resolución

  • Compruebe si el id. de inquilino se agrega a la lista de inquilinos permitidos del Agent 365.
  • Establece los detalles del agente con el Id. de cliente de la instancia del agente (no el id. de cliente de plano técnico).
  • Compruebe la URL de exportación que se genera: se registra si habilita el registrador. Confirme que el id. del agente en la URL coincida con el id. de cliente de la instancia del agente.
  • Para habilitar el registro de diagnóstico por SDK, consulte Validación local.

Errores HTTP 429 o 5xx - Errores transitorios

Síntomas: la exportación falla con un código de estado HTTP transitorio como 429 o 5xx.

Resolución

  • Estos errores suelen ser transitorios y se resuelven por sí solos. Las distribuciones de Python y JavaScript reintentan automáticamente la exportación cuando se reciben los códigos de estado HTTP 408, 429 y 5xx. La distribución .NET no reintenta automáticamente.
  • Si persisten errores, revise el panel de estado del servicio.
  • Considere reducir la frecuencia de exportación aumentando el retraso programado entre lotes o el tamaño máximo de lote de exportación. Para Python y JavaScript, utilice los parámetros exporterOptions o a365_* pertinentes según lo documentado en Repositorios de 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

  • Compruebe la conectividad de red al punto de conexsión de observabilidad.

  • El tiempo de espera predeterminado para las solicitudes HTTP es de 30 segundos en todas las plataformas. Si los tiempos de espera ocurren con frecuencia, aumente el valor del 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 de Python para la lista completa de opciones a365_*.


La exportación es correcta, pero la telemetría no aparece en Defender ni en Purview.

Síntomas: los registros muestran una exportación exitosa (HTTP 200), pero la telemetría no es visible en Microsoft Defender ni en Microsoft Purview.

Resolución

  • Compruebe que cumpla los requisitos previos para ver los registros exportados:
  • La telemetría puede tardar varios minutos en actualizarse tras una exportación correcta. Espere antes de continuar investigando.
  • Verifique que las etiquetas contengan atributos microsoft.tenant.id y gen_ai.agent.id válidos. La ausencia de atributos de identidad provoca que los intervalos sean descartados en el servidor, incluso si la exportación HTTP devuelve 200.