Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
大量の OpenTelemetry スパンを Cloud Trace に送りつけそうになった話
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
ebi-yade
July 22, 2024
2.3k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
大量の OpenTelemetry スパンを Cloud Trace に送りつけそうになった話
2024/07/19 クラシコムさん 面白法人カヤック 合同勉強会
ebi-yade
July 22, 2024
Featured
See All Featured
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.8k
A better future with KSS
kneath
240
18k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
1k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
2
360
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
430
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.5k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.7k
Mind Mapping
helmedeiros
1
400
Agile that works and the tools we love
rasmusluckow
331
22k
Navigating Weather and Climate Data
rabernat
0
560
How to train your dragon (web standard)
notwaldorf
96
6.9k
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
780
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 • さもなくば宙ぶらりんなスパンが爆誕する可能性