OTEP-0005: グローバルなSDKの初期化

OTEP-0005: グローバルなSDKの初期化 #

ステータス: 提案中

OpenTelemetry APIと実装の起動時の動作を指定します。

動機 #

OpenTelemetryは、APIとそれを実装するSDKを分離して設計されており、アプリケーションはランタイムに互換性のあるSDKを設定しバインドできます。 OpenTelemetryは、グローバルインスタンスの使用により、サードパーティーライブラリの「ゼロタッチ」計装をサポートするように設計されています。

多くのプログラミング環境では、コードのライブラリが自動で初期化され、静的なプログラム状態を初期化している間などに、メインプログラムと同時に動作を開始することが可能です。 これには次のような相反する要件があります。 (1) APIは設定可能なSDKをサポートすること。(2)サードパーティーのライブラリは設定なしでOpenTelemetryを使用できます。

解説 #

この状況に対処するには、いくつかの受け入れ可能な方法があります。 各アプローチの実現可能性は言語によって異なります。 実装は、以下の戦略のいずれかを選択しなければなりません。

サービスプロバイダー機構 #

言語がSDKコンポーネントを注入する一般的に認められた方法を提供する場合、それが優先されるべきです。 Java SPIは、最初に使用される前にグローバルSDKをロードして設定することをサポートしています。 この特性により、サービスプロバイダー機構の場合は、他にほとんど指定するものがありません。

明示的なイニシャライザ #

APIが最初に使用される前にSDKがインストールされ設定されていることを保証できない場合、Ruby issue 19で述べられているように、SDKのロードは「適切なタイミングで」ユーザーに引き渡されます。 この場合、次に説明するように、多くの要件を指定する必要があります。

要件: 明示的なイニシャライザ #

OpenTelemetryは、デフォルトの実装がノンオペレーション(すなわち、“no-op”)であることを明記しており、APIメソッド呼び出しの結果、計装のオーバーヘッドが事実上ゼロになることを要求しています。 私たちは、サードパーティーのライブラリが、インストールされる前にグローバルSDKを使用することを期待しています。

明示的なイニシャライザーメソッドは、独立した Tracer オブジェクトと Meter オブジェクトを取る必要があります(例: opentelemetry.Init(Tracer, Meter))。 SDKのインストールは1回までとします。 最初にSDKをインストールした後、明示的なイニシャライザを呼び出すと、ログコンソールに警告が表示されます。

一般的な言語では、グローバルSDKインスタンス(すなわち、TracerとMeter)の使用は、SDKがインストールされると、以下の規定で「動作を開始」しなければなりません。

Tracer #

起動時にスパンが喪失するかもしれません。

SDKがインストールされる前に開始されたスパンは回復されず、No-opスパンとして継続されます。

Meter #

起動時にメトリクスが喪失するかもしれません。

SDK がインストールされる前に初期化されたメトリクスのサブ計測オブジェクト (つまり、事前定義されたラベルを持つメトリクス) は、インストール後にグローバルSDKにリダイレクトされます。

具象型 #

キー、タグ、属性、ラベル、リソース、スパンコンテキスト、分散コンテキストは、純粋なAPIオブジェクトとして指定されるため、インストールされているSDKに依存しません。

トレードオフと緩和策 #

テストのサポート #

テストは、グローバルSDKに依存することなく実行されるべきです。

同期 #

グローバルな Tracer オブジェクトと Meter オブジェクトは、SDK がインストールされると動作を開始する必要があるため、起動時に暗黙の同期オーバーヘッドが発生します。このオーバーヘッドはSDKがインストールされると 計装を完全に無効にするために、明示的に No-op SDK をインストールすることをおすすめします。これは、このアプローチが、OpenTelemetry ライブラリを未初期化のままにするよりもオーバーヘッドが低くなるためです。

先行技術と代替技術 #

「一般的に受け入れられている」とは言えない例として、Go issue 52 を参照してください。 この例では、最初の使用前に設定可能なSDKをロードするために、Go plugin パッケージを使用しています。

未解決の問題 #

明示的なグローバルイニシャライザーには、他にどのようなオプションを渡すべきでしょうか。

「SDKがインストールされているか、それは no-op か」の公開テストは存在するでしょうか。