Lock in $30 Savings on PRO—Offer Ends Soon! ⏳

Ruby on Rails におけるOpenTelemetry の活用

Ryo Nakamine
May 09, 2024
2.2k

Ruby on Rails におけるOpenTelemetry の活用

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

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