Aggiungere il tracciamento lato client agli agenti Foundry (anteprima)

Importante

Gli elementi contrassegnati come anteprima in questo articolo sono attualmente in anteprima. Questa anteprima viene fornita senza un contratto di servizio e Microsoft non lo consiglia per i carichi di lavoro di produzione. Alcune funzionalità potrebbero non essere supportate o potrebbero avere funzionalità limitate. Per altre informazioni, vedere Condizioni supplementari per l'utilizzo delle anteprime di Microsoft Azure.

Microsoft Foundry acquisisce automaticamente le tracce lato server per gli agenti operativi nel portale. Il tracciamento lato client estende tale visibilità nel proprio codice dell'applicazione. Instrumentando l'applicazione agente con OpenTelemetry, è possibile acquisire intervalli per chiamate di modelli, chiamate di strumenti e logica personalizzata, quindi esportarli in Monitoraggio di Azure Application Insights, nella console o in qualsiasi back-end di osservabilità che supporta il protocollo OpenTelemetry (OTLP), ad esempio Datadog, Grafana Tempo, Jaeger o Honeycomb.

Questo articolo illustra come:

  • Installare i pacchetti di traccia OpenTelemetry necessari.
  • Abilitare la strumentazione per il tracciamento GenAI per le applicazioni degli agenti.
  • Esportare tracce in Monitoraggio di Azure, nella console o in un back-end compatibile con OTLP.
  • Abilitare la registrazione del contenuto per acquisire il contenuto dei messaggi.
  • Abilitare la propagazione del contesto di traccia per la traccia distribuita (Python).
  • Traccia le funzioni personalizzate.

Prerequisiti

Prerequisiti specifici della lingua

  • Python 3.10 o versione successiva.
  • Pacchetto azure-ai-projects versione 2.0.0 o successiva.

Installare i pacchetti di traccia

Installare Microsoft Foundry SDK, OpenTelemetry e l'utilità di esportazione Monitoraggio di Azure:

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

Per l'esportazione limitata a console o OTLP (ad esempio Aspire Dashboard), installare l'utilità di esportazione OTLP:

pip install opentelemetry-exporter-otlp

Abilitare il tracciamento GenAI

La strumentazione di tracciamento GenAI è una funzionalità sperimentale in anteprima. Gli intervalli, gli attributi e gli eventi potrebbero cambiare nelle versioni future. È necessario acconsentire esplicitamente prima che il tracciamento sia attivo.

Impostare la variabile di ambiente AZURE_EXPERIMENTAL_ENABLE_GENAI_TRACINGtrue prima di chiamare AIProjectInstrumentor().instrument():

import os

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

from azure.ai.projects.telemetry import AIProjectInstrumentor

# Enable instrumentation
AIProjectInstrumentor().instrument()

Se la variabile non è impostata o non corrisponde a true (indipendentemente dalle maiuscole), la strumentazione di tracciamento non è abilitata e viene registrato un avviso.

Esportare tracce in Monitoraggio di Azure

Inviare tracce a applicazione Azure Insights in modo che vengano visualizzate nella visualizzazione Traces1 del portale Foundry e in Monitoraggio di Azure.

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)

Riferimento: AIProjectClient, DefaultAzureCredential, configure_azure_monitor

Nota

Per correlare le tracce con un agente specifico nel portale Foundry, includere il agent_reference sia con name che id nella chiamata responses.create() (come illustrato nell'esempio Python precedente). Le tracce vengono in genere visualizzate entro 2-5 minuti.

Esportare tracce nella console

L'esportazione della console è utile per il debug locale. Le tracce vengono stampate direttamente nell'output standard.

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__)

È anche possibile usare Aspire Dashboard come visualizzatore locale compatibile con OTLP. Installare l'esportatore OTLP (pip install opentelemetry-exporter-otlp) e configurarlo come esportatore al posto di ConsoleSpanExporter.

Riferimento: AIProjectInstrumentor, ConsoleSpanExporter

Abilitare la registrazione del contenuto

La registrazione dei contenuti cattura il contenuto dei messaggi e gli argomenti delle chiamate delle applicazioni nelle tracce. Questi dati possono includere informazioni riservate sull'utente.

Attenzione

La registrazione del contenuto acquisisce messaggi utente, argomenti di chiamata dello strumento e output del modello. Abilitare questa impostazione solo negli ambienti di sviluppo. Non abilitare la registrazione del contenuto nell'ambiente di produzione, a meno che i requisiti di conformità e privacy non lo consentano.

Impostare la variabile di ambiente prima di instrumentare:

import os

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

Importante

Questa variabile controlla la registrazione solo per le tracce predefinite. Quando si usa l'elemento @trace_function Decorator nelle proprie funzioni, tutti i parametri e i valori restituiti vengono sempre tracciati indipendentemente da questa impostazione.

Disabilitare la strumentazione automatica (Python)

L'SDK di Python strumentalizza automaticamente le chiamate API Risposte e Conversazioni di OpenAI. Per disabilitare questa strumentazione automatica, impostare AZURE_TRACING_GEN_AI_INSTRUMENT_RESPONSES_API su false prima di chiamare AIProjectInstrumentor().instrument(). Se disabilitato, vengono registrati solo intervalli personalizzati espliciti.

import os

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

Traccia i dati binari (Python)

Quando la registrazione del contenuto è abilitata, per impostazione predefinita, l'SDK traccia gli ID file e i nomi file. Per includere gli URL delle immagini completi (inclusi gli URI dati base64) e i dati dei file negli intervalli, impostare AZURE_TRACING_GEN_AI_INCLUDE_BINARY_DATA su true.

import os

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

Avviso

L'abilitazione AZURE_TRACING_GEN_AI_INCLUDE_BINARY_DATA può aumentare significativamente le dimensioni del payload di traccia. Alcuni back-end di traccia presentano limitazioni per le dimensioni massime dei dati di intervallo. Verificare che il back-end di osservabilità supporti le dimensioni previste del payload prima di abilitare questa impostazione.

Abilitare la propagazione del contesto di traccia (Python)

La propagazione del contesto di traccia consente ai tracciamenti lato client di correlarsi con i tracciamenti lato server di Azure OpenAI e altri servizi Azure. Se abilitato, l'SDK inserisce automaticamente le intestazioni del contesto di traccia W3C (traceparent e tracestate) nelle richieste HTTP effettuate dai client OpenAI ottenute tramite get_openai_client().

La propagazione del contesto di traccia è abilitata per impostazione predefinita quando la traccia è abilitata. Per disabilitarla, impostare la AZURE_TRACING_GEN_AI_ENABLE_TRACE_CONTEXT_PROPAGATION variabile di ambiente su falseo passare direttamente il parametro :

from azure.ai.projects.telemetry import AIProjectInstrumentor

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

Le modifiche apportate a questa impostazione influiscono solo sui client OpenAI ottenuti tramite get_openai_client()dopo la modifica. I client acquisiti in precedenza non sono interessati.

Propagazione bagaglio di controllo (Python)

Per impostazione predefinita, vengono propagate solo le intestazioni traceparent e tracestate. Per includere anche l'intestazione baggage, impostare AZURE_TRACING_GEN_AI_TRACE_CONTEXT_PROPAGATION_INCLUDE_BAGGAGE su true.

Importante

L'intestazione baggage può contenere coppie chiave-valore arbitrarie, inclusi identificatori utente, informazioni sulla sessione o altri dati potenzialmente sensibili. Prima di abilitare la propagazione dei bagagli:

  • Verificare quali dati la vostra applicazione e le librerie di terze parti aggiungono al bagaglio di OpenTelemetry.
  • Comprendere che il bagaglio viene inviato a Azure OpenAI e potrebbe essere registrato dai servizi Azure.
  • Non aggiungere mai informazioni riservate al bagaglio quando la propagazione è abilitata.

Nota

L'SDK C# si basa sulla propagazione standard di .NET System.Diagnostics.Activity. L'inserimento esplicito del contesto di tracciamento per richiesta non è disponibile come funzionalità SDK separata.

Tracciare le funzioni personalizzate

Python — usare il decoratore @trace_function

L'elemento decorator trace_function crea un intervallo OpenTelemetry per ogni chiamata alla funzione. I parametri vengono registrati come code.function.parameter.<name> e il valore restituito come code.function.return.value.

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"

Per usare un nome span personalizzato anziché il nome della funzione, passarlo come parametro:

@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"

Record dell'elemento Decorator:

  • Parametri come gli attributi span code.function.parameter.<name>.
  • Restituisce valori come code.function.return.value.
  • Tipi supportati: str, int, floatbool, e raccolte (list, dict, tuple, set). I tipi di oggetto vengono omessi.

Nota

La OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT variabile di ambiente non influisce sulla traccia della funzione personalizzata. L'elemento @trace_function decorator traccia sempre i parametri e restituisce valori.

C# : usare ActivitySource manualmente

C# SDK non include un Decorator di tracciamento. Usare lo standard .NET ActivitySource per instrumentare le proprie funzioni:

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;
}

Registrare l'origine personalizzata insieme all'origine SDK nel provider di traccia:

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

Configurare la strumentazione a livello di codice (Python)

In alternativa alle variabili di ambiente, passare i parametri di configurazione direttamente a AIProjectInstrumentor().instrument():

from azure.ai.projects.telemetry import AIProjectInstrumentor

AIProjectInstrumentor().instrument(
    enable_content_recording=True,
    enable_trace_context_propagation=True,
    enable_baggage_propagation=False,
)
Parametro Equivalente alla variabile di ambiente Predefinito
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

* Il valore predefinito è True quando la traccia è abilitata.

Quando vengono impostati sia un parametro che la variabile di ambiente corrispondente, il valore del parametro assume la priorità.

Aggiungere attributi personalizzati per gli intervalli

Creare un oggetto personalizzato SpanProcessor per inserire metadati come gli ID sessione in ogni intervallo:

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

Registrare il processore con il provider di traccia globale:

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())

Controllare il comportamento di tracciamento con le variabili di ambiente

Nella tabella seguente sono elencate tutte le variabili di ambiente che è possibile usare per configurare il comportamento di traccia:

Variabile Lingua Predefinito Descrizione
AZURE_EXPERIMENTAL_ENABLE_GENAI_TRACING Python, C# false Abilitare la strumentazione di tracciamento GenAI.
OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT Python, C# false Acquisire il contenuto dei messaggi e i parametri di chiamata dello strumento.
AZURE_TRACING_GEN_AI_ENABLE_TRACE_CONTEXT_PROPAGATION Python true* Inserire le intestazioni del contesto di traccia W3C nelle richieste.
AZURE_TRACING_GEN_AI_TRACE_CONTEXT_PROPAGATION_INCLUDE_BAGGAGE Python false Includere l'intestazione baggage nella propagazione del contesto di traccia.
AZURE_TRACING_GEN_AI_INSTRUMENT_RESPONSES_API Python true API per le risposte e le conversazioni con strumenti automatici.
AZURE_TRACING_GEN_AI_INCLUDE_BINARY_DATA Python false Includere dati di immagine e file in intervalli (non solo ID file).

* Il valore predefinito è true quando la traccia è abilitata.

Per l'elenco completo delle variabili di ambiente e del loro comportamento, vedere il README dell'SDK dei progetti di traccia di Azure AI.

Sicurezza e privacy

La tracciatura sul lato client può acquisire informazioni e dati riservati. Seguire queste procedure per ridurre i rischi:

  • Registrazione del contenuto: acquisisce gli input utente, le risposte del modello e gli argomenti di chiamata dello strumento. Disabilitare nell'ambiente di produzione, a meno che non sia necessario.
  • Propagazione dei dati: è possibile esporre informazioni personali identificabili (PII) e dati di sessione Disabilitato per impostazione predefinita.
  • Propagazione del contesto di tracciamento: Invia ID di tracciamento ai servizi di Azure. Se i requisiti di conformità impediscono la condivisione degli identificatori di traccia, disabilitarli.
  • Segreti: Non archiviare segreti, credenziali o token nei prompt, negli argomenti dello strumento o negli attributi di intervallo.
  • Controllo di accesso: considera i dati di traccia come dati di telemetria di produzione. Applicare gli stessi controlli di accesso e criteri di conservazione usati per i log e le metriche.

Risoluzione dei problemi

Problema Risoluzione
La traccia non produce intervalli Verificare che AZURE_EXPERIMENTAL_ENABLE_GENAI_TRACING sia impostato su trueprima di chiamare AIProjectInstrumentor().instrument() (Python) o prima di creare il provider di tracer (C#).
Il contenuto del messaggio non viene visualizzato nei span Impostare OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT su true.
Le tracce non vengono visualizzate in Monitoraggio di Azure Verificare che il stringa di connessione di Application Insights sia corretto e che la risorsa sia accessibile. Verificare che l'account abbia il ruolo Lettore Log Analytics. Se le tabelle sono protette, assegnare anche Privileged Monitoring Data Reader.
Gli intervalli lato client e lato server non sono correlati (Python) Verificare che la propagazione del contesto di traccia sia abilitata e che i client OpenAI siano ottenuti tramite get_openai_client()post-strumentazione.
Le tracce appaiono con ritardo Le tracce richiedono in genere 2-5 minuti per essere visualizzate nel portale di Foundry e Monitoraggio di Azure. Attendere e aggiornare.