Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Deze handleiding begeleidt u stap voor stap bij het direct verzenden van agenttelemetrie naar Agent 365 via OpenTelemetry (OTLP/HTTP+JSON). Lees voordat u begint Agent 365 waarneembaarheid-concepten om het model, de verificatiestromen en de oppervlakken waarop uw data terechtkomt te begrijpen.
Belangrijk
Het directe OTel-pad is de uitzondering, niet de standaard. Gebruik dit alleen als u al een OpenTelemetry-pijplijn heeft, uw framework de Agent 365 SDK niet kan gebruiken, of uw agent in een programmeertaal is geschreven die door de SDK nog niet wordt ondersteund (zoals Java). Voor alle anderen is de aanbevolen route de Microsoft OpenTelemetry Distro, die een uniforme waarneembaarheids-SDK biedt voor Agent 365, Microsoft Foundry, Azure Monitor en meer. De vorige Waarneembaarheids-SDK blijft functioneren zonder wijzigingen die fouten veroorzaken, maar wordt niet langer aanbevolen voor nieuwe integraties. Migratierichtlijnen voor bestaande SDK-gebruikers zullen binnenkort beschikbaar zijn.
Vereisten
Zorg ervoor dat de volgende configuraties correct zijn ingesteld voordat er telemetrie wordt doorgestuurd.
| Wie | Wat |
|---|---|
| Tenantbeheerder | Meld u aan voor Agent 365 en geef toestemming voor uw agent-app. Zie Onboarden bij Agent 365. Zonder een gelicentieerde tenant wordt de invoer stilletjes genegeerd; het verzoek retourneert 200 OK met partialSuccess: null, maar de data verschijnt nooit in het vervolgproces. |
| Tenantbeheerder |
Wijs een Microsoft 365 E7- of Microsoft Agent 365-licentie toe aan ten minste één gebruiker in de tenant. Alleen de aanwezigheid van de SKU is niet genoeg. Toewijzing aan een gebruiker activeert de back-endwerkstroom van Defender voor gegevensinvoer. Zonder toegewezen licentie retourneren verzoeken 200 OK met partialSuccess: null en worden gegevens ongemerkt niet verwerkt. |
| Tenantbeheerder | Verleen tenanttoestemming. Zie Agents toegang geven tot Microsoft 365-bronnen. Zonder tenanttoestemming worden tokens uitgegeven zonder rol/scope en krijgen verzoeken 403 terug. |
| Uw ontwikkelteam | Registreer uw app (standaard Microsoft Entra-app of blauwdruk). Zie Aan de slag met Agent 365-ontwikkeling. |
| Uw ontwikkelteam | Voeg Agent365.Observability.OtelWrite toe onder API-rechten (app-rol voor S2S, bereik voor gedelegeerd). Voor blauwdrukken gaat u naar Overerfbare machtigingen configureren. Coördineer met het onboardingsteam van Agent 365 om de toestemming mogelijk te maken. |
Verificatierecepten
Alle vier de recepten gebruiken het standaard Microsoft Entra-tokeneindpunt:
| Veld | Waarde |
|---|---|
| Tokeneindpunt | https://login.microsoftonline.com/{your-tenant-id}/oauth2/v2.0/token |
Resource (aud in teruggegeven token) |
9b975845-388f-4429-889e-eab1ef63949c (accepteert ook api://9b975845-388f-4429-889e-eab1ef63949c) |
| S2S-bereik | 9b975845-388f-4429-889e-eab1ef63949c/.default |
| OBO-bereik | 9b975845-388f-4429-889e-eab1ef63949c/Agent365.Observability.OtelWrite |
De onderstaande recepten tonen ruwe HTTP ter verduidelijking. In productie wordt Microsoft.Identity.Web of een andere MSAL-bibliotheek aanbevolen, die tokenvernieuwing en opslaan in cache regelt.
Welk recept heb ik nodig?
| Mijn appmodel | Mijn OAuth-stroom | Ga naar |
|---|---|---|
| Standaard Microsoft Entra-app-registratie | S2S (clientreferenties) | S2S, Standaard Microsoft Entra-app |
| Standaard Microsoft Entra-app-registratie | OBO (gedelegeerd) | OBO, Standaard Microsoft Entra-app |
| Agentidentiteit afgeleid van blauwdruk | S2S (clientreferenties) | S2S, van blauwdruk afgeleide agentidentiteit |
| Agentidentiteit afgeleid van blauwdruk | OBO / AI-teamgenoot | OBO, van blauwdruk afgeleide agentidentiteit |
S2S, Standaard Microsoft Entra-app
Eén POST naar het token-eindpunt van de tenant met grant_type=client_credentials. Authenticeer de app met een clientgeheim, een certificaat (ondertekende JWT-assertie), een beheerde identiteit of een federatieve referentie.
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
Het teruggegeven token heeft appid/azp = {your-app-id}, roles die Agent365.Observability.OtelWrite bevat, en aud = 9b975845-.... Gebruik het op de route /observabilityService/.../traces.
Voor verificatie op basis van het certificaat vervangt u client_secret={secret} door client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer&client_assertion={signed-jwt}.
S2S, van blauwdruk afgeleide agentidentiteit
Agentidentiteiten hebben geen eigen referenties. De blauwdruk voor agentidentiteit bevat de referenties (beheerde identiteits-FIC, certificaat of clientgeheim) en tokengeneratie namens de onderliggende agentidentiteiten via een tweestapsuitwisseling. Zie voor meer informatie OAuth-stroom voor autonome apps.
De blauwdruk verifieert en ontvangt een federatief token voor identiteitsuitwisseling
T1:-
{blueprint-credential}is het MSI-token van de blauwdruk, een met een certificaat ondertekend JWT, of een geheime assertie van een exchange-token, per blauwdrukconfiguratie.
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-
De agentidentiteit wisselt
T1in voor het resource-token van Agent 365-waarneembaarheid: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- Het teruggegeven token heeft
appid/azp={agent-identity-app-id},rolesdieAgent365.Observability.OtelWritebevat enaud=9b975845-.... - Gebruik dit token op de route
/observabilityService/.../traces. - De URL
{agentId}is de agent identity appId, niet de blauwdruk-appId.
- Het teruggegeven token heeft
OBO, Standaard Microsoft Entra-app
Ontvang het inkomende token Tc van uw upstream-beller (Bearer of PFAT) en wissel het vervolgens uit:
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
Voor certificaatverificatie vervangt u client_secret={secret} door hetzelfde paar client_assertion_type + client_assertion als in S2S.
Het teruggegeven token heeft appid/azp = {your-app-id}, scp die Agent365.Observability.OtelWrite bevat en aud = 9b975845-.... Gebruik het op de route /observability/.../traces. Er wordt een vernieuwingstoken meegeleverd, sla deze op en hergebruik deze, in plaats van de uitwisseling bij elke oproep opnieuw uit te voeren.
OBO, van een blauwdruk afgeleide agentidentiteit (inclusief AI-teamgenoot)
Er zijn drie belangrijkste stappen in de on-behalf-of-stroom. Ga voor meer informatie naar OAuth-stromen van agent: on-behalf-of-stroom.
Ontvang het gebruikerstoken
Tc. Voor een AI-teamgenoot vertegenwoordigt dit token het eigen gebruikersaccount van de agent; anders vertegenwoordigt het de menselijke gebruiker.De blauwdruk voert verificatie uit en verkrijgt
T1, hetzelfde als de van de S2S-blauwdruk afgeleide agentidentiteitsstroom.De agentidentiteit wisselt
T1enTcin voor een gedelegeerd resourcetoken: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
Het geretourneerde token heeft appid/azp = {agent-identity-app-id}, scp met daarin Agent365.Observability.OtelWrite en vertegenwoordigt de agent-gebruiker. Gebruik het op de route /observability/.../traces. De URL {agentId} is de agent identity appId, niet de blauwdruk-appId. Een vernieuwingstoken wordt meegeleverd. Cache het en hergebruik het.
Vereiste claims op het teruggegeven token
S2S-route (/observabilityService/...) - app-only token:
| Claim | Vereiste waarde |
|---|---|
aud |
9b975845-388f-4429-889e-eab1ef63949c (of api://9b975845-...) |
roles |
Moet Agent365.Observability.OtelWrite bevatten |
appid (v1) of azp (v2) |
Moet gelijk zijn aan URL {agentId} |
scp |
Moet afwezig zijn |
Gedelegeerde route (/observability/...) - door de gebruiker gedelegeerde token (Bearer of PFAT):
| Claim | Vereiste waarde |
|---|---|
aud |
9b975845-388f-4429-889e-eab1ef63949c (of api://9b975845-...) |
scp |
Moet Agent365.Observability.OtelWrite bevatten |
appid / azp |
Moet gelijk zijn aan URL {agentId} |
De gedelegeerde route accepteert zowel de tokens Bearer als MSAuth1.0 PFAT. Directe bellers moeten Bearer gebruiken. Als u niet weet welke u hebt, gebruik dan Bearer.
Eindpunten
Er zijn twee routes. Kies op basis van hoe uw service verifieert, niet op basis van de activiteit van de gebruiker.
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
Kopteksten:
Authorization: Bearer <token> # or MSAuth1.0 ... for delegated PFAT
Content-Type: application/json
URL-parameters
-
{tenantId}: de GUID van de klanttenant De server beschouwt dit als gezaghebbend, als uw spansmicrosoft.tenant.idinstelt en deze niet overeenkomen, wordt de aanvraag afgewezen. -
{agentId}: de appId van de aanroepende applicatie (ook de OAuthclient_id). Voor van blauwdrukken afgeleide identiteiten is dit de appId voor agentidentiteit, niet de blauwdruk-appId. Moet gelijk zijn aan deappid/azp-claim van uw token. -
api-version=1: vereist.
Codering van aanvraagbody
De body heeft de standaard OTLP/HTTP+JSON-vorm: een ExportTraceServiceRequest met resourceSpans → scopeSpans → spans. Houd rekening met de volgende details:
-
traceId(16 bytes) enspanId(8 bytes) worden verzonden als hexadecimale tekenreeksen in kleine letters. -
startTimeUnixNano/endTimeUnixNanozijn tekenreeksen die nanoseconden van het Unix-tijdvak bevatten. -
kindis de opsommingswaarde van de gehele OTLP (bijvoorbeeld1voorINTERNAL);status.codeis de opsommingswaarde in een geheel getal (bijvoorbeeld1voorOK,2voorERROR). - Alle kenmerkwaarden worden verzonden als
stringValue.
Responsstructuur
Een succesvolle aanroep retourneert 200 OK:
{ "partialSuccess": null }
Indien sommige spans door de per-span-filter zijn afgewezen:
{
"partialSuccess": {
"rejectedSpans": 2,
"errorMessage": "Dropped 2 non-A365 span(s) ..."
}
}
Veldnamen worden als camelCase verzonden.
Controleer altijd het volgende partialSuccess: een 200-status waarbij al uw spans zijn afgewezen is een werkelijk resultaat dat u moet melden.
Limieten en voorwaarden voor verwijdering somt de stille verwijdergevallen op waarbij een 200 wordt geretourneerd met partialSuccess: null, ondanks dat er downstream geen gegevens worden doorgegeven.
De kleinst mogelijke aanvraag
De eenvoudigste end-to-end test verzendt een enkele invoke_agent-span. Deze span is het kleinste object dat terechtkomt in Microsoft Defender.
Stap 1. Haal een Bearer-token op. Voor S2S gebruikt u clientreferenties met bereik 9b975845-388f-4429-889e-eab1ef63949c/.default (zie Verificatierecepten voor het volledige recept).
Stap 2. POST een enkele 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
Stap 3. Verwacht 200 OK met deze body:
{ "partialSuccess": null }
Stap 4. Bevestig dat de gegevens daadwerkelijk zijn aangekomen. Een OK van 200 is geen bewijs van inname; Opname verifiëren loopt door de verificatiestroom. Als u in plaats daarvan een opgeslagen body-bestand wilt POSTEN, vervangt u --data @- <<EOF ... EOF door --data @./otlp-request.json.
Voorbeeld van een agentuitvoering
Een gebruiker op Microsoft Teams vraagt: 'Wat is het weer in Seattle?' Uw agent roept een GetWeather-functie aan, vraagt een LLM om het antwoord te formatteren en antwoordt. Die enkele uitvoering bestaat uit vier spans:
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
Uitvoeringsbrede kenmerken die op elke span worden ingesteld:
| Kenmerk | Voorbeeldwaarde |
|---|---|
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 |
Belangrijk
Deze uitvoeringsbrede kenmerken worden niet automatisch doorgegeven. U moet gen_ai.conversation.id, microsoft.channel.name en microsoft.session.id zelf op elke span instellen.
Span A: invoke_agent (hoofdmap)
{
"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-aanroep)
{
"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 */
]
}
Telemetrie verzenden
Een OTel SDK gebruiken
De meeste partners verzenden traceringen via een OTel SDK in plaats van via zelfgeschreven HTTP-verzoeken. De SDK regelt batchverwerking, opnieuw proberen en de OTLP/HTTP+JSON-codering voor u. Stel het exporter-eindpunt in en injecteer de Authorization-header.
Het exporter-eindpunt is de route-URL zelf, inclusief de query-tekenreeks:
https://agent365.svc.cloud.microsoft/observabilityService/tenants/{tenantId}/otlp/agents/{agentId}/traces?api-version=1
(Gebruik /observability/... in plaats van /observabilityService/... voor de gedelegeerde route.)
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}"},
)
Pakket: 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}` },
});
Pakket: @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;
}));
Pakket: OpenTelemetry.Exporter.OpenTelemetryProtocol.
Handgeschreven HTTP
Als u geen OTel SDK kunt of wilt gebruiken, bouw dan zelf de OTLP/HTTP+JSON-aanvraag en POST deze. De structuur van de body wordt gedefinieerd door de OTLP/HTTP+JSON-specificatie van OpenTelemetry:
{
"resourceSpans": [{
"resource": { "attributes": [ ... ] }, // optional
"scopeSpans": [{
"scope": { "name": "<your-instrumentation>", "version": "1.0.0" },
"spans": [ <span>, <span>, ... ]
}]
}]
}
Elk <span> is een object met als verplichte velden traceId, spanId, name, kind, startTimeUnixNano, endTimeUnixNano, attributes en (voor niet-root spans) parentSpanId. Zie Eindpunten en Codering van aanvraagbody voor de regels voor codering (met tekenreeks gecodeerde tijden, hexadecimaal traceId / spanId, geheel getal kind / status.code, alle attribuutwaarden als stringValue).
De reeks kenmerken die op elke span moet worden ingesteld, is gedefinieerd in Message-contracten. Zie Kenmerkverwijzing voor een volledige lijst met kenmerken. Zie het Voorbeeld van een agentuitvoering voor een end-to-end sample met het Bearer-token in de header en de body inline.
U kunt alle spans van een uitvoering in één POST-body verzenden (voorkeur - één verzoek, één tracering) of over meerdere POST's. De server reconstrueert de uitvoering vanaf traceId + parentSpanId + gen_ai.conversation.id, zodat elke span genoeg draagt om in beide richtingen gecorreleerd te worden.
Message-contracten
Deze sectie definieert welke spans u kunt verzenden en welke attributen bij elke span horen. Voor de volledige kenmerk-voor-kenmerk specificatie, gaat u naar de Kenmerkreferentie.
Bewerkingstypen
Elke span die u verzendt moet gen_ai.operation.name ingesteld hebben op een van deze vier waarden (niet-hoofdlettergevoelig). Elke span met een ontbrekende of niet-herkende waarde wordt stilzwijgend verwijderd en in partialSuccess.rejectedSpans geteld.
gen_ai.operation.name |
Betekenis | Meest gegoogelde valkuil |
|---|---|---|
invoke_agent |
Een aanroep van een agent. De ′hoofdmap′ van een agentuitvoering. | Noodzakelijk zodat de agentuitvoering zichtbaar wordt in weergaven van agentactiviteit in Microsoft Defender of in het Microsoft 365-beheercentrum. Als dit niet wordt gedaan, komt de telemetrie alleen terecht in de geavanceerde opsporing van Microsoft Defender (CloudAppEvents). |
execute_tool |
Een tool / functieaanroep uitgevoerd door een agent. | -- |
chat |
Een LLM-deductie-aanroep. |
Gebruik de letterlijke chat, NIET inference. |
output_messages |
Een laatst uitgezonden uitvoerbericht. | -- |
Spanhiërarchie en uitvoeringsgroepering
Agent 365 reconstrueert een uitvoering uit de standaard OTLP-spangrafiek (traceId, spanId, parentSpanId) plus de uitvoeringsbrede kenmerken uit de Kenmerkreferentie.
Zes regels:
-
Stel altijd
parentSpanIdin op elke niet-root span. Als dit niet gebeurt, kan deze de boomstructuur van de uitvoering niet reconstrueren. -
Hergebruik dezelfde
traceIdbij iedere span in een uitvoering. -
Stel
gen_ai.conversation.idin op elke span met dezelfde waarde. Dit is de primaire joinsleutel voor "alle spans in deze uitvoering". Het wordt niet automatisch doorgegeven. -
Stel
microsoft.channel.namein op elke span met dezelfde waarde. Toolspans die het kanaal / gesprek missen, kunnen deze alleen van hun bovenliggendeinvoke_agenterven, alleen als de bovenliggende agent in hetzelfde OTLP-verzoek zit, dus stel ze zelf op elke span in. -
Stel
microsoft.session.idin op elke span wanneer u een logische sessie hebt. - Voor aanroepen van agent-naar-agent waarbij de onderliggende agent zich in een afzonderlijke aanvraag bevindt, hergebruikt u dezelfde
gen_ai.conversation.iden gebruikt u de kenmerkenmicrosoft.a365.caller.agent.*(zie Kenmerkreferentie) om de context van de bellende agent vast te leggen.
De spanstructuur met vier spans in het Voorbeeld van de agentuitvoering is de canonieke structuur.
Veelvoorkomende uitvoeringsvormen
| Vorm | Spans om uit te zenden | Opmerkingen |
|---|---|---|
| Chatbots met één agent (geen tools, geen LLM-span) | Slechts één invoke_agent |
Stel uitvoeringsbrede kenmerken plus gen_ai.input.messages en gen_ai.output.messages in. Identiek aan De kleinst mogelijke aanvraag. |
| Agent met tools (meest voorkomend) |
invoke_agent-hoofdmap+ chat, execute_tool, onderliggende output_messages |
Alle onderliggende items delen de traceId van de hoofdmap en stellen parentSpanId = root.spanId in. Ze hebben allemaal dezelfde uitvoeringsbrede eigenschappen. Zie Voorbeeld van een agentuitvoering voor een volledig voorbeeld. |
| Agent-naar-agent | Elke agent zendt zijn eigen invoke_agent uit |
Hergebruik dezelfde gen_ai.conversation.id voor beide agents. Stel op de invoke_agent van het doel de gen_ai.execution.type = "Agent2Agent"- en de kenmerken microsoft.a365.caller.agent.* in (appId van de aanroepende agent, naam, appId-blauwdruk , gebruikers-id en e-mail). Als de aanroepende agent geen Entra-registratie heeft, gebruik microsoft.a365.caller.agent.platform.id en gen_ai.caller.agent.type dan in plaats daarvan. |
Checklist voor onboarding
Doorloop deze checklist voordat u naar productie gaat.
| Categorie | Controle |
|---|---|
| Auth | Uw Entra-app (of blauwdruk) is geregistreerd en u kunt er tokens voor genereren. |
| Auth | Uw app is Agent365.Observability.OtelWrite toegekend (aanvraagrol voor S2S, bereik voor gedelegeerde). |
| Auth | Elke agent heeft een eigen Entra-appId zoals {agentId} in de URL. Voor van een blauwdruk-afgeleide identiteiten betreft het de appId agentidentiteit, niet de blauwdruk-appId. Als de agent geen Entra-registratie heeft, zie Waarden kiezen. |
| Auth | Een tenantbeheerder heeft toestemming verleend voor Agent365.Observability.OtelWrite. Zonder toestemming worden tokens uitgegeven zonder de rol/het bereik en worden aanvragen afgewezen met 403. |
| Licenties | Ten minste één gebruiker in de klanttenant heeft een Microsoft 365 E7- of Microsoft Agent 365-licentie (toewijzing, niet alleen SKU-aanwezigheid in de tenant). Zonder een toegewezen licentie wordt opname stilletjes verwijderd. Zie Vereisten. |
| Spans | Elke span stelt de uitvoeringsbrede noodzakelijke items vast (spanhiërarchie en uitvoeringsgroepering). |
| Spans |
invoke_agent spans gen_ai.input.messages ingesteld en gen_ai.output.messages. |
| Spans |
execute_tool spans ingesteld 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 spans ingesteld gen_ai.request.model en gen_ai.provider.name (en idealiter gen_ai.usage.input_tokens / gen_ai.usage.output_tokens - gecodeerd met een tekenreeks). |
| Spans | Alle niet-root spans stellen parentSpanId in; alle spans in een uitvoeren delen dezelfde traceId. |
| Payload | Aanvraagbody is ≤ 1 MB |
| Verificatie | U parseert partialSuccess op elke respons en logt afwijzingen. |
| Verificatie | U hebt de verificatiestroom uitgevoerd in Opname verifiëren op uw eerste runs. |
Volgende stappen
- Kenmerkreferentie: specificaties per kenmerk en richtlijnen voor waardekeuze.
- Probleemoplossing: opname verifiëren, veelvoorkomende valkuilen en foutreacties.