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
Reflections from 52 weeks, 52 projects
jeffersonlam
351
21k
Stop Working from a Prison Cell
hatefulcrawdad
271
21k
Keith and Marios Guide to Fast Websites
keithpitt
411
22k
Building Applications with DynamoDB
mza
95
6.5k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
21
1.3k
The Straight Up "How To Draw Better" Workshop
denniskardys
235
140k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
251
21k
Building a Modern Day E-commerce SEO Strategy
aleyda
42
7.4k
Java REST API Framework Comparison - PWX 2021
mraible
31
8.7k
Intergalactic Javascript Robots from Outer Space
tanoku
271
27k
Optimizing for Happiness
mojombo
379
70k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
34
5.9k
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 • さもなくば宙ぶらりんなスパンが爆誕する可能性