BigQuery Monitoring の概要

モニタリングとロギングは、クラウドで信頼性の高いアプリケーションを実行するために不可欠です。ワークロードが大きい場合やミッション クリティカルな場合、BigQuery ワークロードも例外ではありません。このドキュメントでは、BigQuery で使用できるモニタリング データの概要を説明します。

モニタリングとロギングのソースは、サンプリングや集計を行う頻度によって異なる場合があります。たとえば、情報スキーマデータは、Cloud Monitoring の指標データよりも粒度の細かいものになります。

その結果、比較的粒度の粗い指標のグラフは、同等の情報スキーマ統計情報とは異なっているように見える場合があります。集計すると、そうした差異を軽減できます。モニタリング ソリューションを設計する場合、要件に照らして、指標のリクエスト レスポンス時間、精度、確度を評価します。

指標

指標は定期的に収集され、分析に利用できる数値です。指標を使って次のことができます。

  • グラフとダッシュボードを作成する。
  • 人間による介入を必要とする状態や状況に応じたアラートをトリガーする。
  • 過去のパフォーマンスを分析する。

BigQuery の場合、利用可能な指標には、実行中のジョブの数、クエリ中にスキャンされたバイト数、クエリ時間の分布などがあります。クエリの指標は、クエリが成功した場合にのみ利用可能になり、報告されるまでに最大 7 分かかる場合があります。失敗したクエリの指標は報告されません。サンプルレート、可視性、制限を含む使用可能な指標の完全なリストについては、Google Cloud の指標bigquery をご覧ください。

Cloud Monitoring を使用して、BigQuery の指標を表示し、グラフとアラートを作成します。各指標には、bigquery_datasetbigquery_projectglobal のいずれかのリソースタイプと一連のラベルがあります。この情報を基に、Monitoring Query Language(MQL)でクエリを作成します。ラベルを使用して、各指標をグループ化またはフィルタリングできます。

たとえば、処理中のインタラクティブなクエリの数をグラフ化するには、次の MQL ステートメントを使用します。このステートメントでは、interactive と等しい priority でフィルタリングを行います。

fetch global
| metric 'bigquery.googleapis.com/query/count'
| filter metric.priority = 'interactive'

次の例では、処理中の読み込みジョブの数を 10 分間隔でグループ化して取得します。

fetch bigquery_project
| metric 'bigquery.googleapis.com/job/num_in_flight'
| filter metric.job_type = 'load'
| group_by 10m

詳細については、BigQuery のグラフとアラートの作成をご覧ください。

ログ

ログは、特定のイベントまたはアクションに応じて生成されるテキスト レコードです。BigQuery は、テーブルの作成や削除、スロットの購入、読み込みジョブの実行などのアクションのログエントリを作成します。Google Cloud でのロギングの詳細については、Cloud Logging をご覧ください。

ログは、ログエントリの追記専用のコレクションです。たとえば、独自のログエントリを projects/PROJECT_ID/logs/my-test-log という名前のログに書き込むことができます。BigQuery を含む多くの Google Cloud サービスは、監査ログと呼ばれるログの種類を作成します。ログには次の情報が記録されます。

  • リソースの作成や変更などの管理アクティビティ。
  • リソースからのユーザー提供データの読み取りなどのデータアクセス。
  • ユーザーの操作ではなく、Google システムによって生成されたシステム イベント。

監査ログは構造化 JSON 形式で書き込まれます。Google Cloud ログエントリの基本データ型は LogEntry 構造です。この構造には、ログの名前、ログエントリを生成したリソース、タイムスタンプ(UTC)、その他の基本情報が含まれています。

ログに記録されたイベントの詳細は、ペイロード フィールドと呼ばれるサブフィールドに含まれています。監査ログの場合、ペイロード フィールドは protoPayload という名前になります。このフィールドの値は AuditLog 構造で、type.googleapis.com/google.cloud.audit.AuditLog に設定された、protoPayload.@type フィールドの値で示されます。

BigQuery は現在、データセット、テーブル、ジョブのオペレーション用に監査ログを 2 つの異なる形式で書き込みますが、どちらも AuditLog ベースタイプを共有します。

以前の形式:

  • resource.type フィールドは bigquery_resource です。
  • オペレーションの詳細は、protoPayload.serviceData フィールドに書き込まれます。このフィールドの値は AuditData 構造です。

新しい形式:

  • resource.type フィールドは bigquery_project または bigquery_dataset のいずれかです。bigquery_project リソースにはジョブに関するログエントリがありますが、bigquery_dataset リソースにはストレージに関するログエントリがあります。
  • オペレーションの詳細は、protoPayload.metadata フィールドに書き込まれます。このフィールドの値は BigQueryAuditMetadata 構造です。

新しい形式のログを使用することをおすすめします。詳細については、監査ログ移行ガイドをご覧ください。

次に、失敗したオペレーションを示すログエントリの簡単な例を示します。

{
  "protoPayload": {
    "@type": "type.googleapis.com/google.cloud.audit.AuditLog",
    "status": {
      "code": 5,
      "message": "Not found: Dataset my-project:my-dataset was not found in location US"
    },
    "authenticationInfo": { ... },
    "requestMetadata":  { ... },
    "serviceName": "bigquery.googleapis.com",
    "methodName": "google.cloud.bigquery.v2.JobService.InsertJob",
    "metadata": {
  },
  "resource": {
    "type": "bigquery_project",
    "labels": { .. },
  },
  "severity": "ERROR",
  "logName": "projects/my-project/logs/cloudaudit.googleapis.com%2Fdata_access",
  ...
}

BigQuery Reservations のオペレーションでは、protoPayloadAuditLog 構造であり、protoPayload.request フィールドと protoPayload.response フィールドに詳細情報が含まれています。フィールドの定義は BigQuery Reservation API で確認できます。詳細については、BigQuery Reservations のモニタリングをご覧ください。

INFORMATION_SCHEMA ビュー

INFORMATION_SCHEMA ビューは BigQuery のインサイトの別のソースで、指標やログと組み合わせて使用できます。

このビューには、ジョブ、データセット、テーブル、その他の BigQuery エンティティに関するメタデータが含まれます。たとえば、特定の期間に実行された BigQuery ジョブに関するリアルタイムのメタデータを取得し、取得した結果をプロジェクト、ユーザー、参照するテーブル、その他のディメンションでグループ化またはフィルタリングできます。

この情報を基に、BigQuery ワークロードをより細かく分析することで、次のような質問に答えることができます。

  • 特定のプロジェクトの過去 7 日間のすべてのクエリの平均スロット使用率
  • 特定のプロジェクトでバッチ読み込みジョブを送信したユーザー
  • 過去 30 分間に発生したストリーミング エラーを、エラーコード別にグループ化したもの

BigQuery ワークロードのパフォーマンスを分析する場合は、特にジョブ メタデータストリーミング メタデータ予約メタデータをご覧ください。

組織のスロットと予約の使用状況、ジョブの実行、ジョブエラーを示す GitHub のサンプル INFORMATION_SCHEMA クエリを検索できます。たとえば、次のクエリでは、保留中または現在実行中のクエリのリストが提供されます。これらのクエリは、us リージョンで作成されてからの経過時間順になっています。

SELECT
    creation_time,
    project_id,
    user_email,
    job_id,
    job_type,
    priority,
    state,
    TIMESTAMP_DIFF(CURRENT_TIMESTAMP(), start_time,second) as running_time_sec
 FROM
   `region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
 WHERE
    creation_time BETWEEN TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 DAY) AND CURRENT_TIMESTAMP()
    AND state != "DONE"
ORDER BY
    running_time_sec DESC

詳細については、BigQuery のパフォーマンスを各種ダッシュボードでトラブルシューティングをご覧ください。

スロット予約がある場合、独自のクエリを作成するだけでなく、BigQuery 管理リソースグラフを使用して、スロットの使用状況、ジョブの同時実行、ジョブの実行時間をグラフで確認できます。詳細については、BigQuery 管理リソースグラフの概要プレビュー)をご覧ください。

次のステップ