VS Codeのエージェントモードを拡張するには、を試してください!

AI Toolkitでのトレース

AI Toolkitは、AIアプリケーションのパフォーマンスを監視および分析するのに役立つトレース機能を提供します。生成AIモデルとのやり取りを含むAIアプリケーションの実行をトレースして、その動作とパフォーマンスに関する洞察を得ることができます。

AI Toolkitは、トレースデータを収集するためのローカルHTTPおよびgRPCサーバーをホストします。コレクターサーバーはOTLP(OpenTelemetry Protocol)と互換性があり、ほとんどの言語モデルSDKはOTLPを直接サポートするか、それをサポートするための非Microsoftインストルメンテーションライブラリを持っています。AI Toolkitを使用して、収集されたインストルメンテーションデータを視覚化します。

OTLPをサポートし、生成AIシステムのセマンティック規則に従うすべてのフレームワークまたはSDKがサポートされています。次の表に、互換性がテストされた一般的なAI SDKを示します。

Azure AI Inference Azure AI Foundry Agents Service Anthropic Gemini LangChain OpenAI SDK OpenAI Agents SDK
Python ✅ (traceloop)1,2 ✅ (LangSmith)1,2 ✅ (opentelemetry-python-contrib)1 ✅ (Logfire)1,2
TS/JS ✅ (traceloop)1,2 ✅ (traceloop)1,2 ✅ (traceloop)1,2
  1. 括弧内のSDKは、公式SDKがOTLPをサポートしていないため、OTLPサポートを追加する非Microsoftツールです。
  2. これらのツールは、生成AIシステムに対するOpenTelemetryのルールを完全に遵守していません。

トレースを開始する方法

  1. ツリービューでトレースを選択して、トレースウェブビューを開きます。

  2. コレクターの開始ボタンを選択して、ローカルOTLPトレースコレクターサーバーを起動します。

    Screenshot showing the Start Collector button in the Tracing webview.

  3. コードスニペットでインストルメンテーションを有効にします。さまざまな言語とSDKのコードスニペットについては、「インストルメンテーションのセットアップ」セクションを参照してください。

  4. アプリを実行してトレースデータを生成します。

  5. トレースウェブビューで、更新ボタンを選択して新しいトレースデータを表示します。

    Screenshot showing the Trace List in the Tracing webview.

インストルメンテーションのセットアップ

トレースデータを収集するために、AIアプリケーションでトレースをセットアップします。以下のコードスニペットは、さまざまなSDKと言語のトレースをセットアップする方法を示しています。

プロセスはすべてのSDKで類似しています。

  • LLMまたはエージェントアプリにトレースを追加します。
  • OTLPトレースエクスポーターをセットアップして、AITKローカルコレクターを使用します。
Azure AI Inference SDK - Python

インストール

pip install opentelemetry-sdk opentelemetry-exporter-otlp-proto-http azure-ai-inference[opentelemetry]

セットアップ

import os
os.environ["AZURE_TRACING_GEN_AI_CONTENT_RECORDING_ENABLED"] = "true"
os.environ["AZURE_SDK_TRACING_IMPLEMENTATION"] = "opentelemetry"

from opentelemetry import trace, _events
from opentelemetry.sdk.resources import Resource
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.sdk._logs import LoggerProvider
from opentelemetry.sdk._logs.export import BatchLogRecordProcessor
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
from opentelemetry.sdk._events import EventLoggerProvider
from opentelemetry.exporter.otlp.proto.http._log_exporter import OTLPLogExporter

resource = Resource(attributes={
    "service.name": "opentelemetry-instrumentation-azure-ai-agents"
})
provider = TracerProvider(resource=resource)
otlp_exporter = OTLPSpanExporter(
    endpoint="https://:4318/v1/traces",
)
processor = BatchSpanProcessor(otlp_exporter)
provider.add_span_processor(processor)
trace.set_tracer_provider(provider)

logger_provider = LoggerProvider(resource=resource)
logger_provider.add_log_record_processor(
    BatchLogRecordProcessor(OTLPLogExporter(endpoint="https://:4318/v1/logs"))
)
_events.set_event_logger_provider(EventLoggerProvider(logger_provider))

from azure.ai.inference.tracing import AIInferenceInstrumentor
AIInferenceInstrumentor().instrument(True)
Azure AI Inference SDK - TypeScript/JavaScript

インストール

npm install @azure/opentelemetry-instrumentation-azure-sdk @opentelemetry/api @opentelemetry/exporter-trace-otlp-proto @opentelemetry/instrumentation @opentelemetry/resources @opentelemetry/sdk-trace-node

セットアップ

const { context } = require('@opentelemetry/api');
const { resourceFromAttributes } = require('@opentelemetry/resources');
const {
  NodeTracerProvider,
  SimpleSpanProcessor
} = require('@opentelemetry/sdk-trace-node');
const { OTLPTraceExporter } = require('@opentelemetry/exporter-trace-otlp-proto');

const exporter = new OTLPTraceExporter({
  url: 'https://:4318/v1/traces'
});
const provider = new NodeTracerProvider({
  resource: resourceFromAttributes({
    'service.name': 'opentelemetry-instrumentation-azure-ai-inference'
  }),
  spanProcessors: [new SimpleSpanProcessor(exporter)]
});
provider.register();

const { registerInstrumentations } = require('@opentelemetry/instrumentation');
const {
  createAzureSdkInstrumentation
} = require('@azure/opentelemetry-instrumentation-azure-sdk');

registerInstrumentations({
  instrumentations: [createAzureSdkInstrumentation()]
});
Azure AI Foundry Agent Service - Python

インストール

pip install opentelemetry-sdk opentelemetry-exporter-otlp-proto-http azure-ai-inference[opentelemetry]

セットアップ

import os
os.environ["AZURE_TRACING_GEN_AI_CONTENT_RECORDING_ENABLED"] = "true"
os.environ["AZURE_SDK_TRACING_IMPLEMENTATION"] = "opentelemetry"

from opentelemetry import trace, _events
from opentelemetry.sdk.resources import Resource
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.sdk._logs import LoggerProvider
from opentelemetry.sdk._logs.export import BatchLogRecordProcessor
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
from opentelemetry.sdk._events import EventLoggerProvider
from opentelemetry.exporter.otlp.proto.http._log_exporter import OTLPLogExporter

resource = Resource(attributes={
    "service.name": "opentelemetry-instrumentation-azure-ai-agents"
})
provider = TracerProvider(resource=resource)
otlp_exporter = OTLPSpanExporter(
    endpoint="https://:4318/v1/traces",
)
processor = BatchSpanProcessor(otlp_exporter)
provider.add_span_processor(processor)
trace.set_tracer_provider(provider)

logger_provider = LoggerProvider(resource=resource)
logger_provider.add_log_record_processor(
    BatchLogRecordProcessor(OTLPLogExporter(endpoint="https://:4318/v1/logs"))
)
_events.set_event_logger_provider(EventLoggerProvider(logger_provider))

from azure.ai.agents.telemetry import AIAgentsInstrumentor
AIAgentsInstrumentor().instrument(True)
Azure AI Foundry Agent Service - TypeScript/JavaScript

インストール

npm install @azure/opentelemetry-instrumentation-azure-sdk @opentelemetry/api @opentelemetry/exporter-trace-otlp-proto @opentelemetry/instrumentation @opentelemetry/resources @opentelemetry/sdk-trace-node

セットアップ

const { context } = require('@opentelemetry/api');
const { resourceFromAttributes } = require('@opentelemetry/resources');
const {
  NodeTracerProvider,
  SimpleSpanProcessor
} = require('@opentelemetry/sdk-trace-node');
const { OTLPTraceExporter } = require('@opentelemetry/exporter-trace-otlp-proto');

const exporter = new OTLPTraceExporter({
  url: 'https://:4318/v1/traces'
});
const provider = new NodeTracerProvider({
  resource: resourceFromAttributes({
    'service.name': 'opentelemetry-instrumentation-azure-ai-inference'
  }),
  spanProcessors: [new SimpleSpanProcessor(exporter)]
});
provider.register();

const { registerInstrumentations } = require('@opentelemetry/instrumentation');
const {
  createAzureSdkInstrumentation
} = require('@azure/opentelemetry-instrumentation-azure-sdk');

registerInstrumentations({
  instrumentations: [createAzureSdkInstrumentation()]
});
Anthropic - Python

インストール

pip install opentelemetry-sdk opentelemetry-exporter-otlp-proto-http opentelemetry-instrumentation-anthropic

セットアップ

from opentelemetry import trace, _events
from opentelemetry.sdk.resources import Resource
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.sdk._logs import LoggerProvider
from opentelemetry.sdk._logs.export import BatchLogRecordProcessor
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
from opentelemetry.sdk._events import EventLoggerProvider
from opentelemetry.exporter.otlp.proto.http._log_exporter import OTLPLogExporter

resource = Resource(attributes={
    "service.name": "opentelemetry-instrumentation-anthropic-traceloop"
})
provider = TracerProvider(resource=resource)
otlp_exporter = OTLPSpanExporter(
    endpoint="https://:4318/v1/traces",
)
processor = BatchSpanProcessor(otlp_exporter)
provider.add_span_processor(processor)
trace.set_tracer_provider(provider)

logger_provider = LoggerProvider(resource=resource)
logger_provider.add_log_record_processor(
    BatchLogRecordProcessor(OTLPLogExporter(endpoint="https://:4318/v1/logs"))
)
_events.set_event_logger_provider(EventLoggerProvider(logger_provider))

from opentelemetry.instrumentation.anthropic import AnthropicInstrumentor
AnthropicInstrumentor().instrument()
Anthropic - TypeScript/JavaScript

インストール

npm install @traceloop/node-server-sdk

セットアップ

const { initialize } = require('@traceloop/node-server-sdk');
const { trace } = require('@opentelemetry/api');

initialize({
  appName: 'opentelemetry-instrumentation-anthropic-traceloop',
  baseUrl: 'https://:4318',
  disableBatch: true
});
Google Gemini - Python

インストール

pip install opentelemetry-sdk opentelemetry-exporter-otlp-proto-http opentelemetry-instrumentation-google-genai

セットアップ

from opentelemetry import trace, _events
from opentelemetry.sdk.resources import Resource
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.sdk._logs import LoggerProvider
from opentelemetry.sdk._logs.export import BatchLogRecordProcessor
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
from opentelemetry.sdk._events import EventLoggerProvider
from opentelemetry.exporter.otlp.proto.http._log_exporter import OTLPLogExporter

resource = Resource(attributes={
    "service.name": "opentelemetry-instrumentation-google-genai"
})
provider = TracerProvider(resource=resource)
otlp_exporter = OTLPSpanExporter(
    endpoint="https://:4318/v1/traces",
)
processor = BatchSpanProcessor(otlp_exporter)
provider.add_span_processor(processor)
trace.set_tracer_provider(provider)

logger_provider = LoggerProvider(resource=resource)
logger_provider.add_log_record_processor(
    BatchLogRecordProcessor(OTLPLogExporter(endpoint="https://:4318/v1/logs"))
)
_events.set_event_logger_provider(EventLoggerProvider(logger_provider))

from opentelemetry.instrumentation.google_genai import GoogleGenAiSdkInstrumentor
GoogleGenAiSdkInstrumentor().instrument(enable_content_recording=True)
LangChain - Python

インストール

pip install langsmith[otel]

セットアップ

import os
os.environ["LANGSMITH_OTEL_ENABLED"] = "true"
os.environ["LANGSMITH_TRACING"] = "true"
os.environ["OTEL_EXPORTER_OTLP_ENDPOINT"] = "https://:4318"
LangChain - TypeScript/JavaScript

インストール

npm install @traceloop/node-server-sdk

セットアップ

const { initialize } = require('@traceloop/node-server-sdk');
initialize({
  appName: 'opentelemetry-instrumentation-langchain-traceloop',
  baseUrl: 'https://:4318',
  disableBatch: true
});
OpenAI - Python

インストール

pip install opentelemetry-sdk opentelemetry-exporter-otlp-proto-http opentelemetry-instrumentation-openai-v2

セットアップ

from opentelemetry import trace, _events
from opentelemetry.sdk.resources import Resource
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.sdk._logs import LoggerProvider
from opentelemetry.sdk._logs.export import BatchLogRecordProcessor
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
from opentelemetry.sdk._events import EventLoggerProvider
from opentelemetry.exporter.otlp.proto.http._log_exporter import OTLPLogExporter
from opentelemetry.instrumentation.openai_v2 import OpenAIInstrumentor

# Set up resource
resource = Resource(attributes={
    "service.name": "opentelemetry-instrumentation-openai"
})

# Set up tracer provider
trace.set_tracer_provider(TracerProvider(resource=resource))

# Configure OTLP exporter
otlp_exporter = OTLPSpanExporter(
    endpoint="https://:4318/v1/traces"
)

# Add span processor
trace.get_tracer_provider().add_span_processor(
    BatchSpanProcessor(otlp_exporter)
)

# Set up logger provider
logger_provider = LoggerProvider(resource=resource)
logger_provider.add_log_record_processor(
    BatchLogRecordProcessor(OTLPLogExporter(endpoint="https://:4318/v1/logs"))
)
_events.set_event_logger_provider(EventLoggerProvider(logger_provider))

# Enable OpenAI instrumentation
OpenAIInstrumentor().instrument()
OpenAI - TypeScript/JavaScript

インストール

npm install @traceloop/instrumentation-openai @traceloop/node-server-sdk

セットアップ

const { initialize } = require('@traceloop/node-server-sdk');
initialize({
  appName: 'opentelemetry-instrumentation-openai-traceloop',
  baseUrl: 'https://:4318',
  disableBatch: true
});
OpenAI Agents SDK - Python

インストール

pip install logfire

セットアップ

import logfire
import os

os.environ["OTEL_EXPORTER_OTLP_TRACES_ENDPOINT"] = "https://:4318/v1/traces"

logfire.configure(
    service_name="opentelemetry-instrumentation-openai-agents-logfire",
    send_to_logfire=False,
)
logfire.instrument_openai_agents()

例: Azure AI Inference SDKでトレースをセットアップする

以下のエンドツーエンドの例では、PythonでAzure AI Inference SDKを使用し、トレースプロバイダーとインストルメンテーションをセットアップする方法を示しています。

前提条件

この例を実行するには、以下の前提条件が必要です。

開発環境のセットアップ

以下の手順を使用して、この例を実行するために必要なすべての依存関係を含む事前設定された開発環境をデプロイします。

  1. GitHubパーソナルアクセストークンの設定

    無料のGitHub モデルをモデルの例として使用します。

    GitHub 開発者設定を開き、新しいトークンを生成を選択します。

    重要

    トークンにはmodels:readのアクセス許可が必要です。そうでない場合、認証エラーが返されます。トークンはMicrosoftサービスに送信されます。

  2. 環境変数の作成

    以下のいずれかのコードスニペットを使用して、トークンをクライアントコードのキーとして設定するための環境変数を作成します。<your-github-token-goes-here>を実際のGitHubトークンに置き換えてください。

    bash

    export GITHUB_TOKEN="<your-github-token-goes-here>"
    

    powershell

    $Env:GITHUB_TOKEN="<your-github-token-goes-here>"
    

    Windowsコマンドプロンプト

    set GITHUB_TOKEN=<your-github-token-goes-here>
    
  3. Pythonパッケージのインストール

    以下のコマンドは、Azure AI Inference SDKでトレースするために必要なPythonパッケージをインストールします。

    pip install opentelemetry-sdk opentelemetry-exporter-otlp-proto-http azure-ai-inference[opentelemetry]
    
  4. トレースのセットアップ

    1. プロジェクトのためにコンピューター上に新しいローカルディレクトリを作成します。

      mkdir my-tracing-app
      
    2. 作成したディレクトリに移動します。

      cd my-tracing-app
      
    3. そのディレクトリでVisual Studio Codeを開きます。

      code .
      
  5. Pythonファイルの作成

    1. my-tracing-appディレクトリに、main.pyという名前のPythonファイルを作成します。

      トレースをセットアップし、Azure AI Inference SDKとやり取りするためのコードを追加します。

    2. 以下のコードをmain.pyに追加し、ファイルを保存します。

      import os
      
      ### Set up for OpenTelemetry tracing ###
      os.environ["AZURE_TRACING_GEN_AI_CONTENT_RECORDING_ENABLED"] = "true"
      os.environ["AZURE_SDK_TRACING_IMPLEMENTATION"] = "opentelemetry"
      
      from opentelemetry import trace, _events
      from opentelemetry.sdk.resources import Resource
      from opentelemetry.sdk.trace import TracerProvider
      from opentelemetry.sdk.trace.export import BatchSpanProcessor
      from opentelemetry.sdk._logs import LoggerProvider
      from opentelemetry.sdk._logs.export import BatchLogRecordProcessor
      from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
      from opentelemetry.sdk._events import EventLoggerProvider
      from opentelemetry.exporter.otlp.proto.http._log_exporter import OTLPLogExporter
      
      github_token = os.environ["GITHUB_TOKEN"]
      
      resource = Resource(attributes={
          "service.name": "opentelemetry-instrumentation-azure-ai-inference"
      })
      provider = TracerProvider(resource=resource)
      otlp_exporter = OTLPSpanExporter(
          endpoint="https://:4318/v1/traces",
      )
      processor = BatchSpanProcessor(otlp_exporter)
      provider.add_span_processor(processor)
      trace.set_tracer_provider(provider)
      
      logger_provider = LoggerProvider(resource=resource)
      logger_provider.add_log_record_processor(
          BatchLogRecordProcessor(OTLPLogExporter(endpoint="https://:4318/v1/logs"))
      )
      _events.set_event_logger_provider(EventLoggerProvider(logger_provider))
      
      from azure.ai.inference.tracing import AIInferenceInstrumentor
      AIInferenceInstrumentor().instrument()
      ### Set up for OpenTelemetry tracing ###
      
      from azure.ai.inference import ChatCompletionsClient
      from azure.ai.inference.models import UserMessage
      from azure.ai.inference.models import TextContentItem
      from azure.core.credentials import AzureKeyCredential
      
      client = ChatCompletionsClient(
          endpoint = "https://models.inference.ai.azure.com",
          credential = AzureKeyCredential(github_token),
          api_version = "2024-08-01-preview",
      )
      
      response = client.complete(
          messages = [
              UserMessage(content = [
                  TextContentItem(text = "hi"),
              ]),
          ],
          model = "gpt-4.1",
          tools = [],
          response_format = "text",
          temperature = 1,
          top_p = 1,
      )
      
      print(response.choices[0].message.content)
      
  6. コードの実行

    1. Visual Studio Codeで新しいターミナルを開きます。

    2. ターミナルで、コマンドpython main.pyを使用してコードを実行します。

  7. AI Toolkitでトレースデータを確認する

    コードを実行してトレースウェブビューを更新すると、リストに新しいトレースが表示されます。

    トレースを選択して、トレースの詳細ウェブビューを開きます。

    Screenshot showing selecting a trace from the Trace List in the Tracing webview.

    左側のスパンツリービューで、アプリの完全な実行フローを確認します。

    右側のスパン詳細ビューでスパンを選択し、入力 + 出力タブで生成AIメッセージを確認します。

    メタデータタブを選択して、生のメタデータを表示します。

    Screenshot showing the Trace Details view in the Tracing webview.

学んだこと

この記事では、以下の方法を学びました。

  • Azure AI Inference SDKとOpenTelemetryを使用して、AIアプリケーションでトレースをセットアップする。
  • OTLPトレースエクスポーターを構成して、トレースデータをローカルコレクターサーバーに送信する。
  • アプリケーションを実行してトレースデータを生成し、AI Toolkitウェブビューでトレースを表示する。
  • PythonやTypeScript/JavaScriptなどの複数のSDKや言語、OTLPを介した非Microsoftツールでトレース機能を使用する。
  • 提供されたコードスニペットを使用して、さまざまなAIフレームワーク(Anthropic、Gemini、LangChain、OpenAIなど)をインストルメント化する。
  • コレクターの開始および更新ボタンを含むトレースウェブビューUIを使用して、トレースデータを管理する。
  • 環境変数やパッケージのインストールなど、開発環境をセットアップしてトレースを有効にする。
  • スパンツリーと詳細ビューを使用して、生成AIメッセージフローとメタデータを含むアプリの実行フローを分析する。