Slide 1

Slide 1 text

1 5分でわかるGoの⾃動計装 渡部 ⿓⼀ OpenTelemetry Meetup 2024-02

Slide 2

Slide 2 text

技術部プラットフォームグループ 2021年 中途入社 2 自己紹介 渡部 龍一 Watanabe Ryuichi ● ロール: SRE ● Otel歴: 半年 ● SRE NEXTスタッフ 8/3~4で今年もやります! ● SNS: @ryuichi_1208

Slide 3

Slide 3 text

Goでも⾃動計装されたい! 3

Slide 4

Slide 4 text

opentelemetry-go-instrumentation 4

Slide 5

Slide 5 text

5 OpenTelemetryにおける⾃動計装とは https://speakerdeck.com/k6s4i53rx/getting-started-auto-instrumentation-with-opentelemetry

Slide 6

Slide 6 text

6 ● open-telemetry/opentelemetry-go-instrumentation ○ 2024年2⽉15⽇の時点でも開発中のステータス ● Go⾔語で書かれたアプリケーションやライブラリに⾃動的に観測可能性(オブザーバ ビリティ)を提供するプロジェクト ● eBPFを使⽤して実装されている ○ アプリケーションには⼿を加えずに外部のプロセスとして起動するだけでよい ● 以下のライブラリに対応している ○ database/sql ○ github.com/gin-gonic/gin ○ google.golang.org/grpc ○ net/http opentelemetry-go-instrumentationとは

Slide 7

Slide 7 text

使ってみる 7

Slide 8

Slide 8 text

8 httpリクエスト httpリクエスト こんなアプリを想定 レスポンスを作って返す

Slide 9

Slide 9 text

9 こんなアプリを想定

Slide 10

Slide 10 text

10 こんなアプリを想定

Slide 11

Slide 11 text

11 ● アプリケーションには⼿を⼊れずに分散トレーシングができる ● Docker / docker-compose / Kubernetes(kind)で動かす環境が提供されている ● ⾃前ビルドでも動かせるのでこれをやってみる opentelemetry-go-instrumentationを使う

Slide 12

Slide 12 text

12 ● Linux with kernel version 4.19 or higher ● x64 or ARM processor ● Go 1.18 or higher 制約

Slide 13

Slide 13 text

13

Slide 14

Slide 14 text

14

Slide 15

Slide 15 text

15

Slide 16

Slide 16 text

どういう仕組み?🤔 16

Slide 17

Slide 17 text

17 ● 引数で渡されたTARGETの⽂字列から/procを検索する ● eBPFを⽤いてhttpやDBとのやりとりするuprobesを使って関数にアタッチする ○ 実⾏時にユーザー空間アプリケーションの任意の部分に動的にフックする ○ ユーザ空間のアプリケーションに処理を差し込むための仕組み ● httpならリクエストにtraceIDを追記しつつspanを⽣成する ○ go build -ldflags ʻ-s -w’とかで作られたバイナリでも対応している ○ offsets-trackerを使ってデバッグ情報なしでも構造体のオフセットを知る仕組み ● 内部的にはcilium/ebpfが使われている ○ eBPF プログラムのロード、コンパイル、デバッグのためのユーティリティを提供するpure Go ライブラリ 仕組み

Slide 18

Slide 18 text

18 internal/pkg/instrumentation/bpf/net/http/client/bpf/probe.bpf.c

Slide 19

Slide 19 text

デメリット 19

Slide 20

Slide 20 text

20 ● 関数ごとにトレースを取りたいとかは現状不可能 ● 個別のsetAttributeとかもできない ○ ⼿動軽装のissueはある ○ https://github.com/open-telemetry/opentelemetry-go-instrumentation/issues/352 ● sampling設定なども現時点ではできない デメリット

Slide 21

Slide 21 text

⽤途 21

Slide 22

Slide 22 text

22 ● シンプルなネットワークIOのみのサービスで複雑な処理をしない場合 ○ 画像変換するだけ、外部APIを叩いてProxyするだけ ● 複数サービスのうち⼀部のサービスの開発者が不在みたいなケースで⼀時的に伝播を させたい ● eBPFプログラミングの練習によさそう ○ シンボルテーブル⾒てアタッチしてinjectするみたいなのやれば⼀応実現はできるはず ○ internal/pkg/instrumentation/bpf/net/http/client/probe.go ⽤途

Slide 23

Slide 23 text

eBPFにはロマンがある 23

Slide 24

Slide 24 text

24 ご静聴ありがとうございました