このチュートリアルでは、Google Stackdriver の使い方について説明します。Google Stackdriver を使用すると、Google Cloud Platform アプリケーションで次のことができます。
- App Engine、Compute Engine、Container Engine で実行中のアプリケーションで、デバッグ スナップショットを取得します。
- アプリケーション ログを表示します。
- 指標を設定してモニタリングし、アラートを受け取ります。
- API 呼び出しをトレースし、レスポンス タイムとコード内でボトルネックになる可能性がある箇所を分析します。
- アプリをデプロイすることなく、実行中のアプリケーションにログポイントを追加できます。これは、他にはない便利な機能です。
このチュートリアルでは、以下のことを行います。
- Google Cloud Platform プロジェクトを作成する(App Engine のみ)
- Google Cloud Platform プロジェクトのソース リポジトリを設定する
- GitHub から入手可能な標準の Guestbook Python アプリケーション ソースを利用する
- コードをデプロイする
- 実行中のアプリケーションのデバッグ スナップショットを取得する方法を見る
- Logging とアプリケーション呼び出しトレースを確認する
- 現在実行中のアプリケーションにログポイントを追加します。この機能については、当初、ブログ投稿「再起動なしでアプリケーションにアプリケーション ログを追加」で説明されていました。
では始めましょう。
このコンテンツは最初に Romin Irani によって作成され、こちらに投稿されました。
セルフペース型の環境設定
Google アカウント(Gmail または Google Apps)をまだお持ちでない場合は、アカウントを作成する必要があります。Google Cloud Platform Console(console.cloud.google.com)にログインして、新しいプロジェクトを作成します。
プロジェクト ID を忘れないようにしてください。プロジェクト ID はすべての Google Cloud プロジェクトを通じて一意の名前にする必要があります(上記の名前はすでに使用されているので使用できません)。以降、このコードラボでは PROJECT_ID
と呼びます。
次に、Google Cloud リソースを使用するために、Cloud Console で課金を有効にする必要があります。
この Codelab を実施した場合、費用は数ドルを超えることはありませんが、より多くのリソースを使用する場合や、実行したままにしておくとさらにコストがかかる場合があります(このドキュメントの最後にある「クリーンアップ」セクションをご覧ください)。
Google Cloud Platform の新規ユーザーは 300 ドル分の無料トライアルをご利用いただけます。
Google Cloud Shell
この Codelab では、クラウドで実行されるコマンドライン環境である Google Cloud Shell を使用します。
この Debian ベースの仮想マシンには、必要な開発ツールがすべて読み込まれています。5 GB の永続的なホーム ディレクトリが Google Cloud 上で動作することで、ネットワーク パフォーマンスと認証が大幅に強化されます。この Codelab に必要なのはブラウザだけです(はい、Chromebook で動作します)。
Google Cloud Shell を有効にするには、デベロッパー コンソールで右上のボタンをクリックします(プロビジョニングと環境への接続にはそれほど時間はかかりません)。
次に、利用規約に同意し、[Cloud Shell の起動] リンクをクリックします。
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 を確認するか、コンソール ダッシュボードで確認します。
重要: 最後に、デフォルトのゾーンとプロジェクトの構成を設定します。
gcloud config set compute/zone us-central1-f
さまざまなゾーンを選択できます。詳しくは、リージョンとゾーンのドキュメントをご覧ください。
有効な StackDriver API を確認する
プロジェクトで有効になっている API を見てみましょう。検索バーを使用して、以下に示すように API ダッシュボードを見つけます。
プロジェクトで有効になっている特定の API を確認します。
すべての Google Cloud Platform プロジェクトでプライベート Git ホスティングを提供していますが、最初にデフォルトのリポジトリを作成する必要があります。Console の検索ボックスを使用して Source Repositories に移動します。
「リポジトリを作成」をクリックして、「デフォルト」という名前の新しいコード リポジトリを作成します。
次に、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 プロジェクトから pull されたさまざまなファイルが表示されます。
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 に戻って、開発セクションに戻ります。[ソースコード] をクリックすると、デフォルトのリポジトリとして、すべてのプロジェクト ファイルが表示されます。出力例を以下に示します。
これで、ゲストブック 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]
app deploy コマンドに version パラメータを指定していることに注意してください。値として "1"
を指定しました。
ゲストブック アプリケーションは永続性に 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
データストア インデックスの更新には時間がかかることがあります。ステータスを確認するには、「データストア インデックス」を検索して [インデックス] をクリックします。インデックスの作成が進行中の間は、Status が「Indexing」と表示されます。
バージョン 1 のアプリがデプロイ済みで使用可能かどうかを確認するには、Compute → App Engine に移動し、以下のように [バージョン] をクリックします。
問題がなければ、https://<PROJECT_ID>.appspot.com
に移動してプロジェクトを確認できます。繰り返しになりますが、データストア インデックスの準備が完了するまでに数分かかる場合があります。そのため、アプリケーションでエラー(内部サーバーエラーなど)が発生した場合は、数分後にもう一度お試しください。
以下に示すように、ログインしていくつかのゲストブック エントリを作成し、アプリケーションを使用します。
次の以上で Stackdriver 機能の説明は終わりです。
まず、実行中のアプリケーションのスナップショットを作成する方法を見てみましょう。スナップショットは、特定のコードをデバッグしたり、変数を調べたりするのに便利です。これはすべて、アプリケーションの提供中に行われます。この機能は、アプリケーションに関する問題の報告時にデバッグやアプリの動作確認を行う場合、多くの変数を調査する場合、条件付きでスナップショットを取得する場合などに便利です。
では、ゲストブック アプリケーション用にしましょう。ホームページがリクエストされた場合、特に、現在 Datastore に存在しているグリーティングのリストを取得したい場合にスナップショットをリクエストします。
このコードが guestbook.py
ファイルに存在します。具体的には、データストアから挨拶文のリストを取得したら、ランタイムにコードを検査したいと考えます。72 行目です。そこで、74 行目にブレークポイントを設定し、72 行目が実行されたことを確認できます。
デバッグするには、AppEngine バージョンで [デバッグ] をクリックするか、[Stackdriver] → [デバッグ] に移動します。下記の画面が表示されます。必要な操作は、左側のファイル(guestbook.py
)を選択して、次に示す行番号をクリックするだけです。
スナップショットがトリガーされるのを待っていることを示すメッセージが上の赤いボックスで強調表示されます。あとは、次の URL にアクセスして、
https://<PROJECT_ID>.appspot.com
この操作を行うと、スナップショットがアクティブになり、[変数] セクションと [コールスタック] セクションが次のように表示されます。変数がどのように表示されるかを確認し、展開して値を確認できます。これは非常に便利です。
たとえば、挨拶の変数を展開すると、作成したゲストブック エントリの数に対応するレコードが表示されます。
スナップショットのスナップショットはいつでも再作成できます。いつでもカメラアイコンをクリックするだけで、次のようにスナップショットがヒットするのを待つことができます。
以下の [式] フィールドを使用して、特定の変数を追跡できます。たとえば、Google では挨拶にさまざまな変数があることを把握しており、スナップショットがヒットしたその時点の値を検査したいと考えています。以下のスクリーンショットに示すように、greetings 変数に入れることができます。スナップショットがヒットすると、以下のように値が入力されます。
スナップショットを特定の条件でのみ有効にする場合は、次のように [条件] フィールドを使用します。ここで、スナップショットは挨拶の数が 1 より大きい場合にのみ発生する必要があることを示しています。必要であれば、この機能をお試しください。
ウェブ アプリケーションのパフォーマンスが設定要件を満たしているかどうかを確認することは、非常に重要です。Stackdriver Trace は、アプリケーションのレイテンシの把握に役立つ重要なツールです。
すべての App Engine アプリケーションにおいてデフォルトで有効になっており、すべてのエンドポイントについて、パフォーマンスに関する非常に有用な詳細情報を確認できます。また、さまざまな呼び出しの内訳も表示されます。
この例では、ホームページ(「"/"」)をクリックして、ゲストブックのエントリを表示または追加します。これにより、Trace でレイテンシの詳細を判断できます。[Stackdriver Trace の概要] に移動すると、下のようなスクリーンショットが表示されます。最近のトレースとレイテンシに注目してください。
いずれかのトレースをクリック(URI リンクをクリック)した場合、以下のように詳細なトレースが表示されます。
この機能により、レイテンシの詳細や、どの呼び出しに最も時間がかかっているかを把握できます。上の図から、データストア クエリに時間がかかっていることがわかります。ボトルネックを減らすため、データをキャッシュに保存する方法を検討することも 1 つの方法です。繰り返しになりますが、これらはすべてアプリケーションに依存しており、呼び出しトレースのどの部分でリファクタリングが必要になるかを判断するのに非常に役立ちます。
アプリケーション ログは、Stackdriver Logging でいつでも確認できます(以下を参照)。さまざまな GCP サービス → ログタイプ → ログレベル → 日付など、複数のフィルタを使用できます。
以下のスクリーンショットは、App Engine アプリケーションのログとデフォルトのバージョン 1 を示しています。
最後に、その機能の可能性に期待を持たせるような機能にしましょう。デベロッパーとしては通常、ログ ステートメントをコードに記述して、コードをデプロイし、知っておくべきことをログが出力してくれることを望んでいます。
しかし、十分ではなく、デバッグについてのみ、いくつかのログ ステートメントをあちこちに配置する必要があるかもしれません。通常のワークフローでは、コードを変更し、追加のログ ステートメントを入力して、再デプロイしてモニタリングします。
これは問題ありませんが、これらのログステートメント(ここではログポイントと呼ぶ)を実行中のアプリケーションに追加できればどうなるでしょうか。つまり、アプリケーションの停止、コードの変更、再デプロイのプロセスを実行する必要はありません。代わりに、ログポイントのサポートを使用して、アプリケーションの外部からログポイントのリストを管理できます。
引き続き Cloud Shell 内で、構成した現在のログポイントのリストを確認します(明らかに 0 です)。これは、gcloud
を介して行います。以下をご覧ください。
gcloud debug logpoints list
コンソールに次のような出力が表示されます。
Debug target not specified. Using default target: default-1 Listed 0 items.
次に、実行中のアプリケーションにログポイントを追加します。ログポイントを追加するには、以下の手順を行います。
- ソースコード ファイルと、ログポイントを追加する行番号を特定します。
- ログメッセージを指定します。このログメッセージは、ハードコーディングすることも、式で指定することもできます。
この例では、74 行目の guestbook.py ファイルに、ログポイント作成コマンドを使用してログポイントを追加します。
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 のチュートリアルについては、Romin Irani' のブログ(この Codelab の作成者)https://rominirani.com/(英語)をご覧ください。
この「Stackdriver のモニタリングとロギングの使用」という別の Codelab を見て、アプリケーションの健全性をより深く理解することもできます。
フィードバックがある場合や、この Codelab に関する問題を報告する場合は、このページの左下にある [バグを見つけてください] リンクを使用してください。