Log Analytics 構成のトラブルシューティング

このドキュメントでは、Google Cloud コンソールの [Log Analytics] ページを使用するときに発生する可能性のあるエラーを解決する方法について説明します。

エラー メッセージ

このセクションでは、表示される可能性があるエラー メッセージと、対応するエラー状態を解決する方法について説明します。

No completion signal within allotted timeframe エラー メッセージ

SQL クエリを入力し、[クエリを実行] を選択します。クエリが完了せず、次のエラー メッセージが表示されます。

The query failed to execute and return results due to error: No completion signal within allotted timeframe.

このエラーを解決するには、以下のいずれかを行います。

  • ログがクエリされる期間を短くしてから、クエリを再試行します。 たとえば、クエリ間隔が 14 日の場合は、間隔を 7 日に短縮してからクエリを実行します。

  • リンクされた BigQuery データセットを作成し、BigQuery インターフェースからクエリを実行します。BigQuery インターフェースは、Cloud Logging インターフェースよりも長い実行時間を必要とするクエリをサポートしています。詳細については、リンクされた BigQuery データセットをクエリするをご覧ください。

異なる CMEK キーを持つバケットに対するクエリのエラー メッセージ

複数のログバケットに対してクエリを実行する SQL クエリを入力し、[クエリを実行] を選択します。クエリが完了せず、次のエラー メッセージが表示されます。

Queries against buckets with distinct CMEK keys must have a key configured in the LogSettings.

この状況を解決するには、以下のいずれかを行います。

  • 同じ Cloud Key Management Service(Cloud KMS)鍵を使用するようにログバケットを構成します。
  • ログバケットが同じロケーションにある場合は、デフォルトの Cloud KMS 鍵を使用して、ログバケットの親リソースであるフォルダまたは組織を構成できます。親のデフォルト キーは、ログバケットと同じロケーションに配置する必要があります。この構成では、親のデフォルト キーによって、ログ分析クエリによって生成された一時データが暗号化されます。詳細については、ログ分析の概要をご覧ください。

FROM 句にはビューエラー メッセージを 1 つだけ含める必要がある

Google Cloud コンソールの [Log Analytics] ページのクエリペインに SQL クエリを入力しますが、SQL パーサーは次のエラーを表示します。

FROM clause must contain exactly one log view

上記のエラーは、FROM ステートメントで指定されたテーブルを特定のログビューに対して解決できない場合に報告されます。

このエラーを解決するには、テーブル名の構文が正しいことを確認します。

  • テーブル名がログ分析の命名規則で必要な構文に従っていることを確認します。BigQuery とログ分析では、テーブル名の要件が異なります。テーブル名に必要な構文は、デフォルト クエリを表示することで確認できます。

  • ログバケットの Google Cloud プロジェクト ID、リージョン、バケット ID、またはビュー ID にピリオド((.))が含まれている場合は、各フィールドが単一バッククォート((`))で囲まれていることを確認します。

    たとえば、Google Cloud プロジェクト ID が example.com:bluebird の場合、_Default ログバケットの _AllLogs ビューをクエリするには、次の構文を使用してテーブルを指定します。

    
    SELECT *
    FROM `example.com:bluebird`.`global`.`_Default`.`_AllLogs`
    

    上のクエリは、_Default バケットが global リージョンにあることを前提としています。

クエリを保存できない

SQL クエリを入力して実行し、 [保存] が無効になっている場合は、組織またはフォルダのデフォルトのリソース設定により、組織のポリシー許可されていないロケーションが定義されます。この問題を解決するには、組織のポリシーで許可されているロケーションと一致するロケーションをデフォルトのリソース設定で定義するよう、組織の管理者に依頼してください。詳しくは、組織とフォルダのデフォルト設定を構成するをご覧ください。

[保存] ボタンが有効になっているが、ダイアログを完了してクエリを保存できない場合は、次の手順を行います。

  1. クエリに構文エラーが含まれていないことを確認します。 保存できるのは有効なクエリのみです。
  2. 省略可: クエリをクリップボードにコピーします。
  3. ページを再読み込みします。
  4. クエリをクリップボードにコピーした場合は、クエリを [クエリ] ペインに貼り付け、クエリを実行してから保存を行います。

[Log Analytics] ページへのアクセスが拒否された

Google Cloud コンソールで [Log Analytics] ページを開くと、権限拒否のエラー メッセージが表示されます。

[ログ分析] ページの読み込み、クエリの実行およびログの表示に必要な権限を取得するには、プロジェクトに対する次の IAM ロールの付与を管理者に依頼してください。

必要な権限は、カスタムロールや Logging の事前定義ロールから取得することもできます。

[ログ分析] ページでログエントリを表示してクエリを実行するために必要な権限は、[ログ エクスプローラ] ページでログを表示するために必要な権限と同じです。ユーザー定義バケットに対するビューのクエリ実行、または _Default ログバケットの _AllLogs ビューのクエリ実行のために必要な追加のロールについて詳しくは、Cloud Logging のロールをご覧ください。

Log Analytics を使用するためのログバケットのアップグレードが失敗する

ログバケットを作成して、Log Analytics を使用するオプションを選択するか、既存のログバケットをアップグレードして、Log Analytics を使用します。次のようなエラー状態でアップグレードに失敗します。

Failed precondition (HTTP 400): Constraint "my-constraint" violated for PROJECT_ID  with location global.

上記のエラー メッセージは、使用可能なリージョンを制限する組織のポリシーが組織によって構成されていることを示しています。Log Analytics を使用するようにアップグレードできるログバケットは、global リージョンを使用する必要があります。global リージョンの使用を制限する組織のポリシーを削除できる場合は、ログバケットをアップグレードできます。そうでなければ、ログバケットをアップグレードできません。

リンクされた BigQuery データセットの作成に失敗する

ログバケットを編集してリンクされた BigQuery データセットを作成するか、新しいログバケットを作成して、リンクされたデータセットを作成するオプションを選択しますが、リンクされたデータセットが作成されません。

このエラーを解決するには、次の権限を含む IAM ロールの付与を Google Cloud プロジェクトのシステム管理者に依頼してください。

  • logging.links.create

上記の権限は、Logging 管理者(roles/logging.admin)のロールとログ構成書き込み(roles/logging.configWriter)のロールに含まれています。

ロールと権限の詳細については、IAM によるアクセス制御をご覧ください。

リンクされた BigQuery データセットの削除に失敗する

リンクされたデータセットは不要になりましたが、そのデータセットを削除するオプションが無効になっています。

このエラーを解決するには、次の権限を含む IAM ロールの付与を Google Cloud プロジェクトのシステム管理者に依頼してください。

  • logging.links.delete

上記の権限は、Logging 管理者(roles/logging.admin)のロールとログ構成書き込み(roles/logging.configWriter)のロールに含まれています。

この権限があると、Google Cloud コンソールの [ログストレージ] ページからリンクされたデータセットを削除できます。ロールと権限の詳細については、IAM を使用したアクセス制御をご覧ください。

クエリエンジンの設定ボタンが表示されない

[クエリを実行] ボタンの横に [設定] ボタンが表示されない場合、Google Cloud プロジェクトで予約済みの BigQuery スロットが有効になっていません。 [設定] ボタンを有効にするには、プロジェクトに予約済み BigQuery スロットを構成します。

BigQuery で実行 ボタンが無効になっている

[BigQuery で実行] ボタンが表示されているが無効になっている場合、クエリで参照されているログビューにリンクされたデータセットがありません。BigQuery スロット予約でクエリを実行するには、ログビューにリンクされた BigQuery データセットを作成します。

モニタリング サービス アカウントがない

SQL クエリの結果をモニタリングするアラート ポリシーを作成します。設定手順では、Monitoring サービス アカウントに IAM ロールを付与する必要がありますが、そのアカウントは存在しません。

Monitoring サービス アカウント は、Google Cloud によって作成および管理されるため、サービス エージェントと呼ばれます。アカウントを必要とするリソースまたはサービスを構成すると、アカウントが自動的に作成されます。たとえば、Pub/Sub 通知チャンネルを作成すると、そのアクションによって Monitoring サービス アカウントが作成される場合があります。作成フローに応じて、モニタリング サービス アカウントにプロジェクトに対するモニタリング サービス エージェント(monitoring.NotificationServiceAgent)ロールが付与される場合があります。アカウントに付与されたロールを変更できます。

Monitoring サービス アカウントが存在しない場合は、SQL クエリの結果をモニタリングするアラート ポリシーを作成するために、次の操作を行う必要があります。

  1. サービス エージェントを手動で作成します。この手順については、ロールを作成してサービス エージェントに付与するをご覧ください。

  2. サービス エージェントに必要なロールを付与します。 これらのロールの詳細については、SQL クエリ結果をモニタリングする: 始める前にをご覧ください。

ログ分析の結果に重複するログエントリがある

重複するエントリをカウントまたはレポートするクエリを実行します。ログ エクスプローラは、ログ名、タイムスタンプ、挿入 ID に基づいて重複エントリを削除するため、Log Analytics はクエリの実行前にログエントリの重複を除去することが期待されます。

ログ分析では、ログ エクスプローラで実行されるタイプの重複除去は実行されません。

重複するログエントリを解決するには、次の操作を行います。

  1. 重複するログエントリの受信タイムスタンプ値が異なるかどうかを確認します。タイムスタンプが異なる場合、同じデータが Logging に複数回書き込まれたことを示します。

    重複する書き込みを解決するには、ログ記録の統合でエラー メッセージや構成ミスがないか調査します。

  2. バケットが Cloud Key Management Service 鍵を使用するように構成されている場合は、割り当て内にあり、キーに常にアクセス可能であることを確認します。割り当てを超えた場合や、キーへのアクセス権が失われた場合、ログエントリが重複する可能性があります。

    これらのエラーを解決するには、割り当てを超えていないこと、キーにアクセスできることを確認します。

  3. 重複するログエントリを削除するようにクエリを変更します。

    たとえば、JSON ペイロードに fieldAfieldB が含まれているとします。前者は文字列で、後者は数値です。また、JSON ペイロードに server というラベルのフィールドがあり、文字列が含まれているとします。次に、次のクエリについて考えてみましょう。

    SELECT
      JSON_VALUE(json_payload.fieldA) AS fieldA
      SUM(IFNULL(SAFE_CAST(JSON_VALUE(json_payload.fieldB) AS INT64), 0)) AS sum_fieldB
    FROM
      `TABLE_NAME_OF_LOG_VIEW`
    WHERE
      JSON_VALUE(json_payload.server) = "test"
    GROUP BY
      fieldA;
    

    重複するログエントリを削除するようにクエリを変更できます。この場合、ログ名、タイムスタンプ、挿入 ID が調べられ、ログエントリが重複かどうかが判断されます。

    WITH
      deduplicated AS (
      SELECT
        JSON_VALUE(json_payload.fieldA) AS fieldA
        IFNULL(SAFE_CAST(JSON_VALUE(json_payload.fieldB) AS INT64), 0) AS fieldB
      FROM
        `TABLE_NAME_OF_LOG_VIEW` a
      WHERE
        JSON_VALUE(json_payload.server) = "test"
      QUALIFY
        ROW_NUMBER() OVER (PARTITION BY a.log_name, a.timestamp, a.insert_id ) = 1 )
    
    SELECT
      fieldA,
      SUM(fieldB) AS sum_fieldB
    FROM
      deduplicated
    GROUP BY
      fieldA;