Skip to main content
OTel スパンを Weave の新しい Agents ビューに送信するには、Weave の新しい OTel ネイティブ ワークフローを使用することをお勧めします。生の OTLP トレースデータを Weave の標準 Traces ビューに取り込む場合にのみ、このガイドを使用してください。
Weave は、専用のエンドポイントを通じた OpenTelemetry 互換のトレースデータのインポートをサポートしています。このエンドポイントを使用すると、OTLP (OpenTelemetry Protocol) 形式のトレースデータを Weave プロジェクトに直接送信できます。既存の OTel ベースのオブザーバビリティ パイプラインを置き換えることなく、OpenTelemetry 標準でアプリケーションを計装し、それらのトレースを他の Weave データとあわせて表示したい場合に、このインテグレーションを使用します。 このページでは、エンドポイントの詳細、認証、Python と TypeScript によるエンドツーエンドの例、OpenTelemetry Collector を介してトレースを転送する方法、トレースを Weave スレッドに整理する方法、および Weave が受信したスパンに適用する属性マッピングについて説明します。
このエンドポイントは Traces ビューと スレッド ビューにデータを送ります。multi-turn エージェント から Agents ビューに OTel スパンを送信するには、代わりに agents エンドポイントを使用してください。詳細は、OpenTelemetry スパンを Agents ビューに送信するを参照してください。

エンドポイント の詳細

  • 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 ヘッダーを使用してリクエストを認証し、TracerProvider のリソース属性を使用してスパンを適切な エンティティ と project にルーティングします。wandb-api-key ヘッダーに W&B APIキーを渡したうえで、TracerProvider クラスで次のキーを OpenTelemetry の Resource 属性として指定します。
  • wandb.entity: W&B のチーム名またはユーザー名。
  • wandb.project: トレースの送信先となるプロジェクト名。
次の例は、認証と project ルーティングを設定する方法を示しています。
以下の WEAVE_OTLP_ENDPOINT はローカル変数であり、OTel SDK の OTEL_EXPORTER_OTLP_ENDPOINT 環境変数ではありません。また、完全な traces パス (.../otel/v1/traces) に設定されています。これは エクスポーター の endpoint=/url: に明示的に渡されるため、SDK はその URL に対してリクエストをそのまま送信します。一方、実際の OTEL_EXPORTER_OTLP_ENDPOINT に値を export し、引数なしで エクスポーター を構築した場合 (たとえば OTLPSpanExporter()) 、SDK 側で /v1/traces が自動的に追加されます。そのため、この変数には代わりにベース URL (.../otel) を設定する必要があります。そうしないと、パスが重複して (.../otel/v1/traces/v1/traces) 、404 が発生し、スパンが黙って破棄されます。OTEL_EXPORTER_OTLP_TRACES_ENDPOINT についても同様です。こちらも SDK によって /v1/traces は追加されないため、完全な traces パスを指定する必要があります。

以下の例では、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)。
  • Logfire / Pydantic AI: Logfire の Pydantic AI 向けインストルメンテーション (gen_ai.input.messages, gen_ai.output.messages, pydantic_ai.all_messages, final_result)。
  • Langfuse: Langfuse のトレース属性 (langfuse.startTime, langfuse.endTime)。

属性のリファレンス

制限事項

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