TL;DR
リクエストの処理経路の中の、1 つの作業や操作を表す単位。トレースはスパンを組み合わせて作られる。
なぜ必要か
OpenTelemetry のドキュメントによると、スパンは文脈、相関、階層を持つ構造化ログのようなものである。親子関係で処理の入れ子を表せるので、別のプロセスやサービス、マシンで作られたスパンをまとめて、システムの処理を端から端まで見通せる。
仕組み
同じトレース ID を持つスパンの集まりがトレースであり、親スパン ID によって階層ができる。親スパン ID を持たないスパンがルートスパンで、操作全体の開始と終了を表す。スパンは主に次の情報を持つ。
- 名前、開始と終了のタイムスタンプ
- スパンコンテキスト: トレース ID やスパン ID など、サービス間で伝播する部分
- 属性: 操作を説明するキーと値のメタデータ
- イベント: スパンの期間中のある時点に付ける、時刻付きの注釈
- リンク: 因果関係のある別のスパンとの関連
- ステータス: Unset、Error、Ok のどれか
- 種類: Client、Server、Internal、Producer、Consumer のどれか。指定しなければ Internal になる