アラート: Pub/Sub トピックへのログベース エラー

1. はじめに

最終更新日: 2023 年 6 月 21 日

可用性のログベース エラーのアラート

ログベースのアラートを使用すると、ログ内の特定のイベントやパターンをモニタリングして、アプリケーションの可用性を判断できます。サービス停止やユーザーに影響するその他の問題に関するアラートを受け取ることで、ユーザーや顧客への影響を最小限に抑えるための対策を講じることができます。

稼働時間チェックでは可用性の概要を把握できますが、ログから取得したエラー メッセージをより具体的なタイプの可用性の指標として使用し、問題が発生しているユーザーの割合を把握する方が正確な場合があります。

エラーは、ユーザーのミスからシステムのメンテナンスやアップグレード、さらには悪天候などのシステム外の要因まで、さまざまな原因で発生する可能性があります。アラートの重要な点は、考えられるすべての原因を予測しようとするのではなく、トラブルシューティングの開始点となるいくつかの重要な症状を選択することです。

アラート通知チャネルとしての Pub/Sub トピック

Pub/Sub トピックは、Google Cloud Monitoring 通知チャンネルとして使用して、Pub/Sub サブスクリプションにアラートを送信できます。これにより、Cloud Monitoring アラートをサードパーティの通知サービスなどの他のシステムと統合できます。

Pub/Sub トピックを通知チャンネルとして使用するには、まず Pub/Sub トピックと Pub/Sub サブスクリプションを作成する必要があります。次に、Pub/Sub トピックを宛先として使用する Cloud Monitoring 通知チャンネルを作成する必要があります。

アラートがトリガーされると、Cloud Monitoring は Pub/Sub トピックにメッセージを送信します。Pub/Sub サブスクリプションのサブスクライバーは、メッセージを処理して適切な措置を講じることができます。

作成するアプリの概要

この Codelab では、アプリをデプロイし、Pub/Sub トピックを作成し、アプリの特定の部分のエラーをチェックするログベースのアラートを作成して、Pub/Sub トピックを通知チャンネルとして使用します。

学習内容

  • Pub/Sub トピックを作成する方法
  • ログベースのアラートを作成する方法

この Codelab では、エラーのアラートを作成する方法について説明します。関連のない概念とアプリケーション コードについては軽く触れるにとどめ、そのままコピーして貼り付けられるようにしています。

必要なもの

  • 次の権限を持つ Google Cloud アカウント。
  • Cloud Run アプリケーションをデプロイする
  • Pub/Sub トピックを作成する
  • アラートを作成する

2. 設定方法

Google Cloud プロジェクトを選択または作成する

既存のプロジェクトを選択するには、プルダウンを使用します。

b35bf95b8bf3d5d8.png

Google Cloud で新しいプロジェクトを作成する手順は次のとおりです。

  1. Google Cloud Platform Console に移動します。
  2. [プロジェクトを作成] ボタンをクリックします。
  3. プロジェクトの名前を入力します。
  4. プロジェクトの請求先アカウントを選択します。
  5. [作成] ボタンをクリックします。

プロジェクトが作成され、プロジェクト ダッシュボードが表示されます。これで、Google Cloud サービスの使用を開始できます。

各ステップの詳細は次のとおりです。

  • 名前: プロジェクト名は組織内で一意である必要があります。
  • 請求先アカウント: 既存の請求先アカウントを使用することも、新しいアカウントを作成することもできます。
  • 作成: 必要な情報をすべて入力したら、[作成] ボタンをクリックしてプロジェクトを作成します。

詳細については、プロジェクトの作成に関する Google Cloud のドキュメントをご覧ください。

3. API アプリケーションをデプロイする

サンプル アプリケーションまたは API の概要

このアプリケーションは、在庫アイテムのリストと特定のアイテムの在庫数を取得する 2 つのオペレーションで REST API エンドポイントを公開するシンプルな Inventory API アプリケーションです。

API をデプロイし、https://<somehost> でホストされていると仮定すると、次のように API エンドポイントにアクセスできます。

https://<somehost>/inventory

これにより、在庫レベルがわかるすべての商品アイテムが一覧表示されます。

https://<somehost>/inventory/{productid}

これにより、その商品の productid と手持ち在庫レベルを含む単一のレコードが提供されます。

返されるレスポンス データは JSON 形式です。

: この API アプリケーションはデモ専用であり、安全で堅牢な API 実装を表すものではありません。このラボの主な目的である Google Cloud Operations を理解するために、すぐに利用できるアプリケーションを用意することを目的としています。

サンプルデータと API リクエスト/レスポンス

簡単にするため、このアプリはバックエンドのデータベースで動作していません。これには、3 つの商品 ID のサンプルと、その在庫レベルが含まれています。

製品 ID

手持ち在庫レベル

I-1

10

I-2

20

I-3

30

API リクエストとレスポンスの例を以下に示します。

API リクエスト

API レスポンス

https://<somehost>/inventory

[ { "I-1": 10, "I-2": 20, "I-3": 30 }]

https://<somehost>/inventory/I-1

{ "productid": "I-1", "qty": 10}

https://<somehost>/inventory/I-2

{ "productid": "I-2", "qty": 20}

https://<somehost>/inventory/I-200

{ "productid": I-200, "qty": -1}

リポジトリのクローンを作成する

Google Cloud はノートパソコンからリモートで操作できますが、この Codelab では、Google Cloud Shell(Cloud 上で動作するコマンドライン環境)を使用します。

GCP Console で右上のツールバーにある Cloud Shell アイコンをクリックします。

bce75f34b2c53987.png

プロビジョニングと環境への接続にはそれほど時間はかかりません。完了すると、次のように表示されます。

f6ef2b5f13479f3a.png

この仮想マシンには、必要な開発ツールがすべて用意されています。永続的なホーム ディレクトリが 5 GB 用意されており、Google Cloud で稼働します。そのため、ネットワークのパフォーマンスと認証機能が大幅に向上しています。このラボでの作業はすべて、ブラウザから実行できます。

gcloud を設定する

Cloud Shell でプロジェクト ID を設定し、PROJECT_ID 変数として保存します。

PROJECT_ID=[YOUR-PROJECT-ID]

gcloud config set project $PROJECT_ID

次のコマンドを実行します。

$ git clone https://github.com/rominirani/cloud-code-sample-repository.git

これにより、このフォルダに cloud-code-sample-repository というフォルダが作成されます。

(省略可)Cloud Shell でアプリケーションを実行する

次の手順に沿って、アプリケーションをローカルで実行します。

  1. ターミナルから、次のコマンドを使用して API の Python バージョンに移動します。

$ cd cloud-code-sample-repository

$ cd python-flask-api

  1. ターミナルで次のコマンドを入力します(このドキュメントの作成時点では、Cloud Shell に Python 3.9.x がインストールされており、デフォルト バージョンを使用します)。ノートパソコンでローカルに実行する場合は、Python 3.8 以上を使用できます。

$ python app.py

  1. 次のコマンドを実行して、Python サーバーをローカルで起動できます。

1f798fbddfdc2c8e.png 46edf454cc70c5a6.png

[ポート 8080 でプレビュー] をクリックします。5. ブラウザ ウィンドウが開きます。404 エラーが表示されますが、問題ありません。URL を変更して、ホスト名の後に /inventory だけが続くようにします。

たとえば、私のマシンでは次のようになります。

https://8080-cs-557561579860-default.cs-asia-southeast1-yelo.cloudshell.dev/inventory

これにより、前述のように在庫アイテムのリストが表示されます。

709d57ee2f0137e4.png

  1. ターミナルに移動して Ctrl+C キーを押すと、サーバーを停止できます。

アプリケーションをデプロイする

この API アプリケーションを Cloud Run にデプロイします。このプロセスでは、gcloud コマンドライン クライアントを使用して、コードを Cloud Run にデプロイするコマンドを実行しました。

ターミナルから、次の gcloud コマンドを実行します。

$ gcloud run deploy --source .

このツールでは複数の質問が表示されます。以下に、その一部を示します。

  1. サービス名(python-flask-api): このデフォルトを使用するか、my-inventory-api などの名前を選択します。
  2. API [run.googleapis.com] not enabled on project [613162942481]. 有効にして再試行しますか?(数分かかります)(y/N)? Y
  3. リージョンを指定してください: 31(us-west-1)を選択します。
  4. API [artifactregistry.googleapis.com] not enabled on project [613162942481]. 有効にして再試行しますか?(数分かかります)(y/N)? Y
  5. ソースからデプロイするには、ビルドされたコンテナを保存する Artifact Registry Docker リポジトリが必要です。リージョン [us-west1] に [cloud-run-source-deploy] という名前のリポジトリが作成されます。
  6. Do you want to continue (Y/n)? Y
  7. Allow unauthenticated invocations to [my-inventory-api] (y/N)? Y

最終的に、このプロセスが開始され、ソースコードが取得されてコンテナ化され、Artifact Registry に push されてから、Cloud Run サービスとリビジョンがデプロイされます。このプロセスには 3 ~ 4 分かかることがあります。プロセスが完了すると、サービスの URL が表示されます。

実行例を以下に示します。

87ba8dbf88e8cfa4.png

アプリケーションをテストする

アプリケーションを Cloud Run にデプロイしたので、次のように API アプリケーションにアクセスできます。

  1. 前の手順で取得したサービス URL をメモします。たとえば、私の設定では https://my-inventory-api-bt2r5243dq-uw.a.run.app と表示されます。これを <SERVICE_URL> とします。
  2. ブラウザを開き、API エンドポイントの次の 3 つの URL にアクセスします。
  3. <SERVICE_URL>/inventory
  4. <SERVICE_URL>/inventory/I-1
  5. <SERVICE_URL>/inventory/I-100

これは、前のセクションで API リクエストとレスポンスのサンプルとともに提供した仕様に準拠している必要があります。

Cloud Run からサービスの詳細を取得する

API サービスをサーバーレス コンピューティング環境である Cloud Run にデプロイしました。Google Cloud コンソールから Cloud Run サービスにいつでもアクセスできます。

メインメニューから Cloud Run に移動します。これにより、Cloud Run で実行されているサービスのリストが表示されます。デプロイしたサービスが表示されます。選択した名前に応じて、次のような画面が表示されます。

2633965c4bc957cc.png

[サービス名] をクリックして、詳細を表示します。サンプルの詳細は次のとおりです。

33042ae64322ce07.png

URL は、ブラウザに入力して、デプロイしたばかりの Inventory API にアクセスできるサービス URL です。指標などの詳細を確認します。

それでは、Google Cloud Operations Suite から始めましょう。

4. アラート通知を受信する Pub/Sub トピックを作成する

Pub/Sub トピックを作成するには、Google Cloud コンソールで次の手順を行います。

  1. 検索ボックスで Pub/Sub を検索し、Pub/Sub に移動します。935028bd8f6328ef.png
  2. [トピック] タブをクリックします(まだクリックしていない場合)。7fd8bf91386a88fd.png
  3. [トピックを作成] ボタンをクリックします。cd9d197f9023c41b.png
  4. トピックのわかりやすい名前を入力します。

173f313b4a3c4934.png

  1. [作成] ボタンをクリックします。ca9a02477da21a44.png
  2. コピー アイコン ボタンを使用して、トピック名をコピーします。これは次のセクションで必要になります。

20848252ee83df93.png

5. エラーのアラート ポリシーを作成する

エラーログの確認

アプリケーションのエラーログを表示するには:

[ロギング] タブをクリックします。

ログ インターフェースが表示されます。ここでは、必要に応じてログ メッセージをフィルタリングするために、さまざまなリソース(プロジェクト、Google Cloud リソース、サービス名など)とログレベルを個別に選択または選択解除できます。

6605b68395185b89.png

I-1、I-2、I-3 以外の商品 ID を指定して、Inventory Service への無効なリクエストをシミュレートします。たとえば、次のようなリクエストは正しくありません。

https://<SERVICE_URL>/inventory/I-999

クエリで誤った商品 ID が指定されたときに API によって生成されたすべての WARNING を検索します。

エラーのカスタム ログベースのアラート ポリシーを作成する

アプリケーションの一部で非常に特定のエラー メッセージが発生した場合に、アラートを生成するとします。たとえば、商品 ID の検索でエラーが多発している場合などです。この問題は、さまざまな問題(リンク切れ、データベースの不整合、サイトを列挙するボットなど)の兆候です。考えられるすべての原因を想定することは困難または不可能ですが、このメッセージを一度でも送信するアプリケーションは、認識しておきたい上位レベルの問題です。アラートを生成するには、エラーログのデータに基づいてポリシーを作成する必要があります。

  1. クエリボックスに次のクエリ パラメータを挿入します。

resource.type="cloud_run_revision"

textPayload =~ "WARNING in app: Received inventory request for incorrect productid"

次のようになります。

f672154cfebf0051.png

  1. [クエリを実行] をクリックします。これにより、受信したリクエストと、この問題が発生しているリクエストがすべて表示されます。

77c190e3a2fab6bf.png

  1. 上記をアラートに変換するには、ログ エクスプローラのクエリ フィールドのすぐ下にある [アラートを作成] ボタンをクリックします。

4cd3fcf142189376.png

  1. ログベースのアラート ポリシーを作成するフォームが表示されます。

b82446854bad87fc.png

  1. アラートに含めるログの初期クエリを使用します。

resource.type="cloud_run_revision"

textPayload =~ "WARNING in app: Received inventory request for incorrect productid"

764227db73ec3de6.png

  1. 通知頻度とインシデント期間を設定します。この例では、それぞれに最小値を使用します。

bb3d96448ec998a1.png

  1. 最後に、[通知を受信するユーザー] で、先ほど作成した Pub/Sub 通知チャンネルを選択します。

3593c48c29d4b76c.png

  1. [保存] をクリックします。アラート ポリシーを表示して管理するには、[アラート] ページに移動し、[ポリシー] で確認します。ca08ea380fb37c91.png

6. 完了

おめでとうございます。稼働時間チェックを構成して、Pub/Sub にアラートを送信できるようになりました。