ブログBLOG

\ Web・ゲーム開発に関する情報を発信中 /

Djangoの500エラーをGoogle Chatに通知する方法を解説(トレースバック付き)

Django
django , google-chat , python
20241209_django-send-error-to-google-chat-tmb

ご覧いただきありがとうございます!
領護(りょうご)です。

Djangoを本番環境で運用していると、エラーが発生していないか気になりますよね?
今回は、Djangoの500エラーをGoogle Chatに通知し、トレースバックの内容まで確認する方法を解説します。


Google Chatエラー通知画像
上記のように、Google Chatにエラー内容を通知し、トレースバックも確認できます。

目次

実行環境

Docker Desktop:4.36.0
Python:3.12.8
Django:5.1.3
requests:2.31.0

Google ChatのWebhook URLを取得する

Google Chatに通知を送るには、Webhook URLが必要です。
Webhook URLとは、特定のサービスやアプリケーションが他のサービスと通信する時に使用するURLです。
主に、イベントが発生した際に自動で通知を送信したり、データを送るために使用します。

以下の手順で取得します。

20241209_django-send-error-to-google-chat-01

1.通知を送りたいチャットルームを開き、チャットルームのタイトルをクリック
2.「アプリと統合」を選択

20241209_django-send-error-to-google-chat-02

3.Webhookの「+ Webhookを追加」をクリック

20241209_django-send-error-to-google-chat-03

4.Webhookに名前を付け、「保存」をクリック
※ アバターのURLは、入力しなくてもOK

20241209_django-send-error-to-google-chat-04

WebhookのURLが新規作成され、項目に追加されます。
5.作成されたWebhookの右端にある「:」をクリックし、「リンクをコピー」を選択
これでWebhook URLの新規作成と取得が完了しました。

次のプログラム作成に使うのでどこかに控えておいてください。
続いてプログラムの作成に移ります。

フォルダ構成

sample_web/
├── .env                        # 環境変数ファイル
├── docker-compose.yml          # Docker Compose設定ファイル
├── manage.py                   # Django管理スクリプト
├── sample_project/             # プロジェクト名
│   ├── asgi.py                 # ASGI設定ファイル
│   ├── settings.py             # プロジェクト設定ファイル
│   ├── urls.py                 # URLルーティング
│   ├── wsgi.py                 # WSGI設定ファイル
│   ├── static/                 # 静的ファイルディレクトリ
│   │   └── css/
│   │       └── base.css        # ベースCSSファイル
│   └── templates/              # HTMLテンプレートディレクトリ
│       └── home.html           # ホームページのテンプレート
├── home/                       # アプリフォルダ
│   ├── views.py                # ビューファイル
│   └── migrations/             # マイグレーションファイル
└── common/                     # 共通機能用フォルダ
    └── send_error_log.py       # エラーログ送信スクリプト

今回、解説するフォルダ構成は、上記の構成になります。
解説に使用するのは、common/send_error_log.py、home/views.py、sample_project/urls.py、sample_project/settings.pyの4つを使用します。

必要なライブラリのインストール

pip install requests

通知を送信する時に必要なライブラリ「requests」をインストールします。
※ 既にインストールしている方は、スキップしてください。

Google Chatにエラーを通知するプログラムを作成

Google Chatにエラーを通知する処理をcommon/send_error_log.pyに作成します。
作成場所とファイル名は自由に変更してもOKです!

send_error_log.py
import traceback
import requests

from django.views.decorators.csrf import requires_csrf_token
from django.views.defaults import server_error

# 500番エラーをGoogle Chatに通知
class SendErrorGoogleChat:
    def __init__(self):
        self.webhook_url = "ここに先ほどコピーしたWebhook URLを張り付け"

    def process_exception(self, message_list):

        # Google Chatに送信するペイロード
        payload = {"text": "\n".join(message_list)}

        # Google ChatのWebhookに送信
        try:
            headers = {"Content-Type": "application/json"}
            response = requests.post(self.webhook_url, json=payload, headers=headers)
            response.raise_for_status()
        except requests.RequestException as e:
            # Webhook送信失敗時のログ
            print(f"Google Chat通知エラー: {e}")


# 500番エラーをGoogle Chatに通知
@requires_csrf_token
def server_error_send_to_google_chat(
    request,
    template_name="500.html",
):

    # エラーメッセージ設定
    message_list = [
        "🚨 **500 Internal Server Error 発生** 🚨",
        f"URL: {request.build_absolute_uri()}",
        f"メソッド: {request.method}",
        f"Traceback:```\n{traceback.format_exc()}\n```",
    ]

    # Google Chatにエラーメッセージを通知する
    SendErrorGoogleChat().process_exception(message_list=message_list)
    return server_error(request, template_name)

Google Chatにエラーを送信する処理全体のプログラムです。
SendErrorGoogleChatクラスは、メッセージを送信する基本設定になります。
server_error_send_to_google_chat関数は、送信するメッセージの内容を設定しています。

send_error_log.py
self.webhook_url = "ここに先ほどコピーしたWebhook URLを張り付け"

ここには、先ほどコピーしたWebhook URLを張り付けてください。

注意!

解説を簡単にするために、今回はWebhook URLをコードに直接書いていますが、実際には環境変数にして読み込むことをおすすめします!

send_error_log.py
self.webhook_url = "https://chat.googleapis.com/v1/spaces/~~~"

張り付けると上記のようになります。

send_error_log.py
# Google Chatにエラーメッセージを通知する
message_list = [
    "🚨 **500 Internal Server Error 発生** 🚨",
    f"URL: {request.build_absolute_uri()}",
    f"メソッド: {request.method}",
    f"Traceback:```\n{traceback.format_exc()}\n```",
]

今回通知するメッセージ内容は、下記のようにしています。
通知したい内容を自由に変更してもOKです!

通知メッセージ内容
URL:エラーが発生したページリンク
メソッド:GET / POSTのどちらでエラーが発生したか
Traceback:エラーの詳細を表示するトレースバックを表示

500エラーのトリガー設定

500エラーが発生した時に処理が実行するようにトリガーをsample_project/urls.pyに設定します。

urls.py
from django.contrib import admin
from django.urls import path
from common.send_error_log import server_error_send_to_google_chat # 追加

urlpatterns = [
    path("admin/", admin.site.urls),
    # ~~~
]

# 500番エラーをGoogle Chatに通知する設定
handler500 = server_error_send_to_google_chat

500エラーが発生した際にGoogle Chatへ通知を送るため、先ほど作成した関数をインポートし、handler500に設定します。
これで、エラー発生時に自動で通知が届くようになります!

500エラーが届くかテストする

settings.py
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = False

500エラーが届くかテストするには、sample_project/settings.pyDEBUGFalseに設定を変更してください。

views.py
from django.views.generic import TemplateView

# ホームページ
class HomePage(TemplateView):

    template_name = "home.html"

    def get(self, request, *args, **kwargs):

        # 500エラーを起こす
        print(hogehoge)
        return super().get(request, *args, **kwargs)

home/views.pyに定義していない「hogehoge」変数をprintするように500エラーをわざと起こしてみます。

20241209_django-send-error-to-google-chat-05

そうするとGoogle Chatにエラーが通知されます!
トレースバックもバッチリ表示されています。
簡単ですね!

おまけ:特定の処理を監視する方法

今回は、500エラーのGoogle Chatに通知する方法を解説しましたが、実は特定の処理にもエラー通知を送ることができます。

views.py
from django.views.generic import TemplateView
from common.send_error_log import SendErrorGoogleChat

# ホームページ
class HomePage(TemplateView):

    template_name = "home.html"

    def get(self, request, *args, **kwargs):
        try:
            # 監視したい処理を実行
            pass
        except Exception:

            # 例外エラー発生!時にエラーメッセージを設定して通知
            message_list = [
                "🚨 **例外エラー発生** 🚨",
                f"〇〇の処理でエラーが起きちゃった!テヘペロ!",
            ]
            SendErrorGoogleChat().process_exception(message_list=message_list)

        return super().get(request, *args, **kwargs)

例えば、home/views.pyに例外処理を追加することで、エラーを感知した際に独自のエラーメッセージを作成し、Google Chatに通知することが可能です。

20241209_django-send-error-to-google-chat-06

実際のエラー通知になります。
重要な処理を監視したい場合に便利ですね!

最後に

Djangoの500エラーをGoogle Chatに通知し、トレースバックを表示する方法を解説しました。
本番環境の監視や運用の効率化にぜひ活用してください!


\ よかったらシェアしてね /

関連記事