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のススメ / Getting started di...
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
逆井(さかさい)
June 07, 2023
Technology
5.5k
8
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
分散トレーシングとOpenTelemetryのススメ / Getting started distributed tracing and OpenTelemetry
OCHaCafe Season7 の LT 資料です。
https://ochacafe.connpass.com/event/282817/
逆井(さかさい)
June 07, 2023
More Decks by 逆井(さかさい)
See All by 逆井(さかさい)
AI エージェントの「思考」を可視化する! Agent Observability 最前線 / getting-started-agent-observability-with-agent-platform
k6s4i53rx
1
560
Google Cloud における Managed OTel Collector へのディープダイブ / deepdive-google-cloud-managed-otel-collector
k6s4i53rx
0
46
エージェントの振る舞いを読み解く! Vertex AI Agent Engine と OpenTelemetry によるオブザーバビリティの実現 / getting-started-vertex-ai-agent-engine-with-opentelemetry
k6s4i53rx
2
640
ピーク時165万スパン/秒に立ち向かえ! オブザーバビリティコストを効率化する ABEMA におけるトレースサンプリングの実践的事例 / practical-trace-sampling-with-datadog
k6s4i53rx
2
1.3k
Datadog LLM Observabilityで実現するLLMOps実践事例 / practical-llm-observability-with-datadog
k6s4i53rx
2
2.5k
Telemetry APIから学ぶGoogle Cloud ObservabilityとOpenTelemetryの現在 / getting-started-telemetry-api-with-google-cloud
k6s4i53rx
1
710
実践!Datadogで高める OCIのオブザーバビリティ / Observability in Action: Enhancing OCI with Datadog
k6s4i53rx
1
1.1k
Datadog APM におけるトレース収集の流れ及び Retention Filters のはなし / datadog-apm-trace-retention-filters
k6s4i53rx
0
2.7k
Main Session からの続編: OpenTelemetry のトピックいろいろ / opentelemetry-zero-code-go-opamp
k6s4i53rx
1
370
Other Decks in Technology
See All in Technology
顧客に向き合う開発組織へ。リアーキテクチャとフィーチャーチーム化で挑む組織改革
safie
0
2.2k
Azure Serverless 2026:Production-ready な AI エージェント基盤 / Azure Serverless 2026: Production-Ready AI Agent Platform
miyake
2
460
山手線を徒歩で一周してわかった、 位置情報アプリは「足」が最強のデバッガー
hinakko
0
180
Von-Neumann Machines, Dreams & The Futures of IT
ufried
0
120
What the customer really needed
kawaguti
PRO
3
220
その Lambda、8分で 管理者権限まで奪われます
k1nakayama
7
3.4k
アプリをもっと"iOSアプリっぽく"する小さな工夫 / Small Touches That Make Your App Feel More Like an iOS App
matsuji
2
990
すぐできる衛星通信対応 あとは山奥に行くだけ
tatetate55
0
140
ScotSecure West 2026 - Glasgow
raybugg
0
140
データ_AIの事業の勝敗をわけるもの
nek0128
1
470
Genieを崇めよ
kameitomohiro
0
170
安心して変更できるWebフロントエンドの作り方
pirosikick
5
2.8k
Featured
See All Featured
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
580
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.6k
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
250
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
940
How GitHub (no longer) Works
holman
316
150k
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
760
Designing Powerful Visuals for Engaging Learning
tmiket
1
570
Code Review Best Practice
trishagee
74
20k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6.1k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
580
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
730
Designing for Timeless Needs
cassininazir
1
480
Transcript
- 2023/06/07 Oracle Cloud Hangout Cafe #Season7 - 分散トレーシングとOpenTelemetryのススメ –
超入門編 – 逆井(さかさい) 啓佑 @k6s4i53rx #ochacafe
- 2023/06/07 Oracle Cloud Hangout Cafe #Season7 - Who AM
I ?? 逆 井 啓 佑 さかさい intro_po.yaml 1 2 3 4 5 6 7 8 9 10 11 12 13 belongs: "SIer" kind: "SRE 兼 バックエンドエンジニア " # Kubernetes 運用してます。アプデ祭 大変... metadata: "Season5 カオスエンジニアリング回 " # "その Pod 突然落ちても大丈夫ですか ??" twitter: @k6s4i53rx
- 2023/06/07 Oracle Cloud Hangout Cafe #Season7 - 今日 15
分間ちょっとで話すこと 分散トレーシング はいいぞ! 複雑化されたサービス(MSA / Kubernetes 上サービス)において、 サービス間の関係性を把握したり、処理時間のボトルネックの原因特定が難しい → 分散トレーシングの概要を話します 実際やっていくとき は幾つか (そんなに大変じゃないけど) 考えることがあるぞ! ・計装 / バックエンド何にする / OTel Collector / UI は? ・トレースサンプリング戦略 OpenTelemetry はいいぞ! 分散トレーシングをするための標準化された計装ライブラリ → OpenTelemtry で分散トレーシングする方法、仕組み について解説します メイン
▪ 分散トレーシング の基礎知識(と用語) - 2023/06/07 Oracle Cloud Hangout Cafe #Season7
- 分散トレーシングはいいぞ A B E C D A B C D E 参考:https://www.jaegertracing.io/docs/1.45/architecture/ • トレース・・・・・リクエストの 一連の流れ を示す • スパン・・・・・・トレースの構成要素で、特定の処理 を示す • コンテキスト・・・トレースやスパンなど分散トレーシングする上で必要な情報 コンテキスト コンテキスト コンテキスト コンテキスト トレース
▪コンテキストの伝播 - 2023/06/07 Oracle Cloud Hangout Cafe #Season7 - 分散トレーシングはいいぞ
参考:https://docs.lightstep.com/docs/understand-distributed-tracing トレースツリーを描画するためには、各スパンがコンテキストを伝播 する必要があります。 Trace ID:ABC Span ID:123 Parent SpanID:null Trace ID:ABC Span ID:456 Parent SpanID:123 Trace ID:ABC Span ID:789 Parent SpanID:123 Trace ID:ABC Span ID:890 Parent SpanID:789 トレース Trace ID:ABC トレース ID は固有 親 Span が同じ
<Header> Trace ID Span ID - 2023/06/07 Oracle Cloud Hangout
Cafe #Season7 - 分散トレーシングはいいぞ サービス間では HTTP ヘッダに格納された情報を使って、コンテキストを伝播させます。 HTTP ヘッダの情報を、Handler で Extract、Client で Inject します。 ▪ サービス間のコンテキストの伝播 Handler Client Span 生成... リクエスト リクエスト <Header> Trace ID Span ID Extract Inject 基本的に後述の計装ライブラリに含まれる Context Propagator で行う。 実装としては、W3C Context や B3、AWS X-Ray などが含まれる。
- 2023/06/07 Oracle Cloud Hangout Cafe #Season7 - 分散トレーシングはいいぞ サンプルとして・・・
Tempo 想定より あるサービスの ある処理で遅い と "計測" できる with Tempo & Grafana
- 2023/06/07 Oracle Cloud Hangout Cafe #Season7 - 分散トレーシングはいいぞ サンプルとして・・・
Tempo 想定より あるサービスの ある処理で遅い と "計測" できる with Tempo & Grafana 以上が 分散トレーシング の概要です。 便利そうだけど、なんか面倒臭そう・・・と思った方、 安心してください。 面倒ごとは丸っと 計装 ライブラリ がやってくれます。
計装ライブラリとしての "OpenTelemetry (OTel) ” • OpenTelemetry はテレメトリー送信の標準仕様を定めている CNCF プロジェクト -
2023/06/07 Oracle Cloud Hangout Cafe #Season7 - OpenTelemetry はいいぞ ログやトレース、メトリクスなどのモニタリングデータの総称 • 計装ライブラリ や OpenTelemetry Collector(後述)も提供 • 基本的にモニタリングツールが計装ライブラリや、エージェントは用意してくれてはいるが、 OTel を使うことでプロプライエタリを緩和できる Service Jaeger Tempo クラウド サービス 計装 Service Jaeger Tempo クラウド サービス 計装 ※ OTel 対応の場合に限るが、メジャーどころは対応している ※ Jaeger も自前の計装ライブラリは非推奨とし、OTel を推奨している ※ 機能劣後や、メンテナンス性も加味する必要あり
計装ライブラリとしての "OpenTelemetry (OTel) ” - 2023/06/07 Oracle Cloud Hangout Cafe
#Season7 - OpenTelemetry はいいぞ 🔥伝播 🔥送信 🔥生成 分散トレーシングの計装ライブラリ場合、 ◦ Span / Trace の 生成 ◦ コンテキスト 伝播 ◦ エクスポーターによるデータの 送信 などを簡単に実装することができる。
計装ライブラリとしての "OpenTelemetry (OTel) ” - 2023/06/07 Oracle Cloud Hangout Cafe
#Season7 - OpenTelemetry はいいぞ 🔥伝播 🔥送信 🔥生成 分散トレーシングの場合、 ◦ Span / Trace の 生成 ◦ コンテキスト 伝播 ◦ エクスポートの設定からデータの 送信 などを簡単に実装することができる。 OpenTelemetry を使って どのようにトレースの計装を行うのかイメージで解説します。 ※ コードベースではなく、ライブラリで使われるコンポーネントをベースで イメージできるようになることが目的
① OTel SDK のセットアップ • 各 MS で必要 ※ ほぼ同じ手続き
- 2023/06/07 Oracle Cloud Hangout Cafe #Season7 - OpenTelemetry はいいぞ https://github.com/open-telemetry/opentelemetry-go/blob/main/example/otel-collector/main.go package main func initProvider() (func(context.Context) error, error) { …(略) return tracerProvider.Shutdown, nil } func main() { …(略) shutdown, err := initProvider() if err != nil { log.Fatal(err) } …(略) tracer := otel.Tracer("test-tracer") …(略) ctx, span := tracer.Start( ctx, "CollectorExporter-Example", trace.WithAttributes(commonAttrs...)) defer span.End() …(略) } OTel 計装の Example 引用 ② ① ② Span の生成 • Span 切りたいところでひたすら、 span := tracer.Start(...) defer span.End() するだけ!
① OTel SDK のセットアップ • 各 MS で必要 ※ ほぼ同じ手続き
- 2023/06/07 Oracle Cloud Hangout Cafe #Season7 - OpenTelemetry はいいぞ https://github.com/open-telemetry/opentelemetry-go/blob/main/example/otel-collector/main.go package main func initProvider() (func(context.Context) error, error) { …(略) return tracerProvider.Shutdown, nil } func main() { …(略) shutdown, err := initProvider() if err != nil { log.Fatal(err) } …(略) tracer := otel.Tracer("test-tracer") …(略) ctx, span := tracer.Start( ctx, "CollectorExporter-Example", trace.WithAttributes(commonAttrs...)) defer span.End() …(略) } OTel 計装の Example 引用 ② ① ② Span の生成 • Span 切りたいところでひたすら、 span := tracer.Start(...) defer span.End() するだけ! 詳しく! 簡単なので 割愛!
- 2023/06/07 Oracle Cloud Hangout Cafe #Season7 - OpenTelemetry はいいぞ
OTel SDK のセットアップの主要な登場人物 Trace Provider Sampler Span Processor Resource Exporter ※ icon はイメージとなります ※ Context Propager は省略
- 2023/06/07 Oracle Cloud Hangout Cafe #Season7 - OpenTelemetry はいいぞ
Trace Provider Sampler Span Processor Resource Exporter 親玉 trace の属性 Span 処理する Span 送る Span をふるう OTel SDK のセットアップの主要な登場人物 (上位抽象概念)
- 2023/06/07 Oracle Cloud Hangout Cafe #Season7 - OpenTelemetry はいいぞ
Trace Provider Sampler Span Processor Resource Exporter ▪ Resource:Trace の属性値を保持 • service.name (ex: shoppingcart) • service.instance.id (ex: pod 名) • service.version (ex: 1.0.0) • telemetry.sdk.name (otel) … などなどたくさんある OTel SDK のセットアップの主要な登場人物 参考として、 • Resource Semantic Conventions • GKE の 自動で Resource を入れてくれる OTel Collector の Processor Resource Detection Processor
- 2023/06/07 Oracle Cloud Hangout Cafe #Season7 - OpenTelemetry はいいぞ
Trace Provider Sampler Span Processor Resource Exporter ▪ SpanProcessor:Span を処理するコンポーネント • BatchSpanPorcessor ◦ バッチとして Span をバックエンドに送信する • SimpleSpanProcessor ◦ 一個ずつバックエンドに送信する ※ 商用では非推奨 OTel SDK のセットアップの主要な登場人物
- 2023/06/07 Oracle Cloud Hangout Cafe #Season7 - OpenTelemetry はいいぞ
Trace Provider Sampler Span Processor Resource Exporter ▪ Exporter:Span を送信するコンポーネント • WithEndpoint:送信先(デフォルトは "localhost:4317") 基本的な grpcOption を設定可能 ◦ WithInsecure() ◦ WithBlock() OTel SDK のセットアップの主要な登場人物 参考として、 K8s 上で Otel Collector (一応後述...) 宛だと、 "otel-collector.<namespace>.svc.cluster.local." 、 などとする(例えば)
- 2023/06/07 Oracle Cloud Hangout Cafe #Season7 - OpenTelemetry はいいぞ
Trace Provider Sampler Span Processor Resource Exporter ▪ Sampler:Span をサンプリングするコンポーネント • AlwaysOn:全てのトレースをサンプリングする※ 商用非推奨 • AlwaysOff:全てのトレースをサンプリングしない • TraceIdRationBased:指定されたサンプリングレート • ParentBased:親スパンの設定に基づく OTel SDK のセットアップの主要な登場人物 後ほど詳説するが、 • Head based Sampling => AP レイヤーでのサンプリング • Tail based Sampling => OTel Collector に集約してからサンプリング といった、サンプリング方式があり、 ここでの Sampler は "Head based Sampling" のこと 参考:https://christina04.hatenablog.com/entry/opentelemetry-sampling
- 2023/06/07 Oracle Cloud Hangout Cafe #Season7 - OpenTelemetry はいいぞ
Trace Provider(= tracer) Sampler Span Processor Resource Exporter これらのコンポーネントが TraceProvider(= tracer) に搭載される ① OTel SDK のセットアップ
- 2023/06/07 Oracle Cloud Hangout Cafe #Season7 - OpenTelemetry はいいぞ
Trace Provider(= tracer) Sampler Span Processor Resource Exporter Span A Span B Span C tracer.Start("Span A") tracer.Start("Span B") tracer.Start("Span C") その tracer を使って、 Span を作れ(tracer.Start)ば良い ② Span の生成
- 2023/06/07 Oracle Cloud Hangout Cafe #Season7 - OpenTelemetry はいいぞ
Trace Provider(= tracer) Sampler Span Processor Resource Exporter Span A Span B Span C tracer.Start("Span A") tracer.Start("Span B") tracer.Start("Span C") その tracer を使って、 Span を作れ(tracer.Start)ば良い ② Span の生成 ライブラリを使うことで 簡単にセットアップから計装できる!
- 2023/06/07 Oracle Cloud Hangout Cafe #Season7 - OpenTelemetry はいいぞ
Trace Provider(= tracer) Sampler Span Processor Resource Exporter Span A Span B Span C tracer.Start("Span A") tracer.Start("Span B") tracer.Start("Span C") その tracer を使って、 Span を作れ(tracer.Start)ば良い ② Span の生成 https://github.com/open-telemetry/opentelemetry-go/blob/main/example/otel-collector/main.go package main func initProvider() (func(context.Context) error, error) { …(略) return tracerProvider.Shutdown, nil } func main() { …(略) shutdown, err := initProvider() if err != nil { log.Fatal(err) } …(略) tracer := otel.Tracer("test-tracer") …(略) ctx, span := tracer.Start( ctx, "CollectorExporter-Example", trace.WithAttributes(commonAttrs...)) defer span.End() …(略) } OTel 計装の Example 引用 ② ① この後 OTel 計装の Example コード読むと、 少し見通し良いと思うので、 気になる方は check してください。
- 2023/06/07 Oracle Cloud Hangout Cafe #Season7 - OpenTelemetry はいいぞ
最終的に、バックエンドに Jaeger を繋ぐなどして... ※ 今回は1サービス内でのトレーシング Span Resource
- 2023/06/07 Oracle Cloud Hangout Cafe #Season7 - 最後に、トレースサンプリング戦略について軽く 分散トレーシングする上で考えるべきことはいくつかあるが、
ここでは、トレースサンプリング戦略 について軽く触れて終わろうと思います。 参考:https://opentelemetry.io/docs/concepts/sampling/ この辺はほんと は不要では? 特に欲しいのは 一部の異常な トレースでは? ランダムで 欲しいトレース 収集できるの?
▪ Head based Sampling • アプリケーション側でサンプリングして、バックエンドに送信 • Sampler で述べた方式 ▪
Tail based Sampling • OpenTelemetry Collector にトレースを集約し処理することで High レイテンシやエラーがあるトレースを抽出 し、バックエンドに送信 (tail sampling processor) • 注意:トレースデータを全量送るためパフォーマンス影響は見る必要がある - 2023/06/07 Oracle Cloud Hangout Cafe #Season7 - 最後に、トレースサンプリング戦略について軽く 理論はそうだが、 実践的できてないので、 運用ノウハウある方は ぜひ教えてください...
- 2023/06/07 Oracle Cloud Hangout Cafe #Season7 - 最後に、トレースサンプリング戦略について軽く 時間の都合上、
OpenTelemetry でトレースがどう作られるかのイメージにフォーカス アプリへの計装 / OpenTelemetry Collector ついて詳しく知りたい場合は、 (手前味噌ですが)こちらの記事を参考にしてください... OpenTelemetry Collector は使用推奨されているので、OTel 使う上で知っておいて損はないと思います。 「OpenTelemetry」とは https://atmarkit.itmedia.co.jp/ait/articles/230 1/31/news011.html
- 2023/06/07 Oracle Cloud Hangout Cafe #Season7 - まとめ •
分散トレーシング・OpenTelemetry はいいぞ!! • Observability の文脈でよく聞きますが、トレースを見れば OK ではなく、 "ログやメトリクス、プロファイリングなどのテレメトリーを継続的に関連づけて蓄積し、 必要なときに必要な切り口(ディメンション)で分析できること"が重要 • 最後に、Kubernetes 上でも分散トレーシングは有益だよ!!
記載されている会社名、商品名、 またはサービス名は、各社の商標登録または商標です。 - 2023/06/07 Oracle Cloud Hangout Cafe #Season7 -