Telemetri på miljønivå med Application Insights (forhåndsvisning)

[Denne artikkelen er forhåndsutgitt dokumentasjon og kan endres.]

Bruk Azure Application Insights for å overvåke Copilot Studio-agentspor eksportert fra et administrert miljø. Etter at du har konfigurert eksport, bruk Azure Monitor og Application Insights for å validere agentkjøringer, overvåke node- og verktøykjøring, lage varsler og bygge tilpassede spørringer og dashbord for operasjonell analyse.

Notat

  • Telemetri på miljønivå er tilgjengelig for agenter drevet av både standardharnessen og GitHub Copilot-harnessen.
  • Etter den private forhåndsvisningen sendes rotagent-kall (invoke_agent) nå ut som dependencies (sammen med alle andre spenn), i stedet for requests. Som et resultat kan agentens root-invokasjonsspor fortsatt vises i requests tabellen til den globale utrullingen er fullført.
  • For å evaluere denne forhåndsvisningsfunksjonen ved hjelp av den nyeste telemetristrategien og mulighetene, kan du teste i et ikke-produksjonsmiljø med tidlig lanseringssyklus aktivert.
  • Denne funksjonen rulles for tiden ut globalt og er kanskje ikke fullt tilgjengelig i dine miljøer ennå.
  • Denne funksjonen er kun tilgjengelig for administrerte miljøer.
  • Kun logger for agenter som er bygget i Copilot Studio, ekskludert deklarative agenter, er tilgjengelige i Application Insights.
  • For å adoptere kun en miljønivå Application Insights-strategi for Copilot Studio-agenttelemetri, kan organisasjoner velge å deaktivere agentnivå Application Insights-telemetri.

Denne artikkelen forklarer hvordan man konfigurerer miljønivå-eksport av Copilot Studio-agentspor til Azure Application Insights gjennom Power Platform-administrasjonssenteret.

Important

Denne artikkelen inneholder dokumentasjon for Microsoft Copilot Studio-forhåndsversjonen og kan bli endret.

Evalueringsfunksjonalitet er ikke ment for produksjonsbruk og kan ha begrensninger. Disse funksjonene er tilgjengelige før en offisielle utgivelsen slik at du kan få tidlig tilgang og gi tilbakemeldinger.

Hvis du skal bygge en produksjonsklar agent, kan du se Oversikt over Microsoft Copilot Studio.

Forutsetninger

Før du setter opp dataeksportforbindelsen, fullfør forutsetningene for å eksportere data til Application Insights.

Hva blir eksportert

Når du aktiverer eksport, skrives Copilot Studio-agentens trace-telemetri til Application Insights i et trace-orientert, OpenTelemetry-tilpasset observabilitetsformat som støtter undersøkelse, dashbord og varsling.

Agenthendelser i Copilot Studio skrives til dependencies-tabellen som span. Hver eksportert hendelse (, , og ) er en enkelt spanrad (InvokeAgentExecuteToolOutputMessages).itemType = dependency

Hvordan spenn danner et spor

Telemetrien følger OpenTelemetris spor-og-spenn-modell, rekonstruert gjennom og operation_Id kolonneneoperation_ParentId:

  • Hver agenttur er sin egen sporing, identifisert av en delt operation_Id runde, som gjør det mulig for Application Insights å gruppere runden og vise den i ende-til-ende-transaksjonsvisningen.
  • Spennet InvokeAgent er roten til svingens spor. Dets ExecuteTool og tilkoblede OutputMessages-span er nestet under det, hver med operation_ParentId = InvokeAgent-spanets id.
  • En samtale strekker seg over flere runder, hver sendt ut som et eget spor. Grupper eller filtrer etter gen_ai.conversation.id for å flette vendingene i en samtale sammen igjen.
  • OutputMessages spenn genererer ikke alltid en InvokeAgent-rotnode, noe som betyr at de med hensikt kan komme uten en samsvarende overordnet node og fremstå som et frittstående spor med bare én node.

Opprett en eksportpakke

Lag en eksportpakke med eksporttypen satt til Copilot Studio ved å følge instruksjonene i Lag en eksportpakke av Power Platform-administrasjonssenterets dokumentasjon.

Valider konfigurasjonen

Etter at du har lagret eksportkonfigurasjonen, kjør en testsamtale med agenten og bekreft at telemetrien ankommer i Application Insights. Telemetrilevering kan ta opptil 24 timer på nye konfigurasjoner. Bekreft at:

  • Agent spans vises i tabellen dependencies .
  • I hver omgang har InvokeAgent, ExecuteTool og OutputMessages-områdene en felles operation_Id.

Applikasjonsinnsiktsfelt

Tabellen nedenfor viser feltene i tabellen dependencies , og hvilke felt som er fylt ut for hver av de tre eksporterte agenthendelsene: InvokeAgent, ExecuteTool, og OutputMessages. Agent- og operasjonssemantikk er i customDimensions (nøklene gen_ai.* , som gen_ai.operation.name), ikke i de native kolonnene.

Felt i dependencies tabellen InvokeAgent ExecuteTool Utdatameldinger Eksempelverdi
timestamp [UTC] ✔️ ✔️ ✔️ 6/11/2026, 5:02:13.501 AM
id ✔️ ✔️ ✔️ 1111aaa1-aa11-11aa-11a1-a1aaa1111aa1
name ✔️ ✔️ ✔️ InvokeAgent / ExecuteTool / OutputMessages
resultCode ✔️ ✔️ ✔️ OK, ERROR
type ✔️ ✔️ ✔️ GenAI
target ✔️ ✔️ ✔️ GenAI
data ✔️ ✔️ ✔️ invoke_agent / execute_tool / output_messages
success ✔️ ✔️ ✔️ True
duration ✔️ ✔️ ✔️ 0
performanceBucket ✔️ ✔️ ✔️ <250ms
itemType ✔️ ✔️ ✔️ dependency
customDimensions ✔️ ✔️ ✔️ Lær mer i customDimension-egenskaper
operation_Id ✔️ ✔️ ✔️ trace-1111aaa1-aa11-11aa-11a1-a1aaa1111aa1 (delt av hver spenn i svingen)
operation_ParentId ✔️ ✔️ ✔️ Denne er InvokeAgentid for underordnede spenn; roten til sporingen for InvokeAgent-spennet
client_Type ✔️ ✔️ ✔️ PC
client_IP ✔️ ✔️ ✔️ 0.0.0.0
client_City ✔️ ✔️ ✔️ San Jose
client_StateOrProvince ✔️ ✔️ ✔️ California
client_CountryOrRegion ✔️ ✔️ ✔️ United States
appId ✔️ ✔️ ✔️ 11111a1a-1111-1111-a111-1a1a1a11111a
appName ✔️ ✔️ ✔️ -
iKey ✔️ ✔️ ✔️ aa111a1a-a1aa-111a-111a-a111a111111a
sdkVersion ✔️ ✔️ ✔️ dotnetc:2.23.0-29
itemId ✔️ ✔️ ✔️ a1a1111a-1111-11a1-1111-111111aa1a1a
itemCount ✔️ ✔️ ✔️ 1
_ResourceId ✔️ ✔️ ✔️ -

customDimensions-egenskaper

Hver spenn inkluderer customDimensions JSON. Følgende tabell viser vanlige nøkler som forekommer på hver spennvidde:

Nøkkel Eksempelverdi
SpanId 1111aaa1-aa11-11aa-11a1-a1aaa1111aa1
error.type 404
Status.code 1, 2
Status.message Descriptive failure message
gen_ai.agent.id 1aa11a11-1a1a-1a11-1a1a-1111aa1111aa
gen_ai.agent.name MCS Agent
gen_ai.conversation.id aaaaa111-1a1a-1111-1aa1-a111111a11a1
gen_ai.request.model Sonnet46
gen_ai.operation.name invoke_agent / execute_tool / output_messages
env.id 111a1aa1-a1aa-aaa1-a11a-11a111111111
microsoft.tenant.id 11aaa111-1a11-1a1a-a111-aa1a111a111a
microsoft.a365.agent.blueprint.id 1111111a-aa11-1a11-a1a1-a11a1111a1a1
microsoft.a365.agent.platform.id 111a1aa1-…_1a11111a-…
microsoft.channel.name Copilot Studio Test Pane
resource.provider copilot studio
signal.category default
a365.enabled True
appinsights.enabled True
user.id -
user.email My.User@mytenant.onmicrosoft.com
user.name My User
client.address ::ffff:00.00.00.00
telemetry.sdk.name A365ObservabilitySDK
telemetry.sdk.language dotnet
telemetry.sdk.version 1.1.9.43597

Hendelsesspesifikke nøkler

Tabellen nedenfor viser de hendelsesspesifikke nøklene:

Nøkkel InvokeAgent ExecuteTool Utdatameldinger Beskrivelse
gen_ai.input.messages ✔️ - - JSON-array av {role, parts:[{content, type}]}—brukerprompten
gen_ai.output.messages - - ✔️ JSON-array—agentens svar
gen_ai.tool.name - ✔️ - Eksempel: workiqsharepoint:mcp_SharePointRemoteServer
gen_ai.tool.type - ✔️ - Eksempel: MCP - Power Platform Connector
gen_ai.tool.call.id - ✔️ - Verktøykallingsidentifikator
gen_ai.tool.call.arguments - ✔️ - JSON-nyttelast sendt til verktøyet
gen_ai.tool.call.result - ✔️ - JSON-nyttelast returnert av verktøyet

Oppdag det nåværende skjemaet

Skjemaet som er dokumentert i denne artikkelen kan utvikle seg over tid. I stedet for å stole utelukkende på tabellene nevnt tidligere, bruk følgende spørringer for å inspisere det nyeste skjemaet live i ditt eget miljø.

Vis innebygde tabellkolonner

Følgende spørring returnerer kolonnenivåskjemaet i dependencies tabellen. Bruk det til å bekrefte tilgjengelige native kolonner når du lager forespørsler, dashbord eller varsler.

dependencies
| getschema
| project ColumnName, ColumnType
| order by ColumnName asc

Oppdag customDimensions-nøkler (dynamiske egenskaper)

Følgende spørring lister opp alle nøkler i JSON-en customDimensions i dependencies tabellen: egenskapsnavnet, hvilke agenthendelser den vises på (InvokeAgent, ExecuteTool, OutputMessages), og en prøveverdi. I motsetning til det opprinnelige kolonneskjemaet, er disse egenskapene dynamiske, så denne spørringen forblir nøyaktig når SDK-en legger til nye gen_ai.* eller andre nøkler. Bruk det som levende kilde til sannhet for tilgjengelige attributter.

dependencies
| where timestamp > ago(7d)
| mv-expand Key = bag_keys(customDimensions) to typeof(string)
| summarize Events = make_set(name), SampleValue = take_any(tostring(customDimensions[Key])) by Key
| order by Key asc

Overvåk eksportert telemetri

Bruk Application Insights-loggene for å spørre agentaktivitet og undersøke agent- eller verktøykjøring. All eksportert telemetri havner i dependenciestabellen som span:

  • Hver agentomgang er et spor, gruppert etter en felles operation_Id.
  • Spennet InvokeAgent er sporroten; ExecuteTool og OutputMessages spenner reir under den gjennom operation_ParentId.
  • Grupper etter gen_ai.conversation.id for å samle flere meldinger i samme samtale, og del denne ID-en på _ for å inkludere spor fra underagenter.

Agents (forhåndsvisning) blader

I tillegg til logger tilbyr Application Insights innebygde Agents (forhåndsvisning) visninger som visualiserer den eksporterte GenAI-telemetrien uten å skrive Kusto-spørringer. Når Copilot Studio skriver sine spenn til tabellendependencies, leser disse bladene direkte fra disse dataene:

  • Agent Runs: Lister agent-invokasjoner bygget fra spennene InvokeAgent , med varighet, suksess og samtalen hver runde tilhører. Noen begrensninger gjelder; lær mer i Kjente begrensninger og hensyn.
  • Verktøy: Samler ExecuteTool spennene for å vise hvilke verktøy agentene kaller, hvor ofte og hvordan de presterer.
  • Modeller: Oppsummerer modellbruken på tvers av kjøringer, og fremhever modellene som påkalles og deres kallmønstre.

Skjermbilde av bladene til Application Insights Agents.

Analyser agenttelemetri med Application Insights

Etter at du kobler miljøet ditt til Application Insights, logger det agentens telemetridata når brukere interagerer med agenten, inkludert under testing i Copilot Studio. For å se de loggførte telemetridataene, gå til Loggseksjonen i din Application Insights-ressurs i Azure. Her kan du bruke Kusto-spørringer for å spørre og analysere dataene dine. Lær mer i eksempelforespørsler.

Eksempelspørringer

Følgende eksempler på Kusto-forespørsler rekonstruerer Copilot Studio-agentsamtaler fra dependencies tabellen i Application Insights. Siden hvert span deler et sporingsforløp operation_Id for hver tur, sorterer spørringene spanene med roten først (spanet InvokeAgent før de underordnede spanene) innenfor hvert sporingsforløp.

Forespørsel 1: Hent en fullstendig sporing for en bestemt samtale-ID

Denne spørringen returnerer alle span for en kjent samtale, sortert kronologisk, med hvert rotspan oppført før sine underordnede span. Erstatt Conversation ID-plassholderen med agentens Conversation ID. Du kan finne den ved å skrive inn følgende kommando mens du tester din egendefinerte agent: /debug conversationid.

let LatestConvo = "<Conversation ID>"; 
dependencies
| where tostring(customDimensions["gen_ai.conversation.id"]) == LatestConvo
| order by operation_Id asc, iff(name == "InvokeAgent", 0, 1) asc, timestamp asc
| project timestamp, name, id, operation_Id,
          operation_ParentId, duration, target, type, cloud_RoleName,
          resultCode, customDimensions

Forespørsel 2: Returner den siste samtalen for en spesifikk agent

Denne spørringen finner den nyeste samtalen for en navngitt agent innenfor det angitte tidsvinduet. Den returnerer hvert tidsrom for den samtalen i samme kronologiske, rot-først-rekkefølge. Bytt ut agentnavnets plassholder med agentens navn.

let Window = 7d;
let AgentName = "<Agent name>";
let LatestConvo = toscalar(
    dependencies
    | where timestamp > ago(Window)
    | where tostring(customDimensions["gen_ai.agent.name"]) == AgentName
    | where isnotempty(tostring(customDimensions["gen_ai.conversation.id"]))
    | top 1 by timestamp desc
    | project tostring(customDimensions["gen_ai.conversation.id"])
);
dependencies
| where timestamp > ago(Window)
| where tostring(customDimensions["gen_ai.conversation.id"]) == LatestConvo
| order by operation_Id asc, iff(name == "InvokeAgent", 0, 1) asc, timestamp asc
| project timestamp, name, id, operation_Id,
          operation_ParentId, duration, target, type, cloud_RoleName,
          resultCode, customDimensions

Spørring 3: Utvid kjente genAI OpenTelemetri-egenskaper til kolonner

Denne spørringen returnerer samme spor som spørring 2, men den parser også hver kjent OpenTelemetri-semantisk-konvensjonsnøkkel til sin egen navngitte kolonne. Resultatet er en flat, eksplisitt definert tabell hvor du kan sortere, filtrere og skanne generative AI-felt som verktøynavn, modell, brukerprompt, agentsvar og samtale-ID direkte. Bytt ut agentnavnets plassholder med agentens navn.

let Window = 7d;
let AgentName = "<Agent name>";
let LatestConvo =
    toscalar(
        dependencies
        | where timestamp > ago(Window)
        | extend
            AgentName_ = tostring(customDimensions["gen_ai.agent.name"]),
            ConversationId_ = tostring(customDimensions["gen_ai.conversation.id"])
        | where AgentName_ == AgentName
        | where isnotempty(ConversationId_)
        | summarize arg_max(timestamp, ConversationId_)
        | project ConversationId_
    );
dependencies
| where timestamp > ago(Window)
| extend
    ConversationId = tostring(customDimensions["gen_ai.conversation.id"])
| where ConversationId == LatestConvo
| extend
    OperationName    = tostring(customDimensions["gen_ai.operation.name"]),
    AgentId          = tostring(customDimensions["gen_ai.agent.id"]),
    AgentName        = tostring(customDimensions["gen_ai.agent.name"]),
    Model            = tostring(customDimensions["gen_ai.request.model"]),
    ToolName         = tostring(customDimensions["gen_ai.tool.name"]),
    ToolType         = tostring(customDimensions["gen_ai.tool.type"]),
    ToolCallId       = tostring(customDimensions["gen_ai.tool.call.id"]),
    ToolArguments    = tostring(customDimensions["gen_ai.tool.call.arguments"]),
    ToolResult       = tostring(customDimensions["gen_ai.tool.call.result"]),
    EnvironmentId    = tostring(customDimensions["env.id"]),
    TenantId         = tostring(customDimensions["microsoft.tenant.id"]),
    ChannelName      = tostring(customDimensions["microsoft.channel.name"]),
    BlueprintId      = tostring(customDimensions["microsoft.a365.agent.blueprint.id"]),
    PlatformId       = tostring(customDimensions["microsoft.a365.agent.platform.id"]),
    ResourceProvider = tostring(customDimensions["resource.provider"]),
    SignalCategory   = tostring(customDimensions["signal.category"]),
    UserId           = tostring(customDimensions["user.id"]),
    UserName         = tostring(customDimensions["user.name"]),
    UserEmail        = tostring(customDimensions["user.email"])
| extend
    InputMessages  = parse_json(tostring(customDimensions["gen_ai.input.messages"])),
    OutputMessages = parse_json(tostring(customDimensions["gen_ai.output.messages"]))
| extend
    UserInput   = tostring(InputMessages[0].parts[0].content),
    AgentOutput = tostring(OutputMessages[0].parts[0].content)
| order by
    operation_Id asc,
    iff(name == "InvokeAgent", 0, 1) asc,
    timestamp asc
| project
    timestamp, name, id, operation_Id, operation_ParentId, OperationName, ConversationId,
    AgentId, AgentName, Model, ToolName, ToolType, ToolCallId, ToolArguments, ToolResult,
    UserInput, AgentOutput, EnvironmentId, TenantId, ChannelName, BlueprintId, PlatformId,
    ResourceProvider, SignalCategory, UserId, UserName, UserEmail, duration, target, type,
    cloud_RoleName, resultCode, customDimensions

Spørsmål 4: Utvid alle genAI OpenTelemetrie-egenskaper dynamisk

Denne spørringen returnerer de samme spennviddene som spørring 3, men hver gen_ai.* nøkkel pakkes dynamisk ut fra customDimensions i sin egen ga_-prefiks-kolonne. Siden projeksjonen er dynamisk, vises enhver ny gen_ai.* attributt som SDK-en sender ut senere automatisk uten å endre spørringen. Bytt ut agentnavnets plassholder med agentens navn.

let Window = 7d;
let AgentName = "<Agent name>";
let LatestConvo = toscalar(
    dependencies
    | where timestamp > ago(Window)
    | where tostring(customDimensions["gen_ai.agent.name"]) == AgentName
    | where isnotempty(tostring(customDimensions["gen_ai.conversation.id"]))
    | top 1 by timestamp desc
    | project tostring(customDimensions["gen_ai.conversation.id"])
);
dependencies
| where timestamp > ago(Window)
| where tostring(customDimensions["gen_ai.conversation.id"]) == LatestConvo
| order by operation_Id asc, iff(name == "InvokeAgent", 0, 1) asc, timestamp asc
| mv-apply Key = bag_keys(customDimensions) on (
    where Key startswith "gen_ai."
    | summarize OTelGenAI = make_bag(bag_pack(tostring(Key), customDimensions[tostring(Key)]))
  )
| project timestamp, name, id, operation_Id, operation_ParentId,
          duration, target, type, cloud_RoleName, resultCode,
          OTelGenAI, customDimensions
| evaluate bag_unpack(OTelGenAI, 'ga_')

Forespørsel 5: Returner den siste samtalen for en rotagent med alle dens barn, inkludert underagenter

Denne forespørselen returnerer den nyeste samtalen for en navngitt agent. Den returnerer hvert tidsrom for den samtalen og for alle første-nivå underagenter den påkalte. Når en agent kaller en annen agent som et verktøy, arver underagenten forelderens samtale-ID med et _<subConversationId> suffiks. Hele trestrukturen rekonstrueres ved å samsvare med ID på toppnivå. Bytt ut agentnavnets plassholder med agentens navn.

let Window = 7d;
let AgentName = "<Agent name>";
let LatestRoot =
    toscalar(
        dependencies
        | where timestamp > ago(Window)
        | extend
            AgentName_ = tostring(customDimensions["gen_ai.agent.name"]),
            ConversationId = tostring(customDimensions["gen_ai.conversation.id"])
        | where AgentName_ == AgentName
        | where isnotempty(ConversationId)
        | where ConversationId !has "_"
        | summarize arg_max(timestamp, ConversationId)
        | project ConversationId
    );
dependencies
| where timestamp > ago(Window)
| extend
    ConversationId = tostring(customDimensions["gen_ai.conversation.id"]),
    AgentName_ = tostring(customDimensions["gen_ai.agent.name"]),
    ToolName = tostring(customDimensions["gen_ai.tool.name"]),
    ToolResult = tostring(customDimensions["gen_ai.tool.callresult"])
| where isnotempty(ConversationId)
| where ConversationId == LatestRoot
    or ConversationId startswith strcat(LatestRoot, "_")
| extend
    Depth = countof(ConversationId, "_"),
    AgentRole = iff(ConversationId == LatestRoot, "root", "sub-agent")
| extend
    InputMessages = parse_json( tostring(customDimensions["gen_ai.input.messages"]) ),
    OutputMessages = parse_json( tostring(customDimensions["gen_ai.output.messages"]) )
| extend
    UserInput = tostring(InputMessages[0].parts[0].content),
    AgentOutput = tostring(OutputMessages[0].parts[0].content)
| order by timestamp asc
| project
    timestamp, name, AgentRole, Depth, AgentName, ToolName, ToolResult, UserInput,
    AgentOutput, id, operation_Id, operation_ParentId, ConversationId, duration,
    target, type, cloud_RoleName, resultCode, customDimensions

Kjente begrensninger og hensyn

  • Verdien duration er ikke tilgjengelig for spor av agenter som bruker standard harness.
  • Agent- og verktøyutførelsesfeil vises for øyeblikket ikke korrekt i trace-statusene.
  • Basert på kravene til dataopphold kan det være lurt å bruke dedikerte Application Insights-ressurser for hver miljøregion.
  • Sub-agent-span er for øyeblikket underordnet InvokeAgent-spanet som påkalte agenten, i stedet for InvokeAgent-spanet i sitt eget spor.
  • Trace- og span-IDer sendes for øyeblikket ut som GUID-er (med prefiks der det trengs) i stedet for fullt OpenTelemetry-standard 32-hex-char trace-ID og 16-hex-char span-ID justert.
  • Sørg for at lokal autentisering er aktivert på den målrettede Application Insights-ressursen.
  • Telemetrieksport er ikke transaksjonell. Under transiente tjenestehendelser kan små mengder datatap oppstå.
  • Datainkonsistenser kan oppstå når skjema-relaterte oppdateringer rulles ut.
  • Temarelaterte hendelser som TopicStart, TopicAction, og TopicEnd fanges ikke opp med miljønivå-telemetri.
  • For å forenkle rapportering og feilsøking, unngå å sende både agent- og miljøtelemetri til samme Application Insights-instans.
  • Telemetrien som sendes ut for agenter skrevet i agentene drevet av GitHub Copilot-harnessen, kan avvike fra agenter bygget i agentene drevet av standard harness-authoring-opplevelse.