Timetable

Back to Timetable
OpenTelemetry eBPF Instrumentationの舞台裏
OpenTelemetryの「ゼロコード計装」はeBPFを使えばアプリのコードを1行も変えずにHTTPやgRPCのトレースが取れる、と魔法のように語られます。ですが、その魔法をGoバイナリに対して実現するのは、他のどの言語よりも困難です。
本セッションでは、Grafana BeylaがOpenTelemetryプロジェクトへ寄贈され生まれた OpenTelemetry eBPF Instrumentation (OBI) を題材に、「GoバイナリにeBPFで計装する」という行為がGoランタイムのどんな性質と衝突するのかを詳細に解説します。
具体的には、(1) Goの可動スタックゆえにuretprobeが使えずクラッシュする問題と、関数内の全RET命令にuprobeを置く回避策、(2) Go 1.17以降のレジスタベース呼び出し規約(ABIInternal)と、現在のgoroutineを指すgポインタがレジスタに保持される仕組み、(3) Goのバージョンごとに変わる内部構造体のフィールドオフセットを、外部のオフセットテーブルで追従し続ける運用、(4) goroutineの親子関係を辿ってコンテキストを伝搬する手法とその制約、を順に見ていきます。
最後に、これらの困難に対してGo本体側(ランタイム)がどう向き合ってきた/こなかったのかを、flight recorderやgoroutine leak profileなど近年のオブザーバビリティ向上と対比して議論します。
Goとオブザーバビリティ製品に長らく関わってきた経験により、Go Conferenceであまり触れられてこなかったeBPFに関して、参加者の理解を高める発表にします。
Staff Developer Advocate at Grafana Labs
Grafana Labs スタッフデベロッパーアドボケイト。Grafana StackとGrafana Cloudの普及と技術支援を担当し、特にオブザーバビリティ、SRE、DevOpsといった領域を専門とする。