Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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.
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:
- Microsoft Purview: la auditoría debe estar activada para su organización. Para obtener instrucciones, consulte Activar o desactivar la auditoría.
-
Microsoft Defender: La búsqueda avanzada debe configurarse para acceder a la tabla
CloudAppEvents. Para obtener más información, consulte la tabla CloudAppEvents en el esquema de búsqueda avanzada.
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:
- Ir a
https://admin.cloud.microsoft/#/agents/all. - Seleccione el agente y, a continuación, seleccione Actividad.
- 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=trueNote
ENABLE_A365_OBSERVABILITY_EXPORTERes un botón de alternancia secundario que solo surte efecto cuandoenable_a365=Truese establece en el código. También puede controlarlo a través dela365_enable_observability_exporterkwarg.
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:
Habilitación del registro detallado
Comprobación de los registros de errores de exportación
Use el
az webapp log tailcomando 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
BaggageBuilderde 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
TurnContextactividad 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.Hostingestá 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.jsonya365.generated.config.jsonen 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)
- Vaya a Portal Entra>Registros de aplicaciones> y seleccione la aplicación Blueprint.
- Vaya a Permisos de API>Agregar un permiso>APIs que mi organización utiliza>
9b975845-388f-4429-889e-eab1ef63949cbuscar. - Seleccione Permisos delegados> y verifique
Agent365.Observability.OtelWrite>Agregar permisos. - Repita los pasos del 2 al 3, esta vez seleccione permisos de aplicación> y verifique
Agent365.Observability.OtelWrite>Agregar permisos. - Haga clic en Conceder consentimiento del administrador y confirme.
Tanto
Agent365.Observability.OtelWrite(Delegado) comoAgent365.Observability.OtelWrite(Aplicación) deben mostrarGrantedestado.
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
exporterOptionsoa365_*documentados en los repositorios GitHub. Para .NET, useo.Agent365.Exporter.ScheduledDelayMillisecondsyo.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:
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:
- Microsoft Purview: la auditoría debe estar activada para su organización. Consulte Activar o desactivar la auditoría.
-
Microsoft Defender: La búsqueda avanzada debe configurarse para acceder a la tabla
CloudAppEvents. Consulte la tabla CloudAppEvents en el esquema de búsqueda avanzada.
- 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.idygen_ai.agent.idvá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.