Upgrade to Pro — share decks privately, control downloads, hide ads and more …

分散トレーシングとOpenTelemetryのススメ / Getting started di...

分散トレーシングとOpenTelemetryのススメ / Getting started distributed tracing and OpenTelemetry

OCHaCafe Season7 の LT 資料です。
https://ochacafe.connpass.com/event/282817/

逆井(さかさい)

June 07, 2023
Tweet

More Decks by 逆井(さかさい)

Other Decks in Technology

Transcript

  1. - 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
  2. - 2023/06/07 Oracle Cloud Hangout Cafe #Season7 - 今日 15

    分間ちょっとで話すこと 分散トレーシング はいいぞ!   複雑化されたサービス(MSA / Kubernetes 上サービス)において、   サービス間の関係性を把握したり、処理時間のボトルネックの原因特定が難しい → 分散トレーシングの概要を話します 実際やっていくとき は幾つか (そんなに大変じゃないけど) 考えることがあるぞ!   ・計装 / バックエンド何にする / OTel Collector / UI は?   ・トレースサンプリング戦略 OpenTelemetry はいいぞ!   分散トレーシングをするための標準化された計装ライブラリ → OpenTelemtry で分散トレーシングする方法、仕組み について解説します メイン
  3. ▪ 分散トレーシング の基礎知識(と用語) - 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/ • トレース・・・・・リクエストの 一連の流れ を示す • スパン・・・・・・トレースの構成要素で、特定の処理 を示す • コンテキスト・・・トレースやスパンなど分散トレーシングする上で必要な情報 コンテキスト コンテキスト コンテキスト コンテキスト トレース
  4. ▪コンテキストの伝播 - 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 が同じ
  5. <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 などが含まれる。
  6. - 2023/06/07 Oracle Cloud Hangout Cafe #Season7 - 分散トレーシングはいいぞ サンプルとして・・・

    Tempo 想定より あるサービスの ある処理で遅い と "計測" できる with Tempo & Grafana
  7. - 2023/06/07 Oracle Cloud Hangout Cafe #Season7 - 分散トレーシングはいいぞ サンプルとして・・・

    Tempo 想定より あるサービスの ある処理で遅い と "計測" できる with Tempo & Grafana 以上が 分散トレーシング の概要です。 便利そうだけど、なんか面倒臭そう・・・と思った方、 安心してください。 面倒ごとは丸っと 計装 ライブラリ がやってくれます。
  8.   計装ライブラリとしての "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 を推奨している ※ 機能劣後や、メンテナンス性も加味する必要あり
  9. 計装ライブラリとしての "OpenTelemetry (OTel) ” - 2023/06/07 Oracle Cloud Hangout Cafe

    #Season7 - OpenTelemetry はいいぞ 🔥伝播 🔥送信 🔥生成 分散トレーシングの計装ライブラリ場合、 ◦ Span / Trace の 生成 ◦ コンテキスト 伝播 ◦ エクスポーターによるデータの 送信 などを簡単に実装することができる。
  10. 計装ライブラリとしての "OpenTelemetry (OTel) ” - 2023/06/07 Oracle Cloud Hangout Cafe

    #Season7 - OpenTelemetry はいいぞ 🔥伝播 🔥送信 🔥生成 分散トレーシングの場合、 ◦ Span / Trace の 生成 ◦ コンテキスト 伝播 ◦ エクスポートの設定からデータの 送信 などを簡単に実装することができる。 OpenTelemetry を使って どのようにトレースの計装を行うのかイメージで解説します。 ※ コードベースではなく、ライブラリで使われるコンポーネントをベースで イメージできるようになることが目的
  11. ① 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() するだけ!
  12. ① 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() するだけ! 詳しく! 簡単なので 割愛!
  13. - 2023/06/07 Oracle Cloud Hangout Cafe #Season7 - OpenTelemetry はいいぞ

    OTel SDK のセットアップの主要な登場人物 Trace Provider Sampler Span Processor Resource Exporter ※ icon はイメージとなります ※ Context Propager は省略
  14. - 2023/06/07 Oracle Cloud Hangout Cafe #Season7 - OpenTelemetry はいいぞ

    Trace Provider Sampler Span Processor Resource Exporter 親玉 trace の属性 Span 処理する Span 送る Span をふるう OTel SDK のセットアップの主要な登場人物 (上位抽象概念)
  15. - 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
  16. - 2023/06/07 Oracle Cloud Hangout Cafe #Season7 - OpenTelemetry はいいぞ

    Trace Provider Sampler Span Processor Resource Exporter ▪ SpanProcessor:Span を処理するコンポーネント • BatchSpanPorcessor ◦ バッチとして Span をバックエンドに送信する • SimpleSpanProcessor ◦ 一個ずつバックエンドに送信する ※ 商用では非推奨 OTel SDK のセットアップの主要な登場人物
  17. - 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." 、 などとする(例えば)
  18. - 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
  19. - 2023/06/07 Oracle Cloud Hangout Cafe #Season7 - OpenTelemetry はいいぞ

    Trace Provider(= tracer) Sampler Span Processor Resource Exporter これらのコンポーネントが TraceProvider(= tracer) に搭載される ① OTel SDK のセットアップ
  20. - 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 の生成
  21. - 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 の生成 ライブラリを使うことで 簡単にセットアップから計装できる!
  22. - 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 してください。
  23. - 2023/06/07 Oracle Cloud Hangout Cafe #Season7 - OpenTelemetry はいいぞ

    最終的に、バックエンドに Jaeger を繋ぐなどして... ※ 今回は1サービス内でのトレーシング Span Resource
  24. - 2023/06/07 Oracle Cloud Hangout Cafe #Season7 - 最後に、トレースサンプリング戦略について軽く 分散トレーシングする上で考えるべきことはいくつかあるが、

    ここでは、トレースサンプリング戦略 について軽く触れて終わろうと思います。 参考:https://opentelemetry.io/docs/concepts/sampling/ この辺はほんと は不要では? 特に欲しいのは 一部の異常な トレースでは? ランダムで 欲しいトレース 収集できるの?
  25. ▪ Head based Sampling • アプリケーション側でサンプリングして、バックエンドに送信 • Sampler で述べた方式 ▪

    Tail based Sampling • OpenTelemetry Collector にトレースを集約し処理することで High レイテンシやエラーがあるトレースを抽出 し、バックエンドに送信 (tail sampling processor) • 注意:トレースデータを全量送るためパフォーマンス影響は見る必要がある - 2023/06/07 Oracle Cloud Hangout Cafe #Season7 - 最後に、トレースサンプリング戦略について軽く 理論はそうだが、 実践的できてないので、 運用ノウハウある方は ぜひ教えてください...
  26. - 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
  27. - 2023/06/07 Oracle Cloud Hangout Cafe #Season7 - まとめ •

    分散トレーシング・OpenTelemetry はいいぞ!! • Observability の文脈でよく聞きますが、トレースを見れば OK ではなく、 "ログやメトリクス、プロファイリングなどのテレメトリーを継続的に関連づけて蓄積し、 必要なときに必要な切り口(ディメンション)で分析できること"が重要 • 最後に、Kubernetes 上でも分散トレーシングは有益だよ!!