エラーの報告

このチュートリアルでは、Google Cloud Console を使用して、Python Bookshelf アプリでキャッチされなかった例外を報告し、追跡する方法について説明します。

Error Reporting は、各エラーの発生件数、スタック トレース、発生履歴を表示する一元管理されたダッシュボードを提供します。エラー発生時のアラートを設定することもできます。

このページは複数ページからなるチュートリアルの一部です。最初からの説明や設定手順を確認するには、Python Bookshelf アプリに移動してください。

設定の構成

このセクションでは、5-logging ディレクトリのコードを使用します。ファイルを編集し、このディレクトリでコマンドを実行します。

  1. config.py ファイルを編集用に開き、次の値を置き換えます。
    • [PROJECT_ID] の値をプロジェクト ID に設定します。これは Cloud Console に表示されます。
    • [DATA_BACKEND] の値を、構造化データの使用チュートリアルで使用したものと同じ値に設定します。
    • Cloud SQL または MongoDB を使用している場合は、Cloud SQL または Mongo セクションの値を、「構造化データの使用」ステップで使用したものと同じ値に設定します。
    • [CLOUD_STORAGE_BUCKET] の値を Cloud Storage バケット名に設定します。
    • OAuth2 configuration セクションで、[GOOGLE_OAUTH2_CLIENT_ID][GOOGLE_OAUTH2_CLIENT_SECRET] の値を、以前に作成したアプリケーション クライアント ID とシークレットに設定します。

  2. config.py ファイルを保存して閉じます。

Cloud SQL を使用する場合:

  1. 編集する app.yaml ファイルを開きます。
  2. cloudsql-instance の値を、config.py ファイルの [CLOUDSQL_CONNECTION_NAME] と同じ値に設定します。形式 project:region:cloudsql-instance を使用します。 この行全体のコメントを解除します。
  3. app.yaml ファイルを保存して閉じます。

依存関係のインストール

仮想環境を作成して依存関係をインストールするには、次のコマンドを使用します。

Linux / macOS

virtualenv -p python3 env
source env/bin/activate
pip install -r requirements.txt

Windows

virtualenv -p python3 env
env\scripts\activate
pip install -r requirements.txt

ローカルマシンでのアプリの実行

  1. ローカル ウェブサーバーを起動します。

    python main.py
    
  2. ブラウザに次のアドレスを入力します。

    http://localhost:8080
    

Ctrl+C キーを押してワーカーを終了し、次にローカル ウェブサーバーを終了します。

App Engine フレキシブル環境へのアプリのデプロイ

  1. サンプルアプリをデプロイします。

    gcloud app deploy
    
  2. ブラウザに次の URL を入力します。

    https://PROJECT_ID.REGION_ID.r.appspot.com

    以下を置き換えます。

アプリを更新する場合は、アプリをデプロイしたときと同じコマンドを入力して、更新バージョンをデプロイします。デプロイするとアプリの新しいバージョンが作成され、デフォルト バージョンに設定されます。アプリの古いバージョンはそのまま残ります。それらに関連付けられた仮想マシン(VM)インスタンスも同様です。すべてのアプリ バージョンと VM インスタンスが課金対象のリソースとなります。コストを抑えるには、アプリのデフォルト以外のバージョンを削除します。

アプリのバージョンを削除するには:

  1. Google Cloud コンソールで、App Engine の [バージョン] ページに移動します。

    [バージョン] に移動

  2. デフォルト以外で削除するアプリのバージョンのチェックボックスをオンにします。
  3. アプリのバージョンを削除するには、[削除] をクリックします。

課金対象のリソースをクリーンアップする方法の詳細については、このチュートリアルの最後のステップのクリーンアップセクションをご覧ください。

エラーのシミュレーション

Error Reporting の動作を確認するには、コードに意図的に誤りを挿入し、Cloud Console の Error Reporting ページで例外を探します。

  1. bookshelf/crud.py で、未定義の変数にアクセスしてインデックス ビューで ReferenceError を生成するオペレーションを追加します。

    @crud.route("/")
    def list():
       x[3]
    
  2. アプリをデプロイします。

    gcloud app deploy
  3. インデックス ページにアクセスします。

    gcloud app browse

    メッセージ An internal error occurred を表示できます。

  4. Cloud Console で、Stackdriver の [Error Reporting] ページに移動します。

    Python に移動

    エラーの一覧が表示されます。

    エラーを確認

  5. エラーをクリックすると、エラーが最後に検出された日時、エラーが発生した回数、発生回数のヒストグラム、スタック トレースなどのエラーに関する情報が表示されます。

コードの説明

キャッチされなかった例外を報告するには、Flask の errorhandler デコレータを使用してから、Python 用 Cloud クライアント ライブラリを使用して Error Reporting に例外を報告します。

@app.errorhandler(500)
def server_error(e):
    client = error_reporting.Client(app.config['PROJECT_ID'])
    client.report_exception(
        http_context=error_reporting.build_flask_context(request))
    return """
    An internal error occurred.
    """, 500

クライアントはトレースバック情報を自動的に追加し、ヘルパー関数を使用して Flask リクエストから関連するリクエストの詳細を抽出します。これにより、アプリで発生しキャッチされなかった InternalServerError HTTP 500 例外の関連するスタック トレースと HTTP コンテキストが Error Reporting に入力されます。

クリーンアップ

このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。

課金をなくす最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。

プロジェクトを削除する手順は次のとおりです。

  1. Google Cloud コンソールで、[リソースの管理] ページに移動します。

    [リソースの管理] に移動

  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。