モダンな監視ツールSentryをRailsで使ってみた


はじめに

Rails環境でSentryを導入したので導入手順をまとめました。

以前まではsentry-ravenというGemが使用されていましたが、こちらがメンテナンスモードに入ってしまい、
現在はsentry-railssentry-rubyへの移行が推奨されています。
- getsentry/sentry-ruby
- Migration Guide

この記事ではsentry-railssentry-rubyを使用し進めます。

Sentryとは?

Webアプリケーションで起きたエラー等をロギングできるサービスです。
導入も簡単でUI/UXがGoodなダッシュボードも使えます

料金(2021年3月27日時点)

プラン Developer Team Business Enterprise
料金 $0/月 $26/月 $80/月 要問い合わせ

無料のプラン(Developer)でも個人で使うのであれば十分すぎるほどサービスを利用できます。
エラーをSlackへ通知やDiscoverというクエリ機能を使用するには、Developer以上への登録が必要です!
その他詳細は公式を参照してください。

導入

Sentry.ioにアカウント登録

下記URLにアクセスしサインアップを行ってください。

基本設定

サインアップ後に基本設定のチュートリアルが開始されます。
今回はRailsを使用するのでplatformの選択でRailsを選択します。

ロギングを行いたいアプリのGemfileにsentry-rubysentry-railsを追加し、bundle installを行います。

gem 'sentry-ruby'
gem 'sentry-rails'

config/initializers/sentry.rbを作成し、チュートリアルで表示されているコードをまるっと貼り付けます。

config/initializers/sentry.rb
Sentry.init do |config|
  config.dsn = 'https://123456789abcdefghi.ingest.sentry.io/987655'
  config.breadcrumbs_logger = [:active_support_logger]

  # Set tracesSampleRate to 1.0 to capture 100%
  # of transactions for performance monitoring.
  # We recommend adjusting this value in production
  config.traces_sample_rate = 0.5
  # or
  config.traces_sampler = lambda do |context|
    true
  end
end

※ config.dsnがベタ書きされていますが環境変数などに入れる事が推奨されています。

ここまでの設定ですでに使える!

信じがたい位簡単ですよね。
試しにアプリの適当な箇所でエラーを起こしてみるとダッシュボードのissuesに通知が届くかと思います。

オプション設定

ユーザーを特定したい

config.send_default_pii = true

send_default_piiをtrueにすることでユーザーのIP、Cookie、request bodyがSentryに追加情報として送信されます。

外部サービスに個人情報を送信することになるので取り扱いに注意!

ユーザーidなど特定の情報のみであればset_userを使いidのみ追加も出来ます。
deviseを使用したサンプル書いておきます。

application_controller.rb
 before_action :sentry_set_user, if: :user_signed_in?

 def sentry_set_user
   Sentry.set_user(id: current_user.id)
 end

set_userにはusername, email, ip_addressが用意されており、任意のkey/valueを保存することも出来るようです。

Identify Users

環境を指定したい

enabled_environmentsのリストを追加することにより、特定の環境でのみロギングが行われるようになります。

config.environment = Rails.env
config.enabled_environments = %w[production]

任意のデータを送信したい

ロギングレベルを指定し任意のイベントを送信することが出来ます。

Sentry.capture_message("I'm looking forward to seeing Jujutsu Kaisen movie.", level: :info)

カスタムコンテキストを使用する事でイベントに任意のデータを添付し送信することも出来ます。

Sentry.configure_scope do |scope|
  scope.set_context(
    'character',
    { name: 'Mighty Fighter', age: 19 }
  )
end

issueの下の方にスクロールするとset_contextで渡したデータが送信されているのが確認できます。

まとめ

ざっと使い方紹介させて頂きましたが他にもTransactionやBreadcrumbsなど便利なイベントが用意されているので気になるかたは公式ドキュメントでご確認下さい