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.
Esta guía te orienta de principio a fin para enviar la telemetría del agente directamente a Agent 365 utilizando OpenTelemetry (OTLP/HTTP+JSON). Antes de comenzar, lea los conceptos de observabilidad de Agent 365 para entender el modelo, los flujos de autenticación y los destinos donde llegan sus datos.
Importante
La ruta OTel directa es la excepción, no la predeterminada. Úsela solo si ya tiene una canalización de OpenTelemetry. Su framework no puede utilizar el SDK de Agent 365 o su agente está en un lenguaje que el SDK aún no admite (como Java). Para los demás, la ruta recomendada es Microsoft OpenTelemetry Distro, que proporciona un SDK de observabilidad unificado para Agent 365, Microsoft Foundry, Azure Monitor y más. El SDK de observabilidad anterior sigue funcionando sin cambios importantes, pero ya no se recomienda para nuevas integraciones; se publicarán guías de migración para los usuarios existentes del SDK.
Requisitos previos
Asegúrese de que las siguientes configuraciones se hayan realizado antes de que fluya cualquier telemetría.
| Quién | Qué |
|---|---|
| Administración de inquilinos | Regístrese en Agent 365 y conceda el consentimiento para su aplicación de agente. Consulte Incorporación a Agent 365. Sin un inquilino con licencia, la ingesta se descarta silenciosamente: la solicitud devuelve 200 OK con partialSuccess: null, pero los datos nunca aparecen más adelante. |
| Administración de inquilinos |
Asigne una licencia Microsoft 365 E7 o Microsoft Agent 365 al menos a un usuario del inquilino. Que el SKU esté presente no es suficiente. La asignación a un usuario inicia el flujo de trabajo de back-end de Defender que permite la ingesta. Sin una licencia asignada, las solicitudes devuelven 200 OK con partialSuccess: null y los datos se descartan silenciosamente. |
| Administración de inquilinos | Conceda el consentimiento del inquilino. Consulte Conceder a los agentes acceso a los recursos de Microsoft 365. Sin él, los tokens se emiten sin el rol ni el ámbito y las solicitudes devuelven 403. |
| Su equipo de desarrollo | Registre su aplicación (aplicación estándar de Microsoft Entra o plano técnico). Consulte Comenzar con el desarrollo de Agent 365. |
| Su equipo de desarrollo | Agregue Agent365.Observability.OtelWrite bajo Permisos de API (rol de aplicación para S2S, ámbito para delegado). Para planos técnicos, consulte Configurar permisos heredables. Coordine con el equipo de incorporación de Agent 365 para habilitar el permiso. |
Recetas de autenticación
Las cuatro recetas utilizan el punto de conexión estándar de tokens de Microsoft Entra:
| Campo | Valor |
|---|---|
| Punto de conexión de token | https://login.microsoftonline.com/{your-tenant-id}/oauth2/v2.0/token |
Recurso (aud en el token devuelto) |
9b975845-388f-4429-889e-eab1ef63949c (también acepta api://9b975845-388f-4429-889e-eab1ef63949c) |
| Ámbito del S2S | 9b975845-388f-4429-889e-eab1ef63949c/.default |
| Ámbito del OBO | 9b975845-388f-4429-889e-eab1ef63949c/Agent365.Observability.OtelWrite |
Las siguientes recetas muestran HTTP sin procesar para mayor claridad. En producción, prefiera Microsoft.Identity.Web u otra biblioteca MSAL, que gestione la actualización de tokens y el almacenamiento en caché.
¿Qué receta necesito?
| Mi modelo de aplicación | Mi flujo OAuth | Vaya a |
|---|---|---|
| Registro de aplicaciones de Microsoft Entra estándar | S2S (credenciales de cliente) | S2S, aplicación estándar de Microsoft Entra |
| Registro de aplicaciones de Microsoft Entra estándar | OBO (delegado) | OBO, aplicación estándar de Microsoft Entra |
| Identidad del agente derivado del plano técnico | S2S (credenciales de cliente) | S2S,, identidad del agente derivado del plano técnico |
| Identidad del agente derivado del plano técnico | OBO/Compañero de equipo IA | OBO, identidad del agente derivado del plano técnico |
S2S, aplicación estándar de Microsoft Entra
Un POST al punto de conexión de token del inquilino con grant_type=client_credentials. Autentique la aplicación mediante un secreto de cliente, un certificado (aserción JWT firmada), o una identidad administrada o credencial federada.
POST https://login.microsoftonline.com/{your-tenant-id}/oauth2/v2.0/token
Content-Type: application/x-www-form-urlencoded
client_id={your-app-id}
&scope=9b975845-388f-4429-889e-eab1ef63949c%2F.default
&client_secret={secret}
&grant_type=client_credentials
El token devuelto tiene appid/azp = {your-app-id}, roles que contiene Agent365.Observability.OtelWrite y aud = 9b975845-.... Úselo en la ruta /observabilityService/.../traces.
Para la autenticación basada en certificados, reemplace client_secret={secret} por client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer&client_assertion={signed-jwt}.
S2S,, identidad del agente derivado del plano técnico
Las identidades de los agentes no tienen credenciales propias. La plantilla de identidad del agente contiene las credenciales (FIC de identidad administrada, certificado o secreto de cliente) y emite tokens en nombre de sus identidades de agente secundarias mediante un intercambio de dos pasos. Para más información, consulte flujo OAuth de la aplicación independiente.
La plantilla se autentica y obtiene un token
T1de intercambio de identidad federada:-
{blueprint-credential}es el token MSI del plano técnico JWT firmado por certificado o la aserción de token de intercambio secreto, según la configuración del plano técnico.
POST https://login.microsoftonline.com/{your-tenant-id}/oauth2/v2.0/token Content-Type: application/x-www-form-urlencoded client_id={blueprint-app-id} &scope=api%3A%2F%2FAzureADTokenExchange%2F.default &fmi_path={agent-identity-app-id} &client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer &client_assertion={blueprint-credential} &grant_type=client_credentials-
La identidad del agente intercambia
T1por el token de recurso de observabilidad de Agent 365:POST https://login.microsoftonline.com/{your-tenant-id}/oauth2/v2.0/token Content-Type: application/x-www-form-urlencoded client_id={agent-identity-app-id} &scope=9b975845-388f-4429-889e-eab1ef63949c%2F.default &client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer &client_assertion={T1} &grant_type=client_credentials- El token devuelto tiene
appid/azp={agent-identity-app-id},rolesque contieneAgent365.Observability.OtelWriteyaud=9b975845-.... - Utilice este token en la ruta
/observabilityService/.../traces. - La URL
{agentId}es el appId de identidad de agente, no el appId de plano técnico.
- El token devuelto tiene
OBO, aplicación estándar de Microsoft Entra
Reciba el token entrante del usuario Tc de quien realiza la llamada ascendente (Bearer o PFAT) y, a continuación, intercámbielo:
POST https://login.microsoftonline.com/{your-tenant-id}/oauth2/v2.0/token
Content-Type: application/x-www-form-urlencoded
client_id={your-app-id}
&scope=9b975845-388f-4429-889e-eab1ef63949c%2FAgent365.Observability.OtelWrite
&client_secret={secret}
&grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer
&assertion={Tc}
&requested_token_use=on_behalf_of
Para la autenticación mediante certificado, reemplace client_secret={secret} por el mismo par client_assertion_type + client_assertion que en S2S.
El token devuelto tiene appid/azp = {your-app-id}, scp que contiene Agent365.Observability.OtelWrite y aud = 9b975845-.... Úselo en la ruta /observability/.../traces. Se devuelve un token de actualización adicional; guárdelo y reutilícelo en lugar de volver a ejecutar el intercambio en cada llamada.
OBO, identidad de agente derivada de plano técnico (incluyendo compañero de equipo con IA)
Hay tres pasos principales del flujo con derechos delegados. Para más información, consulte Flujos de OAuth del agente: flujo con derechos delegados.
Reciba el token de usuario
Tc. Para un compañero de equipo de IA, este token representa la cuenta de usuario del agente; de lo contrario, representa al usuario humano que llama.El plano técnico autentica y obtiene
T1, igual que el flujo de identidad del agente derivado del plano técnico S2S.La identidad del agente intercambia
T1yTcpor un token de recurso delegado:POST https://login.microsoftonline.com/{your-tenant-id}/oauth2/v2.0/token Content-Type: application/x-www-form-urlencoded client_id={agent-identity-app-id} &scope=9b975845-388f-4429-889e-eab1ef63949c%2FAgent365.Observability.OtelWrite &client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer &client_assertion={T1} &grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer &assertion={Tc} &requested_token_use=on_behalf_of
El token devuelto tiene appid/azp = {agent-identity-app-id}, scp que contiene Agent365.Observability.OtelWrite, y representa al usuario del agente. Úselo en la ruta /observability/.../traces. La URL {agentId} es el appId de identidad de agente, no el appId de plano técnico. Se devuelve un token de actualización junto a él; almacénelo en caché y reutilícelo.
Notificaciones obligatorias sobre el token devuelto
Ruta S2S (/observabilityService/...): token exclusivo de aplicación:
| Notificación | Valor requerido |
|---|---|
aud |
9b975845-388f-4429-889e-eab1ef63949c (o api://9b975845-...) |
roles |
Debe contener Agent365.Observability.OtelWrite |
appid (v1) o azp (v2) |
Debe ser igual a URL {agentId} |
scp |
Debe estar ausente |
Ruta delegada (/observability/...) - token delegado por el usuario (portador o PFAT):
| Notificación | Valor requerido |
|---|---|
aud |
9b975845-388f-4429-889e-eab1ef63949c (o api://9b975845-...) |
scp |
Debe contener Agent365.Observability.OtelWrite |
appid / azp |
Debe ser igual a URL {agentId} |
La ruta delegada acepta tanto Bearer como MSAuth1.0 PFAT tokens. Los que llaman directamente deben usar Bearer. Si no sabe cuál tienes, use Bearer.
Puntos de conexión
Dos rutas; elija en función de cómo su servicio autentica, no según lo que hace el usuario:
POST https://agent365.svc.cloud.microsoft/observabilityService/tenants/{tenantId}/otlp/agents/{agentId}/traces?api-version=1 # S2S
POST https://agent365.svc.cloud.microsoft/observability/tenants/{tenantId}/otlp/agents/{agentId}/traces?api-version=1 # OBO
Encabezados:
Authorization: Bearer <token> # or MSAuth1.0 ... for delegated PFAT
Content-Type: application/json
Parámetros de URL
-
{tenantId}- el GUID de inquilino de cliente. El servidor lo trata como autoritativo; si los intervalos se establecen enmicrosoft.tenant.idy no están de acuerdo, se rechaza la solicitud. -
{agentId}- el appId de la aplicación que llama (también el OAuthclient_id). Para las identidades derivadas de plantillas, este es el appId de la identidad del agente, no el appId de la plantilla. Debe ser igual a la notificaciónappid/azpde su token. -
api-version=1: obligatorio.
Solicitar codificación de cuerpo
El cuerpo tiene el formato estándar OTLP/HTTP+JSON: un ExportTraceServiceRequest con resourceSpans → scopeSpans → spans. Tenga en cuenta los siguientes detalles:
-
traceId(16 bytes) yspanId(8 bytes) se envían como cadenas hexadecimales minúsculas. -
startTimeUnixNano/endTimeUnixNanoson cadenas que contienen nanosegundos de la época Unix. -
kindes el valor entero de enumeración OTLP (por ejemplo,1paraINTERNAL);status.codees el valor entero de enumeración (por ejemplo,1paraOK,2paraERROR). - Todos los valores de atributos se envían como
stringValue.
Estructura de la respuesta
Una llamada correcta devuelve 200 OK:
{ "partialSuccess": null }
Si el filtro por intervalo rechazó algunos intervalos:
{
"partialSuccess": {
"rejectedSpans": 2,
"errorMessage": "Dropped 2 non-A365 span(s) ..."
}
}
Los nombres de campo se escriben en camelCase en la transmisión.
Comprobar siempre partialSuccess: un 200 con todos los segmentos rechazados es un resultado real que se debe mostrar. Los límites y condiciones de descarte enumeran los casos de descarte silencioso donde un 200 devuelve partialSuccess: null a pesar de que no aparecen datos posteriores.
La solicitud más pequeña posible
La prueba más sencilla de un extremo a otro envía un solo tramo invoke_agent. Este intervalo es el cuerpo más pequeño que llega a Microsoft Defender.
Paso 1. Obtenga un token de portador. Para S2S, utilice las credenciales de cliente con ámbito 9b975845-388f-4429-889e-eab1ef63949c/.default (consulte Recetas de autenticación para la receta completa).
Paso 2. POST un solo intervalo:
TOKEN="$(./get-token.sh)"
TENANT_ID="<customer-tenant-guid>"
AGENT_ID="<your-agent-app-id>"
curl -i -X POST \
"https://agent365.svc.cloud.microsoft/observabilityService/tenants/${TENANT_ID}/otlp/agents/${AGENT_ID}/traces?api-version=1" \
-H "Authorization: Bearer ${TOKEN}" \
-H "Content-Type: application/json" \
--data @- <<EOF
{
"resourceSpans": [{
"scopeSpans": [{
"scope": { "name": "my-instrumentation", "version": "1.0.0" },
"spans": [{
"traceId": "0102030405060708090a0b0c0d0e0f10",
"spanId": "1111111111111111",
"parentSpanId": "",
"name": "invoke_agent",
"kind": 1,
"startTimeUnixNano": "1736175600000000000",
"endTimeUnixNano": "1736175601500000000",
"status": { "code": 1 },
"attributes": [
{ "key": "gen_ai.operation.name", "value": { "stringValue": "invoke_agent" } },
{ "key": "gen_ai.agent.id", "value": { "stringValue": "${AGENT_ID}" } },
{ "key": "gen_ai.agent.name", "value": { "stringValue": "MyAgent" } },
{ "key": "microsoft.a365.agent.blueprint.id", "value": { "stringValue": "${AGENT_ID}" } },
{ "key": "gen_ai.conversation.id","value": { "stringValue": "conv-001" } },
{ "key": "microsoft.channel.name","value": { "stringValue": "web" } },
{ "key": "user.id", "value": { "stringValue": "<entra-user-objectid>" } },
{ "key": "client.address", "value": { "stringValue": "10.1.2.80" } },
{ "key": "server.address", "value": { "stringValue": "myagent.example.com" } },
{ "key": "server.port", "value": { "stringValue": "443" } },
{ "key": "gen_ai.input.messages", "value": { "stringValue": "[{\"role\":\"user\",\"content\":\"hi\"}]" } },
{ "key": "gen_ai.output.messages","value": { "stringValue": "[{\"role\":\"assistant\",\"content\":\"hello\"}]" } }
]
}]
}]
}]
}
EOF
Paso 3. Se espera 200 OK con el siguiente cuerpo:
{ "partialSuccess": null }
Paso 4. Confirme que los datos se han recibido correctamente. Un estado 200 OK no prueba que se haya realizado la ingesta; Verificar la ingesta explica el proceso de verificación. Para hacer un POST con un archivo de cuerpo guardado en su lugar, sustituya --data @- <<EOF ... EOF por --data @./otlp-request.json.
Ejemplo de ejecución de agente
Un usuario de Microsoft Teams pregunta: "¿Qué tiempo hace en Seattle?". Su agente llama a la función GetWeather, pide a un LLM que formatee la respuesta y envía la respuesta. Esa ejecución única es de cuatro intervalos:
graph TD
A["<b>invoke_agent</b> · spanId=A · parentSpanId=∅<br/><i>root - the run itself</i>"]
B["<b>chat</b> · spanId=B · parentSpanId=A<br/><i>LLM picks the tool / formats reply</i>"]
C["<b>execute_tool</b> · spanId=C · parentSpanId=A<br/><i>the GetWeather call</i>"]
D["<b>output_messages</b> · spanId=D · parentSpanId=A<br/><i>final reply emitted to the user</i>"]
A --> B
A --> C
A --> D
Atributos de todo el tramo establecidos para cada tramo:
| Atributo | Valor de ejemplo |
|---|---|
traceId |
0102030405060708090a0b0c0d0e0f10 |
gen_ai.conversation.id |
19:abc@thread.tacv2 |
microsoft.session.id |
session-1234 |
microsoft.channel.name |
msteams |
gen_ai.agent.id |
<AGENT_APP_ID> |
gen_ai.agent.name |
WeatherBot |
microsoft.a365.agent.blueprint.id |
<BLUEPRINT_APP_ID> |
user.id |
<entra-user-objectid> |
client.address |
10.1.2.80 |
server.address |
weatherbot.example.com |
server.port |
443 |
Importante
Estos atributos de ejecución no se propagan automáticamente. Debe configurar gen_ai.conversation.id, microsoft.channel.name y microsoft.session.id manualmente en cada tramo.
Tramo A: invoke_agent (raíz)
{
"traceId": "0102030405060708090a0b0c0d0e0f10",
"spanId": "1111111111111111",
"parentSpanId": "",
"name": "invoke_agent",
"kind": 1,
"startTimeUnixNano": "1736175600000000000",
"endTimeUnixNano": "1736175601500000000",
"status": { "code": 1 },
"attributes": [
{ "key": "gen_ai.operation.name", "value": { "stringValue": "invoke_agent" } },
{ "key": "gen_ai.execution.type", "value": { "stringValue": "HumanToAgent" } },
{ "key": "gen_ai.input.messages", "value": { "stringValue": "[{\"role\":\"user\",\"content\":\"What's the weather in Seattle?\"}]" } },
{ "key": "gen_ai.output.messages", "value": { "stringValue": "[{\"role\":\"assistant\",\"content\":\"It's 65F and partly cloudy in Seattle.\"}]" } },
{ "key": "user.email", "value": { "stringValue": "alice@contoso.com" } }
/* plus all the run-wide attributes listed above */
]
}
Tramo B: chat (llamada al LLM)
{
"traceId": "0102030405060708090a0b0c0d0e0f10",
"spanId": "2222222222222222",
"parentSpanId": "1111111111111111",
"name": "chat",
"kind": 1,
"startTimeUnixNano": "1736175600200000000",
"endTimeUnixNano": "1736175600900000000",
"status": { "code": 1 },
"attributes": [
{ "key": "gen_ai.operation.name", "value": { "stringValue": "chat" } },
{ "key": "gen_ai.request.model", "value": { "stringValue": "gpt-4o" } },
{ "key": "gen_ai.provider.name", "value": { "stringValue": "openai" } },
{ "key": "gen_ai.usage.input_tokens", "value": { "stringValue": "42" } },
{ "key": "gen_ai.usage.output_tokens", "value": { "stringValue": "23" } }
/* plus all the run-wide attributes */
]
}
Tramo C: execute_tool
{
"traceId": "0102030405060708090a0b0c0d0e0f10",
"spanId": "3333333333333333",
"parentSpanId": "1111111111111111",
"name": "execute_tool",
"kind": 1,
"startTimeUnixNano": "1736175600950000000",
"endTimeUnixNano": "1736175601200000000",
"status": { "code": 1 },
"attributes": [
{ "key": "gen_ai.operation.name", "value": { "stringValue": "execute_tool" } },
{ "key": "gen_ai.tool.name", "value": { "stringValue": "GetWeather" } },
{ "key": "gen_ai.tool.type", "value": { "stringValue": "function" } },
{ "key": "gen_ai.tool.call.id", "value": { "stringValue": "call-001" } },
{ "key": "gen_ai.tool.call.arguments", "value": { "stringValue": "{\"location\":\"Seattle\"}" } },
{ "key": "gen_ai.tool.call.result", "value": { "stringValue": "{\"tempF\":65,\"condition\":\"partly cloudy\"}" } }
/* plus all the run-wide attributes */
]
}
Tramo D: output_messages
{
"traceId": "0102030405060708090a0b0c0d0e0f10",
"spanId": "4444444444444444",
"parentSpanId": "1111111111111111",
"name": "output_messages",
"kind": 1,
"startTimeUnixNano": "1736175601400000000",
"endTimeUnixNano": "1736175601500000000",
"status": { "code": 1 },
"attributes": [
{ "key": "gen_ai.operation.name", "value": { "stringValue": "output_messages" } },
{ "key": "gen_ai.output.messages", "value": { "stringValue": "[{\"role\":\"assistant\",\"content\":\"It's 65F and partly cloudy in Seattle.\"}]" } }
/* plus all the run-wide attributes */
]
}
Envío de telemetría
Usar un SDK de OTel
La mayoría de los socios envía trazas a través de un SDK de OTel en lugar de HTTP implementado manualmente. El SDK gestiona automáticamente el procesamiento por lotes, los reintentos y la codificación OTLP/HTTP+JSON. Configure el punto de conexión exportador e inserte el encabezado Authorization.
El punto de conexión exportador es la URL de la propia ruta, incluyendo la cadena de consulta:
https://agent365.svc.cloud.microsoft/observabilityService/tenants/{tenantId}/otlp/agents/{agentId}/traces?api-version=1
(Use /observability/... en lugar de /observabilityService/... para la ruta delegada.)
Python
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
exporter = OTLPSpanExporter(
endpoint="https://agent365.svc.cloud.microsoft/observabilityService/tenants/{tenantId}/otlp/agents/{agentId}/traces?api-version=1",
headers={"Authorization": f"Bearer {token}"},
)
Paquete: opentelemetry-exporter-otlp-proto-http.
Node.js / TypeScript
import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-http";
const exporter = new OTLPTraceExporter({
url: "https://agent365.svc.cloud.microsoft/observabilityService/tenants/{tenantId}/otlp/agents/{agentId}/traces?api-version=1",
headers: { Authorization: `Bearer ${token}` },
});
Paquete: @opentelemetry/exporter-trace-otlp-http.
.NET
using OpenTelemetry.Exporter;
services.AddOpenTelemetry().WithTracing(b => b
.AddOtlpExporter(o =>
{
o.Endpoint = new Uri("https://agent365.svc.cloud.microsoft/observabilityService/tenants/{tenantId}/otlp/agents/{agentId}/traces?api-version=1");
o.Headers = $"Authorization=Bearer {token}";
o.Protocol = OtlpExportProtocol.HttpJson;
}));
Paquete: OpenTelemetry.Exporter.OpenTelemetryProtocol.
HTTP manual
Si no puede o no quieres usar un SDK de OTel, cree usted mismo la solicitud OTLP/HTTP+JSON y envíela mediante POST. La forma del cuerpo se define por la especificación OTLP/HTTP+JSON de OpenTelemetry:
{
"resourceSpans": [{
"resource": { "attributes": [ ... ] }, // optional
"scopeSpans": [{
"scope": { "name": "<your-instrumentation>", "version": "1.0.0" },
"spans": [ <span>, <span>, ... ]
}]
}]
}
Cada <span> es un objeto cuyos campos requeridos son traceId, spanId, name, kind, startTimeUnixNano, endTimeUnixNano, attributes y (para tramos que no son raíz) parentSpanId. Consulte Puntos de conexión y Solicitar codificación de cuerpo para las reglas de codificación (tiempos codificados como cadenas, hexadecimal traceId / spanId, entero kind / status.code, todos los valores de atributo como stringValue).
El conjunto de atributos que se debe establecer en cada tramo está definido en Contratos de mensaje. Consulte Referencia de entidad para ver una lista completa de atributos. Consulte el Ejemplo de ejecución del agente para ver un ejemplo funcional integral con el token de portador en el encabezado y el cuerpo en línea.
Puede enviar todos los intervalos de una ejecución en un único cuerpo POST (preferido: una solicitud, un seguimiento) o en varios POST. El servidor reconstruye la ejecución a partir de traceId + parentSpanId + gen_ai.conversation.id, por lo que cada tramo transporta suficiente como para estar correlacionado en ambos sentidos.
Contratos de mensajes
Esta sección define qué intervalos puede emitir y qué atributos van en cada uno. Para la especificación completa atributo por atributo, consulte la Referencia de atributo.
Tipos de operación
Cada intervalo que envíe debe tener gen_ai.operation.name configurado con uno de estos cuatro valores (sin distinción entre mayúsculas y minúsculas). Cualquier tramo con un valor que falta o no es reconocido se descarta silenciosamente y se cuenta en partialSuccess.rejectedSpans.
gen_ai.operation.name |
Significado | Gotcha más googleada |
|---|---|---|
invoke_agent |
Una invocación de un agente. La "raíz" de la ejecución de un agente. | Es necesario para que la ejecución aparezca en las vistas de actividad de agentes de Microsoft Defender o en el Centro de administración de Microsoft 365. Sin ella, la telemetría solo aparece en la búsqueda avanzada de Microsoft Defender (CloudAppEvents). |
execute_tool |
Una llamada a una herramienta o función realizada por un agente. | -- |
chat |
Una llamada de inferencia de LLM. |
Utilice el literal chat, NO inference. |
output_messages |
Un mensaje final emitido de salida. | -- |
Jerarquía de intervalos y agrupación de ejecución
Agent 365 reconstruye una ejecución a partir de la gráfica estándar de intervalos de OTLP (traceId, spanId, parentSpanId), junto con los atributos globales de la ejecución de la Referencia de atributos.
Seis reglas:
-
Establezca siempre
parentSpanIden cada tramo que no sea raíz. Sin ella, la estructura de árbol de la ejecución no se puede reconstruir. -
Reutiliza el mismo
traceIden cada tramo de una ejecución. -
Establezca
gen_ai.conversation.iden cada tramo con el mismo valor. Esta es la clave de combinación principal para "todos los intervalos de esta ejecución". No se propaga automáticamente. -
Establezca
microsoft.channel.nameen cada tramo con el mismo valor. Los intervalos de herramientas a los que les faltan el canal o la conversación pueden heredarlos de su intervalo principalinvoke_agentsolo si el intervalo principal está en la misma solicitud OTLP, así que configúrelos usted mismo en cada intervalo. -
Establezca
microsoft.session.iden cada intervalo cuando tenga una sesión lógica. - En las llamadas de agente a agente en las que el agente secundario está en una solicitud independiente, reutilice el mismo
gen_ai.conversation.idy use los atributosmicrosoft.a365.caller.agent.*(consulte Referencia de atributos) para capturar el contexto del agente que llama.
El árbol de cuatro intervalos del ejemplo de ejecución del Agente es la forma canónica.
Formas comunes de ejecución
| Forma | Tramos para emitir | Notas |
|---|---|---|
| Bot de chat de un solo agente (sin herramientas, sin tramo LLM) | Solo un invoke_agent |
Establecer atributos en el nivel de ejecución más gen_ai.input.messages y gen_ai.output.messages. Idéntico a solicitud más pequeña posible. |
| Agente con herramientas (más común) |
invoke_agent raíz + chat, execute_tool, output_messages secundarios |
Todos los elementos secundarios comparten los valores traceId y parentSpanId = root.spanId del elemento raíz. Todos tienen los mismos atributos para toda la ejecución. Consulte Ejemplo de ejecución de agente para ver un ejemplo completo. |
| De agente a agente | Cada agente emite su propio invoke_agent |
Reutilice el mismo gen_ai.conversation.id entre ambos agentes. En el invoke_agent del objetivo, establezca gen_ai.execution.type = "Agent2Agent" y los atributos microsoft.a365.caller.agent.* (nombre, appId del agente que llama, plano técnico appId, id de usuario y correo electrónico). Si el agente que llama no tiene registro en Entra, use microsoft.a365.caller.agent.platform.id y gen_ai.caller.agent.type en su lugar. |
Lista de verificación de incorporación
Revise esta lista de verificación antes de pasar a producción.
| Categoría | Comprobación |
|---|---|
| Autenticación | Su aplicación Entra (o plantilla) está registrada y puede acuñar tokens para esta. |
| Autenticación | Se ha concedido a su aplicación Agent365.Observability.OtelWrite (rol de la aplicación para S2S, ámbito para permisos delegados). |
| Autenticación | Cada agente tiene su propio appId de Entra, como {agentId} en la URL. Para las identidades derivadas de plantillas, esta appId es la identidad del agente, no el appId de la plantilla. Si el agente no tiene registro en Entra, consulte Selección de valores. |
| Autenticación | Un administrador del inquilino ha concedido consentimiento para Agent365.Observability.OtelWrite. Sin el consentimiento, los tokens se emiten sin el rol ni el ámbito y las solicitudes se rechazan con 403. |
| Licencias | Al menos un usuario en el inquilino del cliente tiene una licencia de Microsoft 365 E7 o Microsoft Agent 365 asignada (asignación, no solo presencia de SKU en el inquilino). Sin una licencia asignada, la ingesta se descarta sin notificación. Consulte Requisitos previos. |
| Intervalos | Cada tramo establece los elementos esenciales en toda la ejecución (Jerarquía de tramo y agrupación de ejecuciones). |
| Intervalos |
invoke_agent conjunto de intervalos gen_ai.input.messages y gen_ai.output.messages. |
| Intervalos |
execute_tool conjunto de intervalos gen_ai.tool.name, gen_ai.tool.type, gen_ai.tool.call.id, gen_ai.tool.call.arguments, gen_ai.tool.call.result. |
| Intervalos |
chat conjunto de tramos gen_ai.request.model y gen_ai.provider.name (e idóneamente gen_ai.usage.input_tokens / gen_ai.usage.output_tokens - cadena-codificada). |
| Intervalos | Todos los intervalos no raíz establecidos parentSpanId; todos los intervalos de una ejecución comparten el mismo traceId. |
| Payload | El cuerpo de la solicitud es ≤ 1 MB. |
| Comprobación | Analiza partialSuccess en cada respuesta y registra los rechazos. |
| Comprobación | Ejecutó el flujo de verificación en Comprobación de ingestión contra sus primeras ejecuciones. |
Pasos siguientes
- Referencia de atributos: especificación por atributo y guía para seleccionar valores.
- Solución de problemas: verificación de la ingestión, errores comunes y respuestas de error.