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

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

分散トレーシングと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 -
    分散トレーシングとOpenTelemetryのススメ
    – 超入門編 –
    逆井(さかさい) 啓佑
    @k6s4i53rx
    #ochacafe

    View Slide

  2. - 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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide


  6. 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 などが含まれる。

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  16. - 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

    View Slide

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

    View Slide

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

    View Slide

  19. - 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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  27. - 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

    View Slide

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

    View Slide

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

    View Slide