Sentryを使ったElixir/Phoenixアプリのエラー監視【Gmail通知付き】

[fukuoka.ex](https://fukuokaex.connpass.com/) の koyo です！
アプリケーションを運用する際のエラー監視って悩みますよね。
今回はSentryという 「エラー監視/通知 SaaS」 を Elixir/Phoenix で使う方法を紹介します。
また、検知したエラーを一定のルールでGmailに通知する仕組みも使ってみましょう。

最後に参考リポジトリも置いておくので是非使ってみてください。

# 動作環境

- Elixir 1.12.2 on WSL2 Ubuntu
- Phoenix 1.6

# Sentry とは？
[Sentry](https://sentry.io/welcome/#) はエラー監視をはじめとする様々なトラッキング機能を提供するSaaSです。
フロントエンドからバックエンドまで幅広く使用でき、各言語向けのSDKが充実しているのが魅力的ですね。なんとElixirのSDKもあります！:+1:

https://sentry.io/welcome/#

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201242/b6197b13-826e-0fe1-bde5-b141eb3d4da1.png)

すでにいろんな記事で紹介されていて、Sentryのプランの違いなどは下記記事にもまとまっているので是非参考にしてみてください。

https://tech-cci.io/archives/4091

https://zenn.dev/a_ichi1/articles/f85f1b53b474cb#sentry%E3%81%A8%E3%81%AF%EF%BC%9F

[料金プラン](https://sentry.io/pricing/)は色々ありますが、無料でもお試しすることはできそうなので今回はそちらを使ってみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201242/362d0497-40f5-1adc-580b-3f2ca8736db0.png)

無料でも1userで5000エラー/月までのログを30日保持してくれそうですね。個人用途なら十分そう。
ただし `Alerts -> Integration notifications` の項目にあるように、無料の Developer プランでは使えないことに注意です（Teamプラン以上で使える）。
今回はGmail通知を行うので問題ないですが、Slack通知など別Appと連携などになってきたら上位プランを検討してみてもいいかもしれないですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201242/61dc53ca-8a5e-5108-799a-1e2a8a632439.png)

# 導入方法
## Sentryの登録
まず [Signup](https://sentry.io/signup/)ページへ行きます。
今回はGmail通知するつもりなのでGoogleアカウントで登録してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201242/a7a3e93d-55a3-e472-37ca-ffe46c7e10d0.png)

アカウントを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201242/ced5279e-c378-0672-4680-18581bb71aa3.png)

Welcomeページに遷移したらokです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201242/b71d2ad3-bdbc-c715-1b3e-23fce2aed613.png)

ここはもちろん（？）Elixirを選んでProjectを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201242/ad25fe3b-a537-b107-3160-2800f5e4e56b.png)

するとかなり丁寧なセットアップ手順が！
こういうのあるとうれしいですね＾＾
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201242/753ce7e8-a0e5-11cd-67a5-659f8be5cb9d.png)

ちなみにドキュメントのこちらでもセットアップ手順を見ることが出来ます。
Phoenixで使用する場合の手順も書いてあり、非常に親切です。

https://docs.sentry.io/platforms/elixir/

詳しい方は上記のDocumentを読み解いていけば自然に導入できるかと思います。

初めてだと上記のDocumentだけでは難しいと思うので、今回はより詳しくPhoenixプロジェクトの作成から進めていきたいと思います。

### ※日本語化
ちなみに `Settings -> Account Details` にて言語設定を日本語にすることができます！
少しわかりにくいところにあるので右上の検索バーで `language` と調べてみてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201242/5a260098-55a4-fdfd-1ea8-d0c66302f193.png)

有効にするとこんな感じ。完全な日本語化というわけではなさそうですが、英語に慣れてない人にはうれしい機能ですね。
（今回は英語のままやっていきます！）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201242/2584bdb2-f8b9-dbac-5b4b-f9d389284d83.png)

## Phoenixプロジェクトの作成
さて、それでは Elixir の Webアプリケーションフレームワークである Phoenix を用いて Sentry によるエラー監視を実験してみましょう。
なお Phoenix 1.6 から LiveView がデフォルトになりました。（使わない場合は`--no-live`）
今回はLiveviewバージョンの方で問題ないです。

https://hexdocs.pm/phoenix/changelog.html#1-6-2-2021-10-08

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201242/bc257752-6aa6-e3e1-a858-907ad43158c0.png)

以下のコマンドでプロジェクトを作成してください。

```bash
mix phx.new sentry_sample --no-ecto
```

## Sentry の導入
まずSentry公式のライブラリと必要な依存を入れます

```elixir:mix.exs
  defp deps do
    [
      ...
      {:sentry, "~> 8.0"},
      {:hackney, "~> 1.8"}
    ]
  end
```

以下コマンドも忘れずに

```bash
$ mix deps.get
```

ちなみにライブラリの仕様は hexdocs にも詳しく書いてあります！丁寧！

https://hexdocs.pm/sentry/readme.html

以下のファイルに設定を追加します。ドキュメントには `config/prod.ex` への設定が案内されていますが、今回は手元でしか動かさないのでdev.exに設定しておきます。

```elixir:config/dev.ex
config :sentry,
  dsn: "xxxxxx", # <- ここは調べて埋める
  environment_name: :dev,
  enable_source_code_context: true,
  root_source_code_path: File.cwd!(),
  tags: %{
    env: "development"
  },
  included_environments: [:dev]
```

DSN はログイン後の画面で確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201242/c4c3cfc4-4ea6-93d2-4680-a7cbf38ac811.png)

[ドキュメント](https://docs.sentry.io/platforms/elixir/#configure)には `Sentry.PlugCapture` を使う方法など紹介されていますが最低限動かすのはこの設定のみで十分です。ほかに色々やりたくなったらドキュメントやhexを参考に設定してみてください。

## アプリケーション -> Sentry の動作確認
ここまでで設定は完了なので、以下のようなモジュールを使って動かしてみます

```elixir:lib/sentry_sample/ext_notifier.ex
defmodule ExtNotifier do
  def notify(message) do
    Sentry.capture_message(message)
  end
end
```

実行してみます

```bash
$ iex -S mix
iex(1)> ExtNotifier.notify("send!")
{:ok, ""}
```

Sentry の Issues の項目を見ると送られていますね！
![2021-10-11_01h11_32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201242/b503d1ef-c33e-c4c3-fd0a-c0cf290fba73.png)

詳細見ると色々な情報があり、今回設定したtag情報やメッセージも確認できますねb

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201242/732129bc-69a5-9fe9-2245-294b6e3f9b89.png)

## Gmail 通知設定
ここまでで `アプリケーション -> Sentry` への通知はできました。
ここからはさらに `アプリケーション -> Sentry -> Gmail` の通知を設定していきます。
エラー監視では、届いたエラーを別のサービスに通知する要件は多く出てくると思うので、重要ですね！

ここまでできれば [Zapier](https://zapier.com/) などを使うことで Gmail に届いたメールをSlackなどに連携もできそうです。
また、Teamプラン以上であれば、Sentryが提供しているIntegrationの設定でSlackをはじめとする各種サービスへの連携もできます。

今回は `アプリケーション -> Sentry -> Gmail` までをやってみます。

### アラートの設定
Alert の項目でセッティングします。 `Create Alert Rule` で設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201242/4ea7e2c3-d899-8d0e-88df-0d7ddd04ff21.png)

こんな感じで1回でも発生したら送信するようにしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201242/172e0e7f-136f-de7f-7b95-6b73b0f51d3d.png)

### メール設定の確認
あと自分の設定を変更してメール届くようにします。左上の自分のアイコンをクリックし、 `User setting` へ遷移します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201242/70c6138f-1383-5b9d-a252-dd826abc657b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201242/603b9001-1d82-5e84-1043-52f85533df4f.png)

ここに通知したいメールアドレスがあることを確認してみてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201242/62b3f5db-7e46-2c9d-e684-f8865a254c81.png)

またアラートの通知設定が以下のようになっているかを確認してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201242/bd7b9339-195f-c0ca-d7f0-160d9a019a53.png)

### アプリケーション -> Sentry -> Gmail の動作確認
ここまで設定すれば `アプリケーション -> Sentry -> Gmail` のフローができています！ということで送ってみます！

```
iex> ExtNotifier.notify("send2")
{:ok, ""}
```

少し待つとこのように通知来ますね！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201242/6c56be3e-eb49-2951-deb9-a1395b15c7e0.png)

# まとめ
簡単な設定で多機能な監視機能をアプリケーションに組み込むことができました！
Sentryは使いやすくルールも色々設定できるので、監視に困ったらぜひ触ってみてください。

今回使ったリポジトリをこちらに置いておきました。
`config/dev.exs` の DNS を自分のSentryアカウントの DNS に設定すれば動くと思います。

https://github.com/koyo-miyamura/sentry_sample