行動すれば次の現実

テック中心の個人ブログ

ScoutAPMのトレース情報にユーザーIDを付加する方法

ScoutAPMを使ってモニタリングしているとトランザクションとログインユーザー情報を紐付けたいと思ったことはありませんか?

そのような場合は、ScoutAPMのCustom Contextという機能を使うことでトランザクションに対して付加情報を付けることが出来ます。

Custom Contextとは

ScoutAPMでモニタリングされるトランザクションに対して、任意の付加情報を付ける機能です。 アプリケーション側にシンプルなコードを埋め込むだけで実現することが出来ます。

どのような情報を付加するかはアイデア次第ですので、例えば以下のようなニーズに応えることが可能です。

  • 遅いリクエストによって影響を受けるユーザーは誰か?何人くらい該当するか?
  • 毎週木曜の深夜2時にメモリ負荷が上がる原因は「どのユーザー」の「どの操作」によるものか?

Custom Contextの使用方法

ユーザー情報を付加したい場合

ユーザー情報を付加したい場合は下記のメソッドを使用します。

ScoutApm::Context.add_user({})

例えばIDを付加したい場合は下記のような実装になります。

ScoutApm::Context.add_user(id: @user.id)

それ以外の情報以外を付加したい場合

ユーザー情報ではない一般的な情報を付加したい場合は下記のメソッドを使用します。

ScoutApm::Context.add({})

下記のように任意の情報を付加することが出来ます。

ScoutApm::Context.add(database_shard: @db.shard_id)

ユーザーIDをContextに付加する実装例

各アクション単位でユーザーIDをContextに付加することで実現可能です。 ApplicationController.rbに下記を定義します

before_filter :set_scout_context

def set_scout_context
  ScoutApm::Context.add_user(id: current_user.id) if current_user.is_a?(User)
end

このような実装を加えるだけで簡単にContextを追加することが出来ます。

下記は実際のScoutAPMのContextタブの画面イメージです。

f:id:furu07yu:20220112140327j:plain
ScoutAPMのContextタブ

user idが新しく追加されていることが確認できます。

設定自体はとても簡単なので運用のトレーサビリティを上げたい場合は設定しておくことをおすすめします。

参考

Advanced Features