クライアント側トレースを Foundry エージェントに追加する (プレビュー)

重要

この記事でプレビューとしてマークされているアイテムは、現在プレビュー段階です。 このプレビューはサービス レベル アグリーメント(SLA)なしで提供されており、Microsoft はこれを運用ワークロードでの使用に推奨していません。 特定の機能がサポートされていないか、機能が制限されている可能性があります。 詳細については、「Microsoft Azure プレビューの使用条件を参照してください。

Microsoft Foundry は、ポータルで実行されているエージェントのサーバー側トレースを自動的にキャプチャします。 クライアント側トレースは、その可視性を独自のアプリケーション コードに拡張します。 OpenTelemetry を使用してエージェント アプリケーションをインストルメント化することで、モデル呼び出し、ツール呼び出し、およびカスタム ロジックのスパンをキャプチャし、それらを Azure Monitor Application Insights、コンソール、または Datadog、Grafana Tempo、Jaeger、または光ファイバーなどの OpenTelemetry プロトコル (OTLP) をサポートする可観測バックエンドにエクスポートできます。

この記事では、次の方法について説明します。

  • 必要な OpenTelemetry トレース パッケージをインストールします。
  • エージェント アプリケーションの GenAI トレース インストルメンテーションを有効にします。
  • トレースをAzure Monitor、コンソール、または OTLP 互換バックエンドにエクスポートします。
  • コンテンツの記録を有効にして、メッセージの内容をキャプチャします。
  • 分散トレース (Python) のトレース コンテキスト伝達を有効にします。
  • カスタム関数をトレースします。

前提 条件

  • Foundry プロジェクトは、Application Insights リソースが接続されています。

  • プロジェクトにデプロイされた AI モデル。 デプロイ名をメモします。

  • Azure CLIがインストールされています。 az loginを実行してサインインします。

  • Foundry プロジェクトの貢献者以上の役職。 トレースを表示するには、接続されている Application Insights リソースに Log Analytics Reader も必要です。 これらのLog Analyticsテーブルが保護されている場合は、Privileged Monitoring Data Reader も割り当てます。 詳細については、「 Foundry でのロールベースのアクセス制御」を参照してください。

  • 次の環境変数は、独自の値で設定されます。

    変数 説明
    FOUNDRY_PROJECT_ENDPOINT Foundry プロジェクト エンドポイントの URL。 Foundry ポータルのプロジェクト の [概要 ] ページで見つけます。
    FOUNDRY_MODEL_NAME プロジェクト内の AI モデルのデプロイ名。 Foundry ポータルの [モデル ] で検索します。

言語固有の前提条件

  • Python 3.10 以降。
  • azure-ai-projects パッケージ バージョン 2.0.0 以降。

トレース パッケージのインストール

Microsoft Foundry SDK、OpenTelemetry、および Azure Monitor エクスポーターをインストールします。

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

コンソール専用または OTLP エクスポート ( たとえば、アスパイア ダッシュボード) の場合は、OTLP エクスポーターをインストールします。

pip install opentelemetry-exporter-otlp

GenAI トレースを有効にする

GenAI トレース インストルメンテーションは、試験段階のプレビュー機能です。 スパン、属性、およびイベントは、将来のバージョンで変更される可能性があります。 トレースをアクティブにする前に、明示的にオプトインする必要があります。

AZURE_EXPERIMENTAL_ENABLE_GENAI_TRACINGを呼び出すtrueに、環境変数を AIProjectInstrumentor().instrument() に設定します。

import os

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

from azure.ai.projects.telemetry import AIProjectInstrumentor

# Enable instrumentation
AIProjectInstrumentor().instrument()

変数が設定されていない場合、または true されていない場合 (大文字と小文字は区別されません)、トレース インストルメンテーションは有効ではなく、警告がログに記録されます。

トレースをAzure Monitorにエクスポートする

Azure アプリケーション Insights にトレースを送信して、Foundry ポータルの Traces ビューおよび 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"]

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)

リファレンス: AIProjectClient、 DefaultAzureCredential、 configure_azure_monitor

メモ

Foundry ポータルでトレースを特定のエージェントと関連付けるために、agent_reference 呼び出しに name と id の両方にresponses.create()を含めます (上記のPythonサンプルを参照)。 トレースは通常、2 ~ 5 分以内に表示されます。

トレースをコンソールにエクスポートする

コンソールのエクスポートは、ローカル デバッグに役立ちます。 トレースは標準出力に直接出力されます。

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

また、ローカル OTLP 互換ビューアーとして 、アスパイア ダッシュボード を使用することもできます。 OTLP エクスポーター (pip install opentelemetry-exporter-otlp) をインストールし、 ConsoleSpanExporterではなくエクスポーターとして構成します。

リファレンス: AIProjectInstrumentor、ConsoleSpanExporter

コンテンツの記録を有効にする

コンテンツ記録は、トレース内のメッセージの内容とツール呼び出し引数をキャプチャします。 このデータには、機密性の高いユーザー情報が含まれる場合があります。

注意

コンテンツ記録では、ユーザー メッセージ、ツール呼び出し引数、モデル出力がキャプチャされます。 開発環境でのみこの設定を有効にします。 コンプライアンスとプライバシーの要件で許可されていない限り、運用環境でコンテンツの記録を有効にしないでください。

インストルメント化する前に環境変数を設定します。

import os

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

重要

この変数は、組み込みのトレースについてのみ記録を制御します。 独自の関数で @trace_function デコレーターを使用すると、この設定に関係なく、すべてのパラメーターと戻り値が常にトレースされます。

自動インストルメンテーションを無効にする (Python)

Python SDK は、OpenAI 応答と Conversations API 呼び出しを自動的にインストルメント化します。 この自動インストルメンテーションを無効にするには、AZURE_TRACING_GEN_AI_INSTRUMENT_RESPONSES_APIを呼び出す前に、falseを AIProjectInstrumentor().instrument() に設定します。 無効にすると、明示的なカスタム スパンのみが記録されます。

import os

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

バイナリ データのトレース (Python)

コンテンツの記録が有効になっている場合、SDK は既定でファイル ID とファイル名をトレースします。 完全なイメージ URL (base64 データ URI を含む) とファイル データをスパンに含めるには、 AZURE_TRACING_GEN_AI_INCLUDE_BINARY_DATA を true に設定します。

import os

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

警告

AZURE_TRACING_GEN_AI_INCLUDE_BINARY_DATAを有効にすると、トレース ペイロードのサイズが大幅に増加する可能性があります。 一部のトレース バックエンドには、スパン データの最大サイズに制限があります。 この設定を有効にする前に、監視バックエンドで予想されるペイロード サイズがサポートされていることを確認します。

トレース コンテキスト伝達を有効にする (Python)

トレース コンテキスト伝達を使用すると、クライアント側のスパンを、Azure OpenAI やその他のAzure サービスからのサーバー側スパンと関連付けることができます。 有効にすると、SDK は W3C トレース コンテキスト ヘッダー (traceparent と tracestate) を、 get_openai_client()経由で取得した OpenAI クライアントによって行われた HTTP 要求に自動的に挿入します。

トレースが有効になっている場合、トレース コンテキストの伝達は 既定で 有効になります。 無効にするには、 AZURE_TRACING_GEN_AI_ENABLE_TRACE_CONTEXT_PROPAGATION 環境変数を falseに設定するか、パラメーターを直接渡します。

from azure.ai.projects.telemetry import AIProjectInstrumentor

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

この設定の変更は、変更後get_openai_client()によって取得された OpenAI クライアントにのみ影響します。 以前に取得したクライアントは影響を受けません。

手荷物の伝播を制御する (Python)

既定では、 traceparent ヘッダーと tracestate ヘッダーのみが伝達されます。 baggage ヘッダーも含めるには、AZURE_TRACING_GEN_AI_TRACE_CONTEXT_PROPAGATION_INCLUDE_BAGGAGEを true に設定します。

重要

baggage ヘッダーには、ユーザー識別子、セッション情報、またはその他の機密データなど、任意のキーと値のペアを含めることができます。 手荷物の伝播を有効にする前に:

  • アプリケーションとサード パーティ製ライブラリが OpenTelemetry 手荷物に追加するデータを監査します。
  • 手荷物はAzure OpenAI に送信され、Azure サービスによってログに記録される可能性があることを理解してください。
  • 伝達が有効になっている場合は、手荷物に機密情報を追加しないでください。

メモ

C# SDK は、標準の .NET System.Diagnostics.Activity 伝達に依存しています。 明示的な要求ごとのトレース コンテキストの挿入は、別の SDK 機能として公開されません。

カスタム関数をトレースする

Python — @trace_function デコレーターを使用する

trace_functionデコレーターは、関数の呼び出しごとに OpenTelemetry スパンを作成します。 パラメーターは code.function.parameter.<name> として記録され、戻り値は 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"

関数名の代わりにカスタム スパン名を使用するには、パラメーターとして渡します。

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

デコレーターは記録を行います。

  • スパン属性としてのcode.function.parameter.<name>。
  • 。
  • サポートされている型: str、 int、 float、 bool、コレクション (list、 dict、 tuple、 set)。 オブジェクト型は省略されます。

メモ

OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT環境変数は、カスタム関数のトレースには影響しません。 @trace_functionデコレーターは、常にパラメーターと戻り値をトレースします。

C# — ActivitySource を手動で使用する

C# SDK にはトレース デコレーターは含まれません。 標準の .NET ActivitySource を使用して、独自の関数をインストルメント化します。

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

カスタム ソースをトレーサー プロバイダーの SDK ソースと共に登録します。

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

プログラムによるインストルメンテーションの構成 (Python)

環境変数の代わりに、構成パラメーターを AIProjectInstrumentor().instrument()に直接渡します。

from azure.ai.projects.telemetry import AIProjectInstrumentor

AIProjectInstrumentor().instrument(
    enable_content_recording=True,
    enable_trace_context_propagation=True,
    enable_baggage_propagation=False,
)
パラメーター 環境変数と同等 既定
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

* トレースが有効になっている場合、既定値は True です。

パラメーターとそれに対応する環境変数の両方が設定されている場合、パラメーター値が優先されます。

スパンにカスタム属性を追加する

セッション ID などのメタデータをすべてのスパンに挿入するカスタム SpanProcessor を作成します。

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

グローバル トレーサー プロバイダーにプロセッサを登録します。

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

環境変数を使用してトレース動作を制御する

次の表に、トレース動作の構成に使用できるすべての環境変数を示します。

変数 Language 既定 説明
AZURE_EXPERIMENTAL_ENABLE_GENAI_TRACING Python、C# false GenAI トレース インストルメンテーションを有効にします。
OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT Python、C# false メッセージの内容とツール呼び出しパラメーターをキャプチャします。
AZURE_TRACING_GEN_AI_ENABLE_TRACE_CONTEXT_PROPAGATION Python true* 要求に W3C トレース コンテキスト ヘッダーを挿入します。
AZURE_TRACING_GEN_AI_TRACE_CONTEXT_PROPAGATION_INCLUDE_BAGGAGE Python false トレース コンテキストの伝達に baggage ヘッダーを含めます。
AZURE_TRACING_GEN_AI_INSTRUMENT_RESPONSES_API Python true 応答と会話 API を自動インストルメント化します。
AZURE_TRACING_GEN_AI_INCLUDE_BINARY_DATA Python false 画像とファイルのデータをスパンに含めます (ファイル ID だけでなく)。

* トレースが有効になっている場合、既定値は true です。

環境変数とその動作の完全な一覧については、「Azure AI Projects SDK README のTracing」を参照してください。

セキュリティとプライバシー

クライアント側のトレースでは、機密情報をキャプチャできます。 リスクを軽減するには、次のプラクティスに従います。

  • コンテンツ記録: ユーザー入力、モデル応答、およびツール呼び出し引数をキャプチャします。 必要な場合を除き、運用環境では無効にします。
  • 手荷物の伝播: PII とセッション データを公開できます。 既定では無効になっています。
  • Trace コンテキスト伝達: トレース ID をAzure サービスに送信します。 コンプライアンス要件でトレース識別子の共有が禁止されている場合は、無効にします。
  • シークレット: プロンプト、ツール引数、またはスパン属性にシークレット、資格情報、またはトークンを格納しないでください。
  • アクセス制御: トレース データを運用テレメトリとして扱います。 ログとメトリックに使用するのと同じアクセス制御と保持ポリシーを適用します。

トラブルシューティング

問題 解決方法
トレースによってスパンが生成されない AZURE_EXPERIMENTAL_ENABLE_GENAI_TRACING が truebeforeAIProjectInstrumentor().instrument() (Python) を呼び出すか、トレーサー プロバイダー (C#) を作成する前に設定されていることを確認します。
メッセージの内容がスパンに表示されない OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENTをtrueに設定します。
トレースがAzure Monitorに表示されない Application Insights 接続文字列が正しく、リソースにアクセス可能であることを確認します。 アカウントに Log Analytics 閲覧者ロールがあることを確認します。 テーブルが 保護されている場合は、 Privileged Monitoring Data Reader も割り当てます。
クライアント側とサーバー側のスパンは関連付けられません (Python) トレース コンテキストの伝達が有効であること、および OpenAI クライアントが get_openai_client()after インストルメンテーションを介して取得されることを確認します。
トレースが遅延して表示される トレースは通常、Foundry ポータルとAzure Monitorに表示されるまでに 2 ~ 5 分かかります。 待機して更新します。