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

OpenTelemetryでRailsのパフォーマンス分析を始めてみよう(KoR2024)

Y.Matsuda
October 25, 2024

 OpenTelemetryでRailsのパフォーマンス分析を始めてみよう(KoR2024)

Kaigi on Rails 2024での登壇資料になります。
https://kaigionrails.org/2024/talks/ymtdzzz/

Y.Matsuda

October 25, 2024
Tweet

More Decks by Y.Matsuda

Other Decks in Programming

Transcript

  1. • ゴール:トレースを知ってもらい、使ってみたくなる! ◦ パフォーマンス調査の難しさ ◦ ログ+メトリクス+ トレース 👈🆕 ▪ 何が嬉しいのか

    ▪ OpenTelemetryの位置付け ▪ 他ツールとの違い ◦ Railsアプリへの導入方法と実践(デモ) ◦ コスト、構成の選び方について 本日の内容 4
  2. • エンドツーエンドの粒度 ◦ ユーザーから見た 遅さ、使いにくさ ▪ パブリックLBのレイテンシー ▪ 500エラー、不具合の調査 など

    調査はエンドツーエンドの粒度から始まる (ことが多い) 8 私たちはそれを実装レベルの粒度までブレークダウンして 調査する必要がある
  3. ボトルネックの調査(可能性の絞り込み) 11 調査完了 調査開始 ボトルネック特定 テレメトリ中心の 仮説検証 コード中心の 仮説検証 解決方法の検討と

    優先度付け コード読むかぁ M回 N回 テレメトリ(ログやメトリクス)から可 能性を絞る ※事実からの分析=コア分析ループ
  4. ボトルネックの調査(可能性の絞り込み) 12 調査完了 調査開始 ボトルネック特定 テレメトリ中心の 仮説検証 コード中心の 仮説検証 解決方法の検討と

    優先度付け コード読むかぁ M回 N回 絞りきれなかった可能性に対し て仮説検証を繰り返す (コスト大・属人的) ローカルで再現 計測コードを仕込 んでデプロイ コードの理解度に依存
  5. • 集計データの根拠 としてログを手動で調べる 手間 • メトリクス粒度 の悩み ◦ パス別、ブラウザ別にLatency出したいんだけど ◦

    ログベースのカスタムメトリクス作るか・・・ ◦ →ほんとにこれメトリクスで取るべき情報なのかな? メトリクスの難しさ 17
  6. アプリケーション側の計装 • 手動計装 ◦ SpanのStart, Endをコードで実装 • 自動計装 ◦ gemで自動出力

    ▪ 実際はmonkey patch、又はActiveSupport::Notification を利用してStart, Endを差し込んでいる ◦ 今回のデモはこちら 29 計装:アプリケーションからテレメトリを出力 及び収集できるようにすること
  7. 収集フロー 30 HTTP Header(*) TraceID: ~~ SpanID: ~~ (*) HTTP以外も伝播可能(

    gRPC, AMQPのような非同期メッセージングまで)
  8. • Profiler ◦ MiniProfiler/rack-mini-profiler ◦ tmm1/stackprof • N+1 Detection ◦

    flyerhzm/bullet パフォーマンス関連のツールは色々ある 全て強力で有用なツール! 32
  9. • 汎用的 ◦ 言語、FWによらない ◦ 監視ツールや他テレメトリとの統合 • 直感的 ◦ 関連付け、ビジュアライズにより

    トレースが調査の入口になる 41 デバッグ範囲を絞り込んだ上で必要に応じて 詳細なツールへ( Profilerなど) 話を戻して、他ツールとの違いについて
  10. 分散トレーシングの導入ハードルの高さ(数年前) Dapper (Google) 2010 2012 2017 2019 OSS SaaS ※現在はServiceNow

    ※o11y関連のプロダクト開始年に 合わせてマッピング Splunk APM (ソース) Jaeger ソース Grafana Tempo 45
  11. • 技術選定コストが高い ◦ ライブラリ(実装コストに直結) ▪ 例えばFaradayの計装: Jaegerのclient使うよりもOpenCensus のFaradayMiddleware使う方が楽 とか ◦ バックエンド・データストア

    ▪ SaaSの選択肢が少ないので自前で構築・・・ ▪ 対応フォーマットは? ▪ コストは? 分散トレーシングの導入ハードルの高さ(数年前) 46
  12. OpenTelemetryの登場(2019.5) Dapper (Google) 2010 2012 2017 2019 OSS SaaS ※現在はServiceNow

    ※o11y関連のプロダクト開始年に 合わせてマッピング Splunk APM (ソース) Jaeger ソース Grafana Tempo 48
  13. • OpenTracingとOpenCensusを統合 • オブザーバビリティの実現に必要な ほぼ(*1) 全てを提供 ◦ トレース、ログ、メトリクス(*2) ◦ API仕様(Specification,

    OTLP) ◦ 言語別のSDK、instrumentation library ◦ デモやドキュメント OpenTelemetryの登場(2019.5) (*1)ほぼ・・・閲覧用のUIやストレージなど、バックエンドは今のところ提供していません (*2)ログとメトリクスは2024.10現在betaな機能が多いです 49
  14. • 様々なマネージドサービスへの依存 ◦ 通信の複雑さ • RailsのようなThe One Person Framework、豊富な Gem

    ◦ 処理のカプセル化 ◦ 巨大なコードベース モノリスでもそう言える? 「一目見て」何が起きているかわかるのはとても強力 52
  15. Railsアプリケーションを計装する • Gemを入れる • initializerを書く(最小限のコード例) • 環境変数を設定してサーバーを起動する $ bundle add

    opentelemetry-sdk opentelemetry-exporter-otlp opentelemetry-instrumentation-all # config/initializers/opentelemetry.rb require 'opentelemetry/sdk' require 'opentelemetry/instrumentation/all' OpenTelemetry::SDK.configure do |c| c.service_name = 'your-service-name' c.use_all() end 以上!バックエンドについては後ほど 55
  16. • ECサイト(Rails製) • 商品購入にはログイン が必要 ◦ Email / SNS(ID連携) デモアプリ

    - Kaigi on Rails STORE https://github.com/ymtdzzz/kaigi-on-rails-2024-otel 57
  17. • 数量限定セール施策 を開始 • ログイン処理が遅く ユーザーからのクレーム増(*) • あなたはログイン処理のパフォーマンス改善 を任された ◦

    認証領域についてはあまり詳しく無い ◦ データ量も増えており、スロークエリに悩まされている デモアプリ (*)元々ログインは遅かったが、瞬間風速の高い施策はそこまで多く無く、問題にはなっていなかった  なお、認証を長期間維持する仕組み(リフレッシュトークンなど)、ゲスト購入については今回は考えない 58
  18. ここで初めて実装を調べる ※デモ補足用 • jwks.jsonへのGETについてわかったこと ◦ OIDCによるID連携時に必要な処理 ◦ 処理自体はomniauth_openid_connect gemで実装 ◦

    毎回返ってくるデータは同じ ▪ KeyIDがローテしなければ全く同じデータ になる • 解決策の検討 ◦ 起動時にキャッシュする ◦ KeyIDに該当するJWKが見つからなければ取得し直してキャッ シュを更新する 70
  19. 補足)トレースとログの関連付け ※デモ補足用 • スパン詳細から「 Logs for this span」 • トレースに紐付くログを双方向で引いて

    これる • 役立つシーン ◦ エラーからユーザー影響 を調べる ◦ ステータスコードから根本原因を調 べる 73
  20. • 無料枠 ◦ Freeプラン ▪ 例:100GBまで無料 ◦ ホスト数に応じた無料枠 ▪ 例:150GB/ホスト,

    100万Spans/ホスト • 変わり種 ◦ ビルトインのサンプリングルールを使ったトレース(Span)の 件数への課金が無料 SaaSの柔軟な料金体系 79 見積もりした上で、まずは SaaSでトレースの 検証を始めてみましょう!
  21. • バックエンド ◦ SaaS(監視・o11y専門) ▪ NewRelic, Splunk, Datadog … ◦

    SaaS(パブリッククラウド) ▪ X-Ray, Cloud Trace … ◦ OSS(自前構築) ▪ Prometheus, Grafana … • 計装 ◦ OpenTelemetry ◦ SaaSベンダー独自形式 構成における選択肢 81
  22. • バックエンド ◦ SaaS(監視・o11y専門) ▪ NewRelic, Splunk, Datadog … ◦

    SaaS(パブリッククラウド) ▪ X-Ray, Cloud Trace … ◦ OSS(自前構築) ▪ Prometheus, Grafana … • 計装 ◦ OpenTelemetry ◦ SaaSベンダー独自形式 選定時の選択肢 82 • 既に使っている SaaSがある ならそれを使おう
  23. • バックエンド ◦ SaaS(監視・o11y専門) ▪ NewRelic, Splunk, Datadog … ◦

    SaaS(パブリッククラウド) ▪ X-Ray, Cloud Trace … ◦ OSS(自前構築) ▪ Prometheus, Grafana … • 計装 ◦ OpenTelemetry ◦ SaaSベンダー独自形式 選定時の選択肢 83 • SaaSの乗り換え可能性な どを考慮して決定 (移行コストはそこまで大き くない)
  24. • トレース ◦ ログ、メトリクスを補完する情報 ◦ 関連付けにより、テレメトリ全体 を強化 ▪ オブザーバビリティ へ

    • OpenTelemetryにより導入ハードルが下がった • トレース使っていきましょう まとめ 89