OpenTelemetryとは?
-
オブザーバビリティのためにテレメトリ(トレース・メトリクス・ログ)を管理するためのフレームワーク/ツールキット
- オープンソースであり、ベンダーやツールにロックインしない
- プログラミング言語やインフラ/ランタイム環境に関係なく簡単に計装を行えるようにすることがゴール
-
メインコンポーネント(抜粋)
- 以下コンポーネントの仕様
- テレメトリの仕様を定義するプロトコル(OTLP)
- データ型の命名スキームを定義する命名規則 Semantic Conventions
- 各言語のSDK
- OTel Collector(=テレメトリを受信・加工・送信するプロキシ)
- NOTE: データ保存をするバックエンドや可視化ツールは含まれていない
シグナル
OpenTelemetryではテレメトリデータのことを シグナル と呼んでいる
- シグナルを収集・処理・エクスポートする
- シグナルは、アプリケーションやシステムのアクティビティを示す出力
- 特定のある時点で計測したいもの(例えば、メモリ使用量など)や、トレースしたいイベントなど
- トレース(Traces)
- 分散トレース: あるリクエストが複数のマイクロサービスを通過して伝搬されるパス
- 複数のスパンで構成
- 分散トレース: あるリクエストが複数のマイクロサービスを通過して伝搬されるパス
- メトリクス(Metrics)
- ログ(Logs)
- バゲッジ(Baggage)
- トレース(Traces)
スパン
以下の情報が含まれる
- name: スパン名
- RPC メソッド名、関数名など。
get_userはふさわしい名称です。get_user/12345はカーディナリティが高いため(一般的ではなくなるため)避けるべきです。
- RPC メソッド名、関数名など。
- parent span id
- start/end timestamp
- span context
- trace id
- span id
- trace flags
- Sampled flag : スパンがサンプリングされているか(Span Exporterがエクスポートするか)
- trace state
- ベンダー固有のトレース識別データ
- attributes
- ネットワーク情報や HTTP メソッド、ユーザーエージェントなどが含まれています。Kubernetes ならば Pod 名、コンテナ名、ノード名など
- Semantic Attributes に定義されている命名規則に従って属性を付与することが望ましい
- span events
- Span中に発生したイベントを記録するログメッセージ
- span links
- 他のスパンへのリンクです。スパン間の前後関係を示すのに有効です。
- あるリクエストがバッチ処理される、非同期処理されるといった後続処理がいつ実行されるか分からないケースで活用します。
- span status
Unset: 正常に完了したことを示しています。これがデフォルト値であり、通常スパンが正常に完了しているのであれば Span Status は設定する必要はありません。Error: 追跡中の処理で何らかのエラーが発生したことを示しています。例えば、リクエストが HTTP 500 エラーになったなどです。Ok: 開発者が明示的に指定するステータスです。少し解釈が難しいのですが、何らかの意図で処理はエラーだけどスパン上は正常にしたいケースで使うことになるはずです。
- span kind
SERVER: 同期 RPC またはリモートリクエストのサーバーサイドであることを示しています。多くの場合、CLIENTの子スパンです。CLIENT: あるリモートサービスへのリクエストです。多くの場合、SERVER の親スパンで、SERVER からの応答を受け取るまで終了しません。PRODUCER: スパンが非同期リクエストのイニシエーターであることを示しています。CONSUMER が対応完了する前、または、対応前に終了することが多いです。CONSUMER: PRODUCER の子スパンであることを示しています。INTERNAL: デフォルト値。親子を持つ操作ではなく、アプリケーションの内部操作を示しています。
Baggage
- スパン間を伝搬するコンテキスト情報(ex.
CustomerId)- HTTPヘッダで送信される
Metric
- kind
- 何かをカウントしたい(デルタ値を記録する場合):
- 値が単調に増加する場合(デルタ値は常に非負):
Counter - 値が単調に増加しない場合:
UpDownCounter
- 値が単調に増加する場合(デルタ値は常に非負):
- 何かを記録または計測し、その統計情報が意味を持つ可能性がある場合:
Histogram - 何かを計測したい(絶対値を報告する場合):
- 計測値が非加算的な場合、
Asynchronous Gaugeを使用します。 - 計測値が加算的な場合:
- 値が単調に増加する場合:
Asynchronous Counterを使用します。 - 値が単調に増加しない場合:
Asynchronous UpDownCounterを使用します
- 値が単調に増加する場合:
- 計測値が非加算的な場合、
- 何かをカウントしたい(デルタ値を記録する場合):
Collector
- テレメトリーデータをベンダー依存ではない方法で Receive、Process、Export
- Deploymentパターン
- Collector無し: アプリにOtel SDKを組み込み, 直接 o11y backendに送信
- Agent: アプリケーションと Otel Collector が同じホストで動作するパターン
可視化
-
Jaeger: ローカルで動かせる
-
AWS X-Ray: フルマネージド
- トレースIDのフォーマットが違うので id generatorとして
id-generator-aws-x-rayを使わないと行けないらしい
- トレースIDのフォーマットが違うので id generatorとして
-
Prometheus
-
OpenObserve
-
初心者がObservabilityの世界を探索してみた:ツール調査まとめ oss - Qiita
-
今日から分散トレーシングに対応しないといけなくなった人のための opentelemetry-go 入門 - Cybozu Inside Out | サイボウズエンジニアのブログ
Semantic Conventions
- スパン属性のキー名を統一化するための規約
- prompt = eventのbody
