🐱 うさねこ教室 Python と可観測性の教室

OpenTelemetry の全体像

🐱 この章の目次

OTel の成り立ち

OpenTelemetry は、OpenTracingOpenCensus という 2 つのプロジェクトが 2019 年に統合されて誕生しました。 現在は CNCF の Incubating プロジェクトとして、クラウドネイティブ領域における可観測性の標準仕様を策定しています。 ベンダーニュートラルな設計により、バックエンドを切り替えてもアプリケーションコードを変更する必要がありません。

アーキテクチャの構成要素

OTel のアーキテクチャは、大きく 4 つのレイヤーで構成されます。

レイヤー役割
API計装のためのインターフェース定義(ベンダー非依存)
SDKAPI の実装。サンプリングやエクスポートを担う
OTLPテレメトリーデータの転送プロトコル(gRPC / HTTP)
Collectorデータの受信・加工・転送を行うスタンドアロンプロセス

API と SDK が分離されているため、ライブラリ作者は API のみに依存して計装できます。 SDK の設定はアプリケーション側で行い、エクスポート先やサンプリング率を自由に制御します。

3 つのシグナル

OTel が扱うテレメトリーデータは シグナル と呼ばれ、以下の 3 種類があります。

  • トレース — リクエストがサービスを横断する過程を Span の木構造で表現する
  • メトリクス — カウンターやヒストグラムなど、集約可能な数値データ
  • ログ — タイムスタンプ付きのイベントレコード。トレースコンテキストと紐づけ可能

3 シグナルを同一の SDK・プロトコルで統一的に扱えることが OTel の最大の強みです。

自動計装と手動計装

OTel には計装の方法が 2 種類あります。

自動計装(auto-instrumentation) は、ライブラリやフレームワークのフックを利用して、コードを変更せずにテレメトリーを取得する手法です。 Python では opentelemetry-instrument コマンドで既存アプリをラップするだけで動作します。

opentelemetry-instrument --service_name my-app uvicorn main:app

手動計装(manual instrumentation) は、開発者が明示的に Span の作成や属性の付与を行う手法です。 ビジネスロジックに特化したテレメトリーが欲しい場合に使います。

from opentelemetry import trace

tracer = trace.get_tracer(__name__)

with tracer.start_as_current_span("process-order") as span:
    span.set_attribute("order.id", order_id)
    # ビジネスロジック

実運用では自動計装をベースにし、不足する情報を手動計装で補うのが一般的なアプローチです。