Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Microsoft OpenTelemetry Distro ist eine einheitliche Observability-Distribution, die einen einzigen Onboarding-Prozess für das Sammeln von Ablaufverfolgungen, Metriken und Protokollen aus Agent-gestützten und nicht-Agent-gestützten Anwendungen bietet. Es unterstützt die Observability für Microsoft Agent 365, Microsoft Foundry, Azure Monitor und jedes openTelemetry Protocol (OTLP)-kompatible Back-End. Die Distro unterstützt .NET, Node.jsund Python und ersetzt das fragmentierte Setup über mehrere Observability-Stapel durch einen Import- und einen Konfigurationsaufruf.
Hauptvorteile
Die Microsoft OpenTelemetry Distro bietet folgende Vorteile:
- Ein Paket, eine API: Ersetzen Sie mehrere Exporter- und Instrumentierungspakete durch eine einzelne Abhängigkeit.
- Multi-Back-End-Unterstützung: Senden von Telemetrie an Azure Monitor, alle openTelemetry Protocol (OTLP)-kompatiblen Endpunkte wie Datadog, Grafana oder New Relic und Microsoft Agent 365 gleichzeitig.
- Built-In-Instrumentierungen: Verwenden Sie die automatische Instrumentierung für HTTP, Datenbanken, Azure SDK, Azure Functions und mehr ohne zusätzliche Konfiguration.
- Standardsbasiert: Bauen Sie auf OpenTelemetry, dem Branchenstandard-Observability-Framework, auf.
- Minimaler Textbaustein: Fügen Sie einen Import- und einen Funktionsaufruf zu Ihrem Einstiegspunkt der Anwendung hinzu.
Installation und Konfiguration
In diesem Leitfaden wird gezeigt, wie Sie Ihrer Anwendung mit Microsoft OpenTelemetry Distro die Observierbarkeit hinzufügen. Die Distro sammelt automatisch Traces, Metriken und Logs mit integrierten Instrumentierungen und exportiert die Telemetrie in Azure Monitor, jeden OTLP-Endpunkt (OpenTelemetry Protocol) oder Microsoft Agent 365.
Installieren der Bibliothek
Um mit der Microsoft OpenTelemetry Distro zu beginnen, installieren Sie die entsprechende Bibliothek für Ihre Entwicklungsplattform mithilfe des Paket-Managers Ihrer Sprache.
Konfiguration
Der Agent 365-Exporter verwendet keine Verbindungszeichenfolge. Er ermittelt seinen Endpunkt automatisch basierend auf dem Mandanten. Um den Export nach Agent 365 zu aktivieren, legen Sie das Exporterziel fest und stellen einen Tokenlöser bereit, der ein Zugriffstoken für eine bestimmte Agent-ID und Mandanten-ID zurückgibt.
Rufen Sie use_microsoft_opentelemetry() an, um die Beobachtbarkeit zu aktivieren.
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
),
)
Informationen zur benutzerdefinierten Tokenauflösung (anstelle des Standardtokenlösers) finden Sie unter Manual token resolver.
Sie können das Verhalten des Exporters anpassen, indem Sie optionale a365_* kwargs (Schlüsselwortargumente) an use_microsoft_opentelemetry() übergeben.
| Parameter | Description | Vorgabe |
|---|---|---|
a365_use_s2s_endpoint |
Wenn True, verwendet den Dienst-zu-Dienst-Endpunktpfad. |
False |
a365_max_queue_size |
Maximale Warteschlangengröße für den Batchprozessor. | 2048 |
a365_scheduled_delay_ms |
Verzögerung in Millisekunden zwischen Exportbatches. | 5000 |
a365_exporter_timeout_ms |
Timeout in Millisekunden für den Exportvorgang. | 30000 |
a365_max_export_batch_size |
Maximale Batchgröße für Exportvorgänge. | 512 |
Verteilungskontext
Um die Observability über verteilte Agent 365-Vorgänge hinweg aufrechtzuerhalten, müssen Sie den Kontext weitergeben. Wenn Sie den Kontext über Ihre Agents und Dienste weitergeben, stellen Sie sicher, dass Ablaufverfolgungen, Protokolle und Metriken über den gesamten Anforderungslebenszyklus ordnungsgemäß korreliert werden. Diese Korrelation ist für eine vollständige und effektive Microsoft Agent 365-Überwachungserfahrung erforderlich.
Gepäckattribute
Verwenden Sie BaggageBuilder, um Kontextinformationen festzulegen, die über alle Spannen in einer Anforderung fließen.
Das SDK implementiert eine SpanProcessor , die alle nichtleeren Baggage-Einträge in neu gestartete Spans kopiert, ohne dass bestehende Attribute überschrieben werden.
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
Verwenden Sie das BaggageBuilder-Hilfsprogramm im TurnContext-Paket, um das populate aus dem microsoft-opentelemetry automatisch auszufüllen. Dieses Tool extrahiert automatisch Anrufer-, Agenten-, Mandanten-, Kommunikationskanal- und Unterhaltungsdetails aus der Aktivität.
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
Gepäck-Middleware
Wenn Ihr Agent das Hosting-Integrationspaket verwendet, registrieren Sie Gepäck-Middleware, um Gepäck für jede eingehende Anfrage automatisch aufzufüllen. Dieser Schritt entfernt die Notwendigkeit, manuell in jedem Aktivitätshandler aufzurufen BaggageBuilder .
Registrieren Sie in Python Gepäck-Middleware über ObservabilityHostingManager.configure() statt direkt auf dem Adapter.
from microsoft.opentelemetry.a365.hosting import ObservabilityHostingManager, ObservabilityHostingOptions
options = ObservabilityHostingOptions(enable_baggage=True)
ObservabilityHostingManager.configure(adapter.middleware_set, options)
Die Middleware überspringt die Konfiguration für asynchrone Antworten (ContinueConversation Async-Ereignisse), um das Überschreiben von Baggage zu vermeiden, das bereits durch die ursprüngliche Anforderung festgelegt wurde.
Überprüfen, ob Daten im Produkt korrekt fließen
Um die Agent-Telemetrie in Microsoft Purview oder Microsoft Defender anzuzeigen, stellen Sie sicher, dass die folgenden Anforderungen erfüllt sind:
- Microsoft Purview: Die Überwachung muss für Ihre Organisation aktiviert sein. Anweisungen finden Sie unter Aktivieren oder Deaktivieren der Überwachung.
-
Microsoft Defender: Die erweiterte Suche muss für den Zugriff auf die Tabelle
CloudAppEventskonfiguriert werden. Ausführliche Informationen finden Sie in der Tabelle "CloudAppEvents" im Schema für die erweiterte Suche.
Automatische Instrumentierung
Die Microsoft OpenTelemetry Distro kombiniert Standard-OpenTelemetry-Pipelines mit Microsoft-kuratierter Instrumentierung. Die Distro kann je nach Sprache und Konfiguration Anwendungstelemetrie, Infrastrukturtelemetrie und Agent oder generative KI-Telemetrie sammeln.
| Kategorie | Was es abdeckt |
|---|---|
| Signalleitungen | Ablaufverfolgungen, Metriken und Protokolle. |
| Ressourcenerkennung | Dienst-, Host-, Cloud- und Azure Laufzeitkontext, sofern unterstützt. |
| Infrastrukturinstrumentation | HTTP-, ASP.NET Core-, Azure SDK-, Datenbankclients und Protokollierungsframeworks, sofern unterstützt. |
| Generative KI-Instrumentierung | OpenAI, Azure OpenAI, Semantischer Kernel, LangChain, OpenAI Agents SDK und Agent Framework, wo unterstützt. |
| Manuelle Agentbereiche | Agentaufruf, Toolausführung, Rückschluss und Ausgabetelemetrie, wo unterstützt. |
| Exporteure und Verarbeiter | Azure Monitor, Microsoft Agent 365, OTLP, Konsolenausgabe, Spanprozessoren, Protokollprozessoren und Metrikleser. |
Instrumentationsabdeckung
| Sprache | Allgemeine Anwendungsinstrumentation | Gängige Agent- und generative KI-Instrumentierung |
|---|---|---|
| Python | OpenTelemetry-Ressourcen, Prozessoren, Leser, Protokollierung, Metriken und Ablaufverfolgungen. | Semantischer Kernel, OpenAI Agents SDK, Agent Framework, LangChain, Microsoft Agent 365 Bag und Microsoft Agent 365-Bereiche. |
| Node.js | HTTP, Azure SDK, Azure Functions, MongoDB, MySQL, PostgreSQL, Redis, Bunyan und Winston. | OpenAI Agents SDK, LangChain, Microsoft Agent 365 Zusatzdaten und Microsoft Agent 365-Bereiche. |
| .NET | ASP.NET Core, HttpClient, SQL Client, Azure SDK, Ressourcenerkennung, Metriken und Protokolle. | Semantischer Kernel, OpenAI und Azure OpenAI, Agent Framework, Microsoft Agent 365-Kontexte und Microsoft Agent 365-Bereiche. |
Die automatische Instrumentierung überwacht die Telemetriesignale, die von unterstützten Bibliotheken und Frameworks ausgegeben werden. Manuelle Instrumentierung wird verwendet, wenn eine Anwendung agentspezifische Vorgänge beschreiben muss, z. B. Aufrufe, Toolausführung, Rückschluss oder asynchrone Ausgabe.
Fügen Sie benutzerdefinierte OpenTelemetry-Quellen, -Meter, -Prozessoren oder -Leser hinzu, wenn Ihre Anwendung Telemetrie ausgibt, die nicht von den integrierten Instrumentierungen abgedeckt wird.
Integrierte Instrumentationsbibliotheken
Die automatische Instrumentierung lauscht auf Telemetrie, die von unterstützten Frameworks ausgegeben wird, und leitet sie über die OpenTelemetry-Pipeline von Distro weiter. Legen Sie für Agentszenarien Gepäck fest, z. B. Mandanten-ID und Agent-ID, bevor das instrumentierte Framework Spannweiten erstellt.
| Rahmenwerk | Python | Node.js | .NET |
|---|---|---|---|
| Semantischer Kern | Unterstützt | Nicht unterstützt | Unterstützt |
| OpenAI und OpenAI-Agents SDK | Unterstützt | Unterstützt | Unterstützt |
| Agenten-Framework | Unterstützt | Nicht unterstützt | Unterstützt |
| LangChain | Unterstützt | Unterstützt | Nicht aufgelistet |
Semantischer Kern
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},
},
)
Agenten-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},
},
)
Manuelle Instrumentierung
Verwenden Sie manuelle Instrumentierung, wenn die automatische Instrumentierung den Agentenvorgang nicht mit ausreichend Details beschreibt. Manuelle Bereiche ermöglichen es einer Anwendung, allgemeine Agent-Aktivitäten in einer konsistenten Weise in allen Sprachen zu beschreiben.
| Geltungsbereich | Verwendung für |
|---|---|
InvokeAgentScope |
Der Anfang und abschluss eines Agent-Aufrufs. |
ExecuteToolScope |
Ein Toolaufruf, der von einem Agenten ausgeführt wird. |
InferenceScope |
Eine KI-Modell-Ableitungsoperation. |
OutputScope |
Die Ausgabe muss aufgezeichnet werden, nachdem der Ursprungsbereich abgeschlossen ist. |
Verwenden Sie dieselben Anforderungs- und Agentenidentitätswerte in Bereichen einer Anforderung wieder, sodass entsprechende Telemetrie korreliert werden kann.
Agentenaufruf
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."])
Werkzeugausführung
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)
Schlussfolgerung
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"])
Output
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
Die Produktdokumentation sollte alle produktspezifischen Validierungsanforderungen für diese Bereiche definieren.
Lokale Überprüfung
Die lokale Überprüfung bestätigt, dass die Anwendung Telemetrie erzeugt, bevor ein produktspezifisches Ziel überprüft wird. Verwenden Sie die Konsolenausgabe oder einen lokalen OTLP-Endpunkt, um zu überprüfen, ob Ablaufverfolgungen, Metriken und Protokolle erstellt werden.
Überprüfen mit einem lokalen OTLP-Endpunkt
Konfigurieren Sie die Distro, um Telemetrie an einen lokalen Sammler oder einen anderen OTLP-kompatiblen Endpunkt zu senden.
export OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317
from microsoft.opentelemetry import use_microsoft_opentelemetry
use_microsoft_opentelemetry()
Validieren mit lokaler Ausgabe
Verwenden Sie die lokale Ausgabe, wenn Sie die Instrumentierung bestätigen möchten, bevor Sie Telemetrie an ein Remoteziel senden.
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.
Überprüfen Sie die lokale Ausgabe für Bereiche von erwarteten Quellen, z. B. HTTP-Anforderungen, OpenAI- oder Azure OpenAI-Aufrufe, Agentaufrufbereiche, Toolausführungsbereiche oder Ableitungsbereiche. Die zielspezifische Überprüfung gehört zur Produktdokumentation für dieses Ziel.
Manuelles Einrichten der Authentifizierung
Wenn Sie den Agent 365-Exporter verwenden, müssen Sie einen Mechanismus zum Bereitstellen eines Authentifizierungstokens bereitstellen. Der Tokenlöser funktioniert pro Exportbatch mithilfe der Agent-ID und der Mandanten-ID aus dem aktiven Gepäckkontext. Die Distro unterstützt drei Ansätze.
Manueller Tokenlöser
Verwenden Sie einen manuellen Resolver, wenn Sie Token außerhalb der Agent Framework-Pipeline erwerben oder wenn Sie Nicht-Agent-Framework-Apps erstellen.
Der Resolver muss synchron sein. Rufen Sie das Token im asynchronen Aktivitäts-Handler ab und zwischenspeichern Sie es für den Resolver.
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 mit Agent-Framework-Apps
Bei Agent Framework Apps registriert das Distro automatisch IExporterTokenCache<AgenticTokenStruct> mittels DI, wenn Sie kein benutzerdefiniertes TokenResolver festlegen. Ihr Agent ruft RegisterObservability() zur Laufzeit an, um Anmeldeinformationen zu liefern, und der Cache verarbeitet die Tokenerfassung und -aktualisierung.
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,
)
Speicher-Validierungsattribute
Für eine erfolgreiche Speicherüberprüfung muss Ihr Agent InvokeAgentScope, InferenceScope und ExecuteToolScope implementieren. Die folgenden Attribute sind für jeden Bereich erforderlich oder optional.
InvokeAgentScope
| Attribut | Status |
|---|---|
gen_ai.agent.id |
Required |
gen_ai.agent.name |
Required |
gen_ai.operation.name |
Required |
gen_ai.input.messages |
Required |
gen_ai.output.messages |
Required |
gen_ai.conversation.id |
Required |
microsoft.tenant.id |
Required |
microsoft.a365.agent.blueprint.id |
Required |
microsoft.agent.user.id |
Required |
microsoft.agent.user.email |
Required |
microsoft.channel.name |
Required |
user.id |
Required |
user.email |
Required |
client.address |
Required |
server.address |
Required |
server.port |
Required |
error.type |
Optional |
gen_ai.agent.description |
Optional |
gen_ai.agent.version |
Optional |
microsoft.a365.agent.platform.id |
Optional |
microsoft.channel.link |
Optional |
microsoft.conversation.item.link |
Optional |
microsoft.session.id |
Optional |
microsoft.session.description |
Optional |
user.name |
Optional |
microsoft.a365.caller.agent.id |
Optional |
microsoft.a365.caller.agent.name |
Optional |
microsoft.a365.caller.agent.blueprint.id |
Optional |
microsoft.a365.caller.agent.platform.id |
Optional |
microsoft.a365.caller.agent.user.email |
Optional |
microsoft.a365.caller.agent.user.id |
Optional |
microsoft.a365.caller.agent.version |
Optional |
ExecuteToolScope
| Attribut | Status |
|---|---|
gen_ai.agent.id |
Required |
gen_ai.agent.name |
Required |
gen_ai.operation.name |
Required |
gen_ai.tool.name |
Required |
gen_ai.tool.call.id |
Required |
gen_ai.tool.call.arguments |
Required |
gen_ai.tool.call.result |
Required |
gen_ai.tool.type |
Required |
gen_ai.conversation.id |
Required |
microsoft.tenant.id |
Required |
microsoft.a365.agent.blueprint.id |
Required |
microsoft.agent.user.id |
Required |
microsoft.agent.user.email |
Required |
microsoft.channel.name |
Required |
user.id |
Required |
user.email |
Required |
client.address |
Required |
error.type |
Optional |
gen_ai.agent.description |
Optional |
gen_ai.agent.version |
Optional |
gen_ai.tool.description |
Optional |
microsoft.a365.agent.platform.id |
Optional |
microsoft.channel.link |
Optional |
microsoft.conversation.item.link |
Optional |
microsoft.session.id |
Optional |
microsoft.session.description |
Optional |
server.address |
Optional |
server.port |
Optional |
user.name |
Optional |
InferenceScope
| Attribut | Status |
|---|---|
gen_ai.agent.id |
Required |
gen_ai.agent.name |
Required |
gen_ai.operation.name |
Required |
gen_ai.input.messages |
Required |
gen_ai.output.messages |
Required |
gen_ai.request.model |
Required |
gen_ai.provider.name |
Required |
gen_ai.conversation.id |
Required |
microsoft.tenant.id |
Required |
microsoft.a365.agent.blueprint.id |
Required |
microsoft.agent.user.id |
Required |
microsoft.agent.user.email |
Required |
microsoft.channel.name |
Required |
user.id |
Required |
user.email |
Required |
client.address |
Required |
error.type |
Optional |
gen_ai.agent.description |
Optional |
gen_ai.agent.version |
Optional |
gen_ai.response.finish_reasons |
Optional |
gen_ai.usage.input_tokens |
Optional |
gen_ai.usage.output_tokens |
Optional |
microsoft.a365.agent.platform.id |
Optional |
microsoft.a365.agent.thought.process |
Optional |
microsoft.channel.link |
Optional |
microsoft.conversation.item.link |
Optional |
microsoft.session.id |
Optional |
microsoft.session.description |
Optional |
server.address |
Optional |
server.port |
Optional |
user.name |
Optional |
OutputScope
| Attribut | Status |
|---|---|
gen_ai.agent.id |
Required |
gen_ai.agent.name |
Required |
gen_ai.operation.name |
Required |
gen_ai.output.messages |
Required |
gen_ai.conversation.id |
Required |
microsoft.tenant.id |
Required |
microsoft.a365.agent.blueprint.id |
Required |
microsoft.agent.user.id |
Required |
microsoft.agent.user.email |
Required |
microsoft.channel.name |
Required |
user.id |
Required |
user.email |
Required |
client.address |
Required |
gen_ai.agent.description |
Optional |
gen_ai.agent.version |
Optional |
microsoft.a365.agent.platform.id |
Optional |
microsoft.channel.link |
Optional |
microsoft.conversation.item.link |
Optional |
microsoft.session.id |
Optional |
microsoft.session.description |
Optional |
user.name |
Optional |
Testen Sie Ihren Agenten mit Observierbarkeit
Überprüfen Sie nach der Implementierung der Observability, ob Telemetrie erfasst wird:
- Gehe zu
https://admin.cloud.microsoft/#/agents/all. - Wählen Sie Ihren Agent und dann "Aktivität" aus.
- Überprüfen Sie, ob Sitzungen und Toolaufrufe angezeigt werden.
Beispielanwendungen und erweiterte Konfiguration
Arbeitsbeispiele und erweiterte Konfigurationsoptionen finden Sie in den GitHub Repositorys für jede Sprache:
Problembehandlung
In diesem Abschnitt werden häufige Probleme bei der Implementierung und Verwendung der Microsoft OpenTelemetry Distro mit Agent 365 beschrieben.
Tip
Der Agent 365 Troubleshooting Guide enthält übergeordnete Empfehlungen zur Fehlerbehebung, Best Practices und Links zu Inhalten zur Fehlerbehebung für jeden Teil des Entwicklungszyklus von Agent 365.
Observabilitätsdaten erscheinen nicht
Symptome:
- Agent läuft
- Keine Telemetrie im Verwaltungszentrum
- Kann keine Agentenaktivität sehen
Grundursache:
- Agent 365-Export ist nicht aktiviert
- Konfigurationsfehler
- Probleme des Token-Resolvers
Lösungen: Probieren Sie die folgenden Schritte aus, um das Problem zu lösen:
Überprüfen, ob der Agent 365-Export aktiviert ist
Sie müssen den Agent 365-Exporter explizit aktivieren. Wenn es nicht festgelegt wird, kann die Distribution auf eine Konsolenausgabe zurückgreifen oder gar nichts exportieren. Aktivieren Sie sie im Code:
from microsoft.opentelemetry import use_microsoft_opentelemetry use_microsoft_opentelemetry( enable_a365=True, a365_enable_observability_exporter=True, a365_token_resolver=my_token_resolver, )Oder legen Sie die Umgebungsvariable fest:
export ENABLE_A365_OBSERVABILITY_EXPORTER=trueNote
ENABLE_A365_OBSERVABILITY_EXPORTERist ein sekundärer Schalter, der nur wirksam wird, wennenable_a365=Trueim Code gesetzt ist. Sie können es auch über dena365_enable_observability_exporterKwarg steuern.
Überprüfen Sie die Token-Resolver-Konfiguration
Der Exporter erfordert einen gültigen Tokenlöser, der ein Bearertoken für jede Exportanforderung zurückgibt. Wenn der Tokenlöser fehlt oder zurückgibt
null, wird der Export im Hintergrund übersprungen.Aktivieren des Konsolenexports und der lokalen Überprüfung auf Telemetrie
Fügen Sie einen Konsolenexporteur hinzu, um zu überprüfen, ob Telemetrie generiert wird, bevor er den Agent 365-Endpunkt erreicht:
Ausführliche Protokollierung aktivieren
Überprüfen von Protokollen auf Exportfehler
Verwenden Sie den
az webapp log tailBefehl , um Protokolle nach Observability-bezogenen Fehlern zu durchsuchen:az webapp log tail --name <your-app-name> --resource-group <your-resource-group> | Select-String "observability"
Fehlende Mandanten-ID oder Agent-ID – übersprungen
Symptome: Das System verwirft die Spans unbemerkt und exportiert sie nie. Einige Plattformen protokollieren die Anzahl der übersprungenen Bereiche oder eine Nachricht wie No spans with tenant/agent identity found. Andere lassen sie fallen, ohne Protokoll zu führen.
Auflösung:
- Vor dem Export werden die Distributionspartitionen nach Mandanten- und Agentenidentität aufgeteilt. Spans, die weder eine Tenant-ID noch eine Agent-ID besitzen, werden verworfen und nie an den Dienst gesendet.
- Stellen Sie sicher, dass
BaggageBuildermit der Mandanten-ID und der Agenten-ID eingerichtet ist, bevor Sie Spannweiten erstellen. Diese Werte werden über den OpenTelemetry-Kontext verteilt und an alle Spans angefügt, die innerhalb des Baggage-Bereichs erstellt werden. Informationen zur plattformspezifischen API finden Sie unter Gepäckattribute. - Wenn Sie die Baggage-Middleware verwenden oder das kontextbezogene Hilfsprogramm aus dem Hosting-Integrationspaket verwenden, bestätigen Sie, dass die
TurnContextAktivität über einen gültigen Empfänger mit Agentidentität verfügt.
Fehler bei der Tokenauflösung – Export übersprungen oder nicht autorisiert
Symptome: Der Tokenlöser gibt null zurück oder wirft einen Fehler. Je nach Plattform wird der Export entweder vollständig übersprungen oder schlägt mit HTTP 401 fehl.
Auflösung:
- Der Tokenlöser ist erforderlich. Wenn er fehlt, löst der Exporter beim Start einen Fehler aus. Stellen Sie sicher, dass ein Tokenlöser bereitgestellt wird, und gibt ein gültiges Bearertoken zurück.
- Stellen Sie sicher, dass die richtige Mandanten-ID und Agent-ID an
BaggageBuilderübergeben werden, da diese Werte an den Tokenlöser übertragen werden. - Überprüfen Sie für in Azure gehostete Agents, ob die verwaltete Identität über die erforderliche API-Berechtigung für den Überwachungsbereich verfügt.
- Für .NET Apps, die das Agent Framework-Hostingpaket verwenden, wird der Tokenaustausch automatisch über DI verarbeitet. Wenn Token fehlen, bestätigen Sie, dass
Microsoft.Agents.A365.Observability.Hostinginstalliert und registriert ist.
HTTP 401 nicht autorisiert
Symptome: Der Export schlägt mit HTTP 401 fehl. Der Exporter wiederholt diesen Fehler nicht.
Auflösung:
- Überprüfen Sie, ob die Token-Zielgruppe mit dem Observability-Endpunkt-Scope übereinstimmt.
- Überprüfen Sie, ob der Tokenlöser kein delegiertes Benutzertoken, kein Token für eine falsche Zielgruppe oder ein abgelaufenes Token zurückgibt.
HTTP 403 – Unzulässig
Symptome: Der Export schlägt mit HTTP 403 fehl. Der Exporter wiederholt diesen Fehler nicht.
Ursache: Ein HTTP 403-Fehler kann unterschiedliche Ursachen haben. Überprüfen Sie die folgenden Auflösungen in der angegebenen Reihenfolge.
Auflösung:
Missing license – Vergewissern Sie sich, dass Ihrem Mandanten eine der folgenden Lizenzen inMicrosoft 365 Admin Center :- Test - Microsoft 365 E7
- Microsoft 365 E7
- Microsoft Agent 365 Frontier
Fehlende
Agent365.Observability.OtelWriteBerechtigung – Sie müssen Ihrer Identität (verwaltete Identität oder App-Registrierung) diese Berechtigung erteilen. Ohne dies schlägt der Telemetrieexport mit HTTP 403 fehl.Erteilen Sie die Berechtigung mithilfe einer der folgenden Optionen.
Option A – Agent 365 CLI (erfordert
a365.config.jsonunda365.generated.config.jsonin Ihrem Konfigurationsverzeichnis, einem globalen Administratorkonto und Agent 365 CLI v1.1.139-preview oder höher)a365 setup admin --config-dir "<path-to-config-dir>"Option B – Entra-Portal (keine Konfigurationsdateien erforderlich; erfordert globalen Administratorzugriff auf die Blueprint-App-Registrierung)
- Wechseln Sie zu Entra-Portal>App-Registrierungen> Wählen Sie Ihre Blueprint-App aus.
- Wechseln Sie zu API-Berechtigungen>Eine Berechtigung hinzufügen>APIs, die meine Organisation verwendet> suchen nach
9b975845-388f-4429-889e-eab1ef63949c. - Wählen Sie "Delegierte Berechtigungen> " aus, um
Agent365.Observability.OtelWrite>Berechtigungen hinzuzufügen. - Wiederholen Sie die Schritte 2 bis 3, und wählen Sie diesmal Anwendungsberechtigungen>. Überprüfen Sie die Auswahl und klicken Sie auf
Agent365.Observability.OtelWrite>Berechtigungen hinzufügen. - Klicken Sie auf " Administratorzustimmung erteilen " und bestätigen Sie.
Sowohl
Agent365.Observability.OtelWrite(Delegated) als auchAgent365.Observability.OtelWrite(Anwendung) sollten denGrantedStatus anzeigen.
HTTP 429 / 5xx – Vorübergehende Fehler
Symptome: Der Export schlägt mit einem vorübergehenden HTTP-Statuscode wie 429 oder 5xx fehl.
Auflösung:
- Diese Fehler sind in der Regel vorübergehend und allein behoben. Die Python- und JavaScript-Distributionen initiieren automatisch einen erneuten Versuch bei HTTP 408-, 429- und 5xx-Statuscodes. Die .NET-Distribution versucht nicht automatisch erneut.
- Wenn Fehler weiterhin bestehen, überprüfen Sie das Dienststatusdashboard.
- Erwägen Sie, die Exporthäufigkeit zu verringern, indem Sie die geplante Verzögerung zwischen Batches oder der maximalen Exportbatchgröße erhöhen. Verwenden Sie für Python und JavaScript die relevanten Parameter
exporterOptionsodera365_*, die in den Repositorys GitHub dokumentiert sind. Verwenden Sie für .NETo.Agent365.Exporter.ScheduledDelayMillisecondsundo.Agent365.Exporter.MaxExportBatchSize.
Export-Zeitüberschreitung
Symptome: Exportversuche laufen ab.
Auflösung:
Überprüfen Sie die Netzwerkkonnektivität mit dem Observability-Endpunkt.
Das standardmäßige HTTP-Anforderungstimeout beträgt 30 Sekunden auf allen Plattformen. Wenn Timeouts häufig auftreten, erhöhen Sie den Timeoutwert in den Exporteroptionen:
use_microsoft_opentelemetry( enable_a365=True, a365_token_resolver=my_token_resolver, # No direct timeout kwarg — set via environment variable or exporterOptions if supported )Sehen Sie sich das Python-Repository für die vollständige Liste der
a365_*Optionen an.
Der Export ist erfolgreich, die Telemetrie wird jedoch nicht in Defender oder purview angezeigt.
Symptoms: Protokolle zeigen einen erfolgreichen Export (HTTP 200) an, die Telemetrie ist jedoch in Microsoft Defender oder Microsoft Purview nicht sichtbar.
Auflösung:
- Stellen Sie sicher, dass Sie die Voraussetzungen für die Anzeige exportierter Protokolle erfüllen:
- Microsoft Purview: Die Überwachung muss für Ihre Organisation aktiviert sein. Weitere Informationen finden Sie unter Aktivieren oder Deaktivieren der Überwachung.
-
Microsoft Defender: Die erweiterte Suche muss für den Zugriff auf die Tabelle
CloudAppEventskonfiguriert werden. Weitere Informationen finden Sie in der Tabelle "CloudAppEvents" im Schema für die erweiterte Suche.
- Telemetriedaten können nach einem erfolgreichen Export mehrere Minuten benötigen, um angezeigt zu werden. Warten Sie, bevor Sie weitere Untersuchungen ausführen.
- Stellen Sie sicher, dass Spannen gültige
microsoft.tenant.idundgen_ai.agent.idAttribute enthalten. Fehlende Identitätsattribute führen dazu, dass serverseitig Spannen verworfen werden, auch wenn der HTTP-Export 200 zurückgibt.