Microsoft OpenTelemetry Distro

Microsoft OpenTelemetri-distributionen är en enhetlig överskådlighetsdistribution som erbjuder en enhetlig onboarding-upplevelse för att samla in spår, mätvärden och loggar från agentiska och icke-agentiska applikationer. Den stöder överskådlighet för Microsoft Agent 365, Microsoft Foundry, Azure Monitor samt alla OpenTelemetry Protocol (OTLP)-kompatibla backends. Distron stöder .NET, Node.js och Python, och ersätter fragmenterad setup över flera överskådlighetsstackar med ett importanrop och ett konfigurationsanrop.

Viktiga fördelar

Microsoft OpenTelemetry-distro erbjuder dessa fördelar:

  • Ett paket, ett API: Byt ut flera exportör- och instrumenteringspaket mot endast ett beroende.
  • Multi-backend-stöd: Skicka telemetri till Azure Monitor, till valfri OpenTelemetry Protocol (OTLP)-kompatibel endpoint, till exempel Datadog, Grafana eller New Relic, samt till Microsoft Agent 365 samtidigt.
  • Inbyggd instrumentering: Använd automatisk instrumentering för HTTP, databaser, Azure SDKs, Azure Functions och mer utan extra konfiguration.
  • Standardbaserat: Bygg på OpenTelemetry, branschens standardramverk för överskådlighet.
  • Minimal boilerplate: Lägg till en import och ett funktionsanrop i applikationens startpunkt.

Installation och konfiguration

Denna vägledning visar hur du lägger till överskådlighet i din applikation med Microsoft OpenTelemetry Distro. Distro samlar automatiskt in spår, mätvärden och loggar med inbyggda instrumenteringar, och exporterar telemetrin till Azure Monitor, valfri OpenTelemetry Protocol (OTLP)-endpoint eller Microsoft Agent 365.

Installera bibliotek

För att komma igång med Microsoft OpenTelemetry Distro, installera det lämpliga biblioteket för din utvecklingsplattform med hjälp av din språkspecifika pakethanterare.

Systemkrav: Python 3.10 eller senare.

pip install microsoft-opentelemetry

Konfiguration

Agent 365-exportören behöver ingen anslutningssträng. Endpointen upptäcks automatiskt baserat på tenant. För att möjliggöra export till Agent 365, ange exportmålet och tillhandahåll en tokenlösare som returnerar en åtkomsttoken för ett givet agent-ID och tenant-ID.

Anropa use_microsoft_opentelemetry() för att aktivera observerbarhet.

from microsoft.opentelemetry import use_microsoft_opentelemetry
from microsoft.opentelemetry.a365.hosting.token_cache_helpers import AgenticTokenCache

token_cache = AgenticTokenCache()

use_microsoft_opentelemetry(
    enable_a365=True,
    a365_token_resolver=lambda agent_id, tenant_id: (
        (t := asyncio.run(token_cache.get_observability_token(agent_id, tenant_id)))
        and t.token or None
    ),
)

För anpassad tokenupplösning (istället för standardtokenlösare), se Manual token resolver.

Du kan anpassa exporterbeteendet genom att skicka valfria a365_* kwargs till use_microsoft_opentelemetry().

Parameter beskrivning Standard
a365_use_s2s_endpoint När True använder sökvägen till tjänst-till-tjänst-ändpunkten. False
a365_max_queue_size Maximal köstorlek för batchprocessorn. 2048
a365_scheduled_delay_ms Fördröjning i millisekunder mellan exportbatcher. 5000
a365_exporter_timeout_ms Timeout i millisekunder för exportåtgärden. 30000
a365_max_export_batch_size Maximal batchstorlek för exportåtgärder. 512

Propagera kontext

För att bibehålla överskådlighet i distribuerade Agent 365-åtgärder, propagera kontext. När du propagerar kontext genom dina agenter och tjänster ser du till att spår, loggar och mätvärden är korrekt korrelerade under hela livscykeln för en begäran. Denna korrelation krävs för en komplett och effektiv övervakningsupplevelse med Microsoft Agent 365.

Bagageattribut

Använd BaggageBuilder för att ange kontextuell information som följer med genom alla spann i en begäran. SDK:n implementerar en SpanProcessormekanism som kopierar alla bagageposter som inte är tomma till nystartade spann utan att skriva över befintliga attribut.

from microsoft.opentelemetry.a365.core import BaggageBuilder

with (
    BaggageBuilder()
    .tenant_id("tenant-123")
    .agent_id("agent-456")
    .conversation_id("conv-789")
    .build()
):
    # Any spans started in this context will receive these as attributes
    pass

För att automatiskt fylla i BaggageBuilder från TurnContext, använd hjälpredan populate i paketet microsoft-opentelemetry. Hjälparen extraherar automatiskt detaljer om uppringare, agent, tenant, kanal och konversation från aktiviteten.

from microsoft.opentelemetry.a365.core import BaggageBuilder
from microsoft.opentelemetry.a365.hosting.scope_helpers.populate_baggage import populate

builder = BaggageBuilder()
populate(builder, turn_context)

with builder.build():
    # Baggage is auto-populated from the TurnContext activity
    pass

Baggage-mellanprogramvara

Om din agent använder hosting-integreringspaketet, registrera baggage middleware för att automatiskt populera bagage för varje inkommande begäran. Detta steg eliminerar behovet av att kalla på BaggageBuilder manuellt i varje aktivitetsbehandlare.

I Python registrerar du baggage-mellanprogrammet genom ObservabilityHostingManager.configure() istället för direkt på adaptern.

from microsoft.opentelemetry.a365.hosting import ObservabilityHostingManager, ObservabilityHostingOptions

options = ObservabilityHostingOptions(enable_baggage=True)
ObservabilityHostingManager.configure(adapter.middleware_set, options)

Mellanvaran hoppar över att sätta baggage för asynkrona svar (händelser av typ ContinueConversation) för att undvika att skriva över baggage som den ursprungliga förfrågan redan satt.

Validera att data flödar in produkten

För att se agenttelemetri i Microsoft Purview eller Microsoft Defender, se till att följande krav uppfylls:

Automatisk instrumentering

Microsoft OpenTelemetry Distro kombinerar standardpipelines för OpenTelemetry med Microsoft-kuraterad instrumentering. Distron kan samla in applikationstelemetri, infrastrukturtelemetri och agent- eller generativ AI-telemetri beroende på språk och konfiguration.

Kategori Vad det täcker
Signalledningar Spår, mått och loggar.
Resursdetektion Service-, host-, moln- och Azure-körtidskontext där det stöds.
Infrastrukturinstrumentering HTTP, ASP.NET Core, Azure SDKs, databasklienter och loggningsramverk där det stöds.
Generativ AI-instrumentering OpenAI, Azure OpenAI, Semantic Kernel, LangChain, OpenAI Agents SDK och Agent Framework där det stöds.
Manuella agentteleskop Agentanrop, verktygsexekvering, inferens och utdatatelemetri där det stöds.
Exportörer och processorer Azure Monitor, Microsoft Agent 365, OTLP, konsolutmatning, spanprocessorer, loggprocessorer och metrikläsare.

Instrumenteringstäckning

Language Allmän applikationsinstrumentering Allmän agent- och generativ AI-instrumentering
Python OpenTelemetrys resurser, processorer, läsare, loggning, mätvärden och spårning. Semantic Kernel, OpenAI Agents SDK, Agent Framework, LangChain, Microsoft Agent 365 bagage, och Microsoft Agent 365 omfattningar.
Node.js HTTP, Azure SDKs, Azure Functions, MongoDB, MySQL, PostgreSQL, Redis, Bunyan och Winston. OpenAI Agents SDK, LangChain, Microsoft Agent 365 bagage, och Microsoft Agent 365 omfattningar.
.NET ASP.NET Core, HttpClient, SQL Client, Azure SDKs, resursdetektering, mätvärden och loggar. Semantic Kernel, OpenAI och Azure OpenAi, Agent Framework, Microsoft Agent 365 bagage, och Microsoft Agent 365 omfattningar.

Automatisk instrumentering lyssnar på telemetrisignaler som sänds ut av stödda bibliotek och ramverk. Manuell instrumentering används när en applikation behöver beskriva agentspecifika åtgärder, såsom anrop, verktygskörning, inferens eller asynkron utdata.

Lägg till egna OpenTelemetry-källor, mätare, processorer eller läsare när din applikation sänder telemetri som inte täcks av de inbyggda instrumenteringarna.

Viktigt

Automatisk instrumentering fyller endast i standard OpenTelemetrie-attribut. Den inkluderar inte alla attribut som Agent 365 kräver. Du måste lägga till Microsoft-specifika attribut genom BaggageBuilder. För att se vilka attribut som krävs, se Store validation attributes.

Inbyggda instrumenteringsbibliotek

Autoinstrumentering lyssnar på telemetri från stödda ramverk och vidarebefordrar den genom Distrots OpenTelemetry-pipeline. För agentscenarier, sätt baggage såsom klientorganisations-ID och agent-ID innan det instrumenterade ramverket skapar spans.

Ramverk Python Node.js .NET
Semantic Kernel Stöds Stöds inte Stöds
OpenAI och OpenAI Agents SDK Stöds Stöds Stöds
Agent Framework Stöds Stöds inte Stöds
LangChain Stöds Stöds Finns inte med i listan

Semantic Kernel

from microsoft.opentelemetry import use_microsoft_opentelemetry

def token_resolver(agent_id, tenant_id):
    return "your-token"

use_microsoft_opentelemetry(
    enable_a365=True,
    a365_token_resolver=token_resolver,
    instrumentation_options={
        "semantic_kernel": {"enabled": True},
    },
)

OpenAI

from microsoft.opentelemetry import use_microsoft_opentelemetry

def token_resolver(agent_id, tenant_id):
    return "your-token"

use_microsoft_opentelemetry(
    enable_a365=True,
    a365_token_resolver=token_resolver,
    instrumentation_options={
        "openai_agents": {"enabled": True},
    },
)

Agent Framework

from microsoft.opentelemetry import use_microsoft_opentelemetry

def token_resolver(agent_id, tenant_id):
    return "your-token"

use_microsoft_opentelemetry(
    enable_a365=True,
    a365_token_resolver=token_resolver,
    instrumentation_options={
        "agent_framework": {"enabled": True},
    },
)

LangChain

from microsoft.opentelemetry import use_microsoft_opentelemetry

def token_resolver(agent_id, tenant_id):
    return "your-token"

use_microsoft_opentelemetry(
    enable_a365=True,
    a365_token_resolver=token_resolver,
    instrumentation_options={
        "langchain": {"enabled": True},
    },
)

Manuell instrumentering

Använd manuell instrumentering när automatisk instrumentering inte beskriver agentens aktivitet tillräckligt detaljerat. Manuella omfång låter en applikation beskriva gemensamma agentaktiviteter på ett konsekvent sätt över språk.

Definitionsområde Använd för
InvokeAgentScope Början och avslutandet av ett agentanrop.
ExecuteToolScope Ett verktygsanrop gjort av en agent.
InferenceScope En AI-modellinferensåtgärd.
OutputScope Utdata som måste registreras efter att det ursprungliga omfattning:t redan har slutförts.

Återanvänd samma begäran- och agentidentitetsvärden över omfattningar i en förfrågan så att relaterad telemetri kan korreleras.

Agentanrop

from microsoft.opentelemetry.a365.core import (
    AgentDetails,
    Channel,
    InvokeAgentScope,
    InvokeAgentScopeDetails,
    Request,
    ServiceEndpoint,
)

agent_details = AgentDetails(
    agent_id="agent-456",
    agent_name="Email Assistant",
    agent_description="An AI agent powered by Azure OpenAI",
    agentic_user_id="auid-123",
    agentic_user_email="agent@contoso.com",
    agent_blueprint_id="blueprint-789",
    tenant_id="tenant-123",
)

request = Request(
    content="Please help me organize my emails",
    session_id="session-42",
    conversation_id="conv-xyz",
    channel=Channel(name="msteams"),
)

scope_details = InvokeAgentScopeDetails(
    endpoint=ServiceEndpoint(hostname="myagent.contoso.com", port=443),
)

with InvokeAgentScope.start(
    request=request,
    scope_details=scope_details,
    agent_details=agent_details,
) as scope:
    scope.record_input_messages(["Please help me organize my emails"])

    # Run the agent invocation.

    invoke_scope.record_output_messages(["I found 15 urgent emails."])

Verktygskörning

from microsoft.opentelemetry.a365.core import (
    ExecuteToolScope,
    ServiceEndpoint,
    ToolCallDetails,
    ToolType,
)

tool_details = ToolCallDetails(
    tool_name="email-search",
    arguments={"query": "from:manager@contoso.com"},
    tool_call_id="tool-call-456",
    description="Search emails by criteria",
    tool_type=ToolType.FUNCTION.value,
    endpoint=ServiceEndpoint(
        hostname="tools.contoso.com",
        port=8080,
        protocol="https",
    ),
)

with ExecuteToolScope.start(
    request=request,
    details=tool_details,
    agent_details=agent_details,
) as scope:
    result = search_emails(tool_details.arguments)
    scope.record_response(result)

Slutsatsdragning

from microsoft.opentelemetry.a365.core import (
    InferenceCallDetails,
    InferenceOperationType,
    InferenceScope,
)

inference_details = InferenceCallDetails(
    operationName=InferenceOperationType.CHAT,
    model="gpt-4o-mini",
    providerName="azure-openai",
)

with InferenceScope.start(
    request=request,
    details=inference_details,
    agent_details=agent_details,
) as scope:
    scope.record_input_messages(["Summarize the following emails for me."])
    response = call_llm()
    scope.record_output_messages([response.text])
    scope.record_input_tokens(response.usage.input_tokens)
    scope.record_output_tokens(response.usage.output_tokens)
    scope.record_finish_reasons(["stop"])

Utmatning

from microsoft.opentelemetry.a365.core import OutputScope, Response, SpanDetails

# Capture this before exiting the originating InvokeAgentScope context.
parent_context = invoke_scope.get_span_context()
response = Response(
    messages=["Here is your organized inbox."],
)

with OutputScope.start(
    request=request,
    response=response,
    agent_details=agent_details,
    user_details=None,
    span_details=SpanDetails(parent_context=parent_context),
) as scope:
    pass

Produktdokumentationen bör definiera produktspecifika valideringskrav för dessa omfång.

Lokal validering

Lokal validering bekräftar att applikationen genererar telemetri innan en produktspecifik destination valideras. Använd konsolutdata eller en lokal OTLP-endpoint för att verifiera att spår, mätvärden och loggar genereras.

Validera med en lokal OTLP-endpoint

Konfigurera Distro för att skicka telemetri till en lokal samlare eller en annan OTLP-kompatibel endpoint.

export OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317
from microsoft.opentelemetry import use_microsoft_opentelemetry

use_microsoft_opentelemetry()

Validera med lokal utdata

Använd lokal utdata när du vill bekräfta instrumenteringen innan du skickar telemetri till en fjärrdestination.

export ENABLE_A365_OBSERVABILITY_EXPORTER=false
from microsoft.opentelemetry import use_microsoft_opentelemetry

def token_resolver(agent_id, tenant_id):
    return "local-validation-token"

use_microsoft_opentelemetry(
    enable_a365=True,
    a365_token_resolver=token_resolver,
)

# Run instrumented application code.

Granska den lokala utdata för spann från förväntade källor, såsom HTTP-anrop, OpenAI- eller Azure OpenAI-anrop, omfattningar för agentanrop, omfattningar för verktygsexekvering eller omfattningar för inferens. Destinationsspecifik validering ska finnas i produktdokumentationen för respektive destination.

Konfigurera Microsoft-autentisering manuellt

När du använder Agent 365-exportören måste du tillhandahålla en mekanism för att tillhandahålla en autentiseringstoken. Tokenresolvern arbetar per exportbatch genom att använda agent-ID och tenant-ID från den aktiva bagagekontexten. Distron stöder två tillvägagångssätt.

Dricks

Om du skapar agenter med SDK för Microsoft 365-agenter, se Observability Authentication Setup för Agent SDK för steg-för-steg-instruktioner om hur du konfigurerar OBO- och S2S-tokenhämtning för både agentbaserade och icke-agentbaserade agenter.

Manuell tokenlösare

Använd en manuell tokenlösare när du hämtar tokens utanför Agent Framework-pipelinen, när du bygger applikationer som inte använder Agent Framework, eller vid service-till-service (S2S) autentisering (client credentials flow). Agenter kan generera en token själva, till exempel genom att använda Microsofts autentiseringsbibliotek (MSAL) eller någon annan metod för tokenhämtning, men de måste säkerställa att tokenen har rätt överskådlighetsomfång (api://9b975845-388f-4429-889e-eab1ef63949c/Agent365.Observability.OtelWrite).

Kommentar

För autentisering mellan tjänster (S2S) måste du använda denna manuella metod för tokenhämtning. agentbaserade token-cachen stöder endast OBO (on-behalf-of) autentiseringsflöden.

Följande exempel illustrerar OBO (on-behalf-of) tokenlösarmönstret — agenten hämtar en användartoken via den agentbaserade autentiseringshanteraren och byter ut den mot en token med observerbarhetsomfattning. För exempel på S2S (service-to-service) och en jämförelse av OBO- och S2S-autentisering, se Observability Authentication Setup för Agent SDK.

Resolvern måste vara synkron. Hämta token i din asynkrona aktivitetshanterare (eller via MSAL) och lagra den i cache för resolvern.

from microsoft.opentelemetry import use_microsoft_opentelemetry
from microsoft.opentelemetry.a365.runtime import get_observability_authentication_scope

_cached_token: str | None = None

def my_token_resolver(agent_id: str, tenant_id: str) -> str | None:
    return _cached_token

use_microsoft_opentelemetry(enable_a365=True, a365_token_resolver=my_token_resolver)

@AGENT_APP.activity("message", auth_handlers=["AGENTIC"])
async def on_message(context: TurnContext, _state: TurnState):
    global _cached_token
    _cached_token = await AGENT_APP.auth.exchange_token(
        context,
        scopes=get_observability_authentication_scope(),
        auth_handler_id="AGENTIC",
    )

Agentic token cache med Agent Framework-appar

För Agent Framework-appar som använder on-behalf-of (OBO)-autentisering registrerar distributionen automatiskt IExporterTokenCache<AgenticTokenStruct> via DI när du inte ställer in en anpassad TokenResolver. Din agent anropar RegisterObservability() under körning för att tillhandahålla autentiseringsuppgifter, och cachen hanterar tokenhämtning och uppdatering.

Kommentar

Denna metod stöder endast on-behalf-of (OBO) autentiseringsflöden. För autentisering mellan tjänster (S2S), använd den manuella tokenresolvern istället.

from microsoft.opentelemetry import use_microsoft_opentelemetry
from microsoft.opentelemetry.a365.hosting.token_cache_helpers import AgenticTokenCache, AgenticTokenStruct
from microsoft.opentelemetry.a365.runtime import get_observability_authentication_scope

token_cache = AgenticTokenCache()

_cached_tokens: dict[tuple[str, str], str | None] = {}

# Keep the sync resolver side-effect free; refresh the cache in the async request handler.
def sync_token_resolver(agent_id: str, tenant_id: str) -> str | None:
    return _cached_tokens.get((agent_id, tenant_id))

use_microsoft_opentelemetry(enable_a365=True, a365_token_resolver=sync_token_resolver)

@AGENT_APP.activity("message", auth_handlers=["AGENTIC"])
async def on_message(context: TurnContext, _state: TurnState):
    agent_id = context.activity.recipient.id
    tenant_id = context.activity.recipient.tenant_id
    token_cache.register_observability(
        agent_id=agent_id,
        tenant_id=tenant_id,
        token_generator=AgenticTokenStruct(
            authorization=AGENT_APP.auth,
            turn_context=context,
        ),
        observability_scopes=get_observability_authentication_scope(),
    )
    _cached_tokens[(agent_id, tenant_id)] = await token_cache.get_observability_token(
        agent_id, tenant_id,
    )

Lagra valideringsattribut

För att validering av lagring ska lyckas måste din agent implementera InvokeAgentScope, InferenceScope och ExecuteToolScope. Varje omfång motsvarar en span-åtgärd i det kanoniska schemat:

Omfattning för SDK Spanåtgärd Universell referenskod
InvokeAgentScope invoke_agent IA
ExecuteToolScope execute_tool ET
InferenceScope chat CH
OutputScope output_messages OM

För fullständiga listor över obligatoriska och valfria attribut per omfång – inklusive attributsemantik, vägledning om värdeval och vilka attribut som kan sökas via Microsoft Defender advanced hunting – se Agent 365-överskådlighetsattributreferens. Kolumnen Gäller för identifierar vilket område varje attribut tillhör, och kolumnen Required skiljer obligatoriska (M) från valfria (O) attribut.

Testa din agent med överskådlighet

När du har implementerat överskådlighet, kontrollera att telemetri samlas in:

  1. Gå till https://admin.cloud.microsoft/#/agents/all.
  2. Välj din agent och välj sedan Aktivitet.
  3. Kontrollera att sessioner och verktygsanrop visas.

Exempelprogram och avancerad konfiguration

För kodexempel och avancerade konfigurationsalternativ, se GitHub-repositorierna för respektive språk:

Felsökning

Detta avsnitt beskriver vanliga problem vid implementering och användning av Microsoft OpenTelemetry-distro med Agent 365.

Problem beskrivning
Observerbarhetsdata visas inte Ingen telemetri syns eftersom Agent 365-exporten inte är aktiverad, installationen är ofullständig eller token-upplösningen misslyckas.
Saknad tenant-ID eller agent-ID - spans filtreras bort Spann filtreras bort innan export när nödvändiga tenant- eller agentidentitetsattribut saknas.
Tokenupplösningsfel – export hoppades över eller nekades behörighet Export hoppas över eller avvisas om tokenresolvern inte returnerar någon token eller om det uppstår fel vid tokeninhämtning.
HTTP 401 icke auktoriserad Förfrågningar når tjänsten men autentiseringen misslyckas eftersom token är ogiltig, har gått ut eller är avsedd för fel mottagare.
HTTP 403 förbjuden Auktorisering misslyckas på grund av att tenant-licensiering eller skrivbehörighet för observability saknas.
HTTP 403 Förbjudet – Agent-ID-missmatch Tjänsten avvisar export när agent-ID:t i förfrågan inte matchar den agentidentitet som auktoriserats av token.
HTTP 429 eller 5xx-fel – tillfälliga fel Tillfällig begränsning eller instabilitet i backend avbryter exporten och kan kräva omförsök eller batchjustering.
Exporttidsgräns Exportåtgärder överskrider timeoutgränser på grund av nätverksfördröjningar eller slutpunktens svarstid.
Export lyckas men telemetrin visas inte i Defender eller Purview Datainläsning lyckas, men synligheten fördröjs eller blockeras av nedströmskrav och schemakrav.

Dricks

Agent 365-felsökningsguide innehåller övergripande felsökningsrekommendationer, bästa praxis och länkar till felsökningsinnehåll för varje enskild del av Agent 365:s utvecklingslivscykel.

Observerbarhetsdata visas inte

Symtom:

  • Agenten körs
  • Ingen telemetri i administrationscentret
  • Kan inte se agentaktivitet

Grundorsak:

  • Agent 365-exporten är inte aktiverad
  • Konfigurationsfel
  • Tokenresolver-problem

Lösningar: Följ dessa steg för att lösa problemet:

  • Kontrollera att Agent 365-exportören är aktiverad

    Du måste uttryckligen aktivera Agent 365-exportören. Om du inte ställer in det kan distro falla tillbaka på en konsolexportör eller exportera ingenting. Aktivera det i koden:

    from microsoft.opentelemetry import use_microsoft_opentelemetry
    
    use_microsoft_opentelemetry(
        enable_a365=True,
        a365_enable_observability_exporter=True,
        a365_token_resolver=my_token_resolver,
    )
    

    Eller ange miljövariabeln:

    export ENABLE_A365_OBSERVABILITY_EXPORTER=true
    

    Kommentar

    ENABLE_A365_OBSERVABILITY_EXPORTER är en sekundär inställning som bara träder i kraft när enable_a365=True är inställd i koden. Du kan också styra den via a365_enable_observability_exporter kwarg.


  • Kontrollera tokenresolverns konfiguration

    Exportören kräver en giltig tokenlösare som returnerar en Bearer-token för varje exportförfrågan. Om token resolver saknas eller returnerar null, utförs ingen export och det sker utan att något meddelas.

  • Aktivera konsolexport och kontrollera telemetri lokalt

    Lägg till en konsolexportör för att verifiera att telemetri genereras innan den når Agent 365-endpointen:

    use_microsoft_opentelemetry(enable_a365=True, enable_console=True)
    

  • Aktivera utförlig loggning

    import logging
    
    logging.basicConfig(level=logging.DEBUG)
    

  • Kontrollera loggar för exportfel

    Använd az webapp log tail-kommandot för att söka i loggar efter överskådlighetsrelaterade fel:

    az webapp log tail --name <your-app-name> --resource-group <your-resource-group> | Select-String "observability"
    

Saknat tenant-ID eller agent-ID — spans utelämnats

Symptom: Systemet släpper tyst spans och exporterar dem aldrig. Vissa plattformar loggar ett antal utlämnade spans eller ett meddelande som No spans with tenant/agent identity found. Andra släpper dem utan att logga det.

Lösning:

  • Innan export partitionerar distro spans efter tenant- och agentidentitet. Spann som saknar antingen klientorganisations-ID eller agent-ID tas bort och skickas aldrig till tjänsten.
  • Säkerställ att BaggageBuilder är konfigurerad med tenant-ID och agent-ID innan du skapar span. Dessa värden propagerar genom OpenTelemetry-kontexten och kopplas till alla span som skapas inom bagage-omfattning. För det plattformsspecifika API:et, se Bagageattribut.
  • Om du använder bagage-middleware eller turn context helper från hosting-integreringspaketet, bekräfta att TurnContextaktiviteten har en giltig mottagare med agentidentitet.

Fel vid tokenlösning – exporten uteblir eller är obehörig

Symtom: Tokenresolvern returnerar null eller kastar ett fel. Beroende på plattform uteblir exporten helt eller misslyckas med HTTP 401.

Lösning:

  • Tokenresolvern krävs. Om den saknas kastar exportören ett fel vid uppstart. Verifiera att en token-resolver tillhandahålls och returnerar en giltig Bearer-token.
  • Se till att rätt tenant-ID och agent-ID skickas till BaggageBuilder, eftersom dessa värden vidarebefordras till tokenlösaren.
  • För Azure-hostade agenter, se till att Managed Identity har den nödvändiga API-behörigheten för överskådlighetsområdet.
  • För .NET-appar som använder Agent Framework-värdpaketet hanteras tokenutbyte automatiskt via DI. Om tokens saknas, bekräfta Microsoft.Agents.A365.Observability.Hosting att den är installerad och registrerad.

HTTP 401 icke auktoriserad

Symtom: Exporten misslyckas med HTTP 401. Exportören försöker inte igen vid detta fel.

Lösning:

  • Verifiera att tokenaudience matchar observability-endpointens omfattning.
  • Kontrollera att token resolver inte returnerar en delegerad användartoken, en token med felaktig audience eller en utgången token.

HTTP 403 Förbjuden

Symtom: Exporten misslyckas med HTTP 403. Exportören försöker inte igen vid detta fel.

Grundorsak: Ett HTTP 403-fel kan ha olika orsaker. Kontrollera följande lösningar i ordning.

Lösning:

  • Saknad licens — Kontrollera att din Microsoft 365-miljö har tilldelats någon av följande licenser i Administrationscenter för Microsoft 365:

    • Test - Microsoft 365 E7
    • Microsoft 365 E7
    • Microsoft Agent 365 Frontier
  • Saknad Agent365.Observability.OtelWritebehörighetGe behörigheten till din identitet (Managed Identity eller app-registrering) Utan behörigheten returnerar telemetriexporten HTTP 403.

Bevilja behörigheten

Använd något av dessa alternativ:

  • Agent 365 CLI

    Kräver ett Global Administrator-konto; kör från agentprojektkatalogen som innehåller a365.config.json, eller använd --agent-name.

    a365 setup permissions bot
    

    Eller utan konfigurationsfil:

    a365 setup permissions bot --agent-name "<agent-name>"
    
  • Entra Portal

    Inga konfigurationsfiler krävs; kräver global administratörsbehörighet till Blueprint-appregistreringen.

    1. Gå till Entra portal>Appregistreringar> och välj din Blueprint-app.
    2. Gå till API-behörigheter>Lägg till en behörighets-API> som min organisation använder> sök efter 9b975845-388f-4429-889e-eab1ef63949c.
    3. Välj Delegarede behörigheter> markera Agent365.Observability.OtelWrite>Lägg till behörigheter.
    4. Upprepa steg 2–3, men välj denna gång Applikationsbehörigheter>, markera Agent365.Observability.OtelWrite>Lägg till behörigheter.
    5. Klicka på Bevilja administratörssamtycke och bekräfta.

    Både Agent365.Observability.OtelWrite (Delegerad) och Agent365.Observability.OtelWrite (Applikation) visar Granted status.

HTTP 403 Forbidden — Agent-ID-matchning saknas

Symtom: Exporten misslyckas med HTTP 403 och ett servermeddelande liknande 403 Forbidden med agent-ID-mismatch fel vid anrop till Agent 365 traces endpoints.

Rotorsak: Det här felet uppstår när du använder blueprint-klient-ID istället för agentinstansens klient-ID när du konfigurerar agentens uppgifter. Agent-ID:t i export-URL:en motsvarar inte identiteten som tokenen auktoriserar, så spårnings-ändpunkten avvisar begäran.

Lösning:

  • Verifiera om klientorganisations-ID har lagts till i listan över godkända klientorganisationer för Agent 365.
  • Konfigurera agentens uppgifter med agentinstansens klient-ID (inte Blueprint-klient-ID:t).
  • Verifiera den genererade export-URL:en – den loggas om du aktiverar loggaren. Bekräfta att agent-ID:t i URL:en matchar agentinstansens klient-ID.
  • För att aktivera diagnostisk loggning per SDK, se Lokal validering.

HTTP 429 eller 5xx-fel – tillfälliga fel

Symtom: Exporten misslyckas på grund av en övergående HTTP-statuskod, såsom 429 eller 5xx.

Lösning:

  • Dessa fel är vanligtvis övergående och löses av sig själva. Python- och JavaScript-distributionerna försöker automatiskt igen vid HTTP-statuskoderna 408, 429 och 5xx. .NET-distron återförsöker inte automatiskt.
  • Om felen kvarstår, kontrollera tjänstens hälsostatuspanel.
  • Överväg att minska exportfrekvensen genom att öka den schemalagda fördröjningen mellan batcher eller den maximala exportbatchstorleken. För Python och JavaScript, använd de relevanta exporterOptions eller a365_*-parametrarna som dokumenteras i GitHub-repositorierna. För .NET ska du använda o.Agent365.Exporter.ScheduledDelayMilliseconds och o.Agent365.Exporter.MaxExportBatchSize.

Exporttidsgräns

Symtom: Exportförsök avbryts på grund av timeout.

Lösning:

  • Kontrollera nätverksanslutningen till överskådlighetsändpunkten.

  • Standard timeout för HTTP-förfrågningar är 30 sekunder på alla plattformar. Om timeoutar inträffar ofta, öka timeout-värdet i dina exportörinställningar:

    use_microsoft_opentelemetry(
        enable_a365=True,
        a365_token_resolver=my_token_resolver,
        # No direct timeout kwarg — set via environment variable or exporterOptions if supported
    )
    

    Se Python-arkivet för hela listan med a365_* alternativ.


Export lyckas men telemetrin visas inte i Defender eller Purview

Symtom: Loggar visar en lyckad export (HTTP 200) men telemetri syns inte i Microsoft Defender eller Microsoft Purview.

Lösning:

  • Kontrollera att du uppfyller förutsättningarna för att kunna läsa exporterade loggar:
  • Telemetri kan ta flera minuter att bli tillgänglig efter en lyckad export. Vänta innan du undersöker vidare.
  • Verifiera att spann innehåller giltiga microsoft.tenant.id och gen_ai.agent.id attribut. Saknade identitetsattribut gör att spans tas bort på serversidan även om HTTP-exporten returnerar 200.