spanとは何か? traceの単位の解説
spanは、trace内の単一の名前付きで時間の計られた操作で、他のspanと組み合わさってリクエストの全体像を形成する基本的な構成要素です。
traceがリクエストの物語なら、spanはその中の一文です。spanは、分散tracingの実際のタイミングと詳細が存在する場所です。spanを理解することが、あらゆるtraceを読む鍵です。traceが伝えるすべては、そのspanの総和だからです。
spanが捕捉するもの
spanは、操作の名前、その開始時刻と終了時刻(したがって所要時間)、そしてそのステータス(成功またはエラー)を記録します。また、自身のspan ID、親のspan ID、共有のtrace IDという識別子を運び、それらがtraceツリー内での正しい配置を可能にします。
属性とevent
spanは属性を保持します。HTTPメソッド、データベースのステートメント、jobの名前といった、操作を記述するキーと値のペアです。また、retryやcache missのような、span内のtimestamp付きの点であるeventも記録できます。これらの詳細が、単なるタイミングを診断に役立つものへと変えます。
ネストとspanツリー
spanは親子の階層を形成します。リクエストのspanは、各downstreamの呼び出しに対する子spanを持ち、それらの子はさらに自身の子を持つかもしれません。ネストは因果と時間をエンコードします。どの操作がどの中で起きたか、どれが並行に対し順次で実行されたかを見られます。
rootとchildのspan
root spanは親を持たないもので、操作全体、すなわち受信リクエストやpipelineの実行全体を表します。他のすべてのspanはそれの子孫です。root spanの所要時間は操作の総時間であり、child spanはその時間がどう分配されたかを説明します。
CI/CDにおけるspan
pipelineをtraceすると、各jobやステップがspanになります。実行がroot span、jobがその子、ステップがそのまた子です。spanの所要時間とステータスは、どのステップが遅いか失敗しているかを正確に示します。リクエストのtraceでボトルネックの呼び出しを見つけるbuild版です。
重要なポイント
- spanは、trace内の一つの名前付きで時間の計られた操作です。
- spanは属性、event、親/trace IDを運びます。
- 因果と時間をエンコードするツリーにネストします。
- traceされたpipelineでは、jobとステップがspanに対応します。