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


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

以前までは`sentry-raven`というGemが使用されていましたが、こちらがメンテナンスモードに入ってしまい、
現在は`sentry-rails`、`sentry-ruby`への移行が推奨されています。
- [getsentry/sentry-ruby](https://github.com/getsentry/sentry-ruby)
- [Migration Guide](https://docs.sentry.io/platforms/ruby/migration/)

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

## Sentryとは？

https://docs.sentry.io/platforms/ruby/guides/rails/

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

![スクリーンショット 2021-03-27 11.28.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550573/580634e4-c483-ab7a-c9f3-c08d0a7bec63.png)


#### 料金（2021年3月27日時点）

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

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

https://sentry.io/pricing/


## 導入

### Sentry.ioにアカウント登録
下記URLにアクセスしサインアップを行ってください。

https://sentry.io/

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

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550573/bf32621e-aa58-5acc-28c4-ba532400e2c3.png" width="600">

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

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

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

```ruby: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に通知が届くかと思います。

![スクリーンショット 2021-03-27 13.05.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550573/fb7cf508-2c46-2232-21c9-4446cddc8362.png)

## オプション設定

### ユーザーを特定したい

```ruby
config.send_default_pii = true
```
`send_default_pii`をtrueにすることでユーザーのIP、Cookie、request bodyがSentryに追加情報として送信されます。
**が**
外部サービスに**個人情報**を送信することになるので取り扱いに注意！

ユーザーidなど特定の情報のみであれば`set_user`を使いidのみ追加も出来ます。
[devise](https://github.com/heartcombo/devise)を使用したサンプル書いておきます。

```ruby: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](https://docs.sentry.io/platforms/ruby/enriching-events/identify-user/)

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

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

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

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


![スクリーンショット 2021-03-27 18.41.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550573/29101768-637f-37e2-4e4e-f061d3721f5f.png)


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

```ruby
Sentry.configure_scope do |scope|
  scope.set_context(
    'character',
    { name: 'Mighty Fighter', age: 19 }
  )
end
```
issueの下の方にスクロールすると`set_context`で渡したデータが送信されているのが確認できます。
![スクリーンショット 2021-03-27 13.49.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550573/e7aa87c3-b9d1-b215-c2da-ef976e041cb4.png)


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

https://docs.sentry.io/platforms/ruby/guides/rails/