OpenTelemetry とは何か?
OpenTelemetry は、オープンソースの可観測性フレームワークです。このプロジェクトは、OpenCensus と OpenTracing が統合されたもので、マイクロサービスやクラウドネイティブアプリケーションの可観測性を向上するための標準的な方法を提供します。OpenTelemetry は、トレース、メトリクス、ログなどの遥測データを収集、処理、および送信するための統一された API とデータフォーマットを定義しています。
OpenTelemetry は、アプリケーションから収集された遥測データを後端プラットフォームに送信する方法を指定します。これにより、組織はさまざまな可観測性ツールやプラットフォームとシームレスに統合できます。
OpenTelemetry は、柔軟性、相互運用性、およびスケーラビリティを備えたアーキテクチャを提供します。これにより、開発者は、自分の環境に最適な可観測性プラクティスを採用できます。
遥測データの種類
OpenTelemetry は、以下の遥測データをサポートします:
- トレース:複数のコンポーネントやサービス間を横断するリクエストや操作の実行パスを表します。トレースは、リクエストの流れを理解し、パフォーマンスのボトルネックを特定するのに役立ちます。
- メトリクス:システムの動作やリソースの利用率を定量的に測定します。メトリクスは、長期的なパフォーマンスのモニタリングや分析に役立ちます。
- ログ:アプリケーション内で発生したイベント、エラー、アクティビティに関する構造化または非構造化テキスト情報を含みます。ログはデバッグ、監査、障害排除に役立ちます。
OpenTelemetry を使用する方法
OpenTelemetry を始めたい場合は、ディストリビューション・トレースツール(Jaeger/SigNoz/Uptrace)を選択し、そのツールのドキュメントに従ってください。
技術用語
- OpenTelemetry API:トレース、メトリクス、ログを収集するためのプログラマブルなインターフェースです。
- OpenTelemetry SDK:API の実装で、収集した遥測データを後端にエクスポートします。
- OpenTelemetry インストルメンテーション:HTTP リクエスト、DB クエリ、ログ、エラーなどの重要な操作をレコードするための、人気のあるフレームワークやライブラリのプラグインです。
- OpenTelemetry コレクター:アプリケーションと後端の間にあるエージェントです。コレクターは、遥測データを受信、変換し、それを永続的に保存することができる後端にエクスポートします。
- OTLP:OpenTelemetry が使用するプロトコルで、gRPC(OTLP/gRPC)や HTTP(OTLP/HTTP)を介してデータを送信します。
- OpenTelemetry バックエンド:収集した遥測データを受信、保存、分析するためのプラットフォームです。
- OpenTelemetry Jaeger:OpenTelemetry エコシステムの一部で、トレースデータを保存、分析、可視化するのに役立ちます。
OpenTelemetry アーキテクチャ
概要図
OpenTelemetry は、アプリケーションやサービスから遥測データを収集、伝送、処理するための標準化された方法を提供します。このフレームワークは、API、SDK、コレクター、バックエンドなどの主要コンポーネントで構成されています。
可観測性信号
OpenTelemetry は、次の3つの信号を収集します:
- メトリクス:問題が発生していることを示します。
- トレース:問題がどこにあるかを示します。
- ログ:問題の根本原因を特定するのに役立ちます。
OpenTelemetry トレース
OpenTelemetry トレースは、リクエストがディストリビューションシステム内でどのようなパスをたどるかを詳細に記録します。トレースは、単一の操作とその関連する操作の時系列データを収集し、リクエストの流れやパフォーマンスのボトルネックを特定します。
スパン
スパンは、トレースの単一操作を表します。スパンには、次のプロパティがあります:
- 名前(操作名)
- 親スパン
- 種類(サーバー、クライアント、プロデューサー、コンシューマー、内部)
- 開始と終了時刻
- 成功または失敗を表すステータス
- オペレーションに関する属性
- イベントのタイムライン
- 関連するスパンへのリンク
- トラース・IDやスパン・IDなどのコンテキスト情報
スパン名
スパン名は、トレース・バックエンドがスパンをグループ化するのに役立ちます。スパン名は、簡潔で一意であるべきです。
| スパン名 | コメント |
|---|---|
GET /projects/:id |
良い。パラメータ名を含むルート名。 |
select\_project |
良い。パラメータを含まない関数名。 |
SELECT \* FROM projects WHERE id = ? |
良い。プレースホルダーを含むデータベースクエリ。 |
| スパン名 | コメント |
|---|---|
GET /projects/42 |
悪い。変量 42 を含む。 |
select\_project(42) |
悪い。変量 42 を含む。 |
SELECT \* FROM projects WHERE id = 42 |
悪い。変量引数 42 を含む。 |
サンプリング
OpenTelemetry は、トレースのコストを削減するためにサンプリングをサポートします。サンプリングは、スパンの一部のみを収集し、残りを破棄するプロセスです。
| 名前 | 側 | 調整済み数 | 精度 |
|---|---|---|---|
| ヘッドベースのサンプリング | クライアント側 | はい | 100% |
| レートリミットサンプリング | サーバー側 | はい | 90%未満 |
| テールベースのサンプリング | サーバー側 | はい | 90%未満 |
サンプリング・プロセッサ
OpenTelemetry には、次のサンプリング・プロセッサが用意されています:
- AlwaysOn:すべてのトレースをサンプリングします。
- AlwaysOff:トレースをサンプリングしません。
- TraceIDRatioBased:トレース・IDに基づいてサンプリング率を設定します。
- ParentBased:親スパンのサンプリング・決定を子スパンに伝播します。
OpenTelemetry コレクター
OpenTelemetry コレクターは、アプリケーションとバックエンド間のデータ収集を管理します。コレクターは、柔軟性と拡張性を備えており、さまざまな受信器、プロセッサ、エクスポート器を組み合わせて使用できます。
コレクターの構成
コレクターの構成は、YAML ファイルを使用します。以下は、サンプル構成です:
receivers:
otlp:
protocols:
grpc:
http:
processors:
resourcedetection:
detectors: [env, system]
cumulativetodelta:
batch:
send_batch_size: 10000
timeout: 10s
exporters:
otlp/uptrace:
endpoint: otlp.uptrace.dev:4317
headers:
uptrace-dsn: 'https://<token>@uptrace.dev/<project_id>'
service:
pipelines:
traces:
receivers: [otlp]
processors: [batch]
exporters: [otlp/uptrace]
metrics:
receivers: [otlp]
processors: [cumulativetodelta, batch, resourcedetection]
exporters: [otlp/uptrace]
logs:
receivers: [otlp]
processors: [batch]
exporters: [otlp/uptrace]
リソース検出
コレクターは、ホスト名やOSタイプなどのリソース属性を自動的に検出します。これにより、収集したデータにコンテキストが追加されます。
processors:
resourcedetection:
detectors: [env, system]
メモリーリミッタ
コレクターが使用するメモリ量を制限するためのプロセッサです。
processors:
memory_limiter:
check_interval: 1s
limit_mib: 4000
spike_limit_mib: 800
OpenTelemetry メトリクス
OpenTelemetry は、アプリケーションのパフォーマンスを監視するための標準的なメトリクス収集方法を提供します。メトリクスは、CPU利用率、メモリ消費、リクエスト遅延などのシステム動作を測定します。
メトリクスの種類
- Counter:非負の値を累積的に測定します。
- UpDownCounter:増加または減少する値を測定します。
- Histogram:値の分布を測定します。
- Gauge:特定の時点での値を測定します。
OpenTelemetry ログ
OpenTelemetry は、構造化ログの収集をサポートします。ログは、アプリケーションの動作を理解し、障害を診断するのに役立ちます。
ログの種類
- システムログ:OSやネットワークデバイスから収集されるログです。
- アプリケーションログ:アプリケーション内のイベントやエラーを記録します。
- 構造化ログ:トレース・IDやスパン・IDなどのコンテキスト情報を含むログです。
OpenTelemetry ホスト・メトリクス
OpenTelemetry コレクターは、ホストの CPU、メモリ、ディスクI/O 等のメトリクスを収集します。これにより、ホストのパフォーマンスを監視できます。
receivers:
hostmetrics:
collection_interval: 10s
scrapers:
cpu:
disk:
filesystem:
load:
memory:
network:
paging: