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
2.1k
大量の OpenTelemetry スパンを Cloud Trace に送りつけそうになった話
2024/07/19 クラシコムさん 面白法人カヤック 合同勉強会
ebi-yade
July 22, 2024
Tweet
Share
Featured
See All Featured
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
0
450
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
640
Become a Pro
speakerdeck
PRO
31
5.8k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.7k
Chasing Engaging Ingredients in Design
codingconduct
0
140
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
2.4k
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
86
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
71
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
190
Designing Experiences People Love
moore
143
24k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
480
Paper Plane
katiecoart
PRO
0
48k
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 • さもなくば宙ぶらりんなスパンが爆誕する可能性