Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Ruby on Rails におけるOpenTelemetry の活用
Search
Ryo Nakamine
May 09, 2024
4k
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Ruby on Rails におけるOpenTelemetry の活用
Pepabo Tech Conference #22 春のSREまつり にて発表した資料になります
Ryo Nakamine
May 09, 2024
More Decks by Ryo Nakamine
See All by Ryo Nakamine
少人数SREで信頼性を配るためのセルフサービスとガードレール設計
rnakamine
3
860
Building a ServiceMap with Service Graph Connector
rnakamine
1
2.2k
10年動くアプリケーションに Embedded SRE を導入した話
rnakamine
4
700
EBILABを支えるクラウド・サーバーレス活用事例とこれから
rnakamine
1
110
Laravel NOVAを使ってみた
rnakamine
0
88
Featured
See All Featured
HDC tutorial
michielstock
2
900
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
530
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
3k
Large-scale JavaScript Application Architecture
addyosmani
515
110k
The Mindset for Success: Future Career Progression
greggifford
PRO
0
510
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
540
Being A Developer After 40
akosma
91
590k
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.4k
How to Ace a Technical Interview
jacobian
281
24k
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
710
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
580
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
310
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