Cloud Functions の関数に Stackdriver Logging と Stackdriver Trace を使用する

1. はじめに

この Codelab では、Cloud Functions を使用するすべてのデベロッパーが利用できるロギングツールとモニタリング ツールを活用する方法を学びます。これらのツールは、サポートされているすべての言語でデプロイできるすべての Cloud Functions の関数に付属しているため、サーバーレス コードを記述して運用する際の生産性を向上させることができます。

5815064fec87444b.png

ここでは HTTP でトリガーされる Cloud Functions の関数を使用しますが、ここで取り上げる内容は、他の言語や、他のイベントによってトリガーされる Cloud Functions にも当てはまります。

2. 設定と要件

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

  1. Cloud Console にログインし、新しいプロジェクトを作成するか、既存のプロジェクトを再利用します(Gmail アカウントまたは G Suite アカウントをお持ちでない場合は、アカウントを作成する必要があります)。

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

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

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

このコードラボを実行しても、費用はほとんどかからないはずです。このチュートリアル以外で請求が発生しないように、リソースのシャットダウン方法を説明する「クリーンアップ」セクションの手順に従うようにしてください。Google Cloud の新規ユーザーは、300 米ドル分の無料トライアル プログラムをご利用いただけます。

Cloud Shell

Cloud Functions とそのロギングおよびモニタリング機能はノートパソコンからリモートで使用できますが、Cloud Shell(Google Cloud 上で動作するコマンドライン環境)を使用します。

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

  1. Cloud Console から Cloud Shell を有効にするには、[Cloud Shell をアクティブにする] fEbHefbRynwXpq1vj2wJw6Dr17O0np8l-WOekxAZYlZQIORsWQE_xJl-cNhogjATLn-YxLVz8CgLvIW1Ncc0yXKJsfzJGMYgUeLsVB7zSwz7p6ItNgx4tXqQjag7BfWPcZN5kP-X3Q をクリックします(環境のプロビジョニングと接続に若干時間を要します)。

I5aEsuNurCxHoDFjZRZrKBdarPPKPoKuExYpdagmdaOLKe7eig3DAKJitIKyuOpuwmrMAyZhp5AXpmD_k66cBuc1aUnWlJeSfo_aTKPY9aNMurhfegg1CYaE11jdpSTYNNIYARe01A

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 を確認するか、Cloud コンソール ダッシュボードで確認します。

R7chO4PKQfLC3bvFBNZJALLTUiCgyLEq_67ECX7ohs_0ZnSjC7GxDNxWrJJUaoM53LnqABYamrBJhCuXF-J9XBzuUgaz7VvaxNrkP2TAn93Drxccyj2-5zz4AxL-G3hzxZ4PsM5HHQ

Cloud Shell では、デフォルトで環境変数もいくつか設定されます。これらの変数は、以降のコマンドを実行する際に有用なものです。

echo $GOOGLE_CLOUD_PROJECT

コマンド出力

<PROJECT_ID>
  1. 最後に、デフォルトのゾーンとプロジェクト構成を設定します。
gcloud config set compute/zone us-central1-f

さまざまなゾーンを選択できます。詳しくは、リージョンとゾーン

3. シンプルな Cloud Functions の関数をデプロイする

モニタリング対象を用意するには、「Hello, World」というCloud Functions の関数。Google Cloud コンソールの左側のメニューで、[Cloud Functions] をクリックし、[関数を作成] をクリックします。

3c13aa20af602aa7.png

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

fa6816c96d6d5b94.png

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

7aadf164450484e.png

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

dc74cd21000d6c91.png

Cloud Functions 関数の横に緑色のチェックマークが付いているはずです。これは、関数を呼び出す準備ができていることを意味します。

5363a34eb001d5ed.png

4. Cloud Functions の関数をテストし、負荷生成ツールを使用してトラフィックを送信する

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

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

$ gcloud functions describe hello-monitor

これにより、Cloud Functions の説明が返されます。これには、httpsTrigger の URL が含まれます。これは、Cloud Functions の関数を呼び出すための HTTP(S) エンドポイントです。次のようになります: 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 の関数にトラフィックを送信する(数分間毎秒 5 件のリクエスト)には、次のコマンドを使用します。

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

5. ログを確認する

Cloud Functions の関数の詳細ビューで、[ログを表示] をクリックします。

b24157fd3376e6a8.png

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

5a36fa75d2fb0165.png

Cloud Functions の関数に対するすべてのリクエストは、ステータス コード 200 を返します。

ログを表示すると、次のことができます。

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

6. 関数を更新する

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

aaee3159bbe395d3.png 7ed347101da5eca0.png

レイテンシと RPC 呼び出しをモニタリングするためのさらに詳細なツールとして Stackdriver Trace があります。ただし、使用する前に、Cloud Functions にいくつかの変更を加える必要があります。手順は次のとおりです。

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

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

39b0f8f98b18a6c0.png

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 ミリ秒一時停止した後に、ランダムな絵文字が Cloud Functions の関数によって返されるメッセージに追加されます。

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

9205bd277b76aa21.png

[保存] をクリックします。

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] の下)に移動します。

576373f38cad6f8.png

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

44a36b758b49f88f.png

これにより、Cloud Functions の関数で導入されたレイテンシが実際に 300 ミリ秒で測定されていることがよくわかります。

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

5815064fec87444b.png

拡大する場合は、グラフをクリックしてドラッグするだけです。トレースのグラフでカスタムの期間を選択する

縮小するには、ページ上部の [ズームを元に戻す] をクリックします。

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

左側のメニューで [概要] に移動します。

e920cfca2a50899e.png

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

ef5a45647967d275.png

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

5bd34e9d13b47fb6.png

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

2cc0e9a3212b91bb.png

2e7b1ebf2f0a2b4f.png

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

8. リソースをクリーンアップする時間

これでこの Codelab は終了です。

Cloud Functions と Stackdriver のツールは、使用時以外は費用が発生しないサーバーレス プラットフォームですが、Cloud Functions を適切に使用しましょう。Cloud Functions の関数は削除してください。[Cloud Functions] の [概要] で [hello-monitor] を選択し、[削除] をクリックします。

aceb633cf70a4a27.png

9. 次のステップ

以下に、関連する情報を示します。

/