Ajouter le traçage côté client aux agents Foundry (aperçu)

Important

Les éléments marqués comme préversion dans cet article sont actuellement en préversion. Cette préversion est fournie sans contrat de niveau de service et Microsoft ne le recommande pas pour les charges de travail de production. Certaines fonctionnalités peuvent ne pas être prises en charge ou avoir des fonctionnalités contraintes. Pour plus d’informations, consultez Conditions d'utilisation supplémentaires pour les versions préliminaires de Microsoft Azure.

Microsoft Foundry capture automatiquement les traces côté serveur pour les agents s’exécutant dans le portail. Le suivi côté client étend cette visibilité dans votre propre code d’application. En instrumentant votre application agent avec OpenTelemetry, vous pouvez capturer des étendues pour les appels de modèle, les appels d’outils et la logique personnalisée, puis les exporter vers Azure Monitor Application Insights, la console ou tout back-end d’observabilité prenant en charge le protocole OpenTelemetry (OTLP), tel que Datadog, Grafana Tempo, Jaeger ou Honeycomb.

Dans cet article, vous allez apprendre à :

  • Installez les packages de suivi OpenTelemetry requis.
  • Activez l’instrumentation de suivi GenAI pour les applications d’agent.
  • Exportez des traces vers Azure Monitor, la console ou un back-end compatible OTLP.
  • Activez l’enregistrement de contenu pour capturer le contenu du message.
  • Activez la propagation du contexte de trace pour le suivi distribué (Python).
  • Tracez les fonctions personnalisées.

Conditions préalables

  • Projet Foundry avec une ressource Application Insights connectée.

  • Modèle IA déployé sur le projet. Notez le nom du déploiement.

  • Azure CLI installé. Connectez-vous en exécutant az login.

  • Rôle contributeur ou supérieur sur le projet Foundry. Pour afficher les traces, vous avez également besoin de Log Analytics Lecteurs sur la ressource Application Insights connectée. Si ces tables Log Analytics sont protégées, affectez également privileged Monitoring Data Reader. Pour plus d’informations, consultez Contrôle d’accès en fonction du rôle dans Foundry.

  • Les variables d’environnement suivantes sont définies avec vos propres valeurs :

    Variable Description
    FOUNDRY_PROJECT_ENDPOINT URL du point de terminaison de votre projet Foundry. Recherchez-le dans la page Vue d’ensemble du projet dans le portail Foundry.
    FOUNDRY_MODEL_NAME Nom de déploiement d’un modèle IA dans votre projet. Recherchez-le sous Modèles dans le portail Foundry.

Conditions préalables spécifiques à la langue

  • Python 3.10 ou version ultérieure.
  • La version azure-ai-projects du paquet 2.0.0 ou ultérieure.

Installer des packages de suivi

Installez le SDK Microsoft Foundry, OpenTelemetry et l’exportateur Azure Monitor :

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

Pour l’exportation de console uniquement ou OTLP (par exemple, Aspire Dashboard), installez l’exportateur OTLP :

pip install opentelemetry-exporter-otlp

Activer le suivi GenAI

L’instrumentation de traçage GenAI est une fonctionnalité en préversion expérimentale. Les étendues, les attributs et les événements sont susceptibles de changer dans les versions futures. Vous devez vous inscrire explicitement avant l'activation du traçage.

Définissez la variable d’environnement sur AZURE_EXPERIMENTAL_ENABLE_GENAI_TRACINGtrue d’appeler AIProjectInstrumentor().instrument() :

import os

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

from azure.ai.projects.telemetry import AIProjectInstrumentor

# Enable instrumentation
AIProjectInstrumentor().instrument()

Si la variable n’est pas définie ou n’est pas true (totalement insensible à la casse), l'instrumentation de traçage ne s'active pas et un avertissement est enregistré.

Exporter des traces vers Azure Monitor

Envoyez des traces à Azure Application Insights afin qu'elles apparaissent dans la vue Traces du portail Foundry et dans Azure Monitor.

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"]
AGENT_NAME = "MyAgent"

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"):
        # Create an agent
        agent = project.agents.create_version(
            agent_name=AGENT_NAME,
            definition=PromptAgentDefinition(
                model=os.environ["FOUNDRY_MODEL_NAME"],
                instructions="You are a helpful assistant.",
            ),
        )
        print(f"Agent created (id: {agent.id}, name: {agent.name})")

        with project.get_openai_client(agent_name=agent.name) as openai:
            # Create a conversation and get a response
            conversation = openai.conversations.create()
            response = openai.responses.create(
                conversation=conversation.id,
                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)

Référence : AIProjectClient, , DefaultAzureCredentialconfigure_azure_monitor

Note

Pour mettre en corrélation les traces avec un agent spécifique dans le portail Foundry, incluez le agent_reference avec name et id dans votre appel responses.create() (comme indiqué dans l’exemple de Python ci-dessus). Les traces apparaissent généralement dans les 2 à 5 minutes.

Exporter des traces vers la console

L’export de console est utile pour le débogage local. Les traces sont imprimées directement sur la sortie 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__)

Vous pouvez également utiliser Le tableau de bord Aspire comme visionneuse compatible OTLP locale. Installez l’exportateur OTLP (pip install opentelemetry-exporter-otlp) et configurez-le en tant qu’exportateur au lieu de ConsoleSpanExporter.

Référence : AIProjectInstrumentor, ConsoleSpanExporter

Activer l’enregistrement de contenu

L’enregistrement du contenu capture le contenu des messages et les arguments d’appel d’outils dans les traces. Ces données peuvent inclure des informations utilisateur sensibles.

Attention

L’enregistrement de contenu capture les messages utilisateur, les arguments d’appel d’outil et les sorties de modèle. Activez uniquement ce paramètre dans les environnements de développement. N’activez pas l’enregistrement de contenu en production, sauf si vos exigences de conformité et de confidentialité l’autorisent.

Définissez la variable d’environnement avant d’instrumenter :

import os

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

Important

Cette variable contrôle l’enregistrement uniquement pour les traces intégrées. Lorsque vous utilisez le @trace_function décorateur sur vos propres fonctions, tous les paramètres et valeurs de retour sont toujours suivis indépendamment de ce paramètre.

Désactiver l’instrumentation automatique (Python)

Le sdk Python instrumente automatiquement les appels d’API Réponses et Conversations OpenAI. Pour désactiver cette instrumentation automatique, définissez AZURE_TRACING_GEN_AI_INSTRUMENT_RESPONSES_API à false avant d’appeler AIProjectInstrumentor().instrument(). Lorsque désactivé, seules les portées personnalisées explicites sont enregistrées.

import os

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

Tracer des données binaires (Python)

Lorsque l’enregistrement de contenu est activé, le SDK trace les ID de fichier et les noms de fichiers par défaut. Pour inclure des URL d’image complètes (y compris des URI de données base64) et des données de fichier dans des balises, définissez AZURE_TRACING_GEN_AI_INCLUDE_BINARY_DATA sur true.

import os

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

Avertissement

L’activation AZURE_TRACING_GEN_AI_INCLUDE_BINARY_DATA peut augmenter considérablement la taille de la charge utile de trace. Certains back-ends de traçage ont des limitations quant à la taille maximale des données de portée. Vérifiez que votre back-end d’observabilité prend en charge les tailles de charge utile attendues avant d’activer ce paramètre.

Activer la propagation du contexte de trace (Python)

La propagation du contexte de trace permet aux étendues côté client de mettre en corrélation les étendues côté serveur de Azure OpenAI et d’autres services Azure. Lorsqu’il est activé, le SDK injecte automatiquement des en-têtes de contexte de trace W3C (traceparent et tracestate) dans les requêtes HTTP effectuées par les clients OpenAI obtenus via get_openai_client().

La propagation du contexte de trace est activée par défaut lorsque le suivi est activé. Pour le désactiver, définissez la variable d’environnement AZURE_TRACING_GEN_AI_ENABLE_TRACE_CONTEXT_PROPAGATION sur false, ou transmettez le paramètre directement :

from azure.ai.projects.telemetry import AIProjectInstrumentor

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

Les modifications apportées à ce paramètre affectent uniquement les clients OpenAI obtenus get_openai_client()après la modification. Les clients précédemment acquis ne sont pas affectés.

Contrôle de la propagation des données (Python)

Par défaut, seuls les en-têtes traceparent et tracestate sont propagés. Pour inclure également l'en-tête baggage, configurez AZURE_TRACING_GEN_AI_TRACE_CONTEXT_PROPAGATION_INCLUDE_BAGGAGE sur true.

Important

L’en-tête baggage peut contenir des paires clé-valeur arbitraires, notamment des identificateurs utilisateur, des informations de session ou d’autres données potentiellement sensibles. Avant d’activer la propagation des bagages :

  • Vérifiez les données que votre application et vos bibliothèques tierces ajoutent au contexte OpenTelemetry.
  • Comprenez que les bagages sont envoyés à Azure OpenAI et peuvent être enregistrés par Azure services.
  • N’ajoutez jamais d’informations sensibles aux bagages lorsque la propagation est activée.

Note

Le SDK C# s’appuie sur la propagation standard .NET System.Diagnostics.Activity. L'injection explicite du contexte de trace par requête n'est pas exposée en tant que fonctionnalité distincte du SDK.

Tracer des fonctions personnalisées

Python : utilisez le décorateur @trace_function

Le trace_function décorateur crée un span OpenTelemetry pour chaque appel à votre fonction. Les paramètres sont enregistrés sous code.function.parameter.<name> et la valeur de retour sous 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"

Pour utiliser un nom d’étendue personnalisé au lieu du nom de la fonction, passez-le en tant que paramètre :

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

Les enregistrements du décorateur :

  • Paramètres comme attributs code.function.parameter.<name> de portée.
  • Retourne des valeurs en tant que code.function.return.value.
  • Types pris en charge : str, , intfloat, boolet collections (list, dict, tuple, set). Les types d’objets sont omis.

Note

La variable d'environnement OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT n'affecte pas le suivi de fonction personnalisé. Le @trace_function décorateur trace toujours les paramètres et les valeurs de retour.

C# : utiliser ActivitySource manuellement

Le Kit de développement logiciel (SDK) C# n’inclut pas de décorateur de suivi. Utilisez la .NET ActivitySource standard pour instrumenter vos propres fonctions :

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

Inscrivez votre source personnalisée en même temps que la source du Kit de développement logiciel (SDK) dans votre fournisseur de suivi :

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

Configurer l’instrumentation par programmation (Python)

En guise d’alternative aux variables d’environnement, transmettez directement les paramètres de configuration à AIProjectInstrumentor().instrument():

from azure.ai.projects.telemetry import AIProjectInstrumentor

AIProjectInstrumentor().instrument(
    enable_content_recording=True,
    enable_trace_context_propagation=True,
    enable_baggage_propagation=False,
)
Paramètre Équivalent de variable d’environnement Par défaut
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

* La valeur par défaut est True lorsque le suivi est activé.

Lorsqu’un paramètre et sa variable d’environnement correspondante sont définis, la valeur du paramètre est prioritaire.

Ajouter des attributs personnalisés aux spans

Créez un code personnalisé SpanProcessor pour injecter des métadonnées telles que des ID de session dans chaque étendue :

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

Inscrivez le processeur auprès du fournisseur de suivi global :

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

Contrôler le comportement de suivi avec des variables d’environnement

Le tableau suivant répertorie toutes les variables d’environnement que vous pouvez utiliser pour configurer le comportement de suivi :

Variable Langue Par défaut Description
AZURE_EXPERIMENTAL_ENABLE_GENAI_TRACING Python, C# false Activez l’instrumentation de suivi GenAI.
OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT Python, C# false Capturez le contenu du message et les paramètres d’appel d’outil.
AZURE_TRACING_GEN_AI_ENABLE_TRACE_CONTEXT_PROPAGATION Python true* Injectez les en-têtes de contexte de traçage W3C dans les requêtes.
AZURE_TRACING_GEN_AI_TRACE_CONTEXT_PROPAGATION_INCLUDE_BAGGAGE Python false Incluez l'en-tête baggage dans la propagation du contexte de trace.
AZURE_TRACING_GEN_AI_INSTRUMENT_RESPONSES_API Python true Auto-instrumentation des API de réponses et de conversations.
AZURE_TRACING_GEN_AI_INCLUDE_BINARY_DATA Python false Incluez des données d'image et de fichier dans des plages (pas seulement des ID de fichier).

* La valeur par défaut est true lorsque le suivi est activé.

Pour obtenir la liste complète des variables d’environnement et de leur comportement, consultez Tracing dans le fichier README du SDK Azure AI Projects README.

Sécurité et confidentialité

Le suivi côté client peut capturer des informations sensibles. Suivez ces pratiques pour réduire les risques :

  • Enregistrement de contenu : capture les entrées utilisateur, les réponses de modèle et les arguments d’appel d’outil. Désactivez en production, sauf si cela est nécessaire.
  • Propagation des bagages : peut exposer des données d’identification personnelle et de session. Désactivé par défaut.
  • Propagation du contexte de trace: envoie des identifiants de trace aux services Azure. Si les exigences de conformité interdisent le partage d’identificateurs de trace, désactivez-la.
  • Informations sensibles : Ne stockez pas les secrets, les identifiants ou les jetons dans des invites, des arguments d'outil ou des attributs d'étendue.
  • Contrôle d’accès : traitez les données de trace comme des données de télémétrie de production. Appliquez les mêmes contrôles d’accès et stratégies de rétention que vous utilisez pour les journaux et les métriques.

Dépannage

Problème Résolution
Le traçage ne produit aucun segment Vérifiez que AZURE_EXPERIMENTAL_ENABLE_GENAI_TRACING est défini sur trueavant d'appeler AIProjectInstrumentor().instrument() (Python) ou avant de créer le fournisseur de suivi (C#).
Le contenu du message n’apparaît pas dans les étendues Définissez OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT sur true.
Les traces n'apparaissent pas dans Azure Monitor Vérifiez que la chaîne de connexion Application Insights est correcte et que la ressource est accessible. Vérifiez que votre compte a le rôle lecteur Log Analytics. Si les tables sont protégées, attribuez également un lecteur de données de surveillance privilégié.
Les étendues côté client et côté serveur ne sont pas corrélées (Python) Vérifiez que la propagation du contexte de trace est activée et que les clients OpenAI sont obtenus via get_openai_client()après l'instrumentation.
Les traces apparaissent avec un délai Les traces prennent généralement 2 à 5 minutes pour apparaître dans le portail Foundry et Azure Monitor. Attendez et actualisez.