Cloud Functions のロギングとトレースの Codelab

この Codelab の目標は、すべての Cloud Functions デベロッパーに提供されているロギングとモニタリングのツールを活用する方法を理解することです。これらのツールには、サポートされているすべての言語にデプロイする、すべての Cloud Functions の関数が付属しており、サーバーレスのコードの作成と運用の生産性を向上させることができます。

ここでは HTTP でトリガーされる関数を使用しますが、ここで扱うすべての内容は他の言語や、他のイベント(ストレージ バケット、Pub/Sub など)でトリガーされる関数にも適用されます。

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

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

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

Google Cloud Functions とそのロギングとモニタリング機能はノートパソコンからリモートで使用できますが、この Codelab では Google Cloud Shell(クラウドで実行されるコマンドライン環境)を使用します。

この Debian ベースの仮想マシンには、必要な開発ツールがすべて読み込まれています。5 GB の永続的なホーム ディレクトリが Google Cloud 上で動作することで、ネットワーク パフォーマンスと認証が大幅に強化されます。この Codelab に必要なのはブラウザだけです(はい、Chromebook で動作します)。

Google Cloud Shell を有効にするには、デベロッパー コンソールで右上のボタンをクリックします(プロビジョニングと環境への接続にはそれほど時間はかかりません)。

activateCloudShell.png

[Cloud Shell の起動] ボタンをクリックします。

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>

Cloud Shell では、いくつかの環境変数もデフォルトで設定します。これは、今後コマンドを実行するときに役立ちます。

echo $GOOGLE_CLOUD_PROJECT

コマンド出力

<PROJECT_ID>

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

gcloud config set project <PROJECT_ID>

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

プロジェクト ID.png

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

gcloud config set compute/zone us-central1-f

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

モニタリングするために、Hello World という Cloud Functions の関数を作成しましょう。Cloud Console の左側のメニューで、[Cloud Functions]、[Create function] の順にクリックします。

新しい関数の名前を「hello-monitor」とします。

ソースコードのすべてのデフォルトをそのまま使用します(ただし、必要に応じて別の言語やランタイムを選択できます)。

最後に、関数「&Create」を使用して関数を作成します。

しばらくすると、関数が呼び出される準備ができていることが表示されます(緑色のチェックマークで示されます)。

Cloud Functions 関数が正常にデプロイされたので、コマンドラインからテストします。

まず、Cloud Shell を使用して、次のコマンドを実行します。

$ gcloud functions describe hello-monitor

この関数には、関数を呼び出す HTTP(S) エンドポイントである httpsTrigger の URL など、関数の説明が返されます。次の形式にする必要があります: https://<region>-<project-id>.cloudfunctions.net/hello-monitor

関数のトリガーは、curl のように単純なものになります。

$ curl https://<region>-<project-id>.cloudfunctions.net/hello-monitor
Hello World!

ここでは、シンプルな HTTP 負荷テストツールの Vegeta を使用します。インストールするには、Cloud Shell から次のコマンドを入力します。

$ go get -u github.com/tsenart/vegeta

次のコマンドを使用すると、Cloud Functions の関数にトラフィック(1 秒間に 5 つのリクエストを数分間)を送信できます。

$ echo "GET https://<region>-<project-id>.cloudfunctions.net/hello-monitor" \
   | vegeta attack -rate=5 -duration=120s \
   > results.bin

関数の詳細ビューで、[ログを表示] の右側にあるメニューをクリックします。

プロジェクトの [Stackdriver Logging] セクションに Cloud ファンクションのログのみが表示されます。

関数に対するすべてのリクエストで 200 ステータス コードが返されることを願っています。

このログビューアでできること :

  • ログレベルでフィルタ(この例ではすべてのログは Debug レベル)
  • 特定の期間(相対または絶対)を選択する
  • ログ ストリーミングを有効にする(画面上部の [再生] ボタン)
  • ログエントリへのリンクをコピーする(チームメンバーと共有するため)
  • リソース コンテキストのログエントリを表示
  • ログエントリを固定する(視覚的な合図として)
  • ログを BigQuery、Cloud Storage、Cloud Pub/Sub にエクスポートする(または JSON や CSV 形式でダウンロードする)

左上のセレクタでは、関数でログをフィルタすることもできます。また、ウィンドウの上部にある検索バーでラベルや全文検索を検索することもできます。この場合、ラベルは hello-monitor(関数の名前)と各リクエストの実行 ID です。

フィルタをコピーして共有することもできます(検索ボックスのプルダウン メニューをご確認ください)。

コンソールを使用して、[関数の詳細] に移動し、1 秒あたりの呼び出し回数と実行時間の両方で、負荷テスターで作成された負荷の急増を確認します。

レイテンシと RPC 呼び出しをモニタリングするもう 1 つの詳細なツールは、Stackdriver Trace の機能です。この機能を使用する前に、いくつかの関数を変更する必要があります。

  1. 命を救う node-emoji パッケージを依存関係として追加する
  2. 関数コードを更新して node-emoji モジュールを使用し、レイテンシを発生させる
  3. Cloud Functions の Stackdriver Trace を有効にする環境変数を追加する

[関数の詳細] ページで [編集] をクリックして、関数を変更します。

package.json ファイルを編集して node-emoji パッケージの依存関係を追加します。

{
  "name": "sample-http",
  "version": "0.0.1",
  "dependencies": {
    "node-emoji": "^1.8.1"
  }
}

index.js の内容を次のように変更して実際の関数を編集します。

const emoji = require('node-emoji');

exports.helloWorld = (req, res) => {
  let message = req.query.message || req.body.message || 'Hello World!';

  // add some latency, functions are too quick!
  setTimeout(function() {
     message += emoji.random().emoji;  
     res.status(200).send(message);
  }, (3 * 100));  // 300ms
  
};

これにより、300 ミリ秒一時停止した後に関数から返されるメッセージに、ランダムな絵文字が追加されます。

最後に、GOOGLE_CLOUD_TRACE_ENABLED という Cloud Function 環境変数を追加し、次のように true に設定します。

[保存] をクリックしてください。

Cloud Shell に戻り、コマンドをデプロイし、新しくデプロイされた関数に負荷をかけます。

$ echo "GET https://<region>-<project-id>.cloudfunctions.net/hello-monitor" \
   | vegeta attack -rate=5 -duration=120s \
   > results.bin

これで、他の設定要件やコード内の特定のトレース ライブラリを使用せずに、生成されたトレースのリストをモニタリングする準備が整いました。

左側のメニューを使用して、[Stackdriver Trace] の下の [トレースリスト] に移動します。

次のような画面が表示されます。

これにより、関数で生じるレイテンシが実際に 300 ms で測定されていることが明らかになります。

このグラフの各ドットは、タイムスタンプ、HTTP メソッドとステータス、ラベル、対応するログエントリへのリンク、関数がその後に行う RPC 呼び出しなど、詳細情報を表示するリクエストです。

ズームインするには、グラフをクリックしてドラッグします。トレースのグラフでカスタムの期間を選択する

ズームアウトするには、ページ上部の [元に戻す] ボタンをクリックします。

単一の関数がデプロイされているため、グラフには hello-monitor URI で GET リクエストのみが表示されますが、トレースは HTTP メソッド(GET、POST、DELETE、...)、HTTP ステータス(2XX、3XX、...)でフィルタリングできます。また、リクエスト フィルタを使用することもできます。

左側のメニューの [Traces] セクションに移動します。

この概要ページでは、最近のトレースやその他の分析情報を確認できます。

URI リクエスト フィルタ、HTTP メソッド、HTTP ステータス、期間の組み合わせに基づいてカスタム レポートを作成することもできます。生成された値を時間ベースラインと比較することもできます。

適切な期間を設定し、十分なデータポイントがある場合、最初の関数と新しい関数の間の重要なレイテンシの変化を示すレポートを作成できます。

このようなカスタム レポートは、パフォーマンスの問題がいつ発生したかを特定する場合や、エンドユーザーのリクエストのレイテンシなどのサービスレベル指標(SLI)を追跡する場合に使用できます。

これで、新しい Cloud Functions の関数のデプロイ、そのログの案内、リクエスト トレースの確認を完了した Codelab は終了です。

Cloud Functions と Stackdriver ツールは、使用していないときにはコストが発生しないサーバーレス プラットフォームですが、クラウドのシチズンであるため、関数を削除することはできます。

Cloud Functions の概要ページで hello-monitor 関数を選択し、[削除] をクリックします。

これで、Cloud Functions のロギングとトレースを使用した簡単な Codelab は終了です。

以下に、フォローアップの資料を示します。

/