Lock in $30 Savings on PRO—Offer Ends Soon! ⏳

OpenTelemetry(ADOT)による自動計装

Avatar for nutslove nutslove
November 06, 2025
61

 OpenTelemetry(ADOT)による自動計装

OpenTelemetryを使ったJava, Python, Node.js(JavaScript), Goの自動計装方法についての資料です。
お役に立てれば幸いです。

Avatar for nutslove

nutslove

November 06, 2025
Tweet

More Decks by nutslove

Transcript

  1. 話す内容 2025/11/6 2 • OpenTelemetryについて • 計装について • 手動計装 •

    自動計装 • 各言語の自動計装 ➢ Java ➢ Python ➢ Node.js(JavaScript) ➢ Go NOTE! 本ドキュメントは、基本的に ADOT、OTLP/HTTPの利用と、ECS(Fargate)構成を前提としています。
  2. OpenTelemetryとは 2025/11/6 4 • テレメトリーデータ(Trace, Metric, Log)収集/連携のために 以下を提供 ➢ SDK/API

    ➢ OpenTelemetry Collector ➢ OTLP ➢ etc. • OpenTelemetry自体はバックエンドを持たない ➢ データフォーマット、データ収集、連携の部分のみを担当 • ベンダーに依存しない(ベンダーニュートラル)
  3. OTLP(OpenTelemetry Protocol) 2025/11/6 5 • すべてのシグナル(Trace, Metric, Log)のための、 アプリケーション、エージェント、バックエンド間のデータ送信を行う ためのプロトコル

    • ベースプロトコルとして、 gRPC over HTTP/2 (otlp/grpc)と HTTP(otlp/http)の 両方をサポート • 主要なObservabilityツールやベンダーはOTLPに対応している
  4. OpenTelemetry Collector 1/2 2025/11/6 6 • 以下を行うエージェント テレメトリーデータ(Trace, Metric, Log)を

    、 ①(様々なフォーマットのデータを)受信して ② バッチ/前処理して ③(データを様々なフォーマットに変換して)バックエンドに送信する • 以下のコンポーネントから構成されている ① Receiver : 様々なフォーマットでデータを受信する ② Processor : Exporterに流す前に処理をする(e.g. batch処理、Attributeの追 加) ③ Exporter : データをバックエンド(e.g. o11yツール)に送信する
  5. OpenTelemetry Collector 2/2 2025/11/6 7 Receiver Processor Exporter New Relic

    X-Ray Cloud Watch Cloud Watch Logs OpenTelemetry Collector otlp awsxray awsemf fluentforward otlp prometheus OpenTelemetry Java agent exporter ・ ・ ・ Fluentd otlp prometheusremotewrite Tempo Loki 1つのデータ種類(e.g. ログ)を 複数のバックエンドに送ることも 可能 Fluent Bit
  6. ADOT(AWS Distro for OpenTelemetry) 2025/11/6 8 • 標準のOpenTelemetryに、 AWSに合わせた様々な機能が追加されたディストリビューション •

    ADOTを使う理由(メリット) ➢ AWSサービスとの連携のための設定が予め組み込まれている ➢ 例えば、ADOT Collectorには、X-RayやCloudWatchなど、AWSサービスと の連携のためのコンポーネントが事前にビルドされている。 各言語の自動計装用Agentでは、デフォルトでデータの送信先エンドポイントと して、CloudWatch LogsやX-Rayなど、AWSサービスが設定されており、 X-Amzn-Trace-Idヘッダーも伝播するように設定されている。 ➢ AWSからサポートを受けられる
  7. ※Context Propagation(コンテキスト伝播) 2025/11/6 9 • Propagationの規格があり、 AWSは独自の規格で X-Amzn-Trace-Id、 OpenTelemetryはデフォルトでW3C Trace

    Context • システム間でこの形式が合わないとトレースが途切れることも ① ④ ①~④を繰り返し Application H T T P H T T P OpenTelemetry SDK/ Auto Instrumentation Header ------------- Trace ID: xxx Span ID : xxx ・ ・ Header ------------- Trace ID: xxx Span ID : xxx ・ ・ ② ③ Backend (e.g. Otel Collector、X-Ray) Contextが含まれている ヘッダーが連携される ヘッダーにある Contextを抽出する SDK等によって生成された処理に関するデータと、 Trace ID/Span ID等が含まれる TraceデータをBackendに送る 新たに生成されたContextを ヘッダーに注入する ※Trace IDは不変
  8. 自動計装 2025/11/6 13 • アプリケーションコードを修正することなく、テレメトリーデータを取得 できるようにする仕組み • 各言語ごとに自動計装の仕組みや取得できるデータ種類、 連携方法などが異なる •

    テレメトリーデータが自動生成されるのは、各言語の Instrumentationライブラリがサポートしている ライブラリ/フレームワークの処理のみ ➢ すべてのデータが自動生成/取得されるわけではない
  9. Javaの自動計装 2025/11/6 15 • Java Agentとして、Otel(ADOT)のJava Agentを指定して実行 するだけ • Spring

    Bootの場合、Actuatorと組み合わせて使うことも可能 • アプリケーションコードの修正は不要だけど、以下の設定ファイルの 修正は必要 ➢ pom.xml(または build.gradle) ➢ logback-spring.xml ➢ application.properties
  10. Javaの自動計装(pom.xmlの設定例) 2025/11/6 16 • pom.xmlの<dependencies>に以下を追加 <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>

    <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-prometheus</artifactId> </dependency> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-tracing-bridge-otel</artifactId> </dependency> <dependency> <groupId>io.opentelemetry.instrumentation</groupId> <artifactId>opentelemetry-logback-mdc-1.0</artifactId> <version>2.20.1-alpha</version> </dependency> <dependency> <groupId>software.amazon.opentelemetry</groupId> <artifactId>aws-opentelemetry-agent</artifactId> <version>2.11.5</version> </dependency> </dependencies>
  11. Javaの自動計装(logback-spring.xmlの設定例) 2025/11/6 17 • logback-spring.xmlの<dependencies>に以下を追加 ※フォーマット(pattern)は適宜修正 <?xml version="1.0" encoding="UTF-8"?> <configuration>

    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - trace_id=%X{trace_id} span_id=%X{span_id} trace_flags=%X{trace_flags} - %msg%n</pattern> </encoder> </appender> <appender name="OpenTelemetry" class="io.opentelemetry.instrumentation.logback.mdc.v1_0.OpenTelemetryAppender"> <appender-ref ref="CONSOLE"/> </appender> <root level="INFO"> <appender-ref ref="OpenTelemetry"/> </root> </configuration>
  12. Javaの自動計装(環境変数の設定・実行) 2025/11/6 19 • 以下のように、環境変数を設定し、 ADOT Java Agent(※) を指定してアプリを実行 ※

    以下から最新バージョンのADOT Java Agentをダウンロード https://github.com/aws-observability/aws-otel-java-instrumentation/releases $ OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318 \ OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf \ OTEL_LOGS_EXPORTER=otlp \ OTEL_METRICS_EXEMPLAR_FILTER=trace_based \ OTEL_METRICS_EXPORTER=prometheus \ OTEL_LOGS_EXPORTER=otlp \ OTEL_TRACES_EXPORTER=otlp \ OTEL_SERVICE_NAME=<サービス or システム名> $ java -javaagent:path/to/aws-opentelemetry-agent.jar –jar app.jar
  13. Javaの自動計装(全体像) 2025/11/6 20 • Logはfirelens → AWS for Fluent-Bit →

    Loki、 TraceとMetricはADOT Collector → Tempo/Thanosに転送 ADOT Collector AWS for Fluent Bit Tempo Loki Prometheus Endpoint Trace Metric Log Log Metric Trace
  14. ※Exemplarとは 2025/11/6 21 • メトリクスとトレースを結びつける仕組み ➢ メトリクスからトレースへの遷移が可能になる • OpenMetricsの仕様で形式が定まっている •

    以下はExemplar付きメトリクスの例で、 「#」以降がExemplarで拡張された部分 http_server_requests_seconds_count{method="POST",status="200"} 5.0 # {span_id="62212b47f709b02c",trace_id="22451e263bfcd9ec6e864c26ab0cebfa"} 1.0 1760358514.383 ※今回ご紹介する4つの言語の中ではJavaが唯一自動計装でExemplarsまで生成してくれる
  15. ※ADOT Collectorの設定例 2025/11/6 22 • otlpとprometheusのReceiverから Tempo/Thanos/Lokiへ転送する例 receivers: otlp: protocols:

    grpc: endpoint: 0.0.0.0:4317 http: endpoint: 0.0.0.0:4318 prometheus: config: scrape_configs: - job_name: 'java-otel-metrics' scrape_interval: 30s static_configs: - targets: ['localhost:9464'] labels: source: 'otel-java-agent' - job_name: 'java-actuator-metrics' scrape_interval: 15s metrics_path: '/actuator/prometheus' static_configs: - targets: ['localhost:8081'] labels: source: 'spring-actuator' ・・続き・・ service: pipelines: traces: receivers: [otlp] exporters: [otlphttp/tempo] metrics: receivers: [otlp, prometheus] exporters: [prometheusremotewrite/thanos] logs: receivers: [otlp] exporters: [otlphttp/loki] ※ processorブロックは省略しています。必要に応じ てbatchなど、processorを追加してください。
  16. Pythonの自動計装 2025/11/6 24 • 「aws-opentelemetry-distro」パッケージをインストールし、 以下の環境変数を設定の上、 「opentelemetry-instrument」 を付けて実行するだけ $ pip

    install aws-opentelemetry-distro $ OTEL_PYTHON_DISTRO=aws_distro \ OTEL_PYTHON_CONFIGURATOR=aws_configurator \ OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318 \ OTEL_TRACES_EXPORTER=otlp \ OTEL_METRICS_EXPORTER=otlp \ OTEL_LOGS_EXPORTER=otlp \ OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf \ OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED=true OTEL_PYTHON_LOG_CORRELATION=true OTEL_PYTHON_LOG_FORMAT=%(asctime)s [%(levelname)s] trace_id=%(otelTraceID)s span_id=%(otelSpanID)s - %(message)s # ログフォーマットは必要に応じて適宜変更 OTEL_SERVICE_NAME=<サービス or システム名> $ opentelemetry-instrument python3 ./path/to/your/app.py
  17. Pythonの自動計装(ログ連携のための設定) 2025/11/6 25 • 標準ロギングライブラリの「logging」でloggerを作成 • 作成したloggerでログを出力すると自動でログの中に 「trace_id」と「span_id」などが出力される import logging

    logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) logger.info(f"Inventory reserved with pricing") # 2025-10-29 05:28:03,930 INFO [main] [main.py:103] [trace_id=6901a5e3cf4d6eb7a0c751e96a15cd75 span_id=0b2f65c94897a756 resource.service.name=python-fastapi-service trace_sampled=True] - Inventory reserved with pricing
  18. Pythonの自動計装(Exemplars) 2025/11/6 26 • OpenTelemetry SDKでExemplarsのサポート自体はされてい る(※) が、各instrumentationの方でMetricにTrace IDやSpan IDを追加する処理がまだ実装されてない。

    つまり、自動生成されるメトリクスは連携されるが、Metricから Traceへの遷移はできない。 ※ https://github.com/open-telemetry/opentelemetry-python/issues/2407
  19. Node.js(JavaScript)の自動計装 2025/11/6 29 • 「@aws/aws-distro-opentelemetry-node- autoinstrumentation」パッケージをインストールし、以下 の環境変数を設定の上、「--require '@aws/aws-distro- opentelemetry-node-autoinstrumentation/register'」を 付けて実行するだけ

    $ npm install @aws/aws-distro-opentelemetry-node-autoinstrumentation $ OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318 \ OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf \ OTEL_LOGS_EXPORTER=otlp \ OTEL_METRICS_EXPORTER=otlp \ OTEL_TRACES_EXPORTER=otlp \ OTEL_SERVICE_NAME=<サービス or システム名> $ node --require '@aws/aws-distro-opentelemetry-node-autoinstrumentation/register' app.js
  20. Node.js(JavaScript)の自動計装(ログ連携のための設定) 2025/11/6 30 • ロギングライブラリ「winston」、「pino」、「bunyan」のいずれかで loggerを作成 • 作成したloggerでログを出力すると自動でログの中に 「trace_id」と「span_id」などが出力される const

    winston = require('winston'); const logger = winston.createLogger({ level: 'info’, format: winston.format.combine( winston.format.timestamp(), winston.format.json() ), transports: [new winston.transports.Console()] }); logger.info('Retrieved inventory items', { count: rows.length }); # {"count":3,"level":"info","message":"Retrieved inventory items","span_id":"6251b344104f74b5","timestamp":"2025-10- 29T06:25:55.737Z","trace_flags":"01","trace_id":"6901b373d750f74a962e86a272143266"}
  21. Goの自動計装(eBPF) 2025/11/6 35 • eBPFプログラムで特定のGoバイナリファイルより実行されたプロ セスからの、サポートしているライブラリ関数の呼び出しをキャッチ し、Traceデータを生成・連携する • ただ、サポートするライブラリは以下の4つだけで限定的(※1) ➢

    「database/sql」 ➢ 「github.com/segmentio/kafka-go」 ➢ 「google.golang.org/gprc」 ➢ 「net/http」 • 足りないトレースデータを補うため、手動計装との併用も可能(※2) ※1 https://github.com/open-telemetry/opentelemetry-go-instrumentation/blob/main/COMPATIBILITY.md ※2 https://opentelemetry.io/docs/zero-code/go/autosdk/#how-do-i-use-it
  22. Goの自動計装(eBPF)(Docker-composeの設定例) 2025/11/6 36 ※ https://github.com/open-telemetry/opentelemetry-go-instrumentation/blob/main/docs/getting-started.md go-service: image: go-service-ebpf:latest build: context:

    ./go-service-ebpf dockerfile: Dockerfile container_name: go-service pid: "host" ports: - "8080:8080" volumes: - ./data:/data go-auto-instrumentation: image: otel/autoinstrumentation-go:latest container_name: go-auto-instrumentation privileged: true pid: "host" environment: - EXPORTER_OTLP_ENDPOINT=http://otel-collector:4318 - OTEL_GO_AUTO_TARGET_EXE=/app/go-service # 対象のgoバイナリを指定 - OTEL_SERVICE_NAME=go-gin-ebpf-service - OTEL_PROPAGATORS=tracecontext,baggage - OTEL_TRACES_EXPORTER=otlp - OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf volumes: - /proc:/host/proc
  23. ※補足: OBI (OpenTelemetry eBPF Instrumentation) 2025/11/6 38 • https://opentelemetry.io/ja/docs/zero-code/obi/ •

    eBPFを使った自動計装 • Kubernetes、Docker、バイナリ、3つのタイプの実行をサポート • Ruby、C、Rustなど幅広い言語をサポート
  24. Goの計装(手動計装) 2025/11/6 41 • OpenTelemetry Go SDKを使って直接Trace(Span)データを 生成し、バックエンド(e.g. ADOT Collector、

    Tempo)に連携 • 基本的な使い方(Trace) 1. Resourceを定義 2. Expoterを定義 3. TraceProviderを定義 4. Tracerを定義 5. 定義したTracerでSpanを生成
  25. Goの計装(手動計装の具体的な実装例) 1/4 2025/11/6 42 import ( "context" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp"

    "go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp" "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp" otlog "go.opentelemetry.io/otel/log" "go.opentelemetry.io/otel/log/global" "go.opentelemetry.io/otel/propagation" sdklog "go.opentelemetry.io/otel/sdk/log" sdkmetric "go.opentelemetry.io/otel/sdk/metric" "go.opentelemetry.io/otel/sdk/resource" sdktrace "go.opentelemetry.io/otel/sdk/trace" semconv "go.opentelemetry.io/otel/semconv/v1.21.0" "go.opentelemetry.io/otel/trace" ) • Otel関連パッケージをimport
  26. Goの計装(手動計装の具体的な実装例) 2/4 2025/11/6 43 • Resource、Exporterを定義 // Resource res, err

    := resource.New(ctx, resource.WithAttributes( // セマンティック規約に則ったResource Attributeを追加 semconv.ServiceName(“go-gin-service”), semconv.ServiceVersion("1.0.0"), ), ) if err != nil { return nil, fmt.Errorf("failed to create resource: %w", err) } // Trace exporter traceExporter, err := otlptracehttp.New(ctx, otlptracehttp.WithEndpoint(“localhost:4318”), // 送り先を指定 otlptracehttp.WithInsecure(), // 送り先としてhttpを使う場合 ) if err != nil { return nil, fmt.Errorf("failed to create trace exporter: %w", err) }
  27. Goの計装(手動計装の具体的な実装例) 3/4 2025/11/6 44 • Trace Provider、Tracerを定義 // Trace provider

    tracerProvider := sdktrace.NewTracerProvider( sdktrace.WithBatcher(traceExporter), // batch processorの引数として前で設定したExpoterを指定 sdktrace.WithResource(res), // 前で設定したResourceを指定 ) otel.SetTracerProvider(tracerProvider) // SetTracerProviderの引数として上のtracerProviderを指定 otel.SetTextMapPropagator(propagation.TraceContext{}) tracer = tracerProvider.Tracer("go-service-tracer")
  28. Goの計装(手動計装の具体的な実装例) 4/4 2025/11/6 45 • 作成したTracerでSpanデータを生成 r.POST("/pricing/calculate", func(c *gin.Context) {

    ctx := c.Request.Context() sql := "SELECT unit_price FROM pricing WHERE product_name = ?” // Span計測開始 dbCtx, dbSpan := tracer.Start(ctx, "db_select_pricing", trace.WithAttributes( attribute.String(“db.operation.name”, “select”),// 必要に応じてspanにAttributeを追加 attribute.String("db.collection.name", "pricing"), attribute.String("db.query.text", sql), ), ) var unitPrice float64 err := db.QueryRowContext(dbCtx, sql, req.ProductName).Scan(&unitPrice) // Span計測終了 dbSpan.End()