メインコンテンツへスキップ
Weave は、専用のエンドポイントを通じた OpenTelemetry 互換のトレースデータのインポートをサポートしています。このエンドポイントを使用すると、OTLP (OpenTelemetry Protocol) 形式のトレースデータを Weave プロジェクトに直接送信できます。既存の OTel ベースのオブザーバビリティ パイプラインを置き換えることなく、OpenTelemetry 標準でアプリケーションを計装し、それらのトレースを他の Weave データとあわせて表示したい場合に、このインテグレーションを使用します。 このページでは、エンドポイントの詳細、認証、Python と TypeScript によるエンドツーエンドの例、OpenTelemetry Collector を介してトレースを転送する方法、トレースを Weave スレッドに整理する方法、および Weave が受信したスパンに適用する属性マッピングについて説明します。

エンドポイント の詳細

  • Path: /otel/v1/traces
  • Method: POST
  • Content-Type: application/x-protobuf
  • Base URL: OTelトレースエンドポイントのベースURLは、W&Bのデプロイタイプによって異なります。
  • Multi-tenant Cloud: https://trace.wandb.ai/otel/v1/traces.
  • 専用クラウドおよびセルフマネージドのインスタンス: https://<your-subdomain>.wandb.io/traces/otel/v1/traces.
<your-subdomain> は、組織固有のW&Bドメイン (例: acme.wandb.io) に置き換えてください。

認証とルーティング

Weave は、リクエストの認証に wandb-api-key ヘッダーを使用し、スパンを適切な エンティティ と project にルーティングするために TracerProvider のリソース属性を使用します。wandb-api-key ヘッダーに W&B APIキーを渡し、続けて次のキーを TracerProvider クラスの OpenTelemetry リソース属性として指定します。
  • wandb.entity: W&B のチーム名またはユーザー名。
  • wandb.project: トレースの送信先となるプロジェクト名。
次の例は、認証とプロジェクトルーティングを設定する方法を示しています。

以下の例では、Python と TypeScript を使用して OpenTelemetry トレースを Weave に送信する方法を示します。各例では、OpenInference インストルメンテーション ライブラリを使用する方法、OpenLLMetry インストルメンテーションを使用する方法、またはインストルメンテーション パッケージを使わずに OpenTelemetry SDK を直接使用する方法という、異なるアプローチを取り上げています。 以下のコード サンプルを実行する前に、次の項目を設定してください。
  • WANDB_API_KEY: これは User Settings から取得できます。
  • Entity: トレースをログできるのは、アクセス権のあるチーム / エンティティ配下の project のみです。エンティティ名を確認するには、W&B ダッシュボード にアクセスし、左サイドバーの Teams フィールドを確認してください。
  • Project name: プロジェクト名を選択してください。
  • OPENAI_API_KEY: これは OpenAI dashboard から取得できます。

OpenInference インストルメンテーション

OpenInferenceは、LLM Call を OpenTelemetry のスパンとして取得する、Arize AI のオープンソースのインストルメンテーションライブラリです。この例では、OpenAI インストルメンテーションの使い方を示します。利用可能なものはほかにも多数あり、公式リポジトリで確認できます。 まず、必要な依存関係をインストールします。
パフォーマンスに関する推奨事項: トレースを Weave に送信する際は、SimpleSpanProcessor ではなく必ず BatchSpanProcessor を使用してください。SimpleSpanProcessor は span を同期的にエクスポートするため、ほかのワークロードのパフォーマンスに影響する可能性があります。これらの例では BatchSpanProcessor を使用しています。これは span を非同期かつ効率的にバッチ処理するため、本番環境での使用が推奨されます。
openinference_example.py などの Python ファイルに、以下のコードを貼り付けます。
次のコードを実行します。

OpenLLMetry インストルメンテーション

OpenLLMetry は、Traceloop が提供するオープンソースのオブザーバビリティ ライブラリであり、一般的な LLM プロバイダやフレームワーク向けの OpenTelemetry インストルメンテーションを提供します。次の例は、OpenAI インストルメンテーションの使い方を示しています。その他の例は OpenLLMetry repository で確認できます。 まず、必要な依存関係をインストールします。
次のコードを、openllmetry_example.py などの Python ファイルに貼り付けてください。上記のコードと同じですが、OpenAIInstrumentoropeninference.instrumentation.openai ではなく opentelemetry.instrumentation.openai から import しています。
コードを実行します。

インストルメンテーションを使用しない場合

インストルメンテーションパッケージの代わりに OTel を直接使用することもできます。この方法では、各 span に設定する属性を完全に制御できます。Weave は、https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-spans/ で説明されている OpenTelemetry のセマンティック規約に従って span 属性を解析します。 まず、必要な依存関係をインストールします。
次のコードを、opentelemetry_example.py などの Python ファイルに貼り付けてください。
コードを実行します。
Weave は、トレースの解釈時にどの規約を適用するかを判断するために、スパン属性のプレフィックス gen_aiopeninference を使用します。どちらのキーも検出されない場合は、すべての スパン属性が Trace view に表示されます。トレースを選択すると、サイドパネルで スパン全体を確認できます。

OpenTelemetry Collector を使用する

上記の例では、トレースをアプリケーションから Weave に直接エクスポートしています。本番環境では、アプリケーションと Weave の間の中継役として OpenTelemetry Collector を使用できます。この collector はアプリからトレースを受信し、その後 1 つ以上のバックエンドに転送します。このパターンでは、認証、バッチ処理、ルーティングのロジックをアプリケーションコードの外部に集約でき、単一のパイプラインから複数の オブザーバビリティ バックエンドへトレースを振り分けて送信できます。

collector を設定する

このセクションでは、Docker でローカルの OpenTelemetry Collector を実行し、アプリケーションがそこにトレースを送信するよう設定する手順を説明します。次の例では、以下の方法を示します。
  • OTLP トレースを受信し、バッチ処理して Weave に転送するローカルサーバー (collector) をデプロイする Docker の設定ファイルを設定する。
  • Docker を使用して、collector をローカルで実行する。
  • Docker コンテナー内で実行中の collector にトレースを転送する、OpenAI への基本的な call を送信する。
collector を使用するには、まず OTLP トレースを受信して Weave にエクスポートするよう collector を設定する collector-config.yaml ファイルを作成します。
collector-config.yaml
この設定ファイルでは、次のことを行います。
  • ポート 4318 (HTTP) で OTLP トレースを受信します。
  • wandb-api-key ヘッダーを使ってトレースを Weave の OTLP エンドポイントにエクスポートします。エンドポイント URL は WANDB_OTLP_ENDPOINT から、APIキーは WANDB_API_KEY から読み取ります。
  • resource プロセッサを使用して wandb.entitywandb.project をリソース属性として設定します。値は DEFAULT_WANDB_ENTITYDEFAULT_WANDB_PROJECT から読み取ります。insert action は、アプリケーションコードですでにこれらの属性を設定していない場合にのみ、これらの属性を追加します。
  • ネットワーク負荷を減らすため、バッチ処理とともにエクスポーター組み込みの sending_queue を有効にします。
collector の設定を行ったら、次の Docker コマンド内の API と entity の値を更新して実行します。
collector が起動したら、OTEL_EXPORTER_OTLP_ENDPOINT 環境変数を設定して、アプリケーションがそこにトレースをエクスポートするように構成します。OTel SDK はこの変数を自動的に読み取るため、exporter にエンドポイントを渡す必要はありません。 アプリケーションの TracerProviderwandb.entity または wandb.project をリソース属性として設定すると、それらは collector の設定で定義されたデフォルトよりも優先されます。
OpenAIInstrumentor は OpenAI の Call をラップし、トレースを作成して collector にエクスポートします。collector は認証と Weave へのルーティングを処理します。 スクリプトの実行後、Weave UI でトレースを表示できます。 トレースを追加のバックエンドに送信するには、エクスポーターを追加し、それらを service.pipelines.traces.exporters リストに含めます。たとえば、同じ Collector インスタンスから Weave と Jaeger の両方にエクスポートできます。

OTel トレースをスレッドに整理する

Weave threads を使用すると、関連するトレースをグループ化して、複数ターンの会話やユーザーセッションを 1 つの単位として分析できます。特定のスパン属性を追加して OpenTelemetry トレースをスレッドに整理すると、Weave の Thread UI を使って、複数ターンの会話やユーザーセッションなどの関連する操作を分析できます。 スレッドのグループ化を有効にするには、OTel スパンに次の属性を追加します。
  • wandb.thread_id: スパンを特定のスレッドにグループ化します。
  • wandb.is_turn: スパンを会話のターンとしてマークします (スレッドビューでは行として表示されます) 。
以下の例は、OTel トレースを Weave スレッドに整理する方法を示しています。wandb.thread_id を使用して関連する操作をグループ化し、wandb.is_turn を使用してスレッドビューで行として表示される高レベルの操作をマークします。
これらの例を実行するには、この設定を使用します。
これらのトレースを送信すると、Weave UI の スレッド タブで確認できます。thread_id ごとにグループ化され、各ターンは個別の行として表示されます。

属性マッピング

Weave は、さまざまなインストルメンテーション フレームワークの OpenTelemetry span 属性を内部データモデルにマッピングします。このマッピングにより、Weave で豊富なビューを得るために既存のインストルメンテーションの属性名を変更したり変換したりする必要はありません。複数の属性名が同じフィールドに対応する場合、Weave は優先順位に従ってそれらを適用するため、同じトレース内で複数のフレームワークを共存させることができます。

対応フレームワーク

Weave は、以下のオブザーバビリティフレームワークおよび SDK の属性規約に対応しています。
  • OpenTelemetry GenAI: 生成 AI 向けの標準セマンティック規約 (gen_ai.*)。
  • OpenInference: Arize AI のインストルメンテーションライブラリ (input.value, output.value, llm.*, openinference.*)。
  • Vercel AI SDK: Vercel の AI SDK 属性 (ai.prompt, ai.response, ai.model.*, ai.usage.*)。
  • MLflow: MLflow のトラッキング属性 (mlflow.spanInputs, mlflow.spanOutputs)。
  • Traceloop: OpenLLMetry のインストルメンテーション (traceloop.entity.*, traceloop.span.kind)。
  • Google Vertex AI: Vertex AI のエージェント属性 (gcp.vertex.agent.*)。
  • OpenLit: OpenLit のオブザーバビリティ属性 (gen_ai.content.completion)。
  • Langfuse: Langfuse のトレース属性 (langfuse.startTime, langfuse.endTime)。

属性のリファレンス

制限事項

Weave UI では、Chat view で OTel trace の tool calls をレンダリングできません。代わりに、生の JSON として表示されます。