コードを変更せずにGoプロジェクトにモニタリングを追加する方法
すべてのメソッドにコンテキストを渡すのが面倒で、プロジェクトでのフルトレーシングの実装を先延ばしにした経験が何度もあったのではないでしょうか?さらに悪いことに、ソースコードを制御できないサードパーティ製のライブラリ内でリクエストパスをトレースする必要がある場合もあるでしょう。通常、このような場合、OpenTelemetry APIに対応するためにビジネスロジックの半分を書き直すか、モニタリングに「盲点」を受け入れるかのどちらかでした。
OpenTelemetryチームはこの面倒な作業を排除する方法を見つけたようです。opentelemetry-go-compile-instrumentationリポジトリは、アプリケーションのビルドプロセス中に直接テレメトリを注入するツールを提供しています。
この魔法のような仕組み
このプロジェクトはユーティリティ otelc です。標準のGoコンパイラのレイヤーとして動作します。OpenTelemetryライブラリのインポートやスパン配置を手動で行う代わりに、ツールがコンパイル時にこれを自動的に実行します。コードと依存関係の適切な箇所を見つけ出し、必要な呼び出しを挿入します。
これは単なる「自動化」ではなく、パラダイムシフトです。ビジネスタスクに集中したクリーンなコードを書くことができ、オーサバビリティはインフラストラクチャレイヤーとしての上に配置されます。
実際にはどのような場面で役立つか
ここでの主な利点は、ソースコードへの変更が完全に不要であることです。明日、モニタリングベンダーを切り替えたり、トレーシングを完全に中止したりしても、プロジェクト全体で数百ものインポートを削除する必要がありません。
ツールの注目すべき機能:
- サードパーティ製ライブラリの操作。go.modで接続された他の人のコードの奥深くからトレースを取得できます。
- 実行時のオーバーヘッドゼロ。コードはビルド時に注入されるため、プログラムは実行中に動的解析やリフレクションにリソースを費やす必要がありません。
- 柔軟な統合。ツールはCI/CDパイプラインに簡単に組み込めます。本質的には、ビルドコマンドを変更するだけです。
内部的な動作仕組み
このツールはビルドプロセスを変更します。おなじみの go build の代わりに otelc go build を使用します。内部的には、このユーティリティはコードとその依存関係の抽象構文木(AST)を分析します。事前に定義されたルール(計装ルール)に基づいて、必要なコードスニペットを注入します。
リポジトリには詳細なアーキテクチャガイドが含まれています。呼び出しの置換がどのように機能するか、新しいライブラリのルールをどのように定義するかについて詳しく知りたい場合は、 docs/ フォルダを参照してください。API設計からセマンティックコンベンションまで、すべてドキュメント化されています。
始め方
まず、ツール自体をビルドする必要があります。これはGoプロジェクトの標準的な手順です:
git clone https://github.com/open-telemetry/opentelemetry-go-compile-instrumentation.git
cd opentelemetry-go-compile-instrumentation
make build
その後、バイナリ otelc が生成されます。実際の動作を確認するには、リポジトリからデモアプリケーションを実行できます。プロセス全体は次の1つのコマンドに集約されます:
cd demo/app/basic
../../otelc go build
./basic
すべてが順調に進めば、アプリケーションはテレメトリデータの生成を開始しますが、ソースコードにはOpenTelemetryの言及が1つも見つからないでしょう。
誰が恩恵を受けるか
このプロジェクトは、レガシーシステムや手動のトレーシング実装に数ヶ月かかるような大規模なモノリス保守者にとって優れたツールのようです。また、コードをインフラストラクチャの依存関係から「クリーン」に保ちたいチームにとっても救世主となります。
ただし、プロジェクトでは計装ルールの仕組みを理解する必要があります。標準ルールでカバーされていない特定のニーズがある場合は、YAML設定を掘り下げ、独自のフックを作成する必要があるかもしれません。
コンテキストやスパンに関するボイラープレートにうんざりしているなら、ぜひこのツールを試してみる価値があります。これは、モダンな開発者体験が目指すべき方向への一歩です:オブザーバビリティのような複雑なものが「箱から出してすぐに」動作し、コード記述の邪魔にならない状態を実現します。
関連プロジェクト