SentryでPythonコードからのエラーキャプチャを試してみた

# Sentryとは
Sentry はアプリケーションのエラーやパフォーマンスをリアルタイムで監視し、問題の迅速な特定と修正を支援する開発者向けツールだ。

https://sentry.io/welcome/

# なぜ試してみたのか
プロジェクトで Sentry を使用していて、基本的な使い方を知りたかった。

今回は Sentry アカウントを作成し、ローカルで実行した Python コードから送られてくるエラーやメッセージを Issues 画面で確認するところまでやってみた。

# アカウントを作成する
[サインアップページ](https://sentry.io/signup/)にアクセスする。

![スクリーンショット 2024-11-30 155246.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3816889/ed275919-1377-8e82-27e0-2175d20a351d.png)

フォームを入力して **CREATE YOUR ACCOUNT** をクリックすると、**Welcome to Sentry** という画面が表示される。

![スクリーンショット 2024-11-30 160325.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3816889/76f130fa-1537-41e2-ae99-42ea11acfc70.png)

ここでは画面下部の **Skip onboarding.** をクリックする。
すると、Sentry の画面が表示される。

# Projectを作成する

![スクリーンショット 2024-11-30 194728.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3816889/4fd24663-d6a6-0154-5eb1-18f81f3d5e3a.png)

左サイドバーの **Projects** をクリックする。
表示された画面右上の **Create Project** をクリックする。

**Create a new projects in 3 steps** 画面が表示される。

![スクリーンショット 2024-11-30 201147.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3816889/fedb23c3-ad2b-67f4-a113-73c05fcad56c.png)

以下のように設定する。
#### 1.  Choose your platform
**PYTHON** を選択する。
#### 2. Set your alert frequency
デフォルトのままにしておく。
#### 3. Name your project and assign it a team
**Project name** に **my-first-sentry** と入力する。
**Team** -> **Create team** と順にクリックして、**my-first-sentry** と入力し、 **Create Team** をクリックする。

![スクリーンショット 2024-11-30 195510.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3816889/95c15559-79dd-44e3-86e8-39c974fc49d9.png)

設定内容を確認して、**Create Project** をクリックする。

![スクリーンショット 2024-11-30 165002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3816889/acce23f9-4327-825d-4fa1-4c12ae90561c.png)

すると、**Dou you use a framework?** というダイアログが表示される。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3816889/a1d15866-cefc-7381-eb47-208cecfe979f.png" width="360px" alt="Do you use a framework?">

デフォルト（Nope, Vanilla）のまま **Configure SDK** をクリックする。

**Configure Python SDK** 画面が表示される。

![スクリーンショット 2024-11-30 202243.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3816889/9eca1061-3061-98de-1635-6dbd8873cda3.png)

画面下部の **Take me to issues** をクリックする。

**Issues** 画面が表示される。

![スクリーンショット 2024-11-30 202556.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3816889/0cff5f4a-b96d-01e1-2d5e-4ea6de893079.png)

# Get Started with Sentry Issues

ここからの作業はターミナルで行う。
事前準備として、先ほど作成したプロジェクトと同じ名前の **my-first-sentry** ディレクトリを作成し、移動する。
```bash
mkdir my-first-sentry && cd my-first-sentry
```
さらに仮想環境を作成し、その中で作業する。
```bash
python3 -m venv .venv
```
```bash
source .venv/bin/activate
```

ここからは画面に従って進める。

#### 1 Install Sentry
Sentry をインストールする。
```bash
pip install --upgrade sentry-sdk
```
画面では **Next** をクリックする。

#### 2 Configure Sentry

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3816889/bdfd4fc9-4a32-4181-7271-360ba067a257.png" width="480">

表示されたコードから、dsn の値をコピーして控えておく。 
**Next** をクリックする。

#### 3 Verify

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3816889/8ead58fa-dbc3-3348-ea2f-6b1ebb8ff0d8.png" width="480">

```division_by_zero = 1 / 0``` で意図的にエラーを発生させよ、と。
> Waiting to receive first event to continue

Sentry がエラーを待っている。

```my_first_sentry.py``` という名前で以下の内容の Python ファイルを作成する。

```python:my_first_sentry.py
import sentry_sdk

sentry_sdk.init(
    dsn="<your-dsn>",
)

division_by_zero = 1 / 0

```

```<your-dsn>``` は手順 2 で控えたあなたの DSN に置き換えて、実行する。

```bash
python my_first_sentry.py
```

すると、画面が以下のように変化し、先に進めるようになった！（これには数秒待つかもしれない）

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3816889/3119162a-0b19-bae4-8b29-31d3135b3c32.png" width="480">

> Event was recieved!

**Take me to my error** をクリックすると、エラー詳細画面に遷移する。

![スクリーンショット 2024-11-30 213627.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3816889/f1c72f12-e87f-7a32-1f79-c590dbb5f488.png)

ここではスタックトレースなどを確認できる。しっかりとエラー情報を送信してくれたようだ。

スタックトレースの下にある **mechanism** や **handled** はタグ （Tags）と呼ばれるもので、エラーのフィルタリングや関連付けに利用できるものらしい。

画面右上の **Resolve** ボタンで、エラーを解決済みとしてマークできるようだ。

# 明示的なキャプチャ
上記は `try/except` で処理されなかったエラーについて、Sentry が自動で捕捉（キャプチャ）してくれる例だった。

Sentry には、明示的にエラーやメッセージをキャプチャするメソッドが用意されている。

**Issues** 画面は、アプリケーションで発生している問題が一覧で表示される画面だ。
以下には先ほどの ```ZeroDivisionError``` のみが表示されている。

![スクリーンショット 2024-11-30 220304.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3816889/0db2691a-e6a9-031d-3959-f1c679a9b399.png)

画面右上の「▷」ボタン（**Enable real-time updates**）をクリックすると、リアルタイムに一覧を更新できるようになる。見ておくとよいだろう。

::: note warn
先ほど控えた DSN を環境変数に入れておこう。この後のコードで `dsn` の部分を置き換える必要がなくなる。
```bash
export SENTRY_DSN=<your-dsn>
```
:::

## ```capture_exception``` メソッド
適切に処理されたエラーでも、Sentry に通知したい場合があるだろう。そのようなときに利用できるメソッドだ。

以下のコードで試してみる。

```python:my_first_capture_exception.py
import os
import sentry_sdk

sentry_sdk.init(
    dsn=os.environ.get('SENTRY_DSN'),
)

try:
    raise Exception("My first capture exception!")
except Exception as e:
    sentry_sdk.capture_exception(e)

```

```bash
python my_first_capture_exception.py
```

すると、一覧に ```Exception``` が追加された。
```ZeroDivisionError``` との違いは、```Unhandled``` と表示されていないことだ。

![スクリーンショット 2024-11-30 221745.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3816889/75c39ed4-db32-f78f-c222-b65b13486428.png)

エラー詳細を見てみる。
**Event Highlights** の **handled** は **yes**、**level** は **error** となっている。
**Stack Trace** の下を見ると、**mechanism** は **generic**, **handled** は **true** だ。

![スクリーンショット 2024-12-01 103942.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3816889/8e6d0160-d264-ab6c-642f-6954e8db8741.png)

## ```capture_message``` メソッド
こちらは任意のメッセージをキャプチャできる便利なメソッドだ。デバッグ目的で利用したいケースはあるだろう。

サンプルコードを実行してみる。

::: note warn
**Custom Search** 欄の **issue.priority is high or medium** を外して Enter を押し、一覧を更新しておこう。
:::

```python:my_first_capture_message.py
import os
import sentry_sdk

sentry_sdk.init(
    dsn=os.environ.get('SENTRY_DSN'),
)

sentry_sdk.capture_message('My first capture message!')
```

```bash
python my_first_capture_message.py
```

![スクリーンショット 2024-11-30 223609.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3816889/9c9b285b-a1e0-843c-175e-054f1a79d7fb.png)

一覧に追加された内容は、先ほどまでのエラーとは異なって見える。
メッセージそのものが強調され、**(No error message)** と表示されており、**PRIORITY** は **Low** だ。

詳細を見ると、**level** は **info** となっていて、**Stack Trace** ではなく **Message** が表示されている。**Tags** はついていない。

![スクリーンショット 2024-11-30 224102.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3816889/219f682e-d9b9-4137-0f1d-a0bb18e4af3f.png)

見てみた内容は以上だ。

# 感想
Sentry で非常に簡単にアプリケーションのエラー監視を始められることを確認できた。

明示的なキャプチャの方法もシンプルだった。様々な情報から、エラーやメッセージを容易に判別できそうだ。

使いこなすには [Docs](https://docs.sentry.io/) に目を通す必要がありそうだが、見てみた感じ充実していそうだった。

機会があれば別の機能も試してみたい。