1. はじめに
この Codelab では、Cloud Functions を使用するすべてのデベロッパーが利用できるロギング ツールとモニタリング ツールを活用する方法を学びます。このツールは、サポートされているすべての言語でデプロイするすべての Cloud Functions に付属しており、サーバーレスコードの作成と運用をより効率的に行うことができます。

ここでは HTTP トリガーの Cloud Functions を使用しますが、ここで説明する内容は他の言語や、他のイベントによってトリガーされる Cloud Functions にも当てはまります。
2. 設定と要件
セルフペース型の環境設定
- Cloud Console にログインし、新しいプロジェクトを作成するか、既存のプロジェクトを再利用します(Gmail アカウントまたは G Suite アカウントをお持ちでない場合は、アカウントを作成する必要があります)。
プロジェクト ID を忘れないようにしてください。プロジェクト ID はすべての Google Cloud プロジェクトを通じて一意の名前にする必要があります(上記の名前はすでに使用されているので使用できません)。以降、このコードラボでは PROJECT_ID と呼びます。
- 次に、Google Cloud リソースを使用するために、Cloud Console で課金を有効にする必要があります。
このコードラボを実行しても、費用はほとんどかからないはずです。このチュートリアル以外で請求が発生しないように、リソースのシャットダウン方法を説明する「クリーンアップ」セクションの手順に従うようにしてください。Google Cloud の新規ユーザーは、300 米ドル分の無料トライアル プログラムをご利用いただけます。
Cloud Shell
Cloud Functions とそのロギング機能とモニタリング機能はノートパソコンからリモートで使用できますが、ここでは Google Cloud 上で動作するコマンドライン環境である Cloud Shell を使用します。
この Debian ベースの仮想マシンには、必要な開発ツールがすべて用意されています。仮想マシンは Google Cloud で稼働し、永続的なホーム ディレクトリが 5 GB 用意されているため、ネットワークのパフォーマンスと認証が大幅に向上しています。つまり、この Codelab に必要なのはブラウザだけです(Chromebook でも動作します)。
- Cloud Console から 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 を確認するか、Cloud Console ダッシュボードで検索します。
Cloud Shell では、デフォルトで環境変数もいくつか設定されます。これらの変数は、以降のコマンドを実行する際に有用なものです。
echo $GOOGLE_CLOUD_PROJECT
コマンド出力
<PROJECT_ID>
- 最後に、デフォルトのゾーンとプロジェクト構成を設定します。
gcloud config set compute/zone us-central1-f
さまざまなゾーンを選択できます。詳細については、リージョンとゾーンをご覧ください。
3. シンプルな Cloud Functions 関数をデプロイする
モニタリング対象を作成するため、「Hello, World」Cloud Functions の関数を作成します。Google Cloud コンソールの左側のメニューで [Cloud Functions] をクリックし、[関数の作成] をクリックします。

新しい Cloud Functions の名前として「hello-monitor」と入力します。

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

最後に [作成] をクリックします。

Cloud Functions が一覧表示され、その横に緑色のチェックマークが表示されます。これは、関数を呼び出す準備が整ったことを意味します。

4. Cloud Functions の関数をテストし、ロードジェネレータを使用してトラフィックを送信する
Cloud Functions が正常にデプロイされたので、コマンドラインからテストします。
まず、Cloud Shell を使用して次のコマンドを発行します。
$ gcloud functions describe hello-monitor
これにより、Cloud Functions の説明が返されます。これには、Cloud Functions を呼び出す HTTP(S) エンドポイントである httpsTrigger の URL が含まれます。https://<region>-<project-id>.cloudfunctions.net/hello-monitor のようになります。
これで、Cloud Functions のトリガーは、その URL で 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
5. ログをナビゲートする
Cloud Functions の詳細ビューで、[ログを表示] をクリックします。

これにより、プロジェクトの Stackdriver Logging セクションに移動し、Cloud Functions のログのみが表示されます。

Cloud Functions へのすべてのリクエストは、ステータス コード 200 を返す必要があります。
ログを表示する際に、次の操作を行うことができます。
- ログレベルでフィルタします(この例では、すべてのログが
debugレベルです)。 - 特定の期間(相対または絶対)を選択します。
- ログのストリーミングを有効にします(画面上部に Play
が表示されます)。 - ログエントリへのリンクをコピーします(チームメンバーと共有するため)。
- リソース コンテキストでログエントリを表示します。
- ログエントリを固定します(視覚的な手がかりとして)。
- ログを BigQuery、Cloud Storage、Pub/Sub にエクスポートします(または、JSON ファイルまたは CSV ファイルとしてダウンロードします)。
6. 関数を更新する
Cloud コンソールを使用して、[関数の詳細] ビューに移動し、ロード テスターで作成したスパイクが、1 秒あたりの呼び出し数とその実行時間に反映されていることを確認します。

レイテンシと RPC 呼び出しをより詳細にモニタリングするツールとして Stackdriver Trace がありますが、これを使用するには、Cloud Functions にいくつかの変更を加える必要があります。手順は次のとおりです。
- 救命用の
node-emojiパッケージを依存関係として追加します。 - node-emoji モジュールを使用し、レイテンシを導入するように関数コードを更新します。
- 環境変数を追加して、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
};
これにより、Cloud Functions が 300 ミリ秒一時停止した後に返すメッセージにランダムな絵文字が追加されます。
最後に、次のように GOOGLE_CLOUD_TRACE_ENABLED という Cloud Functions 環境変数を追加し、true に設定します。

[保存] をクリックします。
Cloud Shell に戻り、新しくデプロイされた Cloud Functions 関数に負荷を生成するコマンドを思い出してください。
$ echo "GET https://<region>-<project-id>.cloudfunctions.net/hello-monitor" \ | vegeta attack -rate=5 -duration=120s \ > results.bin
これで、他の設定要件やコード内の特定のトレース ライブラリなしで生成されたトレースのリストを観察する準備が整いました。
7. 更新された Cloud Functions をトレースする
左側のメニューを使用して、[トレースリスト]([Stackdriver Trace] の下)に移動します。

次のスクリーンショットのような画面が表示されます。

これにより、Cloud Functions で発生したレイテンシが実際に 300 ミリ秒で測定されていることが明確になります。
グラフの各ドットはリクエストを表します。タイムスタンプ、HTTP メソッドとステータス、ラベル、対応するログエントリへのリンク、Cloud Functions が行う後続の RPC 呼び出しなど、詳細情報を確認できます。

グラフを拡大するには、グラフをクリックしてドラッグします。
ズームアウトするには、ページ上部の [ズームを元に戻す] をクリックします。
単一の Cloud Functions をデプロイしたため、グラフには hello-monitor URI の GET リクエストのみが表示されますが、HTTP メソッド(GET、POST、DELETE)、HTTP ステータス(2XX、3XX)、またはリクエスト フィルタを使用してトレースをフィルタできます。
左側のメニューで [概要] に移動します。

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

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

十分なデータポイントを含む正しい期間を設定できれば、最初の Cloud Functions と新しい Cloud Functions の間の重要なレイテンシのシフトを示すレポートを作成できます。


このようなカスタム レポートを使用すると、パフォーマンスの問題がいつ発生したかを特定し、エンドユーザーのリクエスト レイテンシなどのサービスレベル指標(SLI)を追跡できます。
8. リソースをクリーンアップする
これでこの Codelab は終了です。
Cloud Functions と Stackdriver ツールは、使用していないときに費用が発生しないサーバーレス プラットフォームですが、クラウドの市民として、Cloud Functions を削除してください。[Cloud Functions] の [概要] で hello-monitor を選択し、[削除] をクリックします。

9. 次のステップ
フォローアップとして、以下の記事もご覧ください。
/