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

Ruby on Rails におけるOpenTelemetry の活用

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for Ryo Nakamine Ryo Nakamine
May 09, 2024
3.5k

Ruby on Rails におけるOpenTelemetry の活用

Pepabo Tech Conference #22 春のSREまつり にて発表した資料になります

Avatar for Ryo Nakamine

Ryo Nakamine

May 09, 2024
Tweet

Transcript

  1. 1 Ruby on Rails における OpenTelemetry の活⽤ 仲嶺 良 /

    GMO PEPABO,inc. Pepabo Tech Conference #22 春のSREまつり 2024.05.09
  2. 2 ⾃⼰紹介 技術部 プラットフォームグループ 2021年 中途⼊社 仲嶺 良 Nakamine Ryo SRE

    として minne の SLI / SLO の策定‧運⽤、それ に基づいたパフォーマンス改善や Kubernetes を⽤ いたコンテナプラットフォームの運⽤‧改善を担当 • naryo と呼ばれています • 沖縄県出⾝ • X : @r_nakamine
  3. 3 アジェンダ 1. minne について 2. Rails アプリケーション への導⼊ 2.1.

    open-telemetry/opentelemetry-ruby 2.2. ログとトレースの連携 2.3. メトリクスとトレースの連携 3. その他 OpenTelemetry 関連の活⽤事例 3.1. Service Graphs in Grafana Tempo 3.2. Exemplar 4. まとめ
  4. 4 アジェンダ 1. minneについて 2. Rails アプリケーション への導⼊ 2.1. open-telemetry/opentelemetry-ruby

    2.2. ログとトレースの連携 2.3. メトリクスとトレースの連携 3. その他 OpenTelemetry 関連の活⽤事例 3.1. Service Graphs in Grafana Tempo 3.2. Exemplar 4. まとめ
  5. minne について ライフスタイルに合わせたこだわりの作品を購⼊‧販売できる • 作家‧ブランド数 89 万件 • 登録作品数 1705

    万点突破 • アプリDL数 1467 万件以上 • 累計流通額 1,000 億円突破 作品数 No.1 国内最⼤ のハンドメイドマーケット (※) 6 ※ハンドメイド作品の販売を主軸とするハンドメイドマーケット運営会社 2社の作家・ブランド数と作品数に関する IR資料公表数値及びサイト公表数値を比較。 2023年4月14日時点、GMOペパボ調べ。
  6. minne について • システム⾃体は複数の Rails アプリケーションで構成されている • アプリケーションは全て Kubernetes 上で運⽤

    • オブザバーバビリティバックエンドに Prometheus や Grafana スタックを使⽤ • トレースやメトリクスは OpenTelemetry Collector を経由してそれぞれのバックエ ンドのサービスに送信 minne の構成 7 ※ 本日お話しする内容は Grafana を使用していることを前提とした内容が多少含まれています
  7. 8 アジェンダ 1. minne について 2. Rails アプリケーションへの導⼊ 2.1. open-telemetry/opentelemetry-ruby

    2.2. ログとトレースの連携 2.3. メトリクスとトレースの連携 3. その他 OpenTelemetry 関連の活⽤事例 3.1. Service Graphs in Grafana Tempo 3.2. Exemplar 4. まとめ
  8. open-telemetry/opentelemetry-ruby • Ruby ⽤の OpenTelemetry クライアント • API と SDK

    を提供している • Ruby で開発されたアプリケーションのテレメトリデータを、様々なバックエンド に送信することができる open-telemetry/opentelemetry-ruby 11 https://github.com/open-telemetry/opentelemetry-ruby
  9. open-telemetry/opentelemetry-ruby • open-telemetry/opentelemetry-ruby-contrib • 計装ライブラリ⽤のリポジトリ • Rack, Rails, Sinatra等の主要な gem

    の計装をサポート ◦ アプリケーションへの変更を最⼩限に計装を⾏うことができる Instrumentation Library 12 ref: https://opentelemetry.io/docs/languages/ruby/libraries/ 基本的には使用する計装ライブラリの gem をインストールして、以下のように設定すれば OK
  10. open-telemetry/opentelemetry-ruby • Rails の初期化プロセスの中で以下のように use_all() メソッドを呼び出すことで opentelemetry-instrumentation-all 内の全ての計装が有効になる ◦ 利⽤可能な計装ライブラリがロードされる

    • 適宜、Exporter や SpanProcessor 等の設定を⾏い、外部のサービスに対して テレメトリーデータを送信する Ruby on Rails で使う 14 ref: https://opentelemetry.io/docs/languages/ruby/libraries/
  11. open-telemetry/opentelemetry-ruby • ActiveRecord の各クラスに対してパッチを適⽤ ◦ 計装の処理が⼊った Patches Module を mix-in

    している ◦ prepend() を使⽤し Patches Module で定義した同名のメソッドで override している どのように計装しているか - (例) ActiveRecord Instrumentation 15 https://github.com/open-telemetry/opentelemetry-ruby-contrib/blob/92277bd99e237b0f89d8e6a4089e5cc7ece509fd/instru mentation/active_record/lib/opentelemetry/instrumentation/active_record/instrumentation.rb#L33-L51
  12. open-telemetry/opentelemetry-ruby • OpenTelemetry API を使⽤し 計装対象のメソッドの処理をトレーススパンでラッ プすることで、各種トレースデータを収集している (例) ::ActiveRecord::Base.prepend(Patches::Querying) 16

    https://github.com/open-telemetry/opentelemetry-ruby-contrib/blob/e76ee259c30158ef1f105148099139f320c3ee3a/instrumentation/active_record/lib/opentelemetry/instrumentation/active _record/patches/querying.rb
  13. 18

  14. ログとトレースの連携 • リクエストごとに発⾏されるトレース ID をログなどその他のイベントに付与する ことで、該当のトレースを追跡することが可能 ◦ Error Tracking ツールの

    Sentry とも連携できたら便利そう! (例) Rails.application.config.log_tags にトレース ID を付与 ログにトレース ID を付与する 22
  15. ログとトレースの連携 • Kubernetes のログは全て Grafana Loki に集約するようにしている • ログからトレース、トレースからログへの遷移が可能 Grafana

    Loki → Grafana Tempo 23 ref: https://grafana.com/blog/2020/11/09/trace-discovery-in-grafana-tempo-using-prometheus-exemplars-loki-2.0-queries-and-more/
  16. メトリクスとトレースの連携 • 取得したスパンから Request, Error and Duration (R.E.D) メトリクスを⽣成する ◦

    opentelemetry-ruby-contrib を⽤いて収集したトレースデータを活⽤できる! ◦ ActiveRecord, Rack, HTTP 等それぞれのトレースデータからリクエスト数、エラー数、 実⾏時間をメトリクスとして収集できる • 後ほど紹介する Exemplar の機能を使えば、メトリクスにトレース ID を紐づけるこ とかができ、メトリクス → トレース間の連携も可能 Span metrics 25
  17. メトリクスとトレースの連携 • Grafana Tempo の Metrics-Generator で⽣成する ◦ https://grafana.com/docs/tempo/latest/metrics-generator/ •

    OpenTelemetry Collector の Span Metrics Connector で⽣成する ◦ https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/conn ector/spanmetricsconnector ◦ OpenTelemetry Collector の Connectorについてはこちらを参考に ▪ Building a ServiceMap with Service Graph Connector ※ ↑⽣成されるメトリクス名が微妙に違うので注意 Span metrics を収集するには 26
  18. 28 アジェンダ 1. minneについて 2. Rails アプリケーション への導⼊ 2.1. opentelemetry/opentelemetry-ruby

    2.2. ログとトレースの連携 2.3. メトリクスとトレースの連携 3. その他 OpenTelemetry 関連の活⽤事例 3.1. Service Graphs in Grafana Tempo 3.2. Exemplars 4. まとめ
  19. Service Graphs 30 • トレースデータを分析し、サービス間 の相互関係構築するためのメトリクスを⽣成 する ◦ OpenTelemetry のセマンティック規約を元にサービス間のリクエストを検出

    • ⽣成されたメトリクスは Grafana で可視化できる • Span metrics と同様に、OpenTelemetry Collector の Service Graph Connector、 または Grafana Tempo の Metrics-Generator を⽤いてメトリクスを⽣成すること が可能 Service Graphs
  20. Service Graphs 31 ⽣成されるメトリクス traces_service_graph_request_total 2 つのサービス間のリクエストの合計数 traces_service_graph_request_failed_total 2 つのサービス間で失敗したリクエストの合計数

    traces_service_graph_request_server_seconds サーバーから⾒た 2 つのサービス間のリクエストの処理時間 traces_service_graph_request_client_seconds クライアントから⾒た 2 つのサービス間のリクエストの処理時間 traces_service_graph_unpaired_spans_total ペアになっていない span の合計数 traces_service_graph_dropped_spans_total ドロップされた span の合計数
  21. Service Graphs • traces_service_graph_ から始まるメトリクスを元にサービス間の相互関係を Grafana Tempo の Service Graphs

    の機能を使って可視化する • 相互関係だけでなくシステムの健全性も可視化される ◦ レイテンシー、エラー率 Service Graphs in Grafana Tempo 32
  22. Exemplar • 収集されたメトリクスに対して付加情報を追加することができる ◦ トレースID を付与することで、トレースとメトリクスの連携が可能 • Spanmetrics, ServiceGraph も

    Exemplar を有効にすることでメトリクスに対して トレース ID を付与することができる Exemplar に関しては 逆井(さかさい)さんの記事を Google Cloud Managed Service for Prometheusを使ってメトリクスとトレースを紐付け O11y 強化! 参考にさせて頂きました Exemplar 36
  23. 38 アジェンダ 1. minneについて 2. Rails アプリケーション への導⼊ 2.1. opentelemetry/opentelemetry-ruby

    2.2. ログとトレースの連携 2.3. メトリクスとトレースの連携 3. その他 OpenTelemetry 関連の活⽤事例 3.1. Service Graphs in Grafana Tempo 3.2. Exemplar 4. まとめ
  24. • Ruby on Rails の計装は open-telemetry/opentelemetry-ruby を活⽤ ◦ 各種計装ライブラリが現状トレースしか実装されていない •

    ログに関してはトレース ID を付与して Grafana の機能を使って ログとトレース繋 ぎこみを⾏なっている • SpanMetrics を活⽤しトレースからメトリクスを⽣成、また Exemplar 合わせて活 ⽤することで、メトリクスとトレースの繋ぎこみを⾏なっている まとめ 39