Clientseitiges Tracing zu Foundry-Agents hinzufügen (Vorschau)

Wichtig

Elemente, die in diesem Artikel als Vorschau gekennzeichnet sind, befinden sich derzeit in der Vorschau. Diese Vorschau wird ohne Service Level Agreement (SLA) bereitgestellt, und Microsoft empfiehlt sie nicht für Produktionsworkloads. Bestimmte Features werden möglicherweise nicht unterstützt oder weisen eingeschränkte Funktionen auf. Weitere Informationen finden Sie unter Supplementale Nutzungsbedingungen für Microsoft Azure Previews.

Microsoft Foundry erfasst automatisch serverseitige Traces für Agents, die im Portal ausgeführt werden. Client-seitiges Tracing erweitert diese Sichtbarkeit innerhalb des eigenen Anwendungscodes. Durch die Instrumentierung Ihrer Agent-Anwendung mit OpenTelemetry können Sie Spans für Modellaufrufe, Toolaufrufe und benutzerdefinierte Logik erfassen und sie anschließend nach Azure Monitor Application Insights, in die Konsole oder in ein beliebiges Observability-Backend exportieren, das das OpenTelemetry-Protokoll (OTLP) unterstützt, z. B. Datadog, Grafana Tempo, Jaeger oder Honeycomb.

In diesem Artikel erfahren Sie, wie Sie:

  • Installieren Sie die erforderlichen OpenTelemetry-Tracing-Pakete.
  • Aktivieren Sie die Tracing-Instrumente für GenAI in Agentenanwendungen.
  • Exportieren Sie Traces nach Azure Monitor, in die Konsole oder in ein OTLP-kompatibles Backend.
  • Aktivieren Sie die Inhaltsaufzeichnung zum Erfassen von Nachrichteninhalten.
  • Aktivieren Sie die Ablaufverfolgungskontextverteilung für die verteilte Ablaufverfolgung (Python).
  • Nachverfolgen benutzerdefinierter Funktionen.

Voraussetzungen

  • Ein Foundry-Projekt, das mit einer Application Insights-Ressource verbunden ist.

  • Ein KI-Modell, das für das Projekt bereitgestellt wird. Notieren Sie sich den Bereitstellungsnamen.

  • Azure CLI installiert. Melden Sie sich an, indem Sie az login ausführen.

  • Mitwirkender oder höher für das Foundry-Projekt. Zum Anzeigen von Traces benötigen Sie außerdem die Rolle Log Analytics Reader für die verbundene Application Insights-Ressource. Wenn diese Log Analytics Tabellen geschützt sind, weisen Sie auch privileged Monitoring Data Reader zu. Weitere Informationen finden Sie unter Rollenbasierte Zugriffssteuerung in Foundry.

  • Die folgenden Umgebungsvariablen werden mit eigenen Werten gesetzt.

    Variable Beschreibung
    FOUNDRY_PROJECT_ENDPOINT Die Endpunkt-URL Ihres Foundry-Projekts. Suchen Sie es auf der Projektübersichtsseite im Foundry-Portal.
    FOUNDRY_MODEL_NAME Der Bereitstellungsname eines KI-Modells in Ihrem Projekt. Suchen Sie es unter "Modelle " im Findry-Portal.

Sprachspezifische Voraussetzungen

  • Python 3.10 oder höher.
  • Die Version 2.0.0 oder höher des azure-ai-projects Pakets.

Installieren Sie Ablaufverfolgungspakete

Installieren Sie das Microsoft Foundry SDK, OpenTelemetry und den Azure Monitor Exporter:

pip install azure-ai-projects azure-identity opentelemetry-sdk azure-core-tracing-opentelemetry azure-monitor-opentelemetry

Installieren Sie für den reinen Konsolen- oder OTLP-Export (z. B. Aspire Dashboard) den OTLP-Exporter:

pip install opentelemetry-exporter-otlp

Aktivieren der GenAI-Ablaufverfolgung

GenAI-Tracing-Instrumentierung ist eine experimentelle Vorschaufunktion. Spans, Attribute und Ereignisse können sich in zukünftigen Versionen ändern. Sie müssen die Ablaufverfolgung ausdrücklich aktivieren, bevor sie wirksam wird.

Setzen Sie die Umgebungsvariable AZURE_EXPERIMENTAL_ENABLE_GENAI_TRACINGtrue Aufrufen auf AIProjectInstrumentor().instrument():

import os

os.environ["AZURE_EXPERIMENTAL_ENABLE_GENAI_TRACING"] = "true"

from azure.ai.projects.telemetry import AIProjectInstrumentor

# Enable instrumentation
AIProjectInstrumentor().instrument()

Wenn die Variable nicht festgelegt ist oder nicht true entspricht (ohne Beachtung der Groß-/Kleinschreibung), wird die Tracing-Instrumentierung nicht aktiviert, und es wird eine Warnung protokolliert.

Exportieren von Ablaufverfolgungen in Azure Monitor

Senden Sie Ablaufverfolgungen an Azure-Anwendung Insights, so dass sie in der Ansicht Ablaufverfolgungens des Foundry-Portals und in Azure Monitor angezeigt werden.

import os

os.environ["AZURE_EXPERIMENTAL_ENABLE_GENAI_TRACING"] = "true"

from azure.ai.projects import AIProjectClient
from azure.ai.projects.models import PromptAgentDefinition
from azure.identity import DefaultAzureCredential
from azure.monitor.opentelemetry import configure_azure_monitor
from opentelemetry import trace

endpoint = os.environ["FOUNDRY_PROJECT_ENDPOINT"]

with (
    DefaultAzureCredential() as credential,
    AIProjectClient(endpoint=endpoint, credential=credential) as project,
):
    # Get the Application Insights connection string from the project
    connection_string = project.telemetry.get_application_insights_connection_string()
    configure_azure_monitor(connection_string=connection_string)

    tracer = trace.get_tracer(__name__)

    with tracer.start_as_current_span("agent-tracing-scenario"):
        with project.get_openai_client() as openai:
            # Create an agent
            agent = project.agents.create_version(
                agent_name="MyAgent",
                definition=PromptAgentDefinition(
                    model=os.environ["FOUNDRY_MODEL_NAME"],
                    instructions="You are a helpful assistant.",
                ),
            )
            print(f"Agent created (id: {agent.id}, name: {agent.name})")

            # Create a conversation and get a response
            conversation = openai.conversations.create()
            response = openai.responses.create(
                conversation=conversation.id,
                extra_body={"agent_reference": {"name": agent.name, "id": agent.id, "type": "agent_reference"}},
                input="What is the largest city in France?",
            )
            print(f"Response: {response.output_text}")

            # Clean up
            openai.conversations.delete(conversation_id=conversation.id)
            project.agents.delete_version(agent_name=agent.name, agent_version=agent.version)

Referenz: AIProjectClient, , DefaultAzureCredentialconfigure_azure_monitor

Hinweis

Um Traces mit einem bestimmten Agenten im Foundry-Portal zu korrelieren, schließen Sie agent_reference zusammen mit name und id in Ihrem responses.create()-Aufruf ein (wie im oben dargestellten Python-Beispiel gezeigt). Spuren erscheinen in der Regel innerhalb von 2 bis 5 Minuten.

Ablaufverfolgungen in die Konsole exportieren

Der Konsolenexport ist für das lokale Debuggen nützlich. Ablaufverfolgungen werden direkt in die Standardausgabe geschrieben.

import os

os.environ["AZURE_EXPERIMENTAL_ENABLE_GENAI_TRACING"] = "true"

from azure.ai.projects.telemetry import AIProjectInstrumentor
from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import ConsoleSpanExporter, SimpleSpanProcessor

# Set up console tracing
tracer_provider = TracerProvider()
tracer_provider.add_span_processor(
    SimpleSpanProcessor(ConsoleSpanExporter()))
trace.set_tracer_provider(tracer_provider)

# Enable instrumentation
AIProjectInstrumentor().instrument()

tracer = trace.get_tracer(__name__)

Sie können das Aspire Dashboard auch als lokalen OTLP-kompatiblen Viewer verwenden. Installieren Sie den OTLP-Exporter (pip install opentelemetry-exporter-otlp) und konfigurieren Sie ihn als Exporter anstelle von ConsoleSpanExporter.

Referenz: AIProjectInstrumentor, ConsoleSpanExporter

Aktivieren der Inhaltsaufzeichnung

Die Inhaltsaufzeichnung erfasst Nachrichteninhalte und Argumente von Toolaufrufen in Ablaufverfolgungen. Diese Daten können vertrauliche Benutzerinformationen enthalten.

Vorsicht

Die Inhaltsaufzeichnung erfasst Benutzernachrichten, Toolaufrufargumente und Modellausgaben. Aktivieren Sie diese Einstellung nur in Entwicklungsumgebungen. Aktivieren Sie die Inhaltsaufzeichnung nicht in der Produktion, es sei denn, Ihre Compliance- und Datenschutzanforderungen erlauben dies.

Legen Sie die Umgebungsvariable vor der Instrumentierung fest:

import os

os.environ["OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT"] = "true"

Wichtig

Diese Variable steuert die Aufzeichnung nur für integrierte Ablaufverfolgungen. Wenn Sie den @trace_function Decorator für Ihre eigenen Funktionen verwenden, werden alle Parameter und Rückgabewerte immer unabhängig von dieser Einstellung nachverfolgt.

Automatische Instrumentierung deaktivieren (Python)

Das Python SDK überwacht automatisch die OpenAI Responses und Conversations API-Aufrufe. Um diese automatische Instrumentierung zu deaktivieren, legen Sie AZURE_TRACING_GEN_AI_INSTRUMENT_RESPONSES_API auf false fest, bevor Sie AIProjectInstrumentor().instrument() aufrufen. Wenn diese Option deaktiviert ist, werden nur explizite benutzerdefinierte Spannen aufgezeichnet.

import os

os.environ["AZURE_TRACING_GEN_AI_INSTRUMENT_RESPONSES_API"] = "false"

Binärdaten nachverfolgen (Python)

Wenn die Inhaltsaufzeichnung aktiviert ist, zeichnet das SDK standardmäßig die Datei-IDs und Dateinamen auf. Um vollständige Bild-URLs (einschließlich Base64-Daten-URIs) und Dateidaten in Spannen einzuschließen, setzen Sie AZURE_TRACING_GEN_AI_INCLUDE_BINARY_DATA auf true.

import os

os.environ["AZURE_TRACING_GEN_AI_INCLUDE_BINARY_DATA"] = "true"

Warnung

Die Aktivierung von AZURE_TRACING_GEN_AI_INCLUDE_BINARY_DATA kann die Tracing-Payload-Größe erheblich vergrößern. Für einige Abflaufverfolgungs-Back-Ends gelten Einschränkungen für die maximale Größe von Span-Daten. Stellen Sie sicher, dass Ihr Observability-Back-End die erwarteten Nutzlastgrößen unterstützt, bevor Sie diese Einstellung aktivieren.

Aktivieren der Ablaufverfolgungskontextverteilung (Python)

Die Transaktionskontextweitergabe ermöglicht die Korrelation clientseitiger Spans mit serverseitigen Spans von Azure OpenAI und anderen Azure-Diensten. Wenn diese Funktion aktiviert ist, fügt das SDK automatisch W3C Trace Context-Header (traceparent und tracestate) in HTTP-Anforderungen ein, die von über get_openai_client() abgerufenen OpenAI-Clients gesendet werden.

Die Ablaufverfolgungskontextweitergabe ist standardmäßig aktiviert, wenn die Ablaufverfolgung aktiviert ist. Um sie zu deaktivieren, legen Sie die AZURE_TRACING_GEN_AI_ENABLE_TRACE_CONTEXT_PROPAGATION Umgebungsvariable auf false, oder übergeben Sie den Parameter direkt:

from azure.ai.projects.telemetry import AIProjectInstrumentor

# Disable trace context propagation
AIProjectInstrumentor().instrument(enable_trace_context_propagation=False)

Änderungen an dieser Einstellung wirken sich nur auf OpenAI-Clients aus, die get_openai_client() der Änderung über abgerufen werden. Zuvor erworbene Kunden sind nicht betroffen.

Steuerung der Gepäckweiterleitung (Python)

Standardmäßig werden nur traceparent und tracestate Kopfzeilen weitergegeben. Um auch den baggage Header einzuschließen, setzen Sie AZURE_TRACING_GEN_AI_TRACE_CONTEXT_PROPAGATION_INCLUDE_BAGGAGE auf true.

Wichtig

Der baggage Header kann beliebige Schlüsselwertpaare enthalten, einschließlich Benutzer-IDs, Sitzungsinformationen oder anderer potenziell vertraulicher Daten. Vor der Aktivierung der Gepäckweitergabe:

  • Überprüfen Sie, welche Daten Ihre Anwendung und Drittanbieterbibliotheken zu OpenTelemetry-Gepäck hinzufügen.
  • Verstehen Sie, dass Gepäck an Azure OpenAI gesendet wird und möglicherweise von Azure-Diensten protokolliert wird.
  • Fügen Sie dem Gepäck niemals vertrauliche Informationen hinzu, wenn die Weiterleitung aktiviert ist.

Hinweis

Das C#-SDK basiert auf der standardmäßigen .NET System.Diagnostics.Activity-Verteilung. Die explizite Injektion des Tracekontexts pro Anforderung wird nicht als separates SDK-Feature bereitgestellt.

Nachverfolgen benutzerdefinierter Funktionen

Python - verwenden Sie den @trace_function Dekorateur

Der Decorator trace_function erstellt für jeden Aufruf Ihrer Funktion einen OpenTelemetry-Span. Die Parameter werden als code.function.parameter.<name> und der Rückgabewert als code.function.return.value aufgezeichnet.

from azure.ai.projects.telemetry import trace_function

@trace_function
def fetch_weather(location: str) -> str:
    """Get the current weather for a location."""
    return f"Weather in {location}: sunny, 72°F"

Um einen benutzerdefinierten Span-Namen anstelle des Funktionsnamens zu verwenden, übergeben Sie ihn als Parameter:

@trace_function("get-current-weather")
def fetch_weather(location: str) -> str:
    """Get the current weather for a location."""
    return f"Weather in {location}: sunny, 72°F"

Der Decorator zeichnet auf:

  • Parameter als code.function.parameter.<name> Spanattribute.
  • Rückgabewerte als code.function.return.value.
  • Unterstützte Typen: str, , intfloat, bool, und Auflistungen (list, dict, tuple, set). Objekttypen werden weggelassen.

Hinweis

Die OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT Umgebungsvariable wirkt sich nicht auf die Ablaufverfolgung benutzerdefinierter Funktionen aus. Der @trace_function Dekorateur verfolgt immer Parameter und Rückgabewerte.

C# – manuell verwenden ActivitySource

Das C#-SDK enthält keinen Ablaufverfolgungs-Decorator. Verwenden Sie das Standard-.NET-Framework ActivitySource, um Ihre eigenen Funktionen zu instrumentieren:

using System.Diagnostics;

using ActivitySource source = new("MyApp.CustomFunctions");

string FetchWeather(string location)
{
    using var activity = source.StartActivity("FetchWeather");
    activity?.SetTag("input.location", location);

    var result = $"Weather in {location}: sunny, 72°F";
    activity?.SetTag("output", result);
    return result;
}

Registrieren Sie Ihre benutzerdefinierte Quelle zusammen mit der SDK-Quelle in Ihrem Tracer-Anbieter:

var tracerProvider = Sdk.CreateTracerProviderBuilder()
    .AddSource("Azure.AI.Projects.*")
    .AddSource("MyApp.CustomFunctions")
    .SetResourceBuilder(
        ResourceBuilder.CreateDefault().AddService("MyApp"))
    .AddConsoleExporter()
    .Build();

Programmgesteuerte Konfiguration der Instrumentation (Python)

Als Alternative zu Umgebungsvariablen übergeben Sie Konfigurationsparameter direkt an AIProjectInstrumentor().instrument():

from azure.ai.projects.telemetry import AIProjectInstrumentor

AIProjectInstrumentor().instrument(
    enable_content_recording=True,
    enable_trace_context_propagation=True,
    enable_baggage_propagation=False,
)
Parameter Umgebungsvariablenentsprechung Standard
enable_content_recording OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT False
enable_trace_context_propagation AZURE_TRACING_GEN_AI_ENABLE_TRACE_CONTEXT_PROPAGATION True*
enable_baggage_propagation AZURE_TRACING_GEN_AI_TRACE_CONTEXT_PROPAGATION_INCLUDE_BAGGAGE False

* Der Standardwert ist True, wenn die Ablaufverfolgung aktiviert ist.

Wenn sowohl ein Parameter als auch die entsprechende Umgebungsvariable festgelegt werden, hat der Parameterwert Vorrang.

Hinzufügen von benutzerdefinierten Attributen zu Spans

Erstellen Sie eine benutzerdefinierte SpanProcessor, um Metadaten wie Sitzungs-IDs in jeden Abschnitt einzufügen.

from opentelemetry.sdk.trace import SpanProcessor, ReadableSpan
from opentelemetry.trace import Span

class CustomAttributeSpanProcessor(SpanProcessor):
    def on_start(self, span: Span, parent_context=None):
        span.set_attribute("session.id", "user-session-abc")

    def on_end(self, span: ReadableSpan):
        pass

Registrieren Sie den Prozessor beim globalen Tracer-Provider.

from typing import cast
from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider

provider = cast(TracerProvider, trace.get_tracer_provider())
provider.add_span_processor(CustomAttributeSpanProcessor())

Steuern des Tracing-Verhaltens mit Umgebungsvariablen

In der folgenden Tabelle sind alle Umgebungsvariablen aufgeführt, die Sie zum Konfigurieren des Ablaufverfolgungsverhaltens verwenden können:

Variable Sprache Standard Beschreibung
AZURE_EXPERIMENTAL_ENABLE_GENAI_TRACING Python, C# false Aktivieren Sie die GenAI-Ablaufverfolgungsinstrumentierung.
OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT Python, C# false Erfassen Sie Nachrichteninhalte und Toolaufrufparameter.
AZURE_TRACING_GEN_AI_ENABLE_TRACE_CONTEXT_PROPAGATION Python true* Fügen Sie W3C-Ablaufverfolgungskontext-Header in Anforderungen ein.
AZURE_TRACING_GEN_AI_TRACE_CONTEXT_PROPAGATION_INCLUDE_BAGGAGE Python false Schließen Sie den Header baggage in die Transaktionskontextweitergabe ein.
AZURE_TRACING_GEN_AI_INSTRUMENT_RESPONSES_API Python true Responses- und Conversations-APIs automatisch instrumentieren.
AZURE_TRACING_GEN_AI_INCLUDE_BINARY_DATA Python false Bild- und Dateidaten in Abschnitten einschließen (nicht nur Datei-IDs).

* Der Standardwert ist true, wenn die Ablaufverfolgung aktiviert ist.

Eine vollständige Liste der Umgebungsvariablen und deren Verhalten finden Sie unter Tracing im AZURE AI Projects SDK README.

Sicherheit und Datenschutz

Clientseitige Ablaufverfolgung kann vertrauliche Informationen erfassen. Befolgen Sie die folgenden Methoden, um Risiken zu reduzieren:

  • Inhaltsaufzeichnung: Erfasst Benutzereingaben, Modellantworten und Toolaufrufargumente. In der Produktion deaktivieren, es sei denn, es ist erforderlich.
  • Baggage-Weitergabe: Kann PII- und Sitzungsdaten exponieren. Standardmäßig deaktiviert.
  • Weitergabe des Ablaufverfolgungskontexts: Sendet Ablaufverfolgungs-IDs an Azure-Dienste. Wenn Complianceanforderungen die Freigabe von Verfolgungs-IDs verbieten, deaktivieren Sie sie.
  • Geheime Schlüssel: Speichern Sie keine geheimen Schlüssel, Anmeldeinformationen oder Token in Eingabeaufforderungen, Toolargumenten oder Span-Attributen.
  • Zugriffssteuerung: Ablaufverfolgungsdaten als Produktionstelemetrie behandeln. Wenden Sie dieselben Zugriffssteuerungen und Aufbewahrungsrichtlinien an, die Sie für Protokolle und Metriken verwenden.

Problembehandlung

Angelegenheit Auflösung
Tracing erzeugt keine Spans Vergewissern Sie sich, dass AZURE_EXPERIMENTAL_ENABLE_GENAI_TRACING auf true gesetzt wird bevor Sie AIProjectInstrumentor().instrument() aufrufen (Python) oder bevor Sie den Traceranbieter erstellen (C#).
Nachrichteninhalte werden nicht in Spans angezeigt Setze OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT auf true.
Ablaufverfolgungen werden nicht in Azure Monitor angezeigt Überprüfen Sie, ob die Application Insights-Verbindungszeichenfolge korrekt ist und auf die Ressource zugegriffen werden kann. Überprüfen Sie, ob Ihr Konto über die Rolle Log Analytics Reader verfügt. Wenn die Tabellen geschützt sind, weisen Sie auch privileged Monitoring Data Reader zu.
Clientseitige und serverseitige Spannweiten werden nicht korreliert (Python) Vergewissern Sie sich, dass die Transaktionskontextweitergabe aktiviert ist und dass OpenAI-Clients get_openai_client() der Instrumentierung über abgerufen werden.
Ablaufverfolgungen werden mit Verzögerung angezeigt Es dauert in der Regel 2 bis 5 Minuten, bis Ablaufverfolgungen im Foundry-Portal und in Azure Monitor angezeigt werden. Warten und aktualisieren.