Google Stackdriver Debug、Trace、Logging、ログポイントの使用

このチュートリアルでは、Google Stackdriver の概要について説明します。これを使用すると、Google Cloud Platform アプリケーションで次の操作を行うことができます。

  • App Engine、Compute Engine、Container Engine で実行中のアプリケーションで、デバッグ スナップショットを取得します。
  • アプリケーション ログを表示します。
  • 指標を設定し、モニタリングしてアラートを取得します。
  • API 呼び出しをトレースし、レスポンス タイムとコード内でボトルネックになる可能性がある箇所を分析します。
  • 実行中のアプリケーションにログポイントを追加する。アプリをデプロイする必要はありません。これは他に類を見ない、便利な機能です。

このチュートリアルでは、次のことを最初から行います。

  1. Google Cloud Platform プロジェクトを作成する(特に App Engine)
  2. Google Cloud Platform プロジェクトのソース リポジトリを設定する
  3. GitHub から入手できる標準の Guestbook Python アプリケーションのソースを利用する
  4. コードをデプロイする
  5. 実行中のアプリケーションのデバッグ スナップショットを取得する方法を確認する
  6. ロギングとアプリケーション呼び出しトレースを確認する
  7. 現在実行中のアプリケーションにログポイントを追加します。この機能については、ブログ投稿「再起動なしでアプリケーションにアプリケーション ログを追加」で最初に説明しました。

さっそく始めましょう。

このコンテンツは、当初 Romin Irani によって作成され、こちらに投稿されました。

セルフペース型の環境設定

Google アカウント(Gmail または Google Apps)をお持ちでない場合は、1 つ作成する必要があります。Google Cloud Platform のコンソール(console.cloud.google.com)にログインし、新しいプロジェクトを作成します。

Screenshot from 2016-02-10 12:45:26.png

プロジェクト ID を忘れないようにしてください。プロジェクト ID はすべての Google Cloud プロジェクトを通じて一意の名前にする必要があります(上記の名前はすでに使用されているので使用できません)。以降、このコードラボでは PROJECT_ID と呼びます。

次に、Google Cloud リソースを使用するために、Cloud Console で課金を有効にする必要があります。

この Codelab の操作をすべて行っても、費用は数ドル程度です。ただし、その他のリソースを使いたい場合や、実行したままにしておきたいステップがある場合は、追加コストがかかる可能性があります(このドキュメントの最後にある「クリーンアップ」セクションをご覧ください)。

Google Cloud Platform の新規ユーザーは、300 ドル分の無料トライアルをご利用いただけます。

Google Cloud Shell

この Codelab では、Google Cloud Shell(Cloud 上で動作するコマンドライン環境)を使用します。

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

Google Cloud Shell を有効にするには、デベロッパー コンソールの右上にあるボタンをクリックします(環境のプロビジョニングと接続に若干時間を要します)。

activateCloudShell.png

次に、利用規約に同意して、[Cloud Shell を起動] リンクをクリックします。

x.png

Screen Shot 2017-06-14 at 10.13.43 PM.png

Cloud Shell に接続すると、すでに認証は完了しており、プロジェクトに各自の PROJECT_ID が設定されていることがわかります。

gcloud auth list

コマンド出力

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
gcloud config list project

コマンド出力

[core]
project = <PROJECT_ID>

なんらかの理由でプロジェクトが設定されていない場合は、次のコマンドを実行します。

gcloud config set project <PROJECT_ID>

PROJECT_ID が見つからない場合は、設定手順で使用した ID を確認するか、コンソールのダッシュボードで検索します。

Project_ID.png

重要: 最後に、デフォルトのゾーンとプロジェクト構成を設定します。

gcloud config set compute/zone us-central1-f

さまざまなゾーンを選択できます。詳しくは、リージョンとゾーンのドキュメントをご覧ください。

有効な Stackdriver API を確認する

プロジェクトで有効になっている API を確認しましょう。次の図に示すように、検索バーを使用して API ダッシュボードを見つけます。

プロジェクトで有効になっている特定の API を確認します。

すべての Google Cloud Platform プロジェクトでプライベート Git ホスティングが提供されていますが、まず操作するデフォルト リポジトリを作成する必要があります。コンソールの検索ボックスを使用して、Source Repositories に移動します。

[リポジトリを作成] をクリックして、「default」という新しいコード リポジトリを作成します。

Cloud Shell を使用して、このディレクトリを Google Cloud Shell インスタンスに複製します。そのため、まず Google Cloud Shell インスタンスにディレクトリを作成し、次のようにそのディレクトリに移動します(サンプル出力)。

mkdir stackdriver-demo
cd stackdriver-demo/

次に、次の gcloud コマンドを使用して、デフォルトのリポジトリのクローンを作成します。

gcloud source repos clone default

コンソールに次のような出力が表示されます。

Cloning into '/home/gcp123_student/default'...
warning: You appear to have cloned an empty repository.
Project [qwiklabs-gcp-1234abc1234] repository [default] was cloned to [/home/gcp123_student/default].

これで完了です。設定されている git リモートについて、もう少し詳しく見てみましょう。これは必ずしも必要ではありませんが、舞台裏で何が起こったかをよりよく理解するためのものです。

作成されたデフォルト ディレクトリに移動し、次のように git remote -v コマンドを実行します。

cd default
git remote -v

コンソールに次のような出力が表示されます。

origin https://source.developers.google.com/p/qwiklabs-gcp-1234abc1234/r/default (fetch)
origin https://source.developers.google.com/p/qwiklabs-gcp-1234abc1234/r/default (push)

これは、GCP プロジェクトに関連付けられている Git リポジトリを正しく指しています。

GitHub から Guestbook アプリケーションを pull する

使用するアプリケーションは、Guestbook という名前の標準の App Engine アプリケーションで、Google Cloud Platform の公式 Github リポジトリで入手できます。このアプリケーションは、スタートガイドの公式ドキュメントにも含まれています。GitHub プロジェクトは、https://github.com/GoogleCloudPlatform/appengine-guestbook-python で入手できます。

このコードを Cloud Shell インスタンスに pull します。コマンドとその出力は次のとおりです。

git pull https://github.com/GoogleCloudPlatform/appengine-guestbook-python

コンソールに次のような出力が表示されます。

remote: Counting objects: 485, done.
remote: Total 485 (delta 0), reused 0 (delta 0), pack-reused 485
Receiving objects: 100% (485/485), 436.42 KiB | 163.00 KiB/s, done.
Resolving deltas: 100% (195/195), done.
From https://github.com/GoogleCloudPlatform/appengine-guestbook-python
* branch HEAD -> FETCH_HEAD

これで、すべてのコードが Google Cloud Shell インスタンスにローカルに存在します。Github プロジェクトから取得されたさまざまなファイルが表示されます。

Cloud Shell を使用して現在のコードをプロジェクトの Git リポジトリに push する

このコードを GCP プロジェクトの Git リポジトリに push して、コードにブレークポイントやログポイントなどを設定できるようにします。ソースコードをリンクする他の方法(Github やローカルマシンとの直接統合など)もあるため、この手順は必須ではありません。

ここでは、このコードを GCP プロジェクトの Git リポジトリに push します。これは、次の例に示すように、標準の git push コマンドを使用して行います。

git push origin master

コンソールに次のような出力が表示されます。

Counting objects: 485, done.
Compressing objects: 100% (280/280), done.
Writing objects: 100% (485/485), 436.42 KiB | 0 bytes/s, done.
Total 485 (delta 195), reused 485 (delta 195)
remote: Storing objects: 100% (485/485), done.
remote: Processing commits: 100% (152/152), done.
To https://source.developers.google.com/p/qwiklabs-gcp-1234abc1234/r/default
* [new branch] master -> master

次に、GCP Cloud Console の [開発] セクションに戻ります。[Source Code] をクリックすると、デフォルトのリポジトリのすべてのプロジェクト ファイルが表示されます。サンプル出力は次のとおりです。

これで、ゲストブック App Engine アプリケーションをデプロイする準備が整いました。アプリをデプロイするには、Google Cloud Shell で、これまでと同様にデフォルト ディレクトリにいることを確認します。次のように gcloud app deploy コマンドを使用します。

gcloud app deploy --version 1

リージョンを選択するように求められたら、[1] us-east1 を選択します。

コンソールに次のような出力が表示されます。

You are about to deploy the following services:
— qwiklabs-gcp-1234abc1234/default/1 (from [/home/gcp123-student/default/app.yaml])
Deployed URL: [https://qwiklabs-gcp-1234abc1234.appspot.com]
Do you want to continue (Y/n)? Y
Beginning deployment of service [default]...
File upload done.
Updating service [default]...done.
Deployed service [default] to https://qwiklabs-gcp-1234abc1234.appspot.com]

アプリのデプロイ コマンドにバージョン パラメータを指定していることに注意してください。値は "1" に設定しました。

Guestbook アプリケーションは永続化に Google Cloud Datastore を使用しているため、Datastore インデックスを更新する必要があります。インデックスは index.yaml ファイルで指定されているため、次のように gcloud datastore create-indexes コマンドを使用します。

gcloud datastore create-indexes index.yaml

コンソールに次のような出力が表示されます。

You are about to update the following configurations:
— qwiklabs-gcp-1234abc1234/index From: [/home/gcp123_student/default/index.yaml]
Do you want to continue (Y/n)? Y

Datastore インデックスの更新には時間がかかることがあります。ステータスを確認するには、「Datastore インデックス」を検索して [インデックス] をクリックします。インデックスの作成中は、次のようにステータスの値が「インデックス作成中」と表示されます。

[Compute] → [App Engine] に移動し、次のように [バージョン] をクリックすると、バージョン 1 のアプリがデプロイされて使用可能になっているかどうかを確認できます。

これで、すべてが正常に表示されるようになります。https://<PROJECT_ID>.appspot.com に移動して、プロジェクトを確認してください。Datastore インデックスの準備が整うまで数分かかることがあります。アプリケーションでエラー(内部サーバーエラーなど)が発生した場合は、数分後にもう一度お試しください。

次に、以下に示すように、ログインしてゲストブック エントリをいくつか作成して、アプリケーションを使用してみましょう。

これで完了です。これで、Stackdriver の機能について詳しく見ていく準備が整いました。

まず、実行中のアプリケーションのスナップショットを取得する方法を見てみましょう。スナップショットは、特定のコードをデバッグしたり、変数を検査したりする場合に便利です。この間もアプリケーションは引き続き提供されます。これは、アプリケーションに関する問題のレポートを受け取った場合に、デバッグを試してアプリで何が起こっているかを確認したり、多数の変数を検査したり、条件付きでスナップショットを取得したりする場合に非常に役立ちます。

それでは、Guestbook アプリケーションでこれを行ってみましょう。ホームページがリクエストされた場合は、スナップショットをリクエストします。具体的には、Datastore に現在ある挨拶のリストを取得するスナップショットをリクエストします。

このコードは guestbook.py ファイルにあります。具体的には、データストアから挨拶のリストを取得したら、実行時にコードの検査を開始したいと考えています。これは 72 行目で行われます。そこで、74 行目にブレークポイントを設定して、72 行目が実行されたことを確認します。

これを行うには、App Engine バージョン ビューで [デバッグ] をクリックするか、[Stackdriver] → [デバッグ] に移動します。下の画面が表示されます。左側のファイル(guestbook.py)を選択し、図のように行番号をクリックします。

上の赤いボックスでハイライト表示されているメッセージが表示され、スナップショットがトリガーされるのを待機していることが示されます。あとは、次の URL でページにアクセスするだけです。

https://<PROJECT_ID>.appspot.com

スナップショットが有効になり、次のように [変数] セクションと [コールスタック] セクションにデータが入力されます。変数の表示方法を確認し、展開して値を確認します。これは非常に便利です。

たとえば、挨拶変数を展開すると、作成したゲストブック エントリの数に対応するレコードが表示されます。

便利な機能の一つに、いつでもスナップショットを再撮影できることがあります。カメラアイコンをクリックすると、以下のようにスナップショットがヒットするのを再び待機します。

次の図のように [式] フィールドを使用して、特定の変数を追跡できます。たとえば、greeting という変数があり、スナップショットがヒットした瞬間の値を確認したいとします。次のスクリーンショットに示すように、挨拶の変数を入力します。スナップショットがヒットすると、次のように値が入力されます。

特定の条件でのみスナップショットを有効にする場合は、次のように [条件] フィールドを使用します。ここでは、挨拶の数が 1 より大きい場合にのみスナップショットを作成するように指定しています。必要に応じてお試しください。

ウェブ アプリケーションのパフォーマンスが設定要件を満たしているかどうかを確認することは、非常に重要です。Stackdriver Trace は、アプリケーションのレイテンシの調査に役立つ重要なツールです。

これはすべての App Engine アプリケーションでデフォルトで有効になっており、すべてのエンドポイントのパフォーマンスの詳細と、さまざまな呼び出しのブレークダウンを非常に便利に確認できます。

この例では、ホームページ(「/」)にアクセスし、ゲストブック エントリを表示または追加しています。これで、Trace からレイテンシに関する詳細情報を取得できます。Stackdriver Traces の概要に移動すると、次のスクリーンショットが表示されます。最近のトレースとそのレイテンシを確認します。

トレースのいずれか(URI リンク)をクリックすると、次のように詳細なトレースが表示されます。

レイテンシの内訳と、最も時間がかかっている呼び出しを確認できます。上記の可視化から、データストア クエリに時間がかかっていることがわかります。ボトルネックを解消するために、データをキャッシュに保存するという方法も考えられます。これもアプリケーションによって異なりますが、コール トレースのどの領域でリファクタリングが必要になるかを判断するうえで非常に役立ちます。

アプリケーション ログは、Stackdriver Logging に移動することでいつでも表示できます(下記参照)。さまざまな GCP サービス → ログタイプ → ログレベル → 日付など、複数のフィルタを使用できます。

次のスクリーンショットは、App Engine アプリケーションのログとデフォルトのバージョン 1 を示しています。

logging.png

最後に、この機能がもたらす可能性について見ていきましょう。通常、開発者はコードにログ ステートメントを配置し、コードをデプロイして、ログから必要な情報が得られることを期待します。

しかし、それだけでは不十分であり、デバッグでのみ、あちこちにログステートメントを追加すべきだったことに気づきます。通常のワークフローでは、コードを変更し、追加のログ ステートメントを挿入して、再デプロイしてモニタリングします。

これは問題ありませんが、実行中のアプリケーションにこれらのログ ステートメント(ここではログポイントと呼びます)を追加できるとしたらどうでしょうか。つまり、アプリケーションの停止、コードの変更、再デプロイのプロセスを行う必要はありません。代わりに、ログポイントのサポートを使用して、アプリケーションの外部からログポイントのリストを管理できます。

Cloud Shell 内で、構成したログポイントの現在のリストを確認します(当然ながら 0 になっているはずです)。これは、次の例に示すように gcloud コマンドを使用して行います。

gcloud debug logpoints list

コンソールに次のような出力が表示されます。

Debug target not specified. Using default target: default-1
Listed 0 items.

次に、実行中のアプリケーションにログポイントを追加します。ログポイントを追加するには、次の操作を行います。

  • ログポイントを追加するソースコード ファイルと行番号を特定します。
  • ログメッセージを指定します。このログメッセージは、ハードコーディングすることも、式で指定することもできます。

この例では、次の例に示すように、logpoints create コマンドを使用して、guestbook.py ファイルの 74 行目にログポイントを追加します。

gcloud debug logpoints create guestbook.py:74 "Fetched greetings from Datastore. Count of greetings : {len(greetings)}"

コンソールに次のような出力が表示されます。

Debug target not specified. Using default target: default-1
— id: 53538243519d4-f9a0-bdbce
location: guestbook.py:74
logLevel: INFO
logMessageFormat: Fetched greetings from Datastore. Count of greetings : {len(greetings)}
condition: None
status: ACTIVE

上記の filename:linenumber とログメッセージを提供しました。ログメッセージには、データストアから取得した挨拶の数を出力する式も含まれています。

コマンドが戻り、ログポイントが追加されたことを示すメッセージが表示されます。Cloud Shell のスクリーンショットを以下に示します。

ここで、ログポイント リスト コマンドを実行すると、次の出力が表示されます。

gcloud debug logpoints list

コンソールに次のような出力が表示されます。

Debug target not specified. Using default target: default-1
STATUS LOCATION CONDITION LOG_LEVEL LOG_MESSAGE_FORMAT ID
ACTIVE
guestbook.py:74 INFO Fetched greetings from Datastore. Count of greetings : {len(greetings)} 53538243519d4-f9a0-bdbce

実際に機能していることを確認するには、もう一度 https://<PROJECT_ID>.appspot.com でホームページにアクセスします。これにより、コードが呼び出され、ログポイントが呼び出されます。これはデフォルトでアプリケーション ログに記録されます。したがって、次の図に示すように、Stackdriver Logging にもう一度アクセスするだけです。

該当するリクエストをクリックします。詳細には、ログポイントが起動され、ログメッセージが表示されていることが示されます。

このチュートリアルがお役に立てば幸いです。このラボで取り上げたのは、Stackdriver プラットフォームの機能のごく一部にすぎません。他にもさまざまな機能があります。他の Google Cloud Platform チュートリアルについては、この Codelab の元の作成者である Romin Irani のブログ(https://rominirani.com/)をご覧ください。

「Stackdriver のモニタリングとロギングを使用してアプリケーションの稼働状況について理解を深める」という別の codelab もご覧ください。

この Codelab に関するフィードバックや問題を報告する場合は、このページの左下にある [バグを見つけてください] リンクを使用してください。