arrow_back

Log Analysis - ログの分析

ログイン 参加
700 以上のラボとコースにアクセス

Log Analysis - ログの分析

ラボ 1時間 30分 universal_currency_alt クレジット: 5 show_chart 中級
info このラボでは、学習をサポートする AI ツールが組み込まれている場合があります。
700 以上のラボとコースにアクセス

概要

この演習では、アプリケーションからログエントリを生成し、Cloud Logging でログをフィルタし分析して、BigQuery ログシンクにログをエクスポートします。

目標

このラボでは、次のタスクを行う方法について学びます。

  • テスト アプリケーションの設定とデプロイを行う。

  • テスト アプリケーションによって生成されたログエントリを確認する。

  • ログベースの指標を作成して使用する。

  • アプリケーション ログを BigQuery にエクスポートする。

設定と要件

このタスクでは、Qwiklabs を使用してラボの初期化手順を行います。

各ラボでは、新しい Google Cloud プロジェクトとリソースセットを一定時間無料で利用できます。

  1. Qwiklabs にシークレット ウィンドウでログインします。

  2. ラボのアクセス時間(例: 1:15:00)に注意し、時間内に完了できるようにしてください。
    一時停止機能はありません。必要な場合はやり直せますが、最初からになります。

  3. 準備ができたら、[ラボを開始] をクリックします。

  4. ラボの認証情報(ユーザー名パスワード)をメモしておきます。この情報は、Google Cloud Console にログインする際に使用します。

  5. [Google Console を開く] をクリックします。

  6. [別のアカウントを使用] をクリックし、このラボの認証情報をコピーしてプロンプトに貼り付けます。
    他の認証情報を使用すると、エラーが発生したり、料金の請求が発生したりします。

  7. 利用規約に同意し、再設定用のリソースページをスキップします。

最初のログイン手順を完了すると、プロジェクト ダッシュボードが表示されます。

[プロジェクト情報]、[API]、[リソース]、[お支払い] などのタイルが表示されたプロジェクト ダッシュボード

Google Cloud Shell の有効化

Google Cloud Shell は、開発ツールと一緒に読み込まれる仮想マシンです。5 GB の永続ホーム ディレクトリが用意されており、Google Cloud で稼働します。

Google Cloud Shell を使用すると、コマンドラインで Google Cloud リソースにアクセスできます。

  1. Google Cloud コンソールで、右上のツールバーにある [Cloud Shell をアクティブにする] ボタンをクリックします。

    ハイライト表示された Cloud Shell アイコン

  2. [続行] をクリックします。

環境がプロビジョニングされ、接続されるまでしばらく待ちます。接続した時点で認証が完了しており、プロジェクトに各自のプロジェクト ID が設定されます。次に例を示します。

Cloud Shell ターミナルでハイライト表示されたプロジェクト ID

gcloud は Google Cloud のコマンドライン ツールです。このツールは、Cloud Shell にプリインストールされており、タブ補完がサポートされています。

  • 次のコマンドを使用すると、有効なアカウント名を一覧表示できます。
gcloud auth list

出力:

Credentialed accounts: - @.com (active)

出力例:

Credentialed accounts: - google1623327_student@qwiklabs.net
  • 次のコマンドを使用すると、プロジェクト ID を一覧表示できます。
gcloud config list project

出力:

[core] project =

出力例:

[core] project = qwiklabs-gcp-44776a13dea667a6 注: gcloud ドキュメントの全文については、 gcloud CLI の概要ガイド をご覧ください。

タスク 1. テスト アプリケーションを設定してデプロイし、負荷テスト用の VM を設定する

ロギング、ログのエクスポート、Error Reporting をテストするために、前の演習で使用した HelloLoggingNodeJS アプリケーションを Cloud Run にデプロイします。

  1. 後のステップで使用するので、Cloud Build、Compute Engine、Cloud Run の各 API を有効にします。

gcloud services enable cloudbuild.googleapis.com \ run.googleapis.com \ compute.googleapis.com \ cloudprofiler.googleapis.com
  1. API を有効にしたら、https://github.com/haggman/HelloLoggingNodeJS.git リポジトリのクローンを作成します。

git clone https://github.com/haggman/HelloLoggingNodeJS.git

このリポジトリには、テストに使用される基本的な Node.js アプリケーションが含まれています。

  1. HelloLoggingNodeJS フォルダに移動し、Cloud Shell エディタで index.js を開きます。

cd HelloLoggingNodeJS edit index.js
  1. 「サードパーティの Cookie が無効になっているためコードエディタを読み込めなかった」という内容のエラーが表示された場合は、[新しいウィンドウで開く] をクリックし、新しいタブに切り替えます。

  2. 少し時間をかけてコードをよく読みます。このコードが講義モジュール内のコード例の一部であることに気付いたでしょうか。

  • これによって Google Error Reporting ライブラリとデバッグ ライブラリが読み込まれる点に注意してください。

  • 下にスクロールすると、ログ、エラー、エラーログを生成するいくつかのメソッドがあります。

  • 特に /random-error に注目してください。このメソッドによって約 1,000 リクエストごとにエラーが生成されます。次のステップで、これを 20 リクエストに変更し、エラーの表示頻度を上げます。

  1. 捕捉されない例外を増やすために /random-error1,000 分の 1 から 20 分の 1 に変更します。Cloud Shell エディタで index.js を開きます。

  2. index.js ファイルで、125~135 行目を以下の行に置き換えます。

//20 リクエストごとに捕捉されない例外を生成 app.get('/random-error', (req, res) => { error_rate = parseInt(req.query.error_rate) || 20 let errorNum = (Math.floor(Math.random() * error_rate) + 1); if (errorNum==1) { console.log("Called /random-error, and it's about to error"); doesNotExist(); } console.log("Called /random-error, and it worked"); res.send("Worked this time."); });
  1. エディタで rebuildService.sh ファイルも確認します。このファイルでは Cloud Build を使用して Docker コンテナを作成し、そのコンテナを使用して Cloud Run アプリケーションを作成(または更新)します。Cloud Run サービスでは匿名アクセスがサポートされており、ステージと部門に関する 2 つのラベルが付きます。また、1 つの実行インスタンスに対して許可される同時接続数は最大で 5 つのみです。

  2. Cloud Shell ウィンドウに戻ります。Cloud Shell が表示されない場合、[ターミナルを開く] をクリックします。

  3. ファイルを実行することにより、コンテナを作成して Cloud Run アプリケーションを開始します。

sh rebuildService.sh

完了までに 1~2 分かかります。

  1. Cloud Shell に表示される最後のメッセージに新しいサービスへの URL が含まれています。そのリンクをクリックし、新しいタブでアプリケーションをテストします。シンプルな「Hello World!」というレスポンスが返されます。

  2. Cloud Shell ターミナル ウィンドウで新しい URL 環境変数を作成し、その値をアプリケーションへの URL に設定します。

URL=$(gcloud run services list --platform managed --format="value(URL)" | grep hello-logging)
  1. 値をエコーして、変数が正しく作成されたかどうかをテストします。

echo $URL
  1. bash の while ループを使用して、アプリケーションの random-error ルートで負荷を生成します。主に「今回は成功した」という内容のメッセージが表示され始めるのを確認します。表示されない場合は、アプリケーションが実行されており、URL プロパティが正しく設定されていることをもう一度確認します。

while true; \ do curl -s $URL/random-error \ -w '\n' ;sleep .1s;done

タスク 2. テスト アプリケーションのログファイルを確認する

アプリケーションが Cloud Run にデプロイされたので、URL に応じて、シンプルにログを作成するか、Winston を介してログを作成するか、エラーレポートを生成することができます。それらのログを数分かけて確認します。

  1. Google Cloud コンソールの [ナビゲーション メニュー](ナビゲーション メニュー アイコン)を使用して[ロギング] > [ログ エクスプローラー] の順に移動します。

  2. [クエリを表示] を有効にし、デフォルトでクエリが表示される場合は、それを消去します。

  3. [リソース] プルダウン メニューを使用して [Cloud Run のリビジョン] > [hello-logging] Cloud Run サービスを選択します。選択した内容は適用しないとそのリソースで実際にフィルタされないので、忘れずに適用してください。

  4. [クエリを実行] をクリックします。

多くの場合は、成功を示す 200 のメッセージしか見当たりません。エラーはどうすれば見つけられるでしょうか?1 つは 200 のレスポンスをすべて除外し、残ったものを確認する方法です。

  1. 手順としては、ステータス コードが 200 のエントリを 1 つクリックし、[一致エントリを非表示] を選択します。

完璧な方法ではありませんが、エラーに関連付けられたログメッセージと、発生しているエラーから生成されたスタック トレースが見つかります。

  1. ログ フィールドを使用し、[重大度] が [エラー] のメッセージのみを表示するフィルタを適用します。

エラーが発生したときのレスポンスが表示されています。

  1. いずれかのエントリを開いて確認します。500 エラーが含まれているログファイルをメモしておきます。完了したら、エラーの重大度フィルタをクリアします。

  2. 開発者が最も興味を持つと思われるスタック トレースを確認するには、ログ フィールドを使用して run.googleapis.com/stderr 標準エラーログを対象とするフィルタを適用します。

例外が表示されますが、それぞれどこから開始しているのでしょうか?

  1. スタック トレースを含む stderr ログと 500 ステータス エラーを含むリクエストログの両方を確認してみましょう。

  • [クエリビルダー] をクリックして、[ログ名] を選択します。
  • Cloud Run リクエストstderr ログを両方とも選択して、それらをクエリに適用します。
  • [クエリを実行] を選択します。
注: 500 ステータス エラーが表示されるまでに 10~12 分待つ必要があります。
  1. 少し時間をかけて、表示されたログを確認します。クライアント リクエストにエラーを返しているレスポンスと、その後に stderr に送信されたスタック トレースが確認できます。

タスク 3. ログベースの指標を作成して使用する

先ほどは Cloud Run サービスのログファイルを確認し、エラーエントリを調べました。しかし、エラーに関連するとは限らないカスタム ロギングを行っているとして、それに基づくカスタム指標を作成したい場合は、どうすればよいでしょうか?ここでは、/score ルートを呼び出すようにループを変更し、得られるスコアから指標を作成します。

このタスクでは、次のことを実行します。

  • /score エンドポイントで負荷を生成する。

  • 負荷によって生成されたログを確認する。

  • コードを微調整してメッセージをより使いやすい形式にする。

  • 新しいログベースの指標を作成する。

/score エンドポイントで負荷を生成する

  1. Cloud Shell に切り替えるか、再度開きます。

  2. Ctrl+C を使用してテストループから抜けます。

  3. /score ルートを呼び出すように while ループを変更し、ループを再開します。新しいメッセージにランダムスコアが表示されていることを確認します。

while true; \ do curl -s $URL/score \ -w '\n' ;sleep .1s;done

負荷によって生成されたログを確認する

  1. Google Cloud コンソール に切り替え、[ロギング] > [ログ エクスプローラ] ページを再度開きます。

  2. 既存のクエリをすべてクリアし、[リソース] を使用して [Cloud Run のリビジョン] > [hello-logging] ログを表示します。

  3. [適用] をクリックします。

  4. [クエリを実行] を選択します。

ステータス コードが 200 のエントリはすべて、この最新のテスト実行によって生成されたものであるはずです。そうでない場合は、[現在の位置に移動] をクリックしてログビューを更新します。

  1. ステータス コードが 200 のエントリのうち、いずれかを開きます。 /score リクエストのエントリかどうかを見分けるには、どうすればよいでしょうか?ログエントリにスコアが表示されないのはなぜでしょうか?

  2. ログ フィールド エクスプローラを使用して run.googleapis.com/stdout ログを対象にフィルタを適用します。 これで、コード自体によって表示されたすべてのメッセージが確認できるはずです。このエントリのスコアを表示する指標は、なぜ作成しにくいのでしょうか?

メッセージは非構造化テキストではなく、構造化 JSON として生成した方が便利です。そうすれば、ログベースの指標に含まれるスコアだけに簡単にアクセスし、抽出できます。

  1. Cloud Shell ターミナル ウィンドウで、Ctrl+C を使用して while テストループから抜けます。

ログ形式を微調整してスコアにアクセスしやすくする

  1. Cloud Shell エディタで index.js ファイルを開き、/score ルートのコードを見つけます(90 行目辺り)。

  2. /score ルートを以下のコードに置き換えます。

//Express サーバーでビルドした基本的な Node.js アプリ app.get('/score', (req, res) => { //ランダムスコア、contaierID は各ランタイム コンテナに //固有の UUID(テストは Cloud Run で実行した)。 //funFactor は 1~100 の乱数 let score = Math.floor(Math.random() * 100) + 1; let output = { message: '/score called', score: score, containerID: containerID, funFactor: funFactor }; console.log(JSON.stringify(output)); //ブラウザに返す基本メッセージ res.send(`Your score is a ${score}. Happy?`); });

メッセージの内容が output オブジェクトのプロパティになっている点と、表示されるメッセージが文字列化された JSON オブジェクトになっている点に注目してください。

コードを変更したので、Cloud Shell でアプリケーションをローカルに開始して、エラーが発生しないことを確認します。

  1. Cloud Shell ターミナル ウィンドウで依存関係をインストールし、アプリケーションを開始します。現在地が HelloLoggingNodeJS フォルダ内になるようにします。

export GCLOUD_PROJECT=$DEVSHELL_PROJECT_ID cd ~/HelloLoggingNodeJS/ npm i npm start
  1. 「Hello world listening on port 8080 message」と表示されたら、Ctrl+C を使用してアプリケーションを停止し、次のステップに進みます。エラーが表示された場合は、それを修正してアプリケーションが開始するのを確認してから先に進みます。

  2. rebuildService.sh を再実行することにより、アプリケーションの再ビルドと再デプロイを行います。

sh rebuildService.sh
  1. アプリケーションの再ビルドと再デプロイが完了するまで待ってから、テストループを再開します。

while true; \ do curl -s $URL/score \ -w '\n' ;sleep .1s;done

スコア メッセージが再度表示されるのを確認します。

  1. ログ エクスプローラが表示されているブラウザタブに切り替え、[現在の位置に移動] をクリックして最新のログを表示します。

まだエントリには hello-logging の Cloud Run stdout ログを表示するようフィルタを適用しておく必要があります。

  1. いずれかのエントリを開いて新しい形式を調べます。

スコア ログベースの指標を作成する

  1. [指標を作成] をクリックし、以下のように各フィールドに値を設定します。
  • 指標タイプ: Distribution

  • ログ指標の名前: score_averages

  • 単位: 1

  • フィールド名: jsonPayload.score

  1. [詳細] リンクをクリックし、以下のように各フィールドに値を設定します。
  • 種類: Linear

  • 開始値: 0

  • バケット数: 20

  • バケット幅: 5

  1. [指標を作成] をクリックします。

  2. [ナビゲーション メニュー](ナビゲーション メニュー アイコン)を使用して [Monitoring > ダッシュボード] に切り替えます。場合によってはワークスペースが作成されるまで待つ必要があります。

  3. [+CREATE DASHBOARD] をクリックします。

  4. [New Dashboard Name] に「Score Fun」と入力します。

  5. [Line] グラフをクリックします。

  6. [Chart Title] を「Score Info」にします。

  7. [Resource & Metric] セクションで [Cloud Run のリビジョン] > [ログベースの指標] から [logging/user/score_averages] を選択します。

  8. [適用] をクリックします。

  9. 整列指定子はデフォルトで [50 パーセンタイル] に設定されています。そうでない場合は、[50 パーセンタイル](中央値)に設定します。

Score Fun ダッシュボード

タスク 4. アプリケーション ログを BigQuery にエクスポートする

ログを BigQuery にエクスポートすると、より長期間にわたって保存できるだけでなく、SQL と BigQuery を活用して分析を行うこともできます。このタスクでは、Cloud Run ログの BigQuery へのエクスポートを設定し、それを使用して random-error アプリケーション ルートによって生成されたエラー メッセージを見つけます。

このタスクでは、次のことを実行します。

  • BigQuery へのログのエクスポートを設定する。

BigQuery へのエクスポート シンクを設定する

  1. while ループによってアプリケーションに負荷が送信されている Cloud Shell ウィンドウに切り替え、Ctrl+C を使用してループから抜けます。

  2. random-error ルートに負荷を再度送信するよう while を変更します。ループを再実行します。

while true; \ do curl -s $URL/random-error \ -w '\n' ;sleep .1s;done
  1. Google Cloud コンソールの [ナビゲーション メニュー] を使用して [ロギング] > [ログ エクスプローラー] の順に移動します。

  2. 既存のクエリをすべて削除し、[リソース] を [Cloud Run のリビジョン] > [hello-logging] にしてクエリ フィルタリングを行います。

  3. [適用] をクリックします。

  4. 1~2 個のエントリを開いて、それらが /random-error リクエストに関連していることを確認します。

  5. [その他の操作] > [シンクの作成] でシンクを作成します。

  6. [シンク名] を「hello-logging-sink」に設定します。

  7. [次へ] をクリックします。

  8. シンクサービスを [BigQuery データセット] に設定します。

  9. [BigQuery データセット] で [新しい BigQuery データセットを作成する] を選択します。

  10. データセット IDhello_logging_logs と名付けます。

  11. [データセットを作成] をクリックします。

  12. [次へ] をクリックします。

  13. [シンクに含めるログの選択] で、[次へ] をクリックします。

  14. [シンクを作成] をクリックします。シンクを作成するときは、新しい BigQuery データセットへの書き込みに使用するサービス アカウントがどのように作成されるかに注意してください。

  15. [ナビゲーション メニュー] を使用して [BigQuery] に切り替えます。

  16. [エクスプローラ] セクションでプロジェクト ノードを展開し、hello_logging_logs データセットを展開します。

  17. requests テーブルをクリックします。

  18. クエリ ウィンドウの下にあるタブ形式のダイアログで、[プレビュー] タブをクリックしてこのログの情報を確認します。これにはリクエストに関する全般的な情報が含まれています。どのような URL が、いつ、どこからリクエストされたのかというような情報です。

  19. [スキーマ] タブをクリックし、生成されたテーブルのスキーマを少し時間をかけて調べます。resourcehttpRequest のような列にはネストや繰り返しのデータ構造が使用されている点に注意してください。

  20. stderr テーブルを選択します。 標準出力と標準エラーは通常、シンプルなログメッセージとエラーに関連するメッセージを識別する目的でアプリケーションによって使用されます。Node.js アプリケーションでは、捕捉されていない例外やエラー関連の情報が標準エラーにダンプされます。

注: stderr テーブルが表示されない場合は 5~10 分待ってください。
  1. もう一度テーブル内のデータをプレビューします。リクエスト コールスタックのさまざまな部分に影響するものとして、ランダムなエラーが表示されています。ReferenceError を含む textPayload があるエントリは、それ自体が実際のエラーです。

  2. [スキーマ] タブをクリックし、テーブルの実際の構造を調べます。やはり標準フィールド、ネストされたフィールド、繰り返しフィールドが混在しているのがわかります。

  3. クエリを作成および実行し、先頭に ReferenceError がある textPayloads のみを抽出します。

  • [クエリ] ボタンをクリックしてクエリを開始します。

  • textPayload を抽出するように SELECT を変更します。

  • where 句を追加します。

  • [project-id] は自分の GCP プロジェクトの ID、[date] はテーブル名に指定した日付に置き換えてください。

SELECT textPayload FROM `[project-id].hello_logging_logs.run_googleapis_com_stderr_[date]` WHERE textPayload LIKE 'ReferenceError%'
  1. カウントを行うために、これらのエントリをカウントするようにクエリを変更します。
  • 再度実行し、表示されている数値を確認します。

  • [project-id] は自分の GCP プロジェクトの ID、[date] はテーブル名に指定した日付に置き換えてください。

SELECT count(textPayload) FROM `[project-id].hello_logging_logs.run_googleapis_com_stderr_[date]` WHERE textPayload LIKE 'ReferenceError%'
  1. エラーの割合を確認するために、合計リクエスト数を ReferenceError% リクエスト数と比較するクエリを作成します。
  • [project-id] は自分の GCP プロジェクトの ID、[date] はテーブル名に指定した日付に置き換えてください。

  • エラーの割合は 1/1,000 程度ですか?

SELECT errors / total_requests FROM ( SELECT ( SELECT COUNT(*) FROM `[project-id].hello_logging_logs.run_googleapis_com_requests_[date]`) AS total_requests, ( SELECT COUNT(textPayload) FROM `[project-id].hello_logging_logs.run_googleapis_com_stderr_[date]` WHERE textPayload LIKE 'ReferenceError%') AS errors)

お疲れさまでした

この演習では、テスト アプリケーションを使用してログを生成し、それらのログのデータを使用してログベースの指標を作成し、ログを BigQuery にエクスポートしました。これで完了となります。

ラボを終了する

ラボが完了したら、[ラボを終了] をクリックします。ラボで使用したリソースが Google Cloud Skills Boost から削除され、アカウントの情報も消去されます。

ラボの評価を求めるダイアログが表示されたら、星の数を選択してコメントを入力し、[送信] をクリックします。

星の数は、それぞれ次の評価を表します。

  • 星 1 つ = 非常に不満
  • 星 2 つ = 不満
  • 星 3 つ = どちらともいえない
  • 星 4 つ = 満足
  • 星 5 つ = 非常に満足

フィードバックを送信しない場合は、ダイアログ ボックスを閉じてください。

フィードバックやご提案の送信、修正が必要な箇所をご報告いただく際は、[サポート] タブをご利用ください。

Copyright 2020 Google LLC All rights reserved. Google および Google のロゴは Google LLC の商標です。その他すべての企業名および商品名はそれぞれ各社の商標または登録商標です。

始める前に

  1. ラボでは、Google Cloud プロジェクトとリソースを一定の時間利用します
  2. ラボには時間制限があり、一時停止機能はありません。ラボを終了した場合は、最初からやり直す必要があります。
  3. 画面左上の [ラボを開始] をクリックして開始します

シークレット ブラウジングを使用する

  1. ラボで使用するユーザー名パスワードをコピーします
  2. プライベート モードで [コンソールを開く] をクリックします

コンソールにログインする

    ラボの認証情報を使用して
  1. ログインします。他の認証情報を使用すると、エラーが発生したり、料金が発生したりする可能性があります。
  2. 利用規約に同意し、再設定用のリソースページをスキップします
  3. ラボを終了する場合や最初からやり直す場合を除き、[ラボを終了] はクリックしないでください。クリックすると、作業内容がクリアされ、プロジェクトが削除されます

このコンテンツは現在ご利用いただけません

利用可能になりましたら、メールでお知らせいたします

ありがとうございます。

利用可能になりましたら、メールでご連絡いたします

1 回に 1 つのラボ

既存のラボをすべて終了して、このラボを開始することを確認してください

シークレット ブラウジングを使用してラボを実行する

このラボの実行には、シークレット モードまたはシークレット ブラウジング ウィンドウを使用してください。これにより、個人アカウントと受講者アカウントの競合を防ぎ、個人アカウントに追加料金が発生することを防ぎます。