エラーの報告

このチュートリアルでは、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. In the Google Cloud console, go to the Versions page for App Engine.

    Go to Versions

  2. Select the checkbox for the non-default app version that you want to delete.
  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. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.