Adicionar rastreamento do lado do cliente a agentes do Foundry (versão prévia)

Importante

Os itens marcados como visualização neste artigo estão atualmente em versão prévia. Esta versão prévia é fornecida sem um contrato de nível de serviço (SLA), e a Microsoft não a recomenda para cargas de trabalho de produção. Alguns recursos podem não ter suporte ou ter recursos restritos. Para obter mais informações, consulte Supplemental Terms of Use for Microsoft Azure Previews.

O Microsoft Foundry captura automaticamente rastreamentos do lado do servidor para agentes em execução no portal. O rastreamento do lado do cliente estende essa visibilidade ao seu próprio código de aplicativo. Ao instrumentar seu aplicativo de agente com o OpenTelemetry, você pode capturar intervalos para chamadas de modelo, invocações de ferramentas e lógica personalizada , em seguida, exportá-los para Azure Monitor Application Insights, o console ou qualquer back-end de observabilidade que dê suporte ao protocolo OpenTelemetry (OTLP), como Datadog, Grafana Tempo, Jaeger ou Honeycomb.

Neste artigo, você aprenderá a:

  • Instale os pacotes de rastreamento OpenTelemetry necessários.
  • Habilitar a instrumentação de rastreamento do GenAI para aplicações de agentes.
  • Exporte rastreamentos para Azure Monitor, o console ou um back-end compatível com OTLP.
  • Habilite a gravação de conteúdo para capturar o conteúdo da mensagem.
  • Habilite a propagação de contexto de rastreamento para rastreamento distribuído (Python).
  • Rastrear funções personalizadas.

Pré-requisitos

Pré-requisitos específicos do idioma

  • Python 3.10 ou posterior.
  • O azure-ai-projects pacote versão 2.0.0 ou posterior.

Instalar pacotes de rastreamento

Instale o SDK do Microsoft Foundry, o OpenTelemetry e o exportador de Azure Monitor:

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

Para exportação somente de console ou OTLP (por exemplo, Aspire Dashboard), instale o exportador OTLP:

pip install opentelemetry-exporter-otlp

Habilitar o rastreamento do GenAI

A instrumentação de rastreamento do GenAI é um recurso de prévia experimental. Intervalos, atributos e eventos podem mudar em versões futuras. Você deve optar explicitamente por ativar o rastreamento.

Defina a variável de AZURE_EXPERIMENTAL_ENABLE_GENAI_TRACING ambiente para trueantes de chamar AIProjectInstrumentor().instrument():

import os

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

from azure.ai.projects.telemetry import AIProjectInstrumentor

# Enable instrumentation
AIProjectInstrumentor().instrument()

Se a variável não estiver definida ou não for true (sem diferenciar maiúsculas de minúsculas), a instrumentação de rastreamento não será habilitada e um aviso será registrado.

Exportar rastreamentos para Azure Monitor

Envie rastreamentos para Aplicativo Azure Insights para que eles apareçam na exibição Traces do portal do Foundry e no 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)

Referência: AIProjectClient, , DefaultAzureCredentialconfigure_azure_monitor

Nota

Para correlacionar rastreamentos com um agente específico no portal do Foundry, inclua o agent_reference com name e id em sua chamada responses.create() (conforme mostrado no exemplo de Python acima). Os traços normalmente aparecem dentro de 2 a 5 minutos.

Exportar rastreamentos para o console

A exportação de console é útil para depuração local. Os rastreamentos são impressos diretamente na saída padrão.

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

Você também pode usar o Aspire Dashboard como um visualizador compatível com OTLP local. Instale o exportador OTLP (pip install opentelemetry-exporter-otlp) e configure-o como exportador em vez de ConsoleSpanExporter.

Referência: AIProjectInstrumentor, ConsoleSpanExporter

Habilitar gravação de conteúdo

A gravação de conteúdo captura o conteúdo das mensagens e os argumentos das chamadas de ferramentas nos rastreamentos. Esses dados podem incluir informações confidenciais do usuário.

Cuidado

A gravação de conteúdo captura mensagens do usuário, argumentos de chamada de ferramenta e saídas de modelo. Habilite apenas essa configuração em ambientes de desenvolvimento. Não habilite a gravação de conteúdo em produção, a menos que seus requisitos de conformidade e privacidade permitam isso.

Defina a variável de ambiente antes da instrumentação:

import os

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

Importante

Essa variável controla a gravação apenas para rastreamentos internos. Ao usar o decorador @trace_function em suas próprias funções, todos os parâmetros e valores de retorno são sempre rastreados, independentemente dessa configuração.

Desabilitar a instrumentação automática (Python)

O SDK do Python instrumenta automaticamente as chamadas à API de Conversas e Respostas OpenAI. Para desabilitar essa instrumentação automática, defina AZURE_TRACING_GEN_AI_INSTRUMENT_RESPONSES_API como false antes de chamar AIProjectInstrumentor().instrument(). Quando desabilitado, somente intervalos personalizados explícitos são registrados.

import os

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

Rastrear dados binários (Python)

Quando a gravação de conteúdo está habilitada, o SDK rastreia IDs de arquivo e nomes de arquivo por padrão. Para incluir URLs de imagem completa (incluindo URIs de dados base64) e dados de arquivo em intervalos, defina AZURE_TRACING_GEN_AI_INCLUDE_BINARY_DATA como true.

import os

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

Aviso

Habilitar AZURE_TRACING_GEN_AI_INCLUDE_BINARY_DATA pode aumentar significativamente o tamanho da carga útil de rastreamento. Alguns back-ends de rastreamento têm limitações no tamanho máximo dos dados de intervalo. Verifique se o back-end de observabilidade dá suporte aos tamanhos de carga útil esperados antes de ativar essa configuração.

Habilitar a propagação de contexto de rastreamento (Python)

A propagação de contexto de rastreamento permite que os intervalos do lado do cliente se correlacionem com intervalos do lado do servidor do OpenAI do Azure e de outros serviços do Azure. Quando habilitado, o SDK injeta automaticamente cabeçalhos de contexto de rastreamento W3C (traceparent e tracestate) em solicitações HTTP feitas por clientes OpenAI obtidas por meio de get_openai_client().

A propagação de contexto de rastreamento é habilitada por padrão quando o rastreamento está habilitado. Para desabilitá-la, defina a variável de ambiente AZURE_TRACING_GEN_AI_ENABLE_TRACE_CONTEXT_PROPAGATION como false, ou passe o parâmetro diretamente:

from azure.ai.projects.telemetry import AIProjectInstrumentor

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

As alterações nessa configuração afetam apenas os clientes OpenAI obtidos via get_openai_client()após a alteração. Os clientes adquiridos anteriormente não são afetados.

Propagação de bagagem de controle (Python)

Por padrão, somente traceparent e tracestate cabeçalhos são propagados. Para incluir também o baggage cabeçalho, defina AZURE_TRACING_GEN_AI_TRACE_CONTEXT_PROPAGATION_INCLUDE_BAGGAGE como true.

Importante

O baggage cabeçalho pode conter pares chave-valor arbitrários, incluindo identificadores de usuário, informações de sessão ou outros dados potencialmente confidenciais. Antes de habilitar a propagação de bagagem:

  • Verifique quais dados são adicionados pelo seu aplicativo e pelas bibliotecas de terceiros à bagagem do OpenTelemetry.
  • Entenda que a bagagem é enviada para Azure OpenAI e pode ser registrada por serviços de Azure.
  • Nunca adicione informações confidenciais à bagagem quando a propagação estiver habilitada.

Nota

O SDK C# depende da propagação padrão do .NET System.Diagnostics.Activity. A injeção explícita de contexto de rastreamento por solicitação não é exposta como um recurso separado do SDK.

Rastrear funções personalizadas

Python – use o decorador @trace_function

O decorador trace_function cria um intervalo OpenTelemetry para cada chamada para sua função. Os parâmetros são registrados como code.function.parameter.<name> e o valor retornado como 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"

Para usar um nome de intervalo personalizado em vez do nome da função, passe-o como um parâmetro:

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

Os registros do decorador:

  • Parâmetros como atributos de intervalo code.function.parameter.<name>.
  • Valores de retorno como code.function.return.value.
  • Tipos com suporte: str, , int, float, boole coleções (list, , dict, tuple). set Os tipos de objeto são omitidos.

Nota

A OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT variável de ambiente não afeta o rastreamento de função personalizada. O @trace_function decorador sempre rastreia parâmetros e retorna valores.

C# — use ActivitySource manualmente

O SDK do C# não inclui um decorador de rastreamento. Use o padrão .NET ActivitySource para instrumentar suas próprias funções:

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

Registre sua fonte personalizada junto com a origem do SDK em seu provedor de rastreamento:

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

Configurar a instrumentação programaticamente (Python)

Como alternativa às variáveis de ambiente, passe os parâmetros de configuração diretamente para AIProjectInstrumentor().instrument():

from azure.ai.projects.telemetry import AIProjectInstrumentor

AIProjectInstrumentor().instrument(
    enable_content_recording=True,
    enable_trace_context_propagation=True,
    enable_baggage_propagation=False,
)
Parâmetro Equivalente à variável de ambiente Padrão
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

* O padrão é True quando o rastreamento está habilitado.

Quando um parâmetro e sua variável de ambiente correspondente são definidos, o valor do parâmetro tem prioridade.

Adicionar atributos personalizados a spans

Crie um SpanProcessor personalizado para injetar metadados, como IDs de sessão, em cada span:

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

Registre o processador com o provedor de rastreamento 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())

Controlar o comportamento de rastreamento com variáveis de ambiente

A tabela a seguir lista todas as variáveis de ambiente que você pode usar para configurar o comportamento de rastreamento:

Variável Linguagem Padrão Descrição
AZURE_EXPERIMENTAL_ENABLE_GENAI_TRACING Python, C# false Habilite a instrumentação de rastreamento do GenAI.
OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT Python, C# false Capturar o conteúdo da mensagem e os parâmetros de chamada de ferramenta.
AZURE_TRACING_GEN_AI_ENABLE_TRACE_CONTEXT_PROPAGATION Python true* Injete cabeçalhos de "Trace Context" W3C em solicitações.
AZURE_TRACING_GEN_AI_TRACE_CONTEXT_PROPAGATION_INCLUDE_BAGGAGE Python false Inclua o baggage cabeçalho na propagação de contexto de rastreamento.
AZURE_TRACING_GEN_AI_INSTRUMENT_RESPONSES_API Python true Instrumente automaticamente APIs de Respostas e Conversas.
AZURE_TRACING_GEN_AI_INCLUDE_BINARY_DATA Python false Inclua dados de imagem e arquivo em intervalos (não apenas IDs de arquivo).

* O padrão é true quando o rastreamento está habilitado.

Para obter a lista completa de variáveis de ambiente e seu comportamento, consulte Tracing in the Azure AI Projects SDK README.

Segurança e privacidade

O rastreamento do lado do cliente pode capturar informações confidenciais. Siga estas práticas para reduzir o risco:

  • Gravação de conteúdo: captura entradas do usuário, respostas de modelo e argumentos de chamada de ferramenta. Desative na produção, exceto se necessário.
  • Propagação de bagagem: pode expor PII (Informações de Identificação Pessoal) e dados de sessão. Desabilitado por padrão.
  • Propagação de contexto de rastreamento: envia IDs de rastreamento para os serviços do Azure. Se os requisitos de conformidade proibirem o compartilhamento de identificadores de rastreamento, desabilite-os.
  • Segredos: não armazene segredos, credenciais ou tokens em prompts, argumentos de ferramenta ou atributos de intervalo.
  • Controle de acesso: tratar dados de rastreamento como telemetria de produção. Aplique os mesmos controles de acesso e políticas de retenção que você usa para logs e métricas.

Solucionando problemas

Questão Resolução
O rastreamento não produz intervalos Verifique se AZURE_EXPERIMENTAL_ENABLE_GENAI_TRACING está definido como trueantes de chamar AIProjectInstrumentor().instrument() (Python) ou antes de criar o provedor de rastreamento (C#).
O conteúdo da mensagem não aparece em trechos Definir OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT como true.
Os traços não aparecem no Azure Monitor Verifique se a cadeia de conexão do Application Insights está correta e se o recurso está acessível. Verifique se sua conta tem a função Log Analytics Leitor. Se as tabelas estiverem protegidas, atribua também o Leitor de Dados de Monitoramento Privilegiado.
Os intervalos do lado do cliente e do servidor não estão correlacionados (Python) Verifique se a propagação de contexto de rastreamento está habilitada e se os clientes do OpenAI são obtidos via get_openai_client()após a instrumentação.
Os rastreamentos aparecem com um atraso Os rastreamentos geralmente levam de 2 a 5 minutos para aparecer no portal do Foundry e no Azure Monitor. Aguarde e atualize.