Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
@ymtdzzz OpenTelemetryによるRailsアプリの計装を 支えるActiveSupport::Notifications 2024.11.08 Fri.Kaigi on Rails 2024事後勉強会 @SmartHR
Slide 2
Slide 2 text
Yosuke MATSUDA (@ymtdzzz) 株式会社SmartHR プロダクトエンジニア 2
Slide 3
Slide 3 text
お久しぶりです&はじめまして 3 出典:モノリスでも使える! OpenTelemetryでRailsアプリのパフォーマンス分析を始めてみよう from Kaigi on Rails 2024
Slide 4
Slide 4 text
やっぱり今日も OpenTelemetry (トレース)
Slide 5
Slide 5 text
おさらい:トレースとは 5
Slide 6
Slide 6 text
6 トレース:追跡の単位(リクエストなど) おさらい:トレースとは
Slide 7
Slide 7 text
7 スパン:処理の単位 おさらい:トレースとは
Slide 8
Slide 8 text
8 トレースを出力すること:計装 ● 自動計装: トレースを自動で出力させる(Gem毎に用 意) ● 手動計装: トレースを手動で出力する
Slide 9
Slide 9 text
9 今日の話はこっち ● 自動計装: トレースを自動で出力させる(Gem毎に用 意) ● 手動計装: トレースを手動で出力する Railsの自動計装の仕組みはどうなって いるのか?
Slide 10
Slide 10 text
10 OpenTelemetry:計装の技術標準 ● 仕様(OpenTelemetry Specification) ● 実装(言語別 SDK、計装ライブラリ) ※他にも色々ありますが、今回は割愛
Slide 11
Slide 11 text
計装のために利用する OpenTelemetryライブラリ 11
Slide 12
Slide 12 text
計装のために利用する OpenTelemetryライブラリ 12 普段私たちが使うのは 計装ライブラリ とRuby SDK
Slide 13
Slide 13 text
Ruby SDK?計装ライブラリ?
Slide 14
Slide 14 text
どちらも計装のためのライブラリ ● Ruby SDK(opentelemetry-ruby) ○ トレース設定(出力先やサービス名の設定など) ○ 手動でスパンを出力したい場合に利用 ● 計装ライブラリ (opentelemetry-ruby-contrib/instrumentation) ○ Gemに合わせたスパンを自動で出力してくれる ○ たくさんあります(faraday, grape, mongo, pg, …) 14
Slide 15
Slide 15 text
どちらも計装のためのライブラリ ● Ruby SDK(opentelemetry-ruby) ○ トレース設定(出力先やサービス名の設定など) ○ 手動でスパンを出力したい場合に利用 ● 計装ライブラリ (opentelemetry-ruby-contrib/instrumentation) ○ Gemに合わせたスパンを自動で出力してくれる ○ たくさんあります(faraday, grape, mongo, pg, …) 15 今日のテーマ
Slide 16
Slide 16 text
ところで:スパンを手動で生成したいケース 16 出典:Tuning GraphQL on Rails (p.37) from Kaigi on Rails 2024
Slide 17
Slide 17 text
Railsの計装ライブラリを覗いてみよう
Slide 18
Slide 18 text
ここの話 18 自動でスパン(トレース) 出してやんよ!
Slide 19
Slide 19 text
ActionMailerの計装ライブラリ 19 https://github.com/open-telemetry/opentelemetry-ruby-contrib/ tree/main/instrumentation z
Slide 20
Slide 20 text
セットアップはこれだけ OpenTelemetry::SDK.configure do |c| # サービス名や出力先などの初期設定は省略 c.use 'OpenTelemetry::Instrumentation::ActionMailer' end 20 ● これだけで勝手にスパンが出始める ○ OpenTelemetry::SDK.configure ○ ブロック内でConfigurator#use 何が起こっている?
Slide 21
Slide 21 text
前提知識: ActiveSupport::Notifications 21 ● Rails内部のイベントを subscribe し、計測を行う仕組み ● ActiveSupport::Notifications.sub scribeでRailsのイベントに hookし て処理を走らせる 出典)Active Support Instrumentation で計測 - Railsガイド
Slide 22
Slide 22 text
処理を追ってみる (超スピードで)
Slide 23
Slide 23 text
まずはRailtieでconfigのinitialize直後にsubscribe 23 スパン生成用の Subscription Handlerでsubscribe Subscribeしたいイベント名 (今回は ActionMailer)
Slide 24
Slide 24 text
計装ライブラリの登録( Ruby SDK) 24 useで、指定した計装ライブラリを 配列にpush 計装ライブラリの installを呼び出し
Slide 25
Slide 25 text
ActionMailerの計装ライブラリの installを見てみる 25 イベントの payloadをスパンの attributeに詰める処理
Slide 26
Slide 26 text
計装ライブラリの独自 Subscription Handlerでイベントの開始と終了時に スパン生成処理を差し込む 26 Subscriberが読み込まれる流れについては時間の都合上省略 🙏 transform_payloadも最終的 にここで実行される( payloadの Span Attributeへのセット) start, finishによりイベントの前 処理、後処理でスパンを生成す る
Slide 27
Slide 27 text
● Railsのイベントを ActiveSupport::Notificationsでsubscribe ● 独自のSubscription Handlerを利用 ○ イベントのstart, finishでスパンの生成とattributeセット ● Configuratorでuseしたinstrumentation libraryのinstall実行 ○ hook時の処理(transform_payloadなど)を設定し有効化 Railsの計装ライブラリの実装ざっくりまとめ 27 Railsの仕組みに上手く乗っかっているこ とがわかりました!
Slide 28
Slide 28 text
モンキーパッチは使ってないの?
Slide 29
Slide 29 text
使っています(例: ActiveRecord) 29
Slide 30
Slide 30 text
モンキーパッチといえば …… 30 出典:現実のRuby/Railsアップグレード (p.33) from Kaigi on Rails 2024
Slide 31
Slide 31 text
Railsの計装ライブラリでもモンキーパッチをやめる動き 31 Github issue: opentelemetry-ruby-contrib #218
Slide 32
Slide 32 text
発端:ActionPackの計装ライブラリ 32 Github PR: opentelemetry-ruby-contrib #123 計装ライブラリのモンキーパッチが原因でリクエスト内容が意図せ ず書き換わってしまう問題
Slide 33
Slide 33 text
まとめ 33 ● OpenTelemetryの計装で利用するライブラリ ○ Ruby SDK:トレース設定、手動計装 ○ 計装ライブラリ:Gem毎の自動計装 ● Railsの計装ライブラリ ○ 多くはActiveSupport::Notificationsを利用 ○ モンキーパッチも一部あるけど、危ないので ActiveSupport::Notificationsを利用する流れへ
Slide 34
Slide 34 text
ありがとうございました!
Slide 35
Slide 35 text
参考 35 ● Ruby on Rails API ● OpenTelemetry 公式ドキュメント ● Github - rails v7.2.2 ● Github - opentelemetry-ruby ● Github - opentelemetry-ruby-contrib ※スライド内に直接出典を記載したものを除く