Upgrade to Pro — share decks privately, control downloads, hide ads and more …

実践!OpenTelemetry

 実践!OpenTelemetry

2025/02/05 に行われたOracle Hangout Cafe(OCHaCafe) Season9 #5 で使用した資料です

oracle4engineer

February 05, 2025
Tweet

More Decks by oracle4engineer

Other Decks in Technology

Transcript

  1. 実践!OpenTelemetry Oracle Cloud Hangout Cafe Season9 #5 Shuhei Kawamura Solution

    Architect, Oracle Digital/ISV Solutions Oracle Corporation Japan
  2. 自己紹介 2 Copyright © 2025, Oracle and/or its affiliates @shukawam

    川村 修平 (Shuhei Kawamura) オラクル・デジタル / ISVソリューション本部 日本オラクル株式会社 コミュニティ • OCHaCafe • CloudNative Days – Observabilityチーム スタッドレスタイヤを履いたので、 雪山いけるようになりました!ぜひお誘いください。 ゴルフも最近ハマりました。同様にお誘いください。
  3. オブザーバビリティ オブザーバビリティ/Observability(Observe + Ability) • システムの出力を調べることで、システムの内部状態を理解する能力のこと システムがオブザーバビリティを獲得すると… • 今まで未知だった新しい問題(unknown-unknowns)のトラブルシューティングや対処が容易になる •

    その事象がなぜ起こるのか?という問いに答えるのに役立つ システムがオブザーバビリティを獲得するためには… • 構成要素が適切に計装されている必要がある • インフラ、アプリケーションが適切なテレメトリーデータを外部出力するように実装されている状態であること 6 Copyright © 2025, Oracle and/or its affiliates (ログ、メトリクス、トレース、プロファイル、など) 今日の関心領域!
  4. 例: アプリケーションの計装 7 Copyright © 2025, Oracle and/or its affiliates

    サービス B サービス A サービス C テレメトリーデータ ※一例です。 ビジネスロジック + ログ関連コード メトリクス関連コード トレース関連コード プロファイル関連コード … トラブルシュートする際に計装の追加が必要ない状態 = アプリケーションが適切に計装されている オブザーバビリティ バックエンド
  5. オブザーバビリティ バックエンド 例: アプリケーションの計装 8 Copyright © 2025, Oracle and/or

    its affiliates サービス B サービス A サービス C テレメトリーデータ ビジネスロジック + ログ関連コード メトリクス関連コード トレース関連コード プロファイル関連コード … • バックエンドに応じたAPIを活用して実装する必要あり • 各バックエンドごとの学習コストが発生 • 何らかの要因でバックエンドを差し替える際は結構大変 バックエンドごとに色んな違いがある • 送信方法 • データフォーマット ※一例です。
  6. OpenTelemetryを構成する主なコンポーネント 11 Copyright © 2025, Oracle and/or its affiliates 仕様

    コレクター 言語固有のAPIとSDKの実装 Kubernetesオペレーター Function as a Serviceアセット • すべての実装に対する言語横 断的な要件と想定を記述 • API、SDK、データ • テレメトリーデータを受信、処理、 エクスポートできるベンダー非依 存なプロキシー • 言語固有のAPIとその実装 (SDK)を提供 • コレクターとゼロコード計装のた めの、K8sオペレーター • FaaSを監視するためのアセット 提供 • ゼロコード計装用のライブラリ • 手動/ゼロコード計装用のコレク ター …以降でざっくりと解説していきます。 割愛します。
  7. OpenTelemetryを構成する主なコンポーネント 仕様 OpenTelemetry仕様 • 2025/02 現在: 1.41.0 • すべての実装に対する言語横断的な要件と想定が記述されている •

    原理とガイドライン – OpenTelemetryのミッションと価値、仕様の原則が記されている • Telemetry should be easy/universal/vendor-neutral/loosely-coupled/built-in • Compatibility, Stability, Resilience, Performance • Be User Driven, Be General, Be Stable, Be Consistent, Be Simple • API仕様 – バゲッジ、トレース、メトリクス、ログやコンテキスト伝搬に関するAPI仕様を定義 • SDK仕様 – トレース、メトリクス、ログ、リソース、構成に関するSDK(APIの実装)仕様を定義 • データ仕様 – セマンティック規約、プロトコル(OTLP | OpenTelemetry Protocol)を定義 12 Copyright © 2025, Oracle and/or its affiliates ※OpenTelemetry 1.40.0時点での内容です。 ちなみに、”OTel”という acronymも仕様内で言及があります。
  8. OpenTelemetry仕様にはどんなことが書いてあるのか? – API編(Tracing) – 扱うデータの形式 • Time: ナノ秒(ns)精度の時間まで操作できる • Timestamp:

    UNIX時間で表現し、ミリ秒 ~ ナノ秒の精度であること • Duration: 2つのイベント間の経過時間を表現し、ミリ秒 ~ ナノ秒の精度であること Tracing APIの構成要素が満たすべき仕様について(一部抜粋 [1] ) • TracerProvider • Tracerを取得するための関数を提供しなければならない [MUST] • Tracer • 新しいSpanを作成するための関数を提供しなければならない [MUST] • Tracerが有効かを判定する関数を実装するべき [SHOULD] • Span • トレース内の単一の操作を表すためのデータ構造を定義 • name, SpanContext, 親スパンの情報、SpanKind、開始/終了タイムスタンプ、属性、Links、Events、Status 13 Copyright © 2025, Oracle and/or its affiliates [1]: 他にもSpanContext, SpanKind, Link, Concurrencyなどに関する記述があります
  9. OpenTelemetry仕様にはどんなことが書いてあるのか? – SDK編(Tracing) – API仕様に基づき、各関数で実装する内容に言及 e.g. TracerProvider – Tracer Creation

    • Tracerインスタンスは、TracerProviderを通してのみ作成することが可能であるべき [SHOULD] • TracerProviderは、Get a Tracer APIを実装しなければならない [MUST] 14 Copyright © 2025, Oracle and/or its affiliates ref: OpenTelemetry Java - https://github.com/open-telemetry/opentelemetry- java/blob/main/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkTracerProvider.java TracerをGetするAPIの実装(Java)
  10. OpenTelemetry仕様にはどんなことが書いてあるのか? – データ編 – セマンティック規約 セマンティック規約 • さまざまな種類の操作やデータに対して共通の名前を指定するもの • コードやライブラリ、プラットフォーム間で標準的な命名スキームに従うことができる

    • https://github.com/open-telemetry/semantic-conventions で管理されている(最新は、v1.30.0) • どんな定義が存在するのか? • e.g. General [1] , Cloud Providers, CloudEvents, Generative AI, Object Stores, … 15 Copyright © 2025, Oracle and/or its affiliates [1]: General Attributes, Events, Logs, Metrics, Spans 属性名 概要 例 gen_ai.system 生成AIシステム名 openai gen_ai.request.model リクエストしたモデル名 gpt-4 gen_ai.input_tokens 生成AIに入力するトークン数 100 gen_ai.output_tokens 生成AIから出力されたトークン数 180 e.g. Generative AI – Spansのセマンティック規約の一部
  11. OpenTelemetry仕様にはどんなことが書いてあるのか? – データ編 – プロトコル(OTLP) OpenTelemetry Protocol(OTLP) • 2025/02 現在:

    1.5.0 • テレメトリーデータのエンコーディングとクライアント/サーバー間のデータ交換に使われるプロトコルが定義されている 16 Copyright © 2025, Oracle and/or its affiliates サービス B サービス A サービス C テレメトリーデータ オブザーバビリティ バックエンド ベンダー非依存にテレメトリーデータを やり取りするための仕様が定義されている。
  12. 例えば、OTLP/HTTP • テレメトリーデータは、HTTP POSTで送信する • リクエストボディーは、バイナリ or JSON フォーマットでエンコードされたProtobufペイロードを使う •

    参考: https://github.com/open-telemetry/opentelemetry-proto/tree/v1.5.0/opentelemetry/proto • URLのパス • トレース: /v1/traces • メトリクス: /v1/metrics • ログ: /v1/logs • プロファイル: /v1development/profiles • レスポンスの挙動も定義(Full Success/Partial Success/Failures) • 耐障害性に関する言及もあり • スロットリング時のふるまい、コネクションのリトライ戦略 17 Copyright © 2025, Oracle and/or its affiliates https://opentelemetry.io/docs/specs/otlp/#otlphttp
  13. OpenTelemetryを構成する主なコンポーネント コレクター OpenTelemetryコレクター • テレメトリーデータの受信、処理、送信を行う実行可能ファイルのこと • 1つ以上のパイプラインから構成される • パイプラインの構成要素: レシーバー、プロセッサー、エクスポーター

    18 Copyright © 2025, Oracle and/or its affiliates fig: OpenTelemetry ドキュメント - https://opentelemetry.io/ja/docs/collector/ パイプライン ちなみに、パイプライン間を接続する コネクターというコンポーネントもありますが、 今日は割愛させていただきます。
  14. OpenTelemetryコレクター レシーバー レシーバー • ネットワークポートをリッスンし、テレメトリーデータを受信する役割を持つ 19 Copyright © 2025, Oracle

    and/or its affiliates レシーバー ref: https://opentelemetry.io/ja/docs/collector/architecture/#receivers レシーバーの例: • Apache Web Server Receiver • Docker Stats Collector Receiver • Filelog Collector Receiver • Fluent Forward Collector Receiver • GitHub Receiver • Jaeger Collector Receiver • JMX Collector Receiver • Kubernetes Cluster Collector Receiver • Oracle DB Receiver • OpenTelemetry Protocol with Apache Arrow Receiver • OTLP Collector Receiver • Prometheus Collector Receiver • … https://opentelemetry.io/ecosystem/registry/?language=collector&component=receiver
  15. OpenTelemetryコレクター プロセッサー プロセッサー • テレメトリーを処理(属性の追加/削除、データ変換)する役割を持つ 20 Copyright © 2025, Oracle

    and/or its affiliates ref: https://opentelemetry.io/ja/docs/collector/architecture/#processors プロセッサーの例: • Attribute Collector Processor • Batch Collector Processor • Filter Collector Processor • Group by Trace Processor • Group by Attribute Processor • K8s Attribute Processor • Memory Limiter Collector Processor • Metrics Transform Processor • Metrics Generation Processor • Span Collector Processor • Tail Sampling Processor • Transform Processor • … プロセッサー https://opentelemetry.io/ecosystem/registry/?language=collector&component=processor
  16. OpenTelemetryコレクター エクスポーター エクスポーター • テレメトリーデータを別の場所(e.g. オブザーバビリティバックエンド、コンソール)へ送信する役割を持つ 21 Copyright © 2025,

    Oracle and/or its affiliates ref: https://opentelemetry.io/ja/docs/collector/architecture/ - exporters エクスポーターの例: • Debug Exporter • Elasticsearch Exporter • File Collector Exporter • Kafka Collector Exporter • Trace ID aware load-balancing Collector Exporter • Loki Exporter • No-op Exporter • OpenTelemetry Protocol with Apache Arrow Exporter • OTLP gRPC Collector Exporter • OTLP HTTP Collector Exporter • Prometheus Remote Write Collector Exporter • Syslog Exporter • … エクスポーター https://opentelemetry.io/ecosystem/registry/?language=collector&component=exporter
  17. 参考: 設定ファイルの一例 22 Copyright © 2025, Oracle and/or its affiliates

    OTLPで受け取って バッチ処理して OTLPで送信する テレメトリー データ レシーバー (otlp) エクスポーター (otlp) オブザーバビリティ バックエンド パイプライン プロセッサー (batch) OTLP OTLP
  18. OpenTelemetryコレクターのディストリビューション ビルド済みで配布されているディストリビューション ビルド済みのディストリビューションで要件が満たせない場合 • ocb(OpenTelemetry Collector Builder)を用いて独自のディストリビューションをビルドすることができる 23 Copyright ©

    2025, Oracle and/or its affiliates ディストリビューション名 概要 otelcol-contrib OpenTelemetry Collector/OpenTelemetry Collector Contribリポジトリの 両方のコンポーネントが全て含まれるディストリビューション otelcol-k8s Kubernetes上のワークロードを監視するためのディストリビューション otelcol-otlp OTLPのレシーバー、エクスポーターのみが含まれているディストリビューション otelcol OpenTelemetry Collectorリポジトリの全てのコンポーネントと OpenTelemetry Collector ContribリポジトリのOSS関連コンポーネントを含むディス トリビューション (良い出発点だけど) 実環境では、必要なコンポーネントのみ を含めることが推奨されています。 https://github.com/open-telemetry/opentelemetry-collector/tree/main/cmd/builder
  19. OpenTelemetryコレクターを使う意義 – Code first vs. Collector first OpenTelemetryコレクターなんか使わないで、直接バックエンドに送信すればいいじゃん? OpenTelemetryのドキュメント [1]

    では、 一般的には、サービスとともにコレクターを使用することをおすすめします。 と言及されている 24 Copyright © 2025, Oracle and/or its affiliates https://opentelemetry.io/ja/docs/collector/#コレクターを使う場面 サービス テレメトリー データ オブザーバビリティ バックエンド サービス テレメトリー データ オブザーバビリティ バックエンド コレクター OpenTelemetryを試したりする分にはすぐに始められる (チーム内に素早く展開し、賛同を得たい時とか) 開発環境や小規模な環境ならこっちでもいいのかも サービスからテレメトリーデータをいち早くコクレターにオフロードできる コレクター側でリトライ、バッチ処理、フィルタリングなどの処理ができる 大規模な環境であれば、管理コストなどの点でコレクターの存在が生きてくる
  20. OpenTelemetryを構成する主なコンポーネント 言語固有のAPIとSDKの実装 多くのプログラミング言語でOpenTelemetryのAPIとその実装のSDKを提供 25 Copyright © 2025, Oracle and/or its

    affiliates 言語 トレース メトリクス ログ C++ Stable Stable Stable C#/.NET* Stable Stable Stable Erlang/Elixir Stable Development Development Go* Stable Stable Beta Java* Stable Stable Stable JavaScript* Stable Stable Development PHP* Stable Stable Stable Python* Stable Stable Development Ruby Stable Development Development Rust Beta Beta Beta Swift Stable Development Development 2025/02における各言語の対応状況 - https://opentelemetry.io/ja/docs/languages/ *:ゼロコード計装対応(※後述)
  21. OpenTelemetryを構成する主なコンポーネント Kubernetesオペレーター OpenTelemetry Operator for Kubernetes • Kubernetes上でコレクターとワークロードのゼロコード計装を行うためのオペレーター • 提供されるCustom

    Resource 26 Copyright © 2025, Oracle and/or its affiliates CR名 概要 OpenTelemetryCollector OpenTelemetryコレクターをK8s上に展開するためのCR Instrumentation K8s上のワークロードに対してゼロコード計装用のライブラリ/エージェントを注入ためのCR OpAMPBridge OpAMP Operator ServerとKubernetes APIをブリッジするためのCR Instrumentation テレメトリー データ オブザーバビリティ バックエンド コレクター これをK8s wayで実現するための オペレーター(OpAMPは置いといて)
  22. ゼロコード計装 ゼロコード計装 • ソースコードを編集することなく、アプリケーションにOpenTelemetry API, SDKを追加する計装方法のこと • 実現方法は言語によって異なる • Java

    → javaagentを用いたバイトコードの操作 • Go → eBPF • .NET, JavaScript, PHP, Python → モンキーパッチ 30 Copyright © 2025, Oracle and/or its affiliates fig: https://opentelemetry.io/ja/docs/concepts/instrumentation/zero-code/
  23. Javaとゼロコード計装 Javaにおけるゼロコード計装の仕組み • javaagentを用いて、JVMがクラスファイルをロードする前に動的にバイトコードを書き換え、計装用のコードを差し込む 31 Copyright © 2025, Oracle and/or

    its affiliates Javaソースコード 中間コード (Java Byte Code) Linux版 JVM Linux Windows Windows版 JVM … javac ここで計装用の コードを差し込む 差し込まれる計装ライブラリの例 [1] : • elasticsearch • hikaricp • java-http-client • java-util-logging • jaxrs • jdbc • jmx-metrics • netty • opentelemetry-api • servlet • spring • tomcat • … [1]: https://github.com/open-telemetry/opentelemetry-java- instrumentation/tree/main/instrumentation
  24. Javaとゼロコード計装 ダウンロード: https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases 32 Copyright © 2025, Oracle and/or its

    affiliates ダウンロードしたJARの 配置場所を指定 必要な設定 計装対象のアプリケーション 環境変数での指定でもOK
  25. 再掲: OpenTelemetryを構成する主なコンポーネント Kubernetesオペレーター OpenTelemetry Operator for Kubernetes • Kubernetes上でコレクターとワークロードのゼロコード計装を行うためのオペレーター •

    提供されるCustom Resource 34 Copyright © 2025, Oracle and/or its affiliates CR名 概要 OpenTelemetryCollector OpenTelemetryコレクターをK8s上に展開するためのCR Instrumentation K8s上のワークロードに対してゼロコード計装用のライブラリ/エージェントを注入ためのCR OpAMPBridge OpAMP Operator ServerとKubernetes APIをブリッジするためのCR(※詳細は後述) Instrumentation テレメトリー データ オブザーバビリティ バックエンド コレクター これどうやるの?
  26. Instrumentationの設定例 35 Copyright © 2025, Oracle and/or its affiliates グローバルレベルで使用させるエクスポーターの設定

    言語ごとに個別設定が必要なら行う。 例えば、Pythonのゼロコード計装はデフォルトでhttp/protoを使うので、 コレクターのポートを変更する。
  27. ゼロコード計装用のライブラリ/エージェントが設定される仕組み ゼロコード計装用のライブラリ/エージェントはどのようにPodに注入されるのか? • Mutating admission webhookを用いて、ワークロード(=Pod)に対してinitContainersなどを設定することで実現 36 Copyright © 2025,

    Oracle and/or its affiliates etcd API リクエスト AuthN & AuthZ Mutating admission Schema validation Validating admission API Server Webhook Webhook Webhook Webhook Webhook Webhook Admission review Admission response Admission review Admission response ここで、Podの設定(initContainersなど) を書き換え!
  28. Mutating admission webhookによって追加される項目 38 Copyright © 2025, Oracle and/or its

    affiliates ゼロコード計装用のエージェントを配置するためのボリューム javaagent.jarだけ持つbusyboxベースの超シンプルなコンテナ 計装対象のコンテナから参照させるためにEmptyDirに配置 initContainersで配置したエージェントを持つボリュームをマウント Instrumentationで設定した項目やその他の必要項目が自動的に追加
  29. OpenTelemetry Protocol with Apache Arrow OpenTelemetry Protocol with Apache Arrow

    • OTEP-0156にまとまっている • Apache Arrowをテレメトリーパイプラインのバルクデータ転送に使うための取り組み(段階的に導入可) • OTLPのデータ形式(行指向)をApache Arrowに基づいた列指向に改良する • テレメトリーデータが広く利用されるようになったことによる、効率的なデータ処理やコスト削減といったニーズに対応する 41 Copyright © 2025, Oracle and/or its affiliates fig: https://github.com/open-telemetry/otel-arrow
  30. OpenTelemetry Protocol with Apache Arrow(otel-arrow) Apache Arrow Apache Arrow •

    高速なデータ交換とインメモリ分析のために作られた列指向フォーマットとライブラリを提供 42 Copyright © 2025, Oracle and/or its affiliates https://arrow.apache.org/docs/format/Intro.html 表形式のデータ 行ベースでメモリ上に表現 列ベースでメモリ上に表現 (Apache Arrowsはこっち) 集計処理などの分析処理がメモリの局所性により効率的に!
  31. otel-arrowの導入 – フェーズ1 フェーズ1: otel-arrowレシーバー/エクスポーターの公開 • レシーバー: otel-arrowプロトコルからOTLPへの変換が責務 • エクスポーター:

    OTLPからotel-arrowプロトコルへの変換が責務 • プロセッサー: 従来通り、OTLP(行指向)でデータ処理をする 43 Copyright © 2025, Oracle and/or its affiliates https://github.com/open-telemetry/opentelemetry-specification/blob/main/oteps/0156-columnar-encoding.md コレクター間のトラフィック量削減と 多変量時系列データに対する高い圧縮率がポイント。
  32. otel-arrowの導入 – フェーズ2 フェーズ2: e2eのApache Arrowサポート • フェーズ1のレシーバー、エクスポーターに加えて、 otel-arrowをサポートするプロセッサーも導入 •

    コレクター間のトラフィック量削減に加え、高度&効率的なデータ処理が行える 44 Copyright © 2025, Oracle and/or its affiliates https://github.com/open-telemetry/opentelemetry-specification/blob/main/oteps/0156-columnar-encoding.md