これは何
OpenTelemetryのTracingについて理解するため,JavaScriptで実装されたアプリケーションに対するauto instrumentationにおいて以下について調査した結果をまとめる記事です.
- Auto instrumentationの実行方法
- Auto instrumentationの実装
まとめ
node
コマンドの--require
flagを用いてアプリケーションの実行前にInstrumentationを行っている- 内部ではhogehoge
node
コマンド実行 -> instrumentationまでの流れは以下のようになっています(ノードをクリックすることで実装リポジトリに遷移できます)
graph LR node["node --require @opentelemetry/auto-instrumentations-node/register app.js"] reg["register.ts(Auto instrumentationのエントリーポイント)"] contrib["https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/plugins/node"] experimental["https://github.com/open-telemetry/opentelemetry-js/tree/v1.25.1/experimental/packages"] node --> reg reg --> contrib reg--> experimental click reg href "https://github.com/open-telemetry/opentelemetry-js-contrib/blob/main/metapackages/auto-instrumentations-node/src/register.ts" click contrib href "https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/plugins/node" click experimental href "https://github.com/open-telemetry/opentelemetry-js/tree/v1.25.1/experimental/packages"
Auto instrumentationの実行方法
OpenTelemetry公式のドキュメントを見てみると node
コマンドの--require
flagを用いています.
env OTEL_TRACES_EXPORTER=otlp OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=your-endpoint \ node --require @opentelemetry/auto-instrumentations-node/register app.js
この--require
flagは アプリケーションの実行前に指定したmoduleを実行できる引数です.
このことからアプリケーションの実行前のinstrumentation処理を実装したmoduleを--require
flagで指定することによりアプリケーションのAuto instrumentationを行うことが可能と考えられます.
Auto instrumentationの実装
ここからは実際のAuto Instrumentationの実装について調査していきます.
@opentelemetry/auto-instrumentations-node
Package
Auto Instrumentation実行時のコマンドを見ると,@opentelemetry/auto-instrumentations-node
Package内のスクリプトを実行していることがわかります.
env OTEL_TRACES_EXPORTER=otlp OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=your-endpoint \ node --require @opentelemetry/auto-instrumentations-node/register app.js
このPackageのREADME.mdを見ると,Auto Instrumentationのためのスクリプトなどを公開しているPackageであることがわかります.
依存するPackageの一覧を見てもJavaScript向けに提供されているAuto instrumentation用Packageがおおよそ含まれていること,また--require
flagで指定していたregister.tsの処理を追っていくとgetNodeAutoInstrumentations
関数の定義元でこれらのPackageからClassをimportしているため,このPackageを起点に各Package毎のAuto Instrumentatin用の処理が呼び出されていそうです.