Fluentd と BigQuery を使用したリアルタイム ログ分析

ログは、大規模なシステムやアプリケーションがどのように動作しているかを調べることができる強力なツールであるとされてきました。しかし、システムの規模や複雑さが増すにつれて、さまざまなインフラストラクチャ全体に分散された複数のログを管理することは、1 つの課題となっています。

Fluentd は、世界中の 2,000 社を超える企業によって採用されているオープンソースのログ収集ツールであり、多数のデータソースやシステムにまたがるログ収集を、統一的な 1 つのロギングレイヤに統合することを目的としています。後からの分析にどのデータが有効かを前もって知ることは難しいため、一般的な使用方法はすべてのログを収集して、後から全体を並べ替えることです。しかし、このデータをすべて収集して保存するのは大変な作業で、求めている答えが得られるのに時間がかかり、また難しくなります。

ここで強みを発揮するのが BigQuery です。Google が提供する完全に管理されたスケーラビリティの高いパラレルクエリ サービスで、ログの詳細な分析に極めて有効です。処理に数分から数時間を要する大規模な MapReduce のジョブとは異なり、BigQuery ではテラバイト規模のログに対するクエリを数十秒で処理できるため、システムの修復や機能向上に必要な答えをすばやく得ることができます。

デフォルトでは、1 秒あたり 10,000 行のログデータを BigQuery の各テーブルに流し込むことができます。またこの制限をリクエストによって 1 秒あたり 100,000 行にまで増やすことができます。複数の BigQuery テーブルとの間でデータ ストリームをシャーディングし、さらに Fluentd から BigQuery へのプラグインを使用すると、ログを BigQuery にリアルタイムに近い速度で、数千台のサーバーから 1 秒あたり 100 万行のペースで直接読み込むことができます。その後、ダッシュボードを作成してこのデータを容易に可視化できます。データは毎分または毎時の間隔で Google スプレッドシートで更新されます。

目標

  • Google Compute Engine のインスタンスで nginx ウェブサーバーを実行します。
  • Fluentd を使用して、このサーバーにブラウザのトラフィックのログを記録します。
  • BigQuery のウェブ UI と、Google スプレッドシートからの Google Apps Script を使用して、ログデータにクエリを実行します。
  • Google スプレッドシートのグラフを使用して、自動的に更新されるクエリの結果を可視化します。

要件

サンプルコードのクローンを作成する

使用しているコンピュータ上に GitHub レポジトリのクローンを作成するには、次のコマンドを実行します。

git clone https://github.com/GoogleCloudPlatform/bigquery-fluentd-docker-sample

データセットと BigQuery テーブルを作成する

次のコマンドを使用して、bq_test という名前のデータセットを作成します。

bq mk bq_test

ディレクトリを GitHub レポジトリのクローンを作成したディレクトリに変更します。

cd bigquery-fluentd-docker-sample

次のコマンドを実行して、BigQuery テーブルの access_log を作成します。用意されているスキーマ ファイル schema.json で定義されているデータ名とタイプを指定します。

bq mk -t bq_test.access_log ./schema.json

BigQuery ウェブ UI を開き、プロジェクト名を選択してから bq_test データセットをクリックし、access_log テーブルを選択します。指定したスキーマでテーブルが作成されていることを確認します。

Google Compute Engine のインスタンスを作成する

次のコマンドを実行して、bq-test-instance という名前の Google Compute Engine インスタンスを作成します。

gcloud compute instances create "bq-test-instance" \
  --zone "us-central1-a"  \
  --machine-type "n1-standard-1"  \
  --scopes storage-ro,bigquery \
  --image-family=cos-stable \
  --image-project=cos-cloud

Docker コンテナで nginx と Fluentd を実行する

作成したばかりの Compute Engine のインスタンスにログインします。

gcloud compute ssh bq-test-instance --zone=us-central1-a

Compute Engine のインスタンスで、次のコマンドを実行します。<YOUR_PROJECT_ID> を実際のプロジェクト ID に置き換えてください。

sudo docker run -e GCP_PROJECT="<YOUR_PROJECT_ID>" -p 80:80 -t -i -d google/fluentd-bigquery-sample

このコマンドによって、Docker イメージ google/fluentd-bigquery-sample のダウンロードが開始され、これによって nginx と Fluentd によって事前構成されていた Docker コンテナが起動および実行されます。

次に、ページビューをいくつか作成して、Fluentd から BigQuery にデータが送信されていることを確認します。

  1. VM インスタンスのリストbq-test-instance を見つけ、その EXTERNAL IP の列にあるリンクをクリックします。ダイアログで [HTTP トラフィックを許可する] を選択し、[適用] をクリックしてファイアウォールのルールを追加します。[アクティビティ] ダイアログがウィンドウの右下に表示され、「bq-test-instance」の [インスタンス タグを更新] というメッセージが表示されます。タグはファイアウォールのルールをインスタンスに関連付けるために使用します。
  2. 更新が完了した後、外部 IP のリンクをもう一度クリックして、Compute Engine のインスタンス上にある nginx サーバーにブラウザからアクセスします。ウェブページに [Welcome to nginx!] と表示されます。このページを何度か再読み込みして、ブラウザ リクエストをいくつか生成します。

BigQuery のウェブ UI を使用してクエリを実行する

BigQuery のウェブ UI を開いて [クエリを作成] をクリックし、次のクエリを実行します。

 SELECT * FROM [bq_test.access_log] LIMIT 1000

ウェブサーバーに送信したブラウザ リクエストは、access_log テーブルに記録されます。Fluentd から最初のログエントリを受け取るまでに数分かかる場合があるので注意してください。

これで作業は完了です。nginx のアクセスログ イベントが Fluentd によって収集され、BigQuery にインポートされて、ウェブ UI に表示されることを確認できました。次のセクションでは、Apache Bench ツールを使用して、より多くのトラフィックをウェブページに送り、Fluentd や BigQuery で大量のログ(デフォルトで最大 10,000 行/秒)をリアルタイムでどのように処理しているかを見ていきます。

Google スプレッドシートからクエリを実行する

BigQuery のウェブ UI からクエリを実行するほかに、Google スプレッドシートから SQL 文を BigQuery に送信することもできます。この場合は、このチュートリアルで用意したスプレッドシートのコピーを使用します。このスプレッドシートには、BigQuery クエリを実行し、結果を保存し、埋め込まれるグラフにこれらを表示する Apps Script が含まれています。このスクリプトや対応するグラフは、指定した間隔(たとえば毎分、毎時、毎日など)で自動的に更新されるよう構成できます。

Google スプレッドシートで BigQuery の API を有効にする

Google スプレッドシートから BigQuery に対して SQL 文を実行できるようにする手順は次のとおりです。

  1. BigQuery と Google スプレットシートの統合の例を開いて、[ファイル] > [コピーを作成...] の順に選択します。
  2. スプレッドシートのコピーで、[ツール] > [スクリプト エディタ...] を選択します。
  3. スクリプト エディタで bq_query.gs を開きます。これは BigQuery クエリを実行し、クエリの結果をシートに保存して、クエリの結果を可視化したグラフを生成するスクリプトです。
  4. プレースホルダのテキスト <<PUT YOUR SPREADSHEET URL HERE>> をスプレッドシートのコピーを表す URL に置き換えます。
  5. プレースホルダのテキスト <<PUT YOUR PROJECT ID HERE>> をプロジェクト ID に置き換えます。[ファイル] > [保存] を選択します。
  6. スクリプト エディタのメニューから、[リソース] > [Google の拡張サービス] を選択します。 BigQuery API が有効になっていることを確認します。
  7. [Google の拡張サービス] ダイアログ ボックスの下部にある、Google Cloud Platform Console へのリンクをクリックします。新しいプロジェクト ID を作成することを確認するメッセージが表示されます。この ID はスプレッドシートに関連付けられます。
  8. API のリストで BigQuery API を探して、そのステータスをオフからオンに切り替えます。上部にある [有効な API] のリストに BigQuery API が表示されます。
  9. コンソールを閉じて、[Google の拡張サービス] ダイアログ ボックスで [OK] をクリックします。

一般公開データセットに対してクエリを実行する

では、スプレッドシートからサンプルの BigQuery のクエリを実行してみましょう。

  1. スプレッドシートのコピーで、BQ Queries シートを開きます。ここには「gsod_temperature_LINE」という名前の BigQuery のクエリがあります。このクエリは公開されている GSOD の気候データベースから年間の気温のデータを収集します。

  2. クエリを定義するスプレッドシートの行
  3. [ダッシュボード] > [すべての BQ クエリを実行] を選択します。BigQuery を初めて実行したときには、[承認が必要] というメッセージがダイアログ ボックスに表示されます。[続行] および [承諾] をクリックします。
  4. クエリの実行が終了すると、gsod_temperature という名前の新しいシートが表示されます。このシートを開いて、クエリの結果が含まれていることを確認します。
  5. [BigQuery Results Visualization] シートを開き、このシートにクエリの結果として返された次のような気温の折れ線グラフが埋め込まれていることを確認します。

  6. 世界の平均、最低、最高気温データの折れ線グラフ

Fluentd のデータに対してクエリを実行する

上記の手順では、一般公開されているデータセットに対してサンプルクエリを実行しました。このセクションでは、Compute Engine のインスタンスに対して 1 秒ごとに行われるブラウザ リクエストを対象として、Fluentd によって収集されたデータに対してクエリを実行します。

[BQ Queries] シートを開きます。次の空の行に「access_log_LINE」という名前のクエリを作成し、間隔を 1 として、クエリセルに次のように設定します。

SELECT
  STRFTIME_UTC_USEC(time * 1000000, "%Y-%m-%d %H:%M:%S") as tstamp,
  count(*) as rps
FROM bq_test.access_log
GROUP BY tstamp ORDER BY tstamp DESC;

[ダッシュボード] > [すべての BQ クエリを実行] を選択します。クエリの結果が [access_log] という新しいシートに保存されます。[access_log] を開いて、クエリを実行したログデータを確認し、[BigQuery Results Visualization] シートを開いて対応する折れ線グラフを確認します(折れ線グラフが表示されていない場合は、[BQ Queries] シートのクエリ名の末尾が「_LINE」であることを確認してください)。Compute Engine インスタンスにブラウザからのアクセスがまだあまり多くない場合は、このグラフに十分なデータがありません。次のセクションでは、より大きなブラウザのトラフィックの読み込みをシミュレートします。

読み込みをシミュレートする

ローカルの端末を開いて次のコマンドを実行し、Apache Bench ツールを使用して nginx サーバーへのトラフィックをシミュレートします。<YOUR_EXTERNAL_IP> は使用している Compute Engine インスタンスの外部 IP に置き換えます。

ab -c 100 -n 1000000 http://<YOUR_EXTERNAL_IP>/

[ダッシュボード] > [すべての BQ クエリを実行] を再度選択します。[access_log] シートを開くと、シミュレートしたブラウザ トラフィックにおいてトラフィックの急増が起きたことがクエリの結果として示されています。この急増は [BigQuery Results Visualization] シートの折れ線グラフに表示されます。

クエリの自動実行を設定する

これらのクエリを自動的に実行し、グラフを定期的に更新するには、次のように操作してください。

  1. [ツール] > [スクリプト エディタ] に移動して、[リソース] > [現在のプロジェクトのトリガー] を選択します。まだトリガーが設定されていないことがわかります。
  2. リンクをクリックしてトリガーを追加します。
  3. [実行] メニューから [runQueries] を選択し、[イベント] に対して [時間主導型]、[分タイマー]、[1 分ごと] を選択します。[保存] をクリックします。スクリプト bq_query.gs がトリガーされて、1 分ごとに実行されます。
  4. [BigQuery Results Visualization] シートに戻ると、「access_log」のグラフが 1 分ごとに更新されます。

1 秒あたりのブラウザ リクエストの折れ線グラフ

Google スプレッドシートを使用して、Fluentd で収集されたデータセットに対して BigQuery クエリを自動的に実行し、結果をリアルタイムで可視化するための設定手順が完了しました。

次のステップ

スプレッドシートにさらにクエリを追加する場合の使用上の注意について説明します。

  • Apps Script で BigQuery の API を使用する方法の詳細については、BigQuery サービスをご覧ください。
  • [BQ Queries] シートに新しいクエリを追加する場合は、次の空白の行に追加してください。各クエリの間に空白の行を挿入しないでください。
  • スプレッドシートで新しいクエリ名でクエリを実行すると、クエリの結果がそのクエリ名をタイトルとする新しいシートに保存されます。
  • クエリ名に _AREA_BAR_COLUMN_LINE_SCATTER_TABLE のいずれかのサフィックスを追加すると、指定したタイプの新しいグラフが [BigQuery Results Visualization] シートに作成されます。
    • 積み上げグラフを作成するには、_AREA_STACKED_BAR_STACKED_COLUMN_STACKED というサフィックスを使用します。
  • スプレッドシートには、BAR および COLUMN のタイプの場合はクエリの結果行が最大で 5 行、他のタイプの場合は最大で 100 行保存できます。クエリの最後に LIMIT 句を追加する(例: LIMIT 20)と、返される結果行の数を明示的に制限できます。
  • 時系列のグラフを描画するには、クエリの最初のフィールドをタイムスタンプか日付の値に設定します。

BigQuery へのデータのストリーミングについての詳細は、以下をご覧ください。

クリーンアップ

  1. ローカルの端末で Ctrl+C コマンドを実行して、Apache Bench を無効にします。

  2. bq_query.gs スクリプトの自動実行を無効にするには、スクリプト エディタから [リソース] > [現在のプロジェクトのトリガー] の順に選択し、「runQueries」 トリガーを削除します。

  3. データセットを削除します。BigQuery のウェブ UI で、プロジェクト名の下にある「bq_test」データセットにマウスを合わせ、プルダウン メニューから [データセットの削除] を選択します。

  4. Google Compute Engine のインスタンスを削除します。

    gcloud compute instances delete bq-test-instance --zone=us-central1-a
    
このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...