Session

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に関して、参加者の理解を高める発表にします。

Yoshi Yamaguchi

Staff Developer Advocate at Grafana Labs

Yamanashi, Japan

Actions

Please note that Sessionize is not responsible for the accuracy or validity of the data provided by speakers. If you suspect this profile to be fake or spam, please let us know.

Jump to top