Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Ruby on Rails におけるOpenTelemetry の活用
Search
Ryo Nakamine
May 09, 2024
2
2.2k
Ruby on Rails におけるOpenTelemetry の活用
Pepabo Tech Conference #22 春のSREまつり にて発表した資料になります
Ryo Nakamine
May 09, 2024
Tweet
Share
More Decks by Ryo Nakamine
See All by Ryo Nakamine
Building a ServiceMap with Service Graph Connector
rnakamine
0
1.4k
10年動くアプリケーションに Embedded SRE を導入した話
rnakamine
3
410
ペパボのSREとして 働くきっかけ
rnakamine
0
1.7k
異業種からエンジニアになった僕が憧れの会社に飛び込むまで
rnakamine
1
660
EBILABを支えるクラウド・サーバーレス活用事例とこれから
rnakamine
0
63
Laravel NOVAを使ってみた
rnakamine
0
30
Featured
See All Featured
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
656
59k
Become a Pro
speakerdeck
PRO
25
5k
The Invisible Side of Design
smashingmag
298
50k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
44
6.9k
How STYLIGHT went responsive
nonsquared
95
5.2k
Building Applications with DynamoDB
mza
91
6.1k
Why You Should Never Use an ORM
jnunemaker
PRO
54
9.1k
Large-scale JavaScript Application Architecture
addyosmani
510
110k
VelocityConf: Rendering Performance Case Studies
addyosmani
326
24k
Typedesign – Prime Four
hannesfritz
40
2.4k
Fantastic passwords and where to find them - at NoRuKo
philnash
50
2.9k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
232
17k
Transcript
1 Ruby on Rails における OpenTelemetry の活⽤ 仲嶺 良 /
GMO PEPABO,inc. Pepabo Tech Conference #22 春のSREまつり 2024.05.09
2 ⾃⼰紹介 技術部 プラットフォームグループ 2021年 中途⼊社 仲嶺 良 Nakamine Ryo SRE
として minne の SLI / SLO の策定‧運⽤、それ に基づいたパフォーマンス改善や Kubernetes を⽤ いたコンテナプラットフォームの運⽤‧改善を担当 • naryo と呼ばれています • 沖縄県出⾝ • X : @r_nakamine
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 アジェンダ 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 https://pepabo.com
minne について ライフスタイルに合わせたこだわりの作品を購⼊‧販売できる • 作家‧ブランド数 89 万件 • 登録作品数 1705
万点突破 • アプリDL数 1467 万件以上 • 累計流通額 1,000 億円突破 作品数 No.1 国内最⼤ のハンドメイドマーケット (※) 6 ※ハンドメイド作品の販売を主軸とするハンドメイドマーケット運営会社 2社の作家・ブランド数と作品数に関する IR資料公表数値及びサイト公表数値を比較。 2023年4月14日時点、GMOペパボ調べ。
minne について • システム⾃体は複数の Rails アプリケーションで構成されている • アプリケーションは全て Kubernetes 上で運⽤
• オブザバーバビリティバックエンドに Prometheus や Grafana スタックを使⽤ • トレースやメトリクスは OpenTelemetry Collector を経由してそれぞれのバックエ ンドのサービスに送信 minne の構成 7 ※ 本日お話しする内容は Grafana を使用していることを前提とした内容が多少含まれています
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. まとめ
Rails アプリケーションへの導⼊ 9
open-telemetry/opentelemetry-ruby 10
open-telemetry/opentelemetry-ruby • Ruby ⽤の OpenTelemetry クライアント • API と SDK
を提供している • Ruby で開発されたアプリケーションのテレメトリデータを、様々なバックエンド に送信することができる open-telemetry/opentelemetry-ruby 11 https://github.com/open-telemetry/opentelemetry-ruby
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
open-telemetry/opentelemetry-ruby Instrumentation Library 13 https://github.com/open-telemetry/opentelemetry-ruby-contrib/tree/main/instrumentation
open-telemetry/opentelemetry-ruby • Rails の初期化プロセスの中で以下のように use_all() メソッドを呼び出すことで opentelemetry-instrumentation-all 内の全ての計装が有効になる ◦ 利⽤可能な計装ライブラリがロードされる
• 適宜、Exporter や SpanProcessor 等の設定を⾏い、外部のサービスに対して テレメトリーデータを送信する Ruby on Rails で使う 14 ref: https://opentelemetry.io/docs/languages/ruby/libraries/
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
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
open-telemetry/opentelemetry-ruby 17 ある程度決まったフォーマット で計装されているので、ライブ ラリの実装を読む前に最初にこ こを読んでみるのも良いかも 各計装ライブラリは template を元に実装されている
18
19 • メトリクスとログは In development の状態 • Instrumentation Libraries は今のところ
トレース実装のみ
楽にログやメトリクスとも 連携したい 20
ログとトレースの連携 21
ログとトレースの連携 • リクエストごとに発⾏されるトレース ID をログなどその他のイベントに付与する ことで、該当のトレースを追跡することが可能 ◦ Error Tracking ツールの
Sentry とも連携できたら便利そう! (例) Rails.application.config.log_tags にトレース ID を付与 ログにトレース ID を付与する 22
ログとトレースの連携 • 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/
メトリクスとトレースの連携 24
メトリクスとトレースの連携 • 取得したスパンから Request, Error and Duration (R.E.D) メトリクスを⽣成する ◦
opentelemetry-ruby-contrib を⽤いて収集したトレースデータを活⽤できる! ◦ ActiveRecord, Rack, HTTP 等それぞれのトレースデータからリクエスト数、エラー数、 実⾏時間をメトリクスとして収集できる • 後ほど紹介する Exemplar の機能を使えば、メトリクスにトレース ID を紐づけるこ とかができ、メトリクス → トレース間の連携も可能 Span metrics 25
メトリクスとトレースの連携 • 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
メトリクスとトレースの連携 メトリクスを集計してダッシュボードを作る 27 https://grafana.com/grafana/dashboards/18264-spanmetrics-demo-dashboard/
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. まとめ
Service Graphs 29
Service Graphs 30 • トレースデータを分析し、サービス間 の相互関係構築するためのメトリクスを⽣成 する ◦ OpenTelemetry のセマンティック規約を元にサービス間のリクエストを検出
• ⽣成されたメトリクスは Grafana で可視化できる • Span metrics と同様に、OpenTelemetry Collector の Service Graph Connector、 または Grafana Tempo の Metrics-Generator を⽤いてメトリクスを⽣成すること が可能 Service Graphs
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 の合計数
Service Graphs • traces_service_graph_ から始まるメトリクスを元にサービス間の相互関係を Grafana Tempo の Service Graphs
の機能を使って可視化する • 相互関係だけでなくシステムの健全性も可視化される ◦ レイテンシー、エラー率 Service Graphs in Grafana Tempo 32
Service Graphs 33
Service Graphs 34
Exemplar 35
Exemplar • 収集されたメトリクスに対して付加情報を追加することができる ◦ トレースID を付与することで、トレースとメトリクスの連携が可能 • Spanmetrics, ServiceGraph も
Exemplar を有効にすることでメトリクスに対して トレース ID を付与することができる Exemplar に関しては 逆井(さかさい)さんの記事を Google Cloud Managed Service for Prometheusを使ってメトリクスとトレースを紐付け O11y 強化! 参考にさせて頂きました Exemplar 36
Exemplar 37
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. まとめ
• Ruby on Rails の計装は open-telemetry/opentelemetry-ruby を活⽤ ◦ 各種計装ライブラリが現状トレースしか実装されていない •
ログに関してはトレース ID を付与して Grafana の機能を使って ログとトレース繋 ぎこみを⾏なっている • SpanMetrics を活⽤しトレースからメトリクスを⽣成、また Exemplar 合わせて活 ⽤することで、メトリクスとトレースの繋ぎこみを⾏なっている まとめ 39
40 We're hiring