Slide 1

Slide 1 text

1 Ruby on Rails における OpenTelemetry の活⽤ 仲嶺 良 / GMO PEPABO,inc. Pepabo Tech Conference #22 春のSREまつり 2024.05.09

Slide 2

Slide 2 text

2 ⾃⼰紹介 技術部 プラットフォームグループ 2021年 中途⼊社 仲嶺 良 Nakamine Ryo SRE として minne の SLI / SLO の策定‧運⽤、それ に基づいたパフォーマンス改善や Kubernetes を⽤ いたコンテナプラットフォームの運⽤‧改善を担当 ● naryo と呼ばれています ● 沖縄県出⾝ ● X : @r_nakamine

Slide 3

Slide 3 text

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. まとめ

Slide 4

Slide 4 text

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. まとめ

Slide 5

Slide 5 text

5 https://pepabo.com

Slide 6

Slide 6 text

minne について ライフスタイルに合わせたこだわりの作品を購⼊‧販売できる ● 作家‧ブランド数 89 万件 ● 登録作品数 1705 万点突破 ● アプリDL数 1467 万件以上 ● 累計流通額 1,000 億円突破 作品数 No.1 国内最⼤ のハンドメイドマーケット (※) 6 ※ハンドメイド作品の販売を主軸とするハンドメイドマーケット運営会社 2社の作家・ブランド数と作品数に関する IR資料公表数値及びサイト公表数値を比較。 2023年4月14日時点、GMOペパボ調べ。

Slide 7

Slide 7 text

minne について ● システム⾃体は複数の Rails アプリケーションで構成されている ● アプリケーションは全て Kubernetes 上で運⽤ ● オブザバーバビリティバックエンドに Prometheus や Grafana スタックを使⽤ ● トレースやメトリクスは OpenTelemetry Collector を経由してそれぞれのバックエ ンドのサービスに送信 minne の構成 7 ※ 本日お話しする内容は Grafana を使用していることを前提とした内容が多少含まれています

Slide 8

Slide 8 text

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. まとめ

Slide 9

Slide 9 text

Rails アプリケーションへの導⼊ 9

Slide 10

Slide 10 text

open-telemetry/opentelemetry-ruby 10

Slide 11

Slide 11 text

open-telemetry/opentelemetry-ruby ● Ruby ⽤の OpenTelemetry クライアント ● API と SDK を提供している ● Ruby で開発されたアプリケーションのテレメトリデータを、様々なバックエンド に送信することができる open-telemetry/opentelemetry-ruby 11 https://github.com/open-telemetry/opentelemetry-ruby

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

open-telemetry/opentelemetry-ruby Instrumentation Library 13 https://github.com/open-telemetry/opentelemetry-ruby-contrib/tree/main/instrumentation

Slide 14

Slide 14 text

open-telemetry/opentelemetry-ruby ● Rails の初期化プロセスの中で以下のように use_all() メソッドを呼び出すことで opentelemetry-instrumentation-all 内の全ての計装が有効になる ○ 利⽤可能な計装ライブラリがロードされる ● 適宜、Exporter や SpanProcessor 等の設定を⾏い、外部のサービスに対して テレメトリーデータを送信する Ruby on Rails で使う 14 ref: https://opentelemetry.io/docs/languages/ruby/libraries/

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

open-telemetry/opentelemetry-ruby 17 ある程度決まったフォーマット で計装されているので、ライブ ラリの実装を読む前に最初にこ こを読んでみるのも良いかも 各計装ライブラリは template を元に実装されている

Slide 18

Slide 18 text

18

Slide 19

Slide 19 text

19 ● メトリクスとログは In development の状態 ● Instrumentation Libraries は今のところ トレース実装のみ

Slide 20

Slide 20 text

楽にログやメトリクスとも 連携したい 20

Slide 21

Slide 21 text

ログとトレースの連携 21

Slide 22

Slide 22 text

ログとトレースの連携 ● リクエストごとに発⾏されるトレース ID をログなどその他のイベントに付与する ことで、該当のトレースを追跡することが可能 ○ Error Tracking ツールの Sentry とも連携できたら便利そう! (例) Rails.application.config.log_tags にトレース ID を付与 ログにトレース ID を付与する 22

Slide 23

Slide 23 text

ログとトレースの連携 ● 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/

Slide 24

Slide 24 text

メトリクスとトレースの連携 24

Slide 25

Slide 25 text

メトリクスとトレースの連携 ● 取得したスパンから Request, Error and Duration (R.E.D) メトリクスを⽣成する ○ opentelemetry-ruby-contrib を⽤いて収集したトレースデータを活⽤できる! ○ ActiveRecord, Rack, HTTP 等それぞれのトレースデータからリクエスト数、エラー数、 実⾏時間をメトリクスとして収集できる ● 後ほど紹介する Exemplar の機能を使えば、メトリクスにトレース ID を紐づけるこ とかができ、メトリクス → トレース間の連携も可能 Span metrics 25

Slide 26

Slide 26 text

メトリクスとトレースの連携 ● 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

Slide 27

Slide 27 text

メトリクスとトレースの連携 メトリクスを集計してダッシュボードを作る 27 https://grafana.com/grafana/dashboards/18264-spanmetrics-demo-dashboard/

Slide 28

Slide 28 text

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. まとめ

Slide 29

Slide 29 text

Service Graphs 29

Slide 30

Slide 30 text

Service Graphs 30 ● トレースデータを分析し、サービス間 の相互関係構築するためのメトリクスを⽣成 する ○ OpenTelemetry のセマンティック規約を元にサービス間のリクエストを検出 ● ⽣成されたメトリクスは Grafana で可視化できる ● Span metrics と同様に、OpenTelemetry Collector の Service Graph Connector、 または Grafana Tempo の Metrics-Generator を⽤いてメトリクスを⽣成すること が可能 Service Graphs

Slide 31

Slide 31 text

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 の合計数

Slide 32

Slide 32 text

Service Graphs ● traces_service_graph_ から始まるメトリクスを元にサービス間の相互関係を Grafana Tempo の Service Graphs の機能を使って可視化する ● 相互関係だけでなくシステムの健全性も可視化される ○ レイテンシー、エラー率 Service Graphs in Grafana Tempo 32

Slide 33

Slide 33 text

Service Graphs 33

Slide 34

Slide 34 text

Service Graphs 34

Slide 35

Slide 35 text

Exemplar 35

Slide 36

Slide 36 text

Exemplar ● 収集されたメトリクスに対して付加情報を追加することができる ○ トレースID を付与することで、トレースとメトリクスの連携が可能 ● Spanmetrics, ServiceGraph も Exemplar を有効にすることでメトリクスに対して トレース ID を付与することができる Exemplar に関しては 逆井(さかさい)さんの記事を Google Cloud Managed Service for Prometheusを使ってメトリクスとトレースを紐付け O11y 強化! 参考にさせて頂きました Exemplar 36

Slide 37

Slide 37 text

Exemplar 37

Slide 38

Slide 38 text

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. まとめ

Slide 39

Slide 39 text

● Ruby on Rails の計装は open-telemetry/opentelemetry-ruby を活⽤ ○ 各種計装ライブラリが現状トレースしか実装されていない ● ログに関してはトレース ID を付与して Grafana の機能を使って ログとトレース繋 ぎこみを⾏なっている ● SpanMetrics を活⽤しトレースからメトリクスを⽣成、また Exemplar 合わせて活 ⽤することで、メトリクスとトレースの繋ぎこみを⾏なっている まとめ 39

Slide 40

Slide 40 text

40 We're hiring