OpenTelemetryを理解する 第3回: データソース

所要時間:約 9分
OpenTelemetry
OpenTelemetryを今すぐ始めよう
OpenTelemetry
OpenTelemetryのデータを今すぐ送信してみよう

OpenTelemetryプロジェクトには、トレース、メトリクス、ログという3つの主要なデータソースがあります。それぞれのデータソースと、関連するアプリケーションプログラミングインターフェース(API)およびソフトウェア開発キット(SDK)を見てみましょう。

OpenTelemetryにおけるトレース 

OpenTelemetry におけるトレースは、システムを介した単一のリクエストの詳細をキャプチャし、スパンと呼ばれる作業の単位から構成されます。スパンはトレース内の単一のオペレーション、またはリクエストがシステムを流れる際に、リクエストに関わる個々のサービスやコンポーネントによって行われる作業を表します。たとえば、HTTP 呼び出しやデータベース呼び出しなどです。 

トレースはスパンのツリー状になっています。各トレースにはルートスパンが含まれており、通常はリクエスト全体のエンドツーエンドのレイテンシーを記述します。オプションとして、そのサブ操作のための 1 つ以上のサブスパンを含むことができます。スパンには、スパン名、開始時刻、終了時刻、key:valueペア形式の属性のセットなどのメタデータが含まれています。

次のビデオでは、ライブラリ作成者が Trace API をどのように使用するか、簡単な例を示しています。また、サービス間でドメイン固有のデータを相関させるためのContext APIや、アプリケーション開発者がTrace SDKをどのように使用するかについても紹介しています。

トレースAPI

アプリケーションやライブラリの開発者は、トレースAPI を依存関係として追加する必要があります。OpenTelemetry トレースAPI は、tracerProvider によってインスタンス化される、スパンを作成するためのトレーサーを提供します。トレーサーによって生成された各スパンには、そのスパンを生成したライブラリのバージョン名が関連付けられます。

コンテキストAPI

スパンには、サービスの境界を越えてトレース情報をやりとりするのに必要なデータを表す、グローバルに一意な識別子(spanIDとtraceID)のセットであるスパンコンテキストが含まれます。コンテキストAPIを使用して、下流のサービスにコンテキストを伝搬し、分散トレースを作成します。ビデオで説明されているように、OpenTelemetryはW3Cトレースコンテキスト、B3、Jaegerなど、トレースコンテキストを伝播するためのさまざまな標準をサポートしています。 そうすると、OpenTelemetryとそれ以外の例えばNew Relicのようなオブザーバビリティプラットフォームとで監視しているサービスが同じ分散トレースに現れます。  

また、このコンテキストを使って、メトリクスやログをトレースに関連付けることができます。 OpenTelemetryはW3C baggage標準をサポートしているので、開発者は任意のkey:valueペアをキャプチャして、トレース、メトリクス、ログデータをリッチにすることができます。  

トレースSDK

アプリケーション開発者は、OpenTelemetryトーレスSDKを依存関係に追加する必要があります。アプリケーション開発者は、アプリケーションのニーズに合ったtracerProviderを設定することができます。これには、リソースの関連付け、サンプリングの設定、スパンプロセッサとエクスポーターのパイプラインのトレーサープロバイダへの登録が含まれます。  

  • リソースとは、アプリケーションが実行されている環境を記述する属性の集合体であり、例えば、サービス名、サービスが実行されているホスト、Kubernetes環境であれば、ノード名やポッド名などが挙げられます。 
  • サンプリングを行うことで、収集してバックエンドに送信するトレースの数を減らします。その結果、インスツルメンテーションによって生じるノイズやオーバーヘッドを抑制することができます。SDKには、すぐに使えるサンプラーがいくつか用意されており、開発者は特定のアプリケーションのニーズに基づいてサンプラーを構成することができます。トレースSDKに限らず、OpenTelemetryコレクターで追加のサンプリング(テールベースのサンプリングなど)を設定することもできます。 
  • トレーサープロバイダーにスパンプロセッサーのパイプラインとエクスポーターを登録することができます。スパンプロセッサーは、登録された順に起動され、属性でスパンをフィルタリングしたり充実させたりすることができます。バッチングプロセッサーを使用してスパンのコレクションをバッチ処理してから、エクスポーターを使用してバックエンドのオブザーバビリティプラットフォームに送信します。 

トレースデータにはアプリケーションに対する個々のリクエストについての詳細な情報が含まれていることがわかります。また、トレースデータがどのようにサンプリングされるかについても説明しました。 

OpenTelemetryにおけるメトリクス

OpenTelemetryにおけるメトリクスデータは、特定の時点でのサービスに関する測定値から取得された、測定値を集約した時系列データを表します。トレースデータと比較すると、メトリクスデータは粒度の低い情報を提供します。しかし、サービスの可用性やパフォーマンスを示すのに役立ちます。メトリクスの例としては、CPUやメモリの使用率、リクエストの継続時間、スループット、エラーレートなどがあります。

次のビデオでは、開発者がメトリクスAPIを使ってコードを計装する例を紹介しています。SDKでメータープロバイダーを実装することで、アプリケーションの計装方法とは別に、メトリクス測定を設定することができます。

メトリクスAPI

OpenTelemetryでは、メトリクスを生成する計装処理を作成するために、メータープロバイダーを初期化する必要があります。OpenTelemetryメトリクスAPIを使うと、属性の形式でメトリックにメタデータを追加することができ、それを使ってデータをファセットすることができます。 メトリクスAPIにはmeterProviderがあり、これを使ってメトリクスSDKを使ってメトリクスコレクションを構成することができます。メトリクスAPIは、特定の測定値を取得するために使用されるさまざまなタイプの計測器へのアクセスを提供します。たとえば、カウンターは時間の経過とともに加算される値です。  

OpenTelemetry メトリクスの仕様では、計測器の数が決められていますが、仕様はまだ進化中のため、近いうちに変更される可能性があります。JavaとGoは最も成熟したメトリクスPIを持っています。

メトリクスSDK

トレースSDKと同様に、メトリクスSDKはアプリケーション開発者が特定のアプリケーションのためにメータープロバイダーを構成することを可能にします。リソースを関連付けたり、メトリクスプロセッサーやエクスポーターのパイプラインを登録することができます。 

メトリクスプロセッサーは、メトリクス属性のフィルタリングやエンリッチメントに使用します。メトリクスパイプラインには、メトリクスの集約方法を示すアグリゲーターと、バックエンドのオブザーバビリティプラットフォームにデータを送信するエクスポーターも含まれます。

OpenTelemetryにおけるログ

OpenTelemetryプロジェクトの最後のデータタイプは、テレメトリーデータの中でおそらく最もシンプルな形態の一つであるログデータです。  これは構造化されたフォーマットのタイムスタンプ付きテキストレコードで、戦略的な属性によってフィルタリングすることができます。  

  • OpenTelemetryによるログデータのサポートはまだ非常に初期の段階です。  OpenTelemetryでログデータを使用するために2つの戦略が用意されています。
  • 言語ごとに存在している、既存のロギングライブラリ向けにエクスポーターを実装し、現在のトレースと関連づけるために拡張機能を利用して、ログデータに追加のコンテキストを提供する方法。

ログフォワーダーからOpenTelemetryコレクターへ送信し、バックエンドのオブザーバビリティプラットフォームにエクスポートする方法。

次のビデオでは、これら2つのアプローチのアーキテクチャ図を示しています。

OpenTelemetry オープンソースプロジェクトの 3 つの主要なデータソース(トレース、メトリクス、ログ)がどのように機能するか、基本的な理解ができたと思います。次回のブログ記事では、New Relic で OpenTelemetry のデータを扱ってみましょう。