Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
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.3k
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.5k
10年動くアプリケーションに Embedded SRE を導入した話
rnakamine
3
420
ペパボのSREとして 働くきっかけ
rnakamine
0
1.7k
異業種からエンジニアになった僕が憧れの会社に飛び込むまで
rnakamine
1
660
EBILABを支えるクラウド・サーバーレス活用事例とこれから
rnakamine
0
63
Laravel NOVAを使ってみた
rnakamine
0
33
Featured
See All Featured
Fontdeck: Realign not Redesign
paulrobertlloyd
82
5.3k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
172
50k
KATA
mclloyd
29
14k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
YesSQL, Process and Tooling at Scale
rocio
170
14k
A Philosophy of Restraint
colly
203
16k
How to train your dragon (web standard)
notwaldorf
89
5.8k
Become a Pro
speakerdeck
PRO
26
5.1k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
26
1.9k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
280
13k
Designing Experiences People Love
moore
139
23k
4 Signs Your Business is Dying
shpigford
182
21k
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