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 SpanProcessor を Let's カスタマイズ!
Search
Tomonori Hayashi / ぴーはや
May 16, 2025
Technology
410
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
OpenTelemetry SpanProcessor を Let's カスタマイズ!
Tomonori Hayashi / ぴーはや
May 16, 2025
More Decks by Tomonori Hayashi / ぴーはや
See All by Tomonori Hayashi / ぴーはや
BigQuery の Cross-cloud Lakehouse への歩み
phaya72
2
660
ビジネス要望の翻訳が生む アーキテクチャの複雑性とトレードオフ
phaya72
2
570
設計に疎いエンジニアでも始めやすいアーキテクチャドキュメント
phaya72
34
22k
OpenTelemetry が拡げる Gemini CLI の可観測性
phaya72
3
3.6k
Pub/Sub vs Cloud Tasks - その違い、わかりますか?-
phaya72
2
510
非同期処理でも分散トレーシングしたい!- OpenTelemetry × Pub/Sub -
phaya72
2
950
エラーバジェット枯渇の原因 - 偽陽性との戦い -
phaya72
2
220
Vertex AI Experimentsの実態 - コードを辿った先にあったもの -
phaya72
3
1.4k
オブザーバビリティと開発優先度との向き合い方
phaya72
5
1k
Other Decks in Technology
See All in Technology
発表と総括 / Presentations and Summary
ks91
PRO
0
200
AI時代におけるエンジニアの新たな役割──FDEとクオリアの探求/登壇資料(戸井田 裕貴)
hacobu
PRO
0
370
複数プロダクト組織のAIネイティブ化における戦略 / AICon2026_kude
rakus_dev
0
310
OpenTelemetryにおけるGoのゼロコード・コンパイル時計装について #fukuokago
quiver
0
290
テックカンファレンス三大ステークホルダーの文化人類学 ─ 違いを認め合う関係性作り
bash0c7
2
340
『モデル + ハーネス』で読み解く AIエージェント入門
oracle4engineer
PRO
2
180
副作用のある Lambda でも Lambda Power Tuning は使えるのか / lambda-power-tuning-side-effects
koukihosaka
2
150
データエンジニアリングとドメイン駆動設計
masuda220
PRO
14
2.6k
Multicaで30個のミニプロジェクトをAIエージェント運用して見えてきたこと
eiei114
1
650
AIが当たり前の組織で エンジニアはどう育つか
nishihira
1
1.2k
複数プロダクトで進めるAI機能実装 ── 実践から得たリアルな学びとロードマップ実現への挑戦 / AICon2026_yanari
rakus_dev
1
280
JAWS_ICEBERG_BASECAMP
iqbocchi
2
110
Featured
See All Featured
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
190
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.5k
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
220
How GitHub (no longer) Works
holman
316
150k
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
[SF Ruby Conf 2025] Rails X
palkan
2
1.2k
How STYLIGHT went responsive
nonsquared
100
6.2k
Making the Leap to Tech Lead
cromwellryan
135
10k
How to Think Like a Performance Engineer
csswizardry
28
2.7k
Claude Code のすすめ
schroneko
67
230k
New Earth Scene 8
popppiees
3
2.4k
Transcript
OpenTelemetry SpanProcessor を Let’s カスタマイズ SRE Tech Talk #12 -
Tomonori Hayashi 1
Tomonori Hayashi • NTT コミュニケーションズ ◦ ソフトウェアエンジニア ▪ Front:TypeScript -
React/Next.js ▪ Infra:Google Cloud • Google Cloud Partner Top Engineer 2024 - 2025 • Google Cloud Tech Blog Challenge 2024 個人カテゴリ受賞 • Google Cloud All Certifications • コミュニティ ◦ Jagu’e’r (Google Cloud 公式ユーザーコミュニティ) ▪ Evangelist ▪ オブザーバビリティ分科会 Organizer • 興味がある方はぜひ Connpass グループにご参加ください! 2 @pHaya72 @t_hayashi
本日お話しすること • 想定以上にスパンが生成されてしまった罠について • OpenTelemetry Collector を使わなくてもスパンをカスタムできることについて
4 とある日に見つけたトレース 7000 以上のスパンが生成されてトレースに紐づいている・・・
5 きっかけは Cloud Run の制約 Cloud Run のリクエスト最大サイズの制約にハマった HTTP/1.1 50MB
Upload 引用:https://cloud.google.com/run/quotas?hl=ja
6 原因は FastAPI のライブラリ計装と Hypercorn 制約を回避するために HTTP/2 でリクエストを受けるように変更 HTTP/1.1 50MB
Upload HTTP/2 50MB Upload
7 原因は FastAPI のライブラリ計装と Hypercorn それぞれの性質から仮説をたてた HTTP/1.1 50MB Upload HTTP/2
50MB Upload 原因となりえる仮説 FastAPI のライブラリ計装は クライアント・サーバー間の通信が発生する度に スパンが生成される ASGI の イベントごとに スパンを生成
8 原因は FastAPI のライブラリ計装と Hypercorn それぞれの性質から仮説をたてた HTTP/1.1 50MB Upload HTTP/2
50MB Upload 原因となりえる仮説 FastAPI のライブラリ計装は クライアント・サーバー間の通信が発生する度に スパンが生成される Hypercorn はリクエストボディの受信 を粒度の細かいチャンクに分割 フレーム フレーム フレーム フレーム フレーム フレーム フレーム フレーム フレーム フレーム フレーム ライフサイクル イベントが発生 ASGI の イベントごとに スパンを生成
9 原因は FastAPI のライブラリ計装と Hypercorn それぞれの性質から仮説をたてた HTTP/1.1 50MB Upload HTTP/2
50MB Upload 原因となりえる仮説 FastAPI のライブラリ計装は クライアント・サーバー間の通信が発生する度に スパンが生成される Hypercorn はリクエストボディの受信 を粒度の細かいチャンクに分割 → 高頻度でスパン生成が行われてしまっていた フレーム フレーム フレーム フレーム フレーム フレーム フレーム フレーム フレーム フレーム フレーム ライフサイクル イベントが発生 ASGI の イベントごとに スパンを生成
10 Before :不要なスパンをフィルタリングしたい ローカルでは otel-tui で確認 課題発覚時は右図のように「 http receive」という サフィックスのつくスパンが大量に生成される
冒頭ではこのようなスパンが 7000 以上トレースに 紐づいてしまっていてデバッグしづらい状況に 特定サフィックスのつくスパン名のス パンを除外したい
11 OpenTelemetry Collector があれば・・ Processors で処理できそう 特定のスパンの除外などは Collector に任せればよさそう 一方で、Collector
のデプロイに悩んだ ・既存の Collector は GKE 上にあり公開していない → Cloud Run 上のアプリケーションから参照可能な 新たな Collector を用意する必要があった → 管理コンポーネントの増加や管理するリポジトリの検討な どいくつか面倒な問題が・・・ 今回はアプリから直送する形に!
12 After :SpanProcessor をカスタムすることで解決 OpenTelemetry-Python のコード on_start 関数 ・スパンが開始された時に呼び出されるメソッド ・注意点としてスパンを開始したスレッドで同期的に
呼び出されるために、処理をブロックするような実装は 避けるべきとのこと on_end 関数 ・スパンが終了した時に呼び出されるメソッド ・ReadableSpan 型のオブジェクトが終了したスパンとなっており、 スパンが終了した後は基本的に読み取り専用となっている on_end 関数で生成したスパンを処理する 引用:https://github.com/open-telemetry/opentelemetry-python/blob/main/opentelemetry-sdk/src/opentelemetry/sdk/trace/export/__init__.py
13 After :SpanProcessor をカスタムすることで解決 直送でも SpanProcessor のカスタムが可能 BatchSpanProcessor を継承した CustomSpaProcessor
を作成 特定のサフィックスがつくスパン名を除外するように on_end 関数をオーバーライドする
想定以上のスパン生成を経験 • FastAPI のライブラリ計装と Hypercorn の性質が合わさったコーナーケースにハマった → コードを見に行って事象を想像できたのは良い経験だった OpenTelemetry Collector
がなくてもスパン生成をカスタムできる • Collector をデプロイしなくてもコード上でカスタムできた → チーム状況によってコンポーネントを増やすことを避けたいケースもあるため、コードでやりくり できるのは選択肢として持っておいても良さそう まとめと学び