Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Denna guide visar steg för steg hur du skickar agenttelemetri till Agent 365 direkt via OpenTelemetry (OTLP/HTTP+JSON). Innan du börjar, läs Agent 365:s överskådlighetskoncept för att förstå modellen, autentiseringsflödena och ytorna där dina data landar.
Viktigt
Den direkta OTel-vägen är undantaget, inte standardvägen. Använd den bara om du redan har en OpenTelemetry-pipeline, om ditt ramverk inte kan använda Agent 365 SDK, eller om din agent är skriven i ett språk som SDK:n ännu inte stöder (till exempel Java). För alla andra är den rekommenderade vägen Microsoft OpenTelemetry Distro, som tillhandahåller ett enhetligt överskådlighets-SDK för Agent 365, Microsoft Foundry, Azure Monitor och mycket mer. Den tidigare Observability SDK fungerar fortfarande utan att medföra brytande ändringar, men rekommenderas inte längre för nya integreringer; migrationsvägledning för befintliga SDK-användare är på väg.
Krav
Säkerställ att följande konfigurationer är på plats innan någon telemetri skickas.
| Vem | Vad |
|---|---|
| Administratör för klientorganisation | Registrera dig för Agent 365 och ge samtycke till din agentapplikation. Se Ombord till Agent 365. Utan en licensierad tenant ignoreras datainmatning tyst – förfrågan returnerar 200 OK med partialSuccess: null men data syns aldrig längre fram. |
| Administratör för klientorganisation |
Tilldela en Microsoft 365 E7- eller Microsoft Agent 365-licens till minst en användare i tenanten. Det räcker inte att SKU:n finns. Tilldelning till en användare startar Defender-backend-arbetsflödet som möjliggör insamling. Utan en tilldelad licens returnerar 200 OK förfrågningar med partialSuccess: null och data ignoreras tyst. |
| Administratör för klientorganisation | Ge klientorganisationens samtycke. Se Grant agents åtkomst till Microsoft 365-resurser. Utan detta utfärdas tokens utan roll/omfattning och förfrågningarna returnerar 403. |
| Ditt utvecklingsteam | Registrera din app (standard Microsoft Entra-app eller blueprint). Se Kom igång med Agent 365-utveckling. |
| Ditt utvecklingsteam | Lägg till Agent365.Observability.OtelWrite under API-behörigheter (applikationsroll för S2S, omfattning för delegerad åtkomst). För blueprints, se Konfigurera ärftliga behörigheter. Samordna med Agent 365-onboardingteamet för att aktivera behörigheten. |
Autentiseringsrecept
Alla fyra recept använder den standardiserade Microsoft Entra-token-endpointen:
| Fält | Värde |
|---|---|
| Tokenslutpunkt | https://login.microsoftonline.com/{your-tenant-id}/oauth2/v2.0/token |
Resurs (aud i returnerad token) |
9b975845-388f-4429-889e-eab1ef63949c (accepterar även api://9b975845-388f-4429-889e-eab1ef63949c) |
| Omfattning för S2S | 9b975845-388f-4429-889e-eab1ef63949c/.default |
| Omfattning för OBO | 9b975845-388f-4429-889e-eab1ef63949c/Agent365.Observability.OtelWrite |
Recepten nedan visar rå HTTP för tydlighet. I produktion föredrar man Microsoft.Identity.Web eller ett annat MSAL-bibliotek, som hanterar tokenuppdatering och caching.
Vilket recept behöver jag?
| Min appmodell | Mitt OAuth-flöde | Gå till |
|---|---|---|
| Standard Microsoft Entra-appregistrering | S2S (klientautentiseringsuppifter) | S2S, standard Microsoft Entra-app |
| Standard Microsoft Entra-appregistrering | OBO (delegerad) | OBO, standard Microsoft Entra-app |
| Blueprint-härledd agentidentitet | S2S (klientautentiseringsuppifter) | S2S, Blueprint-härledd agentidentitet |
| Blueprint-härledd agentidentitet | OBO / AI-teammedlem | OBO, Blueprint-härledd agentidentitet |
S2S, standard Microsoft Entra-app
Ett POST-anrop till klientorganisationens token-endpunkt med grant_type=client_credentials. Autentisera appen genom att använda en klienthemlighet, ett certifikat (signerad JWT-assertion) eller en hanterad identitet eller federerad legitimation.
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
Den returnerade token har appid/azp = {your-app-id}, roles innehållande Agent365.Observability.OtelWrite och aud = 9b975845-.... Använd denna på rutten /observabilityService/.../traces.
Vid autentisering med certifikat, ersätt client_secret={secret} med client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer&client_assertion={signed-jwt}.
S2S, Blueprint-härledd agentidentitet
Agentidentiteter har inga egna autentiseringsuppgifter. AgentidentitetsBlueprinten innehåller autentiseringsuppgifterna (managed identity FIC, certifikat eller klienthemlighet) och utfärdar tokens åt sina underordnade agentidentiteter via ett tvåstegsutbyte. För mer information, se OAuth-flöde för autonoma appar.
Blueprinten autentiserar och får en federerad identitetsbytestoken
T1:-
{blueprint-credential}är blueprintens MSI-token, certifikatsignerad JWT eller secret exchange-token assertion – enligt blueprint-konfiguration.
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-
Agentidentiteten byter
T1mot Agent 365 Observability-resurstoken: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- Den returnerade token har
appid/azp={agent-identity-app-id},rolesinnehållandeAgent365.Observability.OtelWriteochaud=9b975845-.... - Använd denna token på rutten
/observabilityService/.../traces. - URL:
{agentId}är agentidentitetens appId, inte Blueprint-appId.
- Den returnerade token har
OBO, standard Microsoft Entra-app
Ta emot användarens inkommande token Tc från din uppströmsanropare (Bearer eller PFAT), och växla den:
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
Vid autentisering med certifikat, ersätt client_secret={secret} med samma client_assertion_type + client_assertion-par som i S2S.
Den returnerade token har appid/azp = {your-app-id}, scp innehållande Agent365.Observability.OtelWrite och aud = 9b975845-.... Använd denna på rutten /observability/.../traces. En uppdateringstoken returneras bredvid; cacha och återanvänd den istället för att köra Exchange på varje samtal.
OBO, Blueprint-härledd agentidentitet (inklusive AI-teammedlem)
Det finns tre huvudsakliga steg i On-Behalf-Of-flödet. För mer information, se Agent OAuth-flöden: On-behalf-of-flödet.
Ta emot användartoken
Tc. För en AI-lagkamrat representerar denna token agentens eget användarkonto; annars representerar den den mänskliga användaren.Blueprinten autentiserar sig och får
T1, samma som S2S-flödet för blueprint-baserad agentidentitet.Agentidentiteten utbyter
T1ochTcmot en delegerad resurstoken: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
Den returnerade token har appid/azp = {agent-identity-app-id}, scp som innehåller Agent365.Observability.OtelWrite och representerar agnetens användare. Använd denna på rutten /observability/.../traces. URL: {agentId} är agentidentitetens appId, inte Blueprint-appId. En uppdateringstoken returneras bredvid; cache och återanvänd den.
Obligatoriska krav på den returnerade token
S2S-rutt (/observabilityService/...) - app-endast token:
| Anspråk | Obligatoriskt värde |
|---|---|
aud |
9b975845-388f-4429-889e-eab1ef63949c (eller api://9b975845-...) |
roles |
Måste innehålla Agent365.Observability.OtelWrite |
appid (v1) eller azp (v2) |
Måste vara lika med URL {agentId} |
scp |
Måste saknas |
Delegerad rutt (/observability/...) - användardelegerad token (bärare eller PFAT):
| Anspråk | Obligatoriskt värde |
|---|---|
aud |
9b975845-388f-4429-889e-eab1ef63949c (eller api://9b975845-...) |
scp |
Måste innehålla Agent365.Observability.OtelWrite |
appid / azp |
Måste vara lika med URL {agentId} |
Den delegerade rutten accepterar både Bearer och MSAuth1.0 PFAT tokens. Direktuppringare bör använda Bearer. Om du inte vet vilken du har, använd Bearer.
Slutpunkter
Två rutter; välj utifrån hur din tjänst autentiserar, inte utifrån vad användaren gör:
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
Sidhuvuden
Authorization: Bearer <token> # or MSAuth1.0 ... for delegated PFAT
Content-Type: application/json
URL-parametrar
-
{tenantId}- GUID för kundklientorganisation. Servern betraktar detta som auktoritativt; om dina spans sättermicrosoft.tenant.idoch det inte stämmer överens, avslås begäran. -
{agentId}- den anropande applikationens appId (även OAuthclient_id). För Blueprint-baserade identiteter är detta agentidentitetens appId, inte Blueprint-appId. Måste vara lika medappid/azp-anspråket i din token. -
api-version=1– obligatoriskt.
Kodning av begärandetext
Kroppen följer standardformatet OTLP/HTTP+JSON: en ExportTraceServiceRequest med resourceSpans → scopeSpans → spans. Tänk på följande detaljer:
-
traceId(16 byte) ochspanId(8 byte) skickas som hexsträngar med små bokstäver. -
startTimeUnixNano/endTimeUnixNanoär strängar som innehåller nanosekunder enligt Unix-epoken. -
kindär heltalsvärdet för OTLP-uppräkning (till exempel1förINTERNAL);status.codeär heltals-uppräkning (till exempel1förOK,2förERROR). - Alla attributvärden skickas som
stringValue.
Svarstruktur
Ett lyckat anrop returnerar 200 OK:
{ "partialSuccess": null }
Om vissa spann avvisades av per-span-filtret:
{
"partialSuccess": {
"rejectedSpans": 2,
"errorMessage": "Dropped 2 non-A365 span(s) ..."
}
}
Fältnamnen är camelCase vid överföring.
Kontrollera alltid partialSuccess: en 200 med alla dina spann avvisade är ett verkligt scenario du måste hantera.
Gränser och bortfallsförhållanden listar de tysta fallen där en 200 returneras med partialSuccess: null trots att ingen data dyker upp nedströms.
Minsta möjliga begäran
Det enklaste end-to-end-testet skickar ett enda invoke_agent spann. Detta spann är det minsta som hamnar i Microsoft Defender.
Steg 1. Hämta en Bearer-token. För S2S, använd klientuppgifter med omfattning 9b975845-388f-4429-889e-eab1ef63949c/.default (se autentiseringsguider för hela guiden).
Steg 2. POST ett enda span:
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
Steg 3. Förutom 200 OK med denna text:
{ "partialSuccess": null }
Steg 4. Bekräfta att data har mottagits. Ett 200 OK är inte bevis på dataintag; Verifiering av dataintag går igenom verifieringsflödet. För att POST:a en sparad body-fil istället, ersätt --data @- <<EOF ... EOF med --data @./otlp-request.json.
Exempel på agentkörning
En användare på Microsoft Teams frågar "Hur är vädret i Seattle?". Din agent anropar en GetWeather-funktion, ber en LLM att formatera svaret och svarar. Den här körningen består av fyra spann:
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
Körningsomfattande attribut satta på varje span:
| Attribut | Exempelvärde |
|---|---|
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 |
Viktigt
Dessa körningsomfattande attribut sprids inte automatiskt. Du måste själv ställa gen_ai.conversation.idin , microsoft.channel.name, och microsoft.session.id på varje spann.
Spann A: invoke_agent (rot)
{
"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 */
]
}
Span B: chat (LLM-anrop)
{
"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 */
]
}
Span 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 */
]
}
Span 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 */
]
}
Sändning av telemetri
Användning av OTel SDK
De flesta partners skickar spår genom ett OTel SDK istället för egenskriven HTTP. SDK:n hanterar batchning, återförsök och OTLP/HTTP+JSON-kodning åt dig. Ställ in exportörens endpunkt och injicera Authorization header.
Exporter-endpointen är ruttens URL, inklusive frågesträngen:
https://agent365.svc.cloud.microsoft/observabilityService/tenants/{tenantId}/otlp/agents/{agentId}/traces?api-version=1
(Använd /observability/... istället för /observabilityService/... för den delegerade rutten.)
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}"},
)
Paket: 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}` },
});
Paket: @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;
}));
Paket: OpenTelemetry.Exporter.OpenTelemetryProtocol.
Manuell HTTP
Om du inte kan eller vill använda ett OTel SDK, bygg OTLP/HTTP+JSON-förfrågan själv och POSTA den. Body-strukturen definieras av OpenTelemetry OTLP/HTTP+JSON-specifikationen:
{
"resourceSpans": [{
"resource": { "attributes": [ ... ] }, // optional
"scopeSpans": [{
"scope": { "name": "<your-instrumentation>", "version": "1.0.0" },
"spans": [ <span>, <span>, ... ]
}]
}]
}
Varje <span> är ett objekt där de obligatoriska fälten är traceId, spanId, name, kind, startTimeUnixNano, endTimeUnixNano, attributes och (för icke-rootspann) parentSpanId. Se Slutpunkter och Kodning av begärandetext för kodningsreglerna (strängkodade tider, hex traceId / spanId, heltal kind / status.code, alla attributvärden som stringValue).
Uppsättningen attribut som ska sättas på varje spann definieras i meddelandekontrakt. En fullständig lista över tabeller finns på Attributreferens. Se exemplet Agent run för ett end-to-end-arbetsprov med Bearer-token i headern och kroppen inline.
Du kan skicka alla spann av en körning i en enda POST-kropp (föredragen – en förfrågan, en spårning) eller över flera POST:ar. Servern återskapar körningen från traceId + parentSpanId + gen_ai.conversation.id, så varje spann innehåller tillräcklig information för att kunna korreleras oavsett metod.
Meddelandekontrakt
Detta avsnitt definierar vilka spann du kan skicka och vilka attribut som ska finnas på varje. För den fullständiga attributspecifikationen, se Attributreferensen.
Åtgärdstyper
Varje span du skickar måste ha gen_ai.operation.name satt till ett av dessa fyra värden (skiftlägesokänsligt). Alla spann med saknat eller icke erkänt värde tas tyst bort och räknas in i partialSuccess.rejectedSpans.
gen_ai.operation.name |
Betydelse | Mest googlade fallgrop |
|---|---|---|
invoke_agent |
En åberopelse av en agent. "Roten" i en agentkörning. | Krävs för att körningen ska visas i Microsoft Defender agentaktivitetsvyer eller i Administrationscenter för Microsoft 365. Utan detta hamnar telemetrin endast i Microsoft Defender Advanced Hunting (CloudAppEvents). |
execute_tool |
Ett verktygs- eller funktionsanrop utfört av en agent. | -- |
chat |
Ett LLM-inferensanrop. |
Använd bokstavligen chat, INTE inference. |
output_messages |
Ett slutligt utsänd utgångsmeddelande. | -- |
Spannhierarki och gruppering av körningar
Agent 365 återskapar en körning från standard OTLP-spangrafen (traceId, spanId, parentSpanId) plus de körningsövergripande attributen från attributreferensen.
Sex regler:
-
Alltid inställd
parentSpanIdpå varje icke-rotspann. Utan den kan körningens trädstruktur inte rekonstrueras. -
Återanvänd samma
traceIdöver alla span i en körning. -
Sätt
gen_ai.conversation.idpå varje spann med samma värde. Detta är den primära kopplingsnyckeln för "alla spann i denna körning". Den sprids inte automatiskt. -
Sätt
microsoft.channel.namepå varje spann med samma värde. Verktygsspann som saknar kanal eller konversation kan ärva dem från sitt överordnade elementinvoke_agentendast om det överordnade elementet är med i samma OTLP-förfrågan, så sätt dem manuellt på varje spann. -
Sätt
microsoft.session.idpå varje span när du har en logisk session. - För agent-till-agent-anrop där underordnad agent är i en separat förfrågan, återanvänd samma
gen_ai.conversation.idoch använd attributenmicrosoft.a365.caller.agent.*(se Attributreferens) för att fånga anroparagentens kontext.
Det fyrspans-träd som visas i Agent run-exemplet är den kanoniska formen.
Vanliga löpformer
| Form | Spans som ska emitteras | Anteckningar |
|---|---|---|
| Single-agent chattrobot (inga verktyg, ingen LLM-span) | Endast en invoke_agent |
Ställ in runomfattande attribut samt gen_ai.input.messages och gen_ai.output.messages. Identisk med minsta möjliga begäran. |
| Agent med verktyg (vanligast) |
invoke_agentrot + chat, execute_tool, barn output_messages |
Alla underordnade element delar rootspanens traceId och anger parentSpanId = root.spanId. Alla har samma runwide-attribut. Se exempel på agentkörning för ett fullständigt exempel. |
| Agent-till-agent | Varje agent genererar sin egen invoke_agent |
Återanvänd samma gen_ai.conversation.id för båda agenterna. På målets invoke_agent ska du ange gen_ai.execution.type = "Agent2Agent" och microsoft.a365.caller.agent.*-attributen (den anropande agentens appId, namn, blueprint appId, användar-id och e-post). Om den anropande agenten inte är registrerad i Entra, använd microsoft.a365.caller.agent.platform.id och gen_ai.caller.agent.type istället. |
Onboarding-checklista
Gå igenom denna checklista innan du går till produktionen.
| Kategori | Check |
|---|---|
| Autentisering | Din Entra-app (eller blueprint) är registrerad och du kan generera tokens för den. |
| Autentisering | Din app har beviljats Agent365.Observability.OtelWrite (applikationsroll för S2S, behörighet för delegerad). |
| Autentisering | Varje agent har sitt eget Entra-appId som {agentId} i URL:en. För blueprint-härledda identiteter är det agentidentitetens appId, inte blueprintens appId. Om agenten saknar Entra-registrering, se Picking values. |
| Autentisering | En klientorganisationadministratör har gett medgivande för Agent365.Observability.OtelWrite. Utan samtycke utfärdas tokens utan roll/omfattning och förfrågningar avslås med 403. |
| Licensiering | Minst en användare i kundklientorganisationen har en Microsoft 365 E7- eller Microsoft Agent 365-licens tilldelad (tilldelning, inte bara SKU-närvaro i klientorganisationen). Utan en tilldelad licens ignoreras dataintag tyst. Se Förutsättningar. |
| Spans | Varje span sätter de run-övergripande essentiella attributen (Spanhierarki och run-gruppering). |
| Spans |
invoke_agent spann mängden och gen_ai.input.messagesgen_ai.output.messages. |
| Spans |
execute_toolspann satt gen_ai.tool.name, gen_ai.tool.type, gen_ai.tool.call.id, gen_ai.tool.call.arguments, . gen_ai.tool.call.result |
| Spans |
chat spanuppsättning gen_ai.request.model och gen_ai.provider.name (och helst gen_ai.usage.input_tokens / gen_ai.usage.output_tokens - strängkodad). |
| Spans | Alla icke-root spans set parentSpanId; alla spans i en körning har samma traceId. |
| Nyttolast | Begärandetexten ≤ 1 MB. |
| Verifiering | Du analyserar partialSuccess varje svar och loggar avslag. |
| Verifiering | Du körde verifieringsflödet i Verifying Ingestion mot dina första körningar. |
Nästa steg
- Attributreferens – Specifikation, krav och vägledning för val av attributvärden per attribut.
- Felsökning – Verifierar intagning, vanliga fallgropar och felsvar.