コードを変更せずにアプリを計装する:Java、Python、Node.js
環境変数とコマンドラインのフラグだけで、OpenTelemetry のエージェントをアタッチします。
コード不要の計装は、起動時にエージェントをアプリケーションにアタッチします。エージェントは、HTTP のサーバーとクライアント、データベースドライバー、メッセージキューなどの一般的なライブラリにパッチを当て、ソースを変更せずに、トレース、メトリクス、ログを生成します。設定は、標準の OTEL_* 環境変数と、いくつかの言語固有のものなので、全体のセットアップは、Dockerfile の 1 行と、いくつかの変数だけです。このガイドでは、Java、Python、Node.js を扱います。
前提:データの送り先
Collector をリッスンさせておきます。たとえば Docker Compose のガイドのもので、otel-collector:4318(HTTP)または :4317(gRPC)です。以下のすべての例は、OTEL_EXPORTER_OTLP_ENDPOINT でそれに向けます。
Java
エージェントの JAR を 1 度ダウンロードし、-javaagent でアタッチします。
curl -L -o opentelemetry-javaagent.jar \
https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/latest/download/opentelemetry-javaagent.jar
java -javaagent:./opentelemetry-javaagent.jar \
-Dotel.service.name=checkout \
-jar myapp.jar
コンテナでは、環境変数が好まれることが多く、JAVA_TOOL_OPTIONS がフラグを運ぶことで、entrypoint を変更せずに済みます。
FROM eclipse-temurin:21-jre
WORKDIR /app
COPY myapp.jar .
ADD https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/download/<version>/opentelemetry-javaagent.jar /otel/opentelemetry-javaagent.jar
ENV JAVA_TOOL_OPTIONS="-javaagent:/otel/opentelemetry-javaagent.jar"
CMD ["java", "-jar", "myapp.jar"]
ビルドを再現可能にするために、latest ではなく、ダウンロード URL のエージェントのバージョンを固定します。その後、実行時に設定します。
OTEL_SERVICE_NAME=checkout \
OTEL_EXPORTER_OTLP_ENDPOINT=http://otel-collector:4318 \
OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf \
OTEL_RESOURCE_ATTRIBUTES=service.version=1.4.2,deployment.environment.name=staging \
java -jar myapp.jar
エージェントは、3 つの方法で設定できます。システムプロパティ(-Dotel.service.name=...)、環境変数、または OTEL_JAVAAGENT_CONFIGURATION_FILE=/path/to/file.properties(または -Dotel.javaagent.configuration-file)で参照されるプロパティファイルです。設定が多い場合は、プロパティファイルを Git に保管してください。エージェント自体のデバッグには OTEL_JAVAAGENT_DEBUG=true を設定し、非常に冗長な出力を想定してください。エージェントは、宣言的な YAML の設定ファイルもサポートしています。Java エージェントのドキュメントを参照してください。
Python
ディストリビューション、OTLP exporter、インストール済みのパッケージに合う計装ライブラリをインストールします。
pip install opentelemetry-distro opentelemetry-exporter-otlp
opentelemetry-bootstrap -a install
opentelemetry-bootstrap -a install は、環境をスキャンして、見つかったものの計装をインストールします。たとえば Flask がインストールされている場合は、Flask の計装です。インストールせずに推奨を確認するには、引数なしで opentelemetry-bootstrap を実行します。アプリケーションは、opentelemetry-instrument を通じて起動します。
OTEL_SERVICE_NAME=checkout \
OTEL_TRACES_EXPORTER=otlp \
OTEL_METRICS_EXPORTER=otlp \
OTEL_LOGS_EXPORTER=otlp \
OTEL_EXPORTER_OTLP_ENDPOINT=http://otel-collector:4318 \
OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf \
opentelemetry-instrument python myapp.py
末尾のバックスラッシュに注意してください。各変数は、opentelemetry-instrument と同じ論理的なコマンドライン上にある必要があり、そうでないとプロセスに届きません。Gunicorn や Uvicorn のようなサーバーでは、サーバーのコマンドを包みます。opentelemetry-instrument gunicorn app:app。uv パッケージマネージャーを使う一部の構成では、bootstrap のステップに回避策が必要で、それは Python のトラブルシューティングのページに記載されています。Python ではログのエクスポートはオプトインなので、ログが表示されない場合は、Python のドキュメントのロギングのセクションを確認してください。
Dockerfile のパターン:
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt \
&& pip install opentelemetry-distro opentelemetry-exporter-otlp \
&& opentelemetry-bootstrap -a install
COPY . .
CMD ["opentelemetry-instrument", "python", "myapp.py"]
Node.js
API と自動計装のバンドルをインストールします。
npm install --save @opentelemetry/api
npm install --save @opentelemetry/auto-instrumentations-node
アプリケーションの前に、--require か、NODE_OPTIONS で読み込みます。
export OTEL_SERVICE_NAME=checkout
export OTEL_TRACES_EXPORTER=otlp
export OTEL_EXPORTER_OTLP_ENDPOINT=http://otel-collector:4318
export OTEL_NODE_RESOURCE_DETECTORS=env,host,os
export NODE_OPTIONS="--require @opentelemetry/auto-instrumentations-node/register"
node app.js
OTEL_NODE_RESOURCE_DETECTORS は、どの resource detector を実行するかを制限します(デフォルトではすべて有効)。OTEL_NODE_ENABLED_INSTRUMENTATIONS は、どの計装を読み込むかを制限します。モジュールの設定ページを参照してください。OTEL_LOG_LEVEL は、none、error、warn、info、debug、verbose、all を受け付け、デフォルトは info です。デバッグ出力はパフォーマンスを損なうため、本番では info のままにしてください。ES モジュールのアプリケーションには、追加の loader オプションが必要な場合があります。お使いのモジュールシステムに対する Node.js のドキュメントに従ってください。
.NET、Go、その他
.NET には、同じように設定されるコード不要のエージェントがあります(環境変数と起動スクリプト)。Go は、特権のあるサイドカーとして動作し、対象の実行ファイルのパスを必要とする eBPF ベースのエージェントを使うため、主に Operator を通じて使われます。それぞれについては、ドキュメントのコード不要のセクションを参照してください。
得られるものと、得られないもの
受信と送信の HTTP、データベース呼び出し、一般的なメッセージングライブラリのスパンが得られ、一部の言語では、ランタイムのメトリクスも得られます。エージェントはそれについて知ることができないため、「割引を計算する」のような、ビジネスレベルのスパンは得られません。追加の詳細が価値を持つところには、OpenTelemetry の API でいくつかの手作業のスパンや属性を追加し、それ以外のすべてには、エージェントを使い続けてください。
動作することを確認する
- Collector の
debugexporter を有効にして、アプリケーションを起動します。 - リクエストを送ります:
curl http://localhost:8080/。 - Collector のログで、
service.nameを持つスパンを探します。
docker compose logs otel-collector | grep -i 'service.name'
何も届かない場合は、次の順に確認します。エンドポイントとポートがプロトコルと一致しているか、シグナルの Collector のパイプラインが otlp receiver を列挙しているか、アプリケーションが Collector のホスト名を解決できるか、OTEL_SDK_DISABLED が設定されていないか。トラブルシューティングのガイドで、それぞれを詳しく説明します。
本番での注意
- エージェントとディストリビューションのバージョンを固定し、意図的に更新します。
- ダッシュボードがそれらに依存するため、すべてのサービスに
service.name、service.version、deployment.environment.nameを設定します。 - すべてを保持するのではなく、サンプリング比率から始めます(サンプリングのガイドを参照)。
- Kubernetes では、すべての Dockerfile を編集する代わりに、Operator を使って、アノテーションでエージェントを注入します。
人気のガイド
-
OpenTelemetry を解説する:SDK、OTLP、Collector YAML を 1 行も書く前に、構成要素と、設定が存在する 3 つの場所を理解します。 -
Collector の設定モデル:コンポーネント、パイプライン、プロバイダー Collector の YAML のルールを学びます。命名、パイプライン、connector、ファイルのマージ、環境変数。 -
OTEL_* 環境変数で SDK を設定する 標準の変数を使って、任意の言語のサービス名、exporter、サンプリング、制限を設定します。 -
Collector を本番対応にする:メモリ制限、バッチ処理、リトライ 過負荷や障害の間もテレメトリが生き残るように、processor、キュー、永続ストレージを設定します。 -
Helm で Kubernetes に Collector をデプロイする 公式チャートをインストールし、ログとメトリクスに preset を使い、values ファイルで設定を上書きします。 -
Collector と SDK のトラブルシューティング テレメトリが届かないときの体系的なチェックリスト:debug exporter、ヘルスチェック、内部メトリクス、よくある間違い。