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.4k
大量の OpenTelemetry スパンを Cloud Trace に送りつけそうになった話
2024/07/19 クラシコムさん 面白法人カヤック 合同勉強会
ebi-yade
July 22, 2024
Tweet
Share
Featured
See All Featured
Bash Introduction
62gerente
608
210k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
169
50k
Teambox: Starting and Learning
jrom
133
8.8k
Making the Leap to Tech Lead
cromwellryan
133
8.9k
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
26
2.1k
Why Our Code Smells
bkeepers
PRO
334
57k
Rebuilding a faster, lazier Slack
samanthasiow
79
8.7k
Large-scale JavaScript Application Architecture
addyosmani
510
110k
Stop Working from a Prison Cell
hatefulcrawdad
267
20k
What’s in a name? Adding method to the madness
productmarketing
PRO
22
3.1k
The Power of CSS Pseudo Elements
geoffreycrofte
73
5.3k
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 • さもなくば宙ぶらりんなスパンが爆誕する可能性