🔭

OpenTelemetryをざっくり理解する

に公開

なぜOpenTelemetryが必要なのか

ざっくり図にまとめるとこんな感じです。

一昔前、システムは一枚岩で動作するのが基本でした。さらに、ログ、メトリクス、トレース(いわゆるオブザーバビリティの3本柱)もそれぞれ監視ツールとして独立していました。

この場合、システム全体で問題が発生すると原因の特定が困難です。それぞれの監視ツールを一つずつチェックしてボトルネックを探すしかなく、膨大な時間がかかります。

さらに現在は分散システムの時代です。単一システム内の問題だけでなく、システム間の連携も考慮する必要があり、原因特定はより難しくなっています。

そこで誕生したのがOpenTelemetryです。

OpenTelemetryを使うと、整理された相関データが得られます。相関データにより「横串」でデータを眺めることができ、ボトルネックの発見が容易になります。

また、OpenTelemetryはユニバーサルスタンダードとして広く採用されています。主要クラウドプロバイダー(AWS、Google Cloud、Azure)やDatadogなどのSaaSもOpenTelemetryに対応しています。

これによりベンダーロックインを回避でき、テレメトリーの送信先を自由に選択できます。

OpenTelemetryに関連する用語

OpenTelemetryには特有の用語が存在します。まずはそれらの概要を掴んでおきましょう。

  • テレメトリー
    • システムが何をしているかを示すデータ
  • SpanContext
    • スパンを識別するための情報
    • テレメトリーを横断的に相関させるために必須の要素
    • TraceID、SpanID など
  • トレース
    • 1つのトランザクションに関連するスパンの集まり
    • SpanContext(TraceID)によって相関づけられる
  • スパン
    • トレースを構成する個々の処理単位
  • 計装(インストゥルメンテーション)
    • アプリケーションにテレメトリーデータを出力するコードを追加すること
  • OTLP
    • OpenTelemetryプロトコル
    • テレメトリーデータをCollectorやバックエンドに送信するための標準フォーマット

OpenTelemetryのアーキテクチャ

以下は、一般的なOpenTelemetryを採用しているシステムのアーキテクチャです。

OpenTelemetryが担うのは、ApplicationとOpenTelemetry Collectorの部分です。

バックエンドシステム(e.g. Cloud Trace)に送信したあと、どのようにテレメトリーデータを可視化するかは、各ベンダーの裁量に委ねられています。

計装によってアプリケーションから直接バックエンドに送信することも可能ですが、Collectorを挟むことが推奨されています。

アプリケーションは「データをCollectorに渡すだけ」で済み、以下の処理をCollectorに任せられます。

  • 送信失敗時の再試行
  • バッチ処理
  • 暗号化
  • 機密データの除去

これにより、アプリケーションはビジネスロジックに集中でき、テレメトリー送信の複雑さから解放されます。

計装の方法

計装には大きく分けて2つのアプローチがあります。

  • ホワイトボックスアプローチ(手動計装 / Manual Instrumentation)
    • サービスやライブラリに直接テレメトリーコードを追加する
    • アプリケーション固有の詳細なデータが取得できる
  • ブラックボックスアプローチ(自動計装 / Automatic Instrumentation)
    • 外部エージェントやライブラリを利用してテレメトリーを生成する
    • 既存のコードを変更せずに済む

どちらも一長一短があり、要件に応じて使い分けます。

まとめ

OpenTelemetryは、分散システム時代のオブザーバビリティを実現するための標準ツールです。ログ、メトリクス、トレースを統合し、相関データとして扱うことで、複雑なシステムのボトルネック特定を容易にします。

基本的な流れは以下の通りです。

  1. アプリケーションに計装を追加してテレメトリーデータを生成
  2. OpenTelemetry Collectorでデータを処理・変換
  3. 各種バックエンド(Cloud Trace、Datadogなど)に送信

参考資料

Discussion