アプリのコードは変更しないとだめ? 2つの計装方法の違いを知る
計装には、自動計装(Automatic Instrumentation)と手動計装(Manual Instrumentation) [1] という2つの主要なアプローチがあります。
- 自動計装:既存のアプリケーションのコードに手を加えることなく行う計装手法。主に、言語別のエージェントや設定を利用することで計装を行う
- 手動計装:アプリケーションのコードに直接計装用のコードを追加する計装手法。きめ細かく計装をカスタマイズすることができる
自動計装は、アプリケーションコードへの変更が発生しないため、手始めに基本的なメトリクスやトレースデータを取得するのに適したアプローチです。ただし、利用している言語が自動計装に対応していない、使用しているライブラリなどによってはあまりテレメトリーデータが取得できない、アプリケーション固有の詳細な処理に関するテレメトリーデータをカバーできない、などといったケースがしばしば発生します。
自動計装に対応している開発言語としては、以下のようなものが挙げられます。
- .NET
- Go[2]
- Java
- JavaScript(Node.js)
- PHP
- Python
詳細は公式ページをご確認ください。
また、いくつかのライブラリやフレームワークでは、OpenTelemetryによる計装をサポートしており、迅速かつ簡単に計装ができるような仕組みを提供しています。代表的なものだと、JavaフレームワークであるSpring BootやQuarkus、Node.jsで提供されるWebアプリケーションフレームワークであるExpressやNext.jsなどが挙げられます。自動計装に対応しているライブラリやフレームワークは言語ごとに異なります(例:Javaの場合)。
自動計装に対応していない開発言語を利用している場合や、自動計装で取得されたトレースやメトリクスデータをよりきめ細やかにコントロールしたい場合には、手動計装を利用していきます。
アプリケーションのコードに手を入れることになりますが、デバッグなどのためにログ出力を追加するようなイメージで実施できるはずです。また、OpenTelemetryが提供するAPI、SDK、ライブラリを利用している限り、オブザーバビリティベンダー固有のコードが皆さんのアプリケーションに入ることはありません(ベンダー独自の計装ライブラリで計装してしまうと、アプリケーションコードがベンダーロックインの状態に陥る可能性があります)。このあたりが、OpenTelemetryを採用するメリットでもあるわけです。
対応している言語と、それぞれの実装例は公式ページに記載されています。また、言語別のOpenTelemetryプロジェクトのステータスも確認いただくことができます。Javaを参照実装として、各言語において仕様・実装の安定化に向けて開発が進められています。
計装によってアプリケーションから取得したテレメトリーデータは、OpenTelemetry Collectorに集約し、その後オブザーバビリティバックエンドに送信する構成を取るのが一般的には推奨されます。直接バックエンドにテレメトリーデータを送ることも可能ですが、データ送信のバッチ化や暗号化、センシティブデータの加工などを計装側で制御するのは大変なので、開発環境や極小規模な環境以外では避けた方が無難とされています。
[1] 「自動計装」「手動計装」という単語は従来から使用されてきた用語ですが、執筆時点(2024/09/10)におけるOpenTelemetry公式ドキュメントサイトでは「ゼロコード」「コードベース」「ライブラリ」という用語が使用されることがあります。「ゼロコード」は自動計装に、「コードベース」および「ライブラリ」が手動計装に対応するもののようです。特に「ライブラリ」は、下に述べているアプリケーションで利用しているフレームワークなどに対応するOpenTelemetryのパッケージを活用して計装を行う取り組みを指しています。本記事では引き続き「自動計装」と「手動計装」という単語を使用します。