Slide 1

Slide 1 text

- 2023/06/07 Oracle Cloud Hangout Cafe #Season7 - 分散トレーシングとOpenTelemetryのススメ – 超入門編 – 逆井(さかさい) 啓佑 @k6s4i53rx #ochacafe

Slide 2

Slide 2 text

- 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

Slide 3

Slide 3 text

- 2023/06/07 Oracle Cloud Hangout Cafe #Season7 - 今日 15 分間ちょっとで話すこと 分散トレーシング はいいぞ!   複雑化されたサービス(MSA / Kubernetes 上サービス)において、   サービス間の関係性を把握したり、処理時間のボトルネックの原因特定が難しい → 分散トレーシングの概要を話します 実際やっていくとき は幾つか (そんなに大変じゃないけど) 考えることがあるぞ!   ・計装 / バックエンド何にする / OTel Collector / UI は?   ・トレースサンプリング戦略 OpenTelemetry はいいぞ!   分散トレーシングをするための標準化された計装ライブラリ → OpenTelemtry で分散トレーシングする方法、仕組み について解説します メイン

Slide 4

Slide 4 text

■ 分散トレーシング の基礎知識(と用語) - 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/ ● トレース・・・・・リクエストの 一連の流れ を示す ● スパン・・・・・・トレースの構成要素で、特定の処理 を示す ● コンテキスト・・・トレースやスパンなど分散トレーシングする上で必要な情報 コンテキスト コンテキスト コンテキスト コンテキスト トレース

Slide 5

Slide 5 text

■コンテキストの伝播 - 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 が同じ

Slide 6

Slide 6 text

Trace ID Span ID - 2023/06/07 Oracle Cloud Hangout Cafe #Season7 - 分散トレーシングはいいぞ サービス間では HTTP ヘッダに格納された情報を使って、コンテキストを伝播させます。 HTTP ヘッダの情報を、Handler で Extract、Client で Inject します。 ■ サービス間のコンテキストの伝播 Handler Client Span 生成... リクエスト リクエスト Trace ID Span ID Extract Inject 基本的に後述の計装ライブラリに含まれる Context Propagator で行う。 実装としては、W3C Context や B3、AWS X-Ray などが含まれる。

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

- 2023/06/07 Oracle Cloud Hangout Cafe #Season7 - 分散トレーシングはいいぞ サンプルとして・・・ Tempo 想定より あるサービスの ある処理で遅い と "計測" できる with Tempo & Grafana 以上が 分散トレーシング の概要です。 便利そうだけど、なんか面倒臭そう・・・と思った方、 安心してください。 面倒ごとは丸っと 計装 ライブラリ がやってくれます。

Slide 9

Slide 9 text

  計装ライブラリとしての "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 を推奨している ※ 機能劣後や、メンテナンス性も加味する必要あり

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

① 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() するだけ!

Slide 13

Slide 13 text

① 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() するだけ! 詳しく! 簡単なので 割愛!

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

- 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

Slide 17

Slide 17 text

- 2023/06/07 Oracle Cloud Hangout Cafe #Season7 - OpenTelemetry はいいぞ Trace Provider Sampler Span Processor Resource Exporter ■ SpanProcessor:Span を処理するコンポーネント ● BatchSpanPorcessor ○ バッチとして Span をバックエンドに送信する ● SimpleSpanProcessor ○ 一個ずつバックエンドに送信する ※ 商用では非推奨 OTel SDK のセットアップの主要な登場人物

Slide 18

Slide 18 text

- 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..svc.cluster.local." 、 などとする(例えば)

Slide 19

Slide 19 text

- 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

Slide 20

Slide 20 text

- 2023/06/07 Oracle Cloud Hangout Cafe #Season7 - OpenTelemetry はいいぞ Trace Provider(= tracer) Sampler Span Processor Resource Exporter これらのコンポーネントが TraceProvider(= tracer) に搭載される ① OTel SDK のセットアップ

Slide 21

Slide 21 text

- 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 の生成

Slide 22

Slide 22 text

- 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 の生成 ライブラリを使うことで 簡単にセットアップから計装できる!

Slide 23

Slide 23 text

- 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 してください。

Slide 24

Slide 24 text

- 2023/06/07 Oracle Cloud Hangout Cafe #Season7 - OpenTelemetry はいいぞ 最終的に、バックエンドに Jaeger を繋ぐなどして... ※ 今回は1サービス内でのトレーシング Span Resource

Slide 25

Slide 25 text

- 2023/06/07 Oracle Cloud Hangout Cafe #Season7 - 最後に、トレースサンプリング戦略について軽く 分散トレーシングする上で考えるべきことはいくつかあるが、 ここでは、トレースサンプリング戦略 について軽く触れて終わろうと思います。 参考:https://opentelemetry.io/docs/concepts/sampling/ この辺はほんと は不要では? 特に欲しいのは 一部の異常な トレースでは? ランダムで 欲しいトレース 収集できるの?

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

- 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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

記載されている会社名、商品名、 またはサービス名は、各社の商標登録または商標です。 - 2023/06/07 Oracle Cloud Hangout Cafe #Season7 -