Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
大量の OpenTelemetry スパンを Cloud Trace に送りつけそうになった話
Search
ebi-yade
July 22, 2024
0
1.8k
大量の OpenTelemetry スパンを Cloud Trace に送りつけそうになった話
2024/07/19 クラシコムさん 面白法人カヤック 合同勉強会
ebi-yade
July 22, 2024
Tweet
Share
Featured
See All Featured
The World Runs on Bad Software
bkeepers
PRO
68
11k
Building Better People: How to give real-time feedback that sticks.
wjessup
367
19k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
657
60k
The Language of Interfaces
destraynor
158
25k
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
34
3k
Designing for Performance
lara
609
69k
Building an army of robots
kneath
306
45k
Building Adaptive Systems
keathley
43
2.6k
The Pragmatic Product Professional
lauravandoore
35
6.7k
Why Our Code Smells
bkeepers
PRO
337
57k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Transcript
2024年7月19日 @ クラシコムさん 大量の OpenTelemetry スパンを Cloud Trace に送りつけそうになった話 カヤックSRE
市川恭佑(@ebi-yade)
Who is @ebi-yade IT エンジニアをやっています • カヤック SRE 3年目(新卒入社)
• Google Cloud Observability が好き • 最近ありがたいことに?仕事が増加傾向 💪 筋トレはじめました • パーソナル初心者 • 荷重スクワットが楽しい • 上半身は伸び代チョモランマ
OpenTelemetry、やってますか?
OpenTelemetry とは 複雑なトラブルシューティングの 属人化を排除する取り組み “オブザーバビリティ” → テレメトリシグナルの取り扱いを標準化 テレメトリシグナルの例: • ログ
• トレース • メトリクス • プロファイラ
OpenTelemetry とは 複雑なトラブルシューティングの 属人化を排除する取り組み “オブザーバビリティ” → テレメトリシグナルの取り扱いを標準化 テレメトリシグナルの例: • ログ
• トレース • メトリクス • プロファイラ 今日のトピック
トレースとは • どの処理にどのくらい時間かかったかを可視化したもの • ↓それぞれのボックスを “スパン” という
OpenTelemetry Go SDK による初期化の例 exporter, err := googletrace.New(googletrace.WithProjectID(projectID)) if err
!= nil { ... } resource, err := // 略 tracerProvider := sdktrace.NewTracerProvider( sdktrace.WithBatcher(exporter), // 出力先 == Google Cloud Trace sdktrace.WithResource(resource), sdktrace.WithSampler( // スパンを間引く sdktrace.ParentBased( // 基本的に親スパンの設定に従う sdktrace.TraceIDRatioBased(defaultSampleRatio), // 親スパンが存在しなかった場合 => 一定の確 率 ), ), )
ことの発端 exporter, err := googletrace.New(googletrace.WithProjectID(projectID)) if err != nil {
... } resource, err := // 略 tracerProvider := sdktrace.NewTracerProvider( sdktrace.WithBatcher(exporter), // 出力先 == Google Cloud Trace sdktrace.WithResource(resource), sdktrace.WithSampler( // スパンを間引く sdktrace.ParentBased( // 基本的に親スパンの設定に従う sdktrace.TraceIDRatioBased(defaultSampleRatio), // 親スパンが存在しなかった場合 => 一定の確 率 ), ), ) defaultSampleRatio := 1.0 sdktrace.AlwaysSample()と等価
検証環境のトレース一覧 正常時
検証環境のトレース一覧 あっ......😇
ご清聴ありがとうございました
という訳にもいかないので 気を取り直して状況の整理......
ことの発端 exporter, err := googletrace.New(googletrace.WithProjectID(projectID)) if err != nil {
... } resource, err := // 略 tracerProvider := sdktrace.NewTracerProvider( sdktrace.WithBatcher(exporter), // 出力先 == Google Cloud Trace sdktrace.WithResource(resource), sdktrace.WithSampler( // スパンを間引く sdktrace.ParentBased( // 基本的に親スパンの設定に従う sdktrace.TraceIDRatioBased(defaultSampleRatio), // 親スパンが存在しなかった場合 => 一定の確 率 ), ), ) 親スパンが存在しない場合の挙動を 「常にサンプルする」にした
そもそも「親スパンがある」という状態とは 以下のどれかに該当する • 計装済み関数の子孫として呼び出されており、親はサンプルされている • 計装済み関数の子孫として呼び出されており、親はサンプルされていない • クライアントがサンプルされているスパンを伝播してきた • クライアントがサンプルされていないスパンを伝播してきた
サンプルの成否は 存在とは別概念
そもそも「親スパンがある」という状態とは 以下のどれかに該当する • 計装済み関数の子孫として呼び出されており、親はサンプルされている • 計装済み関数の子孫として呼び出されており、親はサンプルされていない • クライアントがサンプルされているスパンを伝播してきた • クライアントがサンプルされていないスパンを伝播してきた
サンプルの成否は 存在とは別概念 親スパンがない → 存在しない (当たり前)
親スパンがある代表的なケース ロードバランサ リクエスト リクエストスコープの スパンを開始
親スパンがない代表的なケース ロードバランサ リクエスト 起動処理 バッファ付きの 非同期処理 グレースフル シャットダウン
問題のスパンたち google.devtools.cloudtrace.v2.TraceService/BatchWriteSpans
問題のスパンたち google.devtools.cloudtrace.v2.TraceService/BatchWriteSpans スパンを送ったよ! というスパン (非同期バッファ)
親スパンがない代表的なケース ロードバランサ リクエスト 起動処理 バッファ付きの 非同期処理 グレースフル シャットダウン
親スパンがない代表的なケース ロードバランサ リクエスト バッファ付きの 非同期処理 ここで Cloud Trace に スパンが送られていた
親スパンがない場合のサンプリングレートを1にした結果 スパンを送信! オブザーバビリティ バックエンド • Cloud Trace • AWS X-Ray
• はてな Vaxila
親スパンがない場合のサンプリングレートを1にした結果 スパンを送信! オブザーバビリティ バックエンド • Cloud Trace • AWS X-Ray
• はてな Vaxila バッファ付き非同期処理 → 親スパンがない
親スパンがない場合のサンプリングレートを1にした結果 スパンを送信! オブザーバビリティ バックエンド • Cloud Trace • AWS X-Ray
• はてな Vaxila スパンを送信した!というスパンを送信!
親スパンがない場合のサンプリングレートを1にした結果 スパンを送信! オブザーバビリティ バックエンド • Cloud Trace • AWS X-Ray
• はてな Vaxila スパンを送信した!というスパンを送信! スパンを送信した!というスパンを送信!
親スパンがない場合のサンプリングレートを1にした結果 スパンを送信! オブザーバビリティ バックエンド • Cloud Trace • AWS X-Ray
• はてな Vaxila スパンを送信した!というスパンを送信! スパンを送信した!というスパンを送信! スパンを送信した!というスパンを送信!
親スパンがない場合のサンプリングレートを1にした結果 スパンを送信! オブザーバビリティ バックエンド • Cloud Trace • AWS X-Ray
• はてな Vaxila スパンを送信した!というスパンを送信! スパンを送信した!というスパンを送信! スパンを送信した!というスパンを送信! スパンを送信した!というスパンを送信! ……
まとめ
まとめ 「親が無いスパン」はしっかり間引こう • バッファ付き非同期処理など、意識が向きにくい場所で開始される • そもそも OpenTelemetry の自動計装コード自体が認知されにくい • 一応トレース送信クライアントの設定でオプトアウトも可能ではある
触れてないけど大事なこと • SDK で OpenTelemetry Trace するならとりあえず ParentBased • さもなくば宙ぶらりんなスパンが爆誕する可能性