Gemini for Google Cloud のログを確認する

このドキュメントでは、次のような Gemini for Google Cloud アクティビティの収集と保存を有効にする方法について説明します。

  • Gemini for Google Cloud プロンプトと回答のログ(ユーザー入力、コンテキスト情報、回答など)。
  • Gemini for Google Cloud テレメトリー メタデータやユーザーが承認したコード行などのメタデータログ。

Gemini Code Assist の指標を生成する必要がある場合は、Gemini for Google Cloud の使用状況をモニタリングするをご覧ください。

Gemini for Google Cloud は、ユーザーが Gemini for Google Cloudで行った他のユーザー インタラクション(フィードバックなどを含む)を収集または Cloud Logging に送信しません。収集されたデータは、保存のために Cloud Logging に送信されます。このデータを確認するには、リソースタイプが cloudaicompanion.googleapis.com/Instance のログエントリを検索します。

この機能では、Vertex AI の Gemini 内のプロンプトや回答はログに記録されません。Vertex AI で Gemini のログを有効にするには、データアクセス監査ログを有効にするをご覧ください。

Identity and Access Management(IAM)のロールは、プリンシパルがログにアクセスする機能を制御します。プリンシパルに事前定義ロールを付与することも、カスタムロールを作成することもできます。必要な権限の詳細については、アクセス制御をご覧ください。

Cloud Logging では、お客様のコンテンツを保存時に暗号化するのがデフォルトの動作です。Logging によってログバケットに保存されたデータは、暗号鍵を使用して暗号化されます。これはエンベロープ暗号化と呼ばれるプロセスです。ロギングデータにアクセスするには、これらの鍵暗号鍵にアクセスする必要があります。この鍵は Google がお客様の代わりに管理します。

お客様の組織には、デフォルトの保存時の暗号化で提供されない規制、コンプライアンス関連の暗号化、高度な暗号化要件がある場合があります。組織の要件を満たすため、データを保護する暗号鍵を Google が管理するのではなく、お客様が鍵を管理できます。

顧客管理の暗号鍵(CMEK)の使用状況に関する具体的な情報(利点や制限など)については、顧客管理の暗号鍵をご覧ください。

制限事項

Gemini for Google Cloud のログデータの記録は、IDE 内での Gemini Code Assist に対するユーザー インタラクションに限定されます。

始める前に

Gemini for Google Cloud のユーザーログとメタデータログを表示する

Gemini for Google Cloud のユーザーログとメタデータログを表示するには、次のいずれかを行います。

コンソール

  1. Google Cloud コンソールで [ログ エクスプローラ] ページに移動します。

    [ログ エクスプローラ] に移動

    検索バーを使用してこのページを検索する場合は、小見出しが「Logging」の結果を選択します。

  2. ツールバーで、 Google Cloud コンソールのプロジェクトを選択します。
  3. ツールバーで [すべてのリソース] メニューを開き、リソースで [Cloud AI Companion インスタンス] を選択します。

gcloud

次のコマンドを実行します。

gcloud logging read "resource.type=cloudaicompanion.googleapis.com/Instance" --project PROJECT_ID  --limit 3

PROJECT_ID は、Gemini for Google Cloud のログを表示するプロジェクトの ID に置き換えます。

API

  1. 次の情報が含まれる JSON ファイルを作成します。

      {
        "resourceNames": [
          "projects/PROJECT_ID"
        ],
        "pageSize": 5,
        "filter": "resource.type: cloudaicompanion.googleapis.com/Instance"
      }
    

    PROJECT_ID は、Gemini for Google Cloud のログを表示するプロジェクトの ID に置き換えます。

  2. 認証トークンを取得します。

    TOKEN=$(gcloud auth print-access-token)
    
  3. cURL を使用して entries.list メソッドを呼び出します。

    curl -X POST --data-binary @JSON_FILE_NAME \
      -H "Authorization: Bearer $TOKEN" \
      -H "Content-Type: application/json" \
      "https://logging.googleapis.com/v2/entries:list"

    JSON_FILE_NAME は、前の手順で作成した JSON ファイルのパスに置き換えます。

    認証の詳細については、REST を使用して認証するをご覧ください。

    レスポンスは、ログエントリのセットを返します。

Gemini for Google Cloud のログ

LogEntry は、Cloud Logging のデータの基本単位です。以降のセクションでは、Gemini for Google Cloud プラットフォーム イベントの LogEntry に含まれるフィールド(ユーザー リクエストGemini for Google Cloud の回答など)の一覧を示します。

ユーザー リクエスト

次の表に、ユーザー リクエスト ログエントリに含まれるフィールドのリストを示します。

フィールド 値とメモ
LogEntry.resource.type Gemini for Google Cloud リソースタイプ: cloudaicompanion.googleapis.com/Instance
LogEntry.resource.labels.resource_container Gemini for Google Cloud が使用されたリソース コンテナの一意の ID。
LogEntry.resource.labels.location Gemini for Google Cloud が使用されたロケーション。
LogEntry.resource.labels.instance_id Gemini for Google Cloud が使用されたリソースの一意の ID。
LogEntry.labels.method logEntry を呼び出した内容に応じて、次のいずれかになります。

CompleteTask: Gemini Code Assist またはその他の Gemini for Google Cloud サービスからのチャット リクエストなど。

GenerateCode: コード生成リクエスト(Gemini Code Assist 内のコード変換リクエストなど)。

CompleteCode: IDE での作業中にコードを補完するリクエスト(Gemini Code Assist 内のインライン候補など)。
LogEntry.labels.product Gemini for Google Cloud のサービス名。Gemini for Google Cloud プロダクトが Gemini Code Assist の場合、この値は code_assist です。Gemini for Google Cloud プロダクトが Gemini Cloud Assist の場合、この値は cloud_assist です。そうでない場合、この値は unknown です。
LogEntry.labels.request_id リクエストを回答のログエントリに関連付けるための固有識別子。
LogEntry.labels.user_id このリクエストを開始したユーザーの ID。
LogEntry.jsonPayload ログエントリのペイロード。
LogEntry.logName ログを識別します。

次のサンプルは、チャット プロンプト イベントのログエントリの例を示しています。

{
  "insertId": "654581e30003b19e340bbd96",
  "resource": {
    "type": "cloudaicompanion.googleapis.com/Instance",
    "labels": {
        instance_id: "default"
        location: "global"
        resource_container: "my-project-id"
     }
  },
  "timestamp": "2023-11-03T23:27:31.242078Z",
  "labels": {
    "product": "code_assist",
    "request_id": "4ea1e265-ea5d-4d11-b3c8-39bad9c96326"
    "user_id": "user@company.com"
  },
  "jsonPayload" : {
    @type: "type.googleapis.com/google.cloud.cloudaicompanion.logging.v1.RequestLog"
    "taskCompletionRequest":
      input: {
        messages: [{
          author: "USER"
          content: "What are some best practices to save cost on my Google Cloud bill?"
        }]
        preamble: ""
      }
  }
  "logName": "projects/my-project-id/logs/cloudaicompanion.googleapis.com%2Frequest",
  "receiveTimestamp": "2023-11-03T23:27:31.255648319Z"
  "severity": "INFO"
}

次のサンプルは、自動インライン コード候補のプロンプトと、コードファイル内の Gemini for Google Cloud プロンプトRequestLog エントリの例を示しています。

インライン コード候補のプロンプト データでは codeCompletionRequest オブジェクトが使用されますが(次の例を参照)、手動で生成をトリガーした場合は codeGenerationRequest が使用されます。

{
  "insertId": "654581e30003b19e340bbd96",
  "resource": {
    "type": "cloudaicompanion.googleapis.com/Instance",
    "labels": {
        instance_id: "default"
        location: "global"
        resource_container: "my-project-id"
     }
  },
  "timestamp": "2023-11-03T23:27:31.242078Z",
  "labels": {
    "product": "code_assist",
    "request_id": "4ea1e265-ea5d-4d11-b3c8-39bad9c96326"
    "user_id": "user@company.com"
  },
  "jsonPayload" : {
    @type: "type.googleapis.com/google.cloud.cloudaicompanion.logging.v1.RequestLog"
    "codeCompletionRequest": {
      "input_data_context": {
        "additional_context": {
          "files": [
            {
              "language": "go",
              "path": "{/path/to/../current-file.go",
              "segments": [
                {
                  "content": "...Prefix Text..."
                },
                {
                  "content": "...Suffix Text..."
                }
              ],
              "state": ["EDITED"]
            },
            {
              "language": "go",
              "path": "/path/to/../recent-file.go",
              "segments": [
                {
                  "content": "...File Text..."
                }
              ],
              "state": ["RECENTLY_OPENED"]
            }
          ]
        }
      }
    }
  }
  "logName": "projects/my-project-id/logs/cloudaicompanion.googleapis.com%2Frequest",
  "receiveTimestamp": "2023-11-03T23:27:31.255648319Z"
  "severity": "INFO"
}

エージェント インタラクション ログ

Gemini とのやり取りによっては、1 つのユーザー アクションに対して複数のログエントリ(リクエスト、レスポンス、メタデータ)が生成されることがあります。このようなインタラクションの例を次に示します。

  • エージェントが、ツールの使用を伴うタスクを実行する場合(たとえば、以下のログの例に示すように、モデルが read_filereplace などの内部関数を呼び出す場合)。
  • エージェントが他のエージェントとやり取りする場合。
リクエスト ログエントリ

次のサンプルは、エージェントとのやり取りを開始するリクエストのログエントリの例を示しています。

{
  "insertId": "qe9xxub2r",
  "jsonPayload": {
    "taskCompletionRequest": {
      "input": {
        "messages": [
          {
            "author": "USER",
            "content": "hi can you add one test here\nCurrent File Path:\n```cpp\n/usr/local/google/home/pdec/test.cpp\n```\n\n"
          }
        ],
        "preamble": ""
      }
    },
    "@type": "type.googleapis.com/google.cloud.cloudaicompanion.logging.v1.RequestLog"
  },
  "resource": {
    "type": "cloudaicompanion.googleapis.com/Instance",
    "labels": {
      "resource_container": "my-project-id",
      "instance_id": "default",
      "location": "global"
    }
  },
  "timestamp": "2025-10-08T10:09:52.225165428Z",
  "severity": "INFO",
  "labels": {
    "request_id": "e60facb1485b17b7",
    "client_version": "unknown",
    "product": "code_assist",
    "method": "CompleteTask",
    "user_id": "user@company.com",
    "client_name": "cloudcode_cli"
  },
  "logName": "projects/my-project-id/logs/cloudaicompanion.googleapis.com%2Frequest",
  "receiveTimestamp": "2025-10-08T10:09:52.581787548Z"
}
レスポンス ログエントリ

次のサンプルは、複数のメッセージを含むエージェントとのやり取りのレスポンス ログエントリの例を示しています。

{
  "insertId": "qe9xxub2t",
  "jsonPayload": {
    "@type": "type.googleapis.com/google.cloud.cloudaicompanion.logging.v1.ResponseLog",
    "taskCompletionResponse": {
      "output": {
        "messages": [
          {
            "content": "**Reading File Contents**\n\nI'm currently focused on reading the contents of `/usr/local/google/home/pdec/test.cpp`. This will inform what kind of test needs to be written and how it should be structured.\n\n\n",
            "author": "MODEL"
          },
          {
            "author": "MODEL",
            "content": "**File Inspection Begins**\n\nI've initiated the process of reading the test file. My immediate goal is to grasp its existing structure and identify the testing framework, if one exists. This will directly influence the design of the new test case I'll be adding.\n\n\n"
          },
          {
            "author": "MODEL",
            "content": "Of course. What is the test about? I'll read the file to understand the context."
          },
          {
            "content": "read_file({\"absolute_path\":\"/usr/local/google/home/pdec/test.cpp\"})",
            "author": "MODEL"
          }
        ]
      }
    }
  },
  "resource": {
    "type": "cloudaicompanion.googleapis.com/Instance",
    "labels": {
      "resource_container": "my-project-id",
      "instance_id": "default",
      "location": "global"
    }
  },
  "timestamp": "2025-10-08T10:09:52.227354297Z",
  "severity": "INFO",
  "labels": {
    "product": "code_assist",
    "request_id": "e60facb1485b17b7",
    "user_id": "user@company.com",
    "client_version": "unknown",
    "method": "CompleteTask",
    "client_name": "cloudcode_cli"
  },
  "logName": "projects/my-project-id/logs/cloudaicompanion.googleapis.com%2Fresponse",
  "receiveTimestamp": "2025-10-08T10:09:52.581787548Z"
}
メタデータ ログエントリ

次のサンプルは、エージェントとのやり取りのメタデータ ログエントリの例を示しています。

{
  "insertId": "qe9xxub2s",
  "jsonPayload": {
    "apiRequest": {},
    "clientName": "cloudcode_cli",
    "requestId": "e60facb1485b17b7",
    "@type": "type.googleapis.com/google.cloud.cloudaicompanion.logging.v1.MetadataLog",
    "clientVersion": "unknown"
  },
  "resource": {
    "type": "cloudaicompanion.googleapis.com/Instance",
    "labels": {
      "location": "global",
      "instance_id": "default",
      "resource_container": "my-project-id"
    }
  },
  "timestamp": "2025-10-08T10:09:52.226420727Z",
  "severity": "INFO",
  "labels": {
    "method": "CompleteTask",
    "product": "code_assist",
    "user_id": "user@company.com"
  },
  "logName": "projects/my-project-id/logs/cloudaicompanion.googleapis.com%2Fmetadata",
  "receiveTimestamp": "2025-10-08T10:09:52.581787548Z"
}

以下のサンプルは、エージェントとのやり取りの別のログエントリの例(リクエスト ID 4b66a582bad9cf2c)を示しています。

リクエスト ログエントリ

{
  "insertId": "4qvt8nb2k",
  "jsonPayload": {
    "taskCompletionRequest": {
      "input": {
        "messages": [
          {
            "author": "USER",
            "content": "FunctionResponse{name: read_file, response: {\"output\":\"#include <iostream>\\n\\n// Function to calculate the greatest common divisor (GCD) of two numbers.\\nint gcd(int a, int b) {\\n    if (b == 0) {\\n        return a;\\n    }\\n    return gcd(b, a % b);\\n}\\n\\n// Function to calculate the least common multiple (LCM) of two numbers.\\nint lcm(int a, int b) {\\n    return (a * b) / gcd(a, b);\\n}\\n\\n// Function to check if a number is prime.\\nint is_prime(int a) {\\n    if (a < 2) {\\n        return 0;\\n    }\\n    for (int i = 2; i * i <= a; ++i) {\\n        if (a % i == 0) {\\n            return 0;\\n        }\\n    }\\n    return 1;\\n}\\n\\n// Function for extended Euclidean algorithm.\\nint extended_gcd(int a, int b, int &x, int &y) {\\n    if (b == 0) {\\n        x = 1;\\n        y = 0;\\n        return a;\\n    }\\n    int x1, y1;\\n    int d = extended_gcd(b, a % b, x1, y1);\\n    x = y1;\\n    y = x1 - (a / b) * y1;\\n    return d;\\n}\\n\\n// Test function\\nvoid run_tests() {\\n    // Test gcd\\n    if (gcd(10, 15) == 5) {\\n        std::cout << \\\"gcd(10, 15) passed\\\" << std::endl;\\n    } else {\\n        std::cout << \\\"gcd(10, 15) failed\\\" << std::endl;\\n    }\\n\\n    // Test lcm\\n    if (lcm(10, 15) == 30) {\\n        std::cout << \\\"lcm(10, 15) passed\\\" << std::endl;\\n    } else {\\n        std::cout << \\\"lcm(10, 15) failed\\\" << std::endl;\\n    }\\n\\n    // Test is_prime\\n    if (is_prime(7) == 1) {\\n        std::cout << \\\"is_prime(7) passed\\\" << std::endl;\\n    } else {\\n        std::cout << \\\"is_prime(7) failed\\\" << std::endl;\\n    }\\n    if (is_prime(10) == 0) {\\n        std::cout << \\\"is_prime(10) passed\\\" << std::endl;\\n    } else {\\n        std::cout << \\\"is_prime(10) failed\\\" << std::endl;\\n    }\\n\\n    // Test extended_gcd\\n    int x, y;\\n    int g = extended_gcd(35, 15, x, y);\\n    if (g == 5 && 35 * x + 15 * y == g) {\\n        std::cout << \\\"extended_gcd(35, 15) passed\\\" << std::endl;\\n    } else {\\n        std::cout << \\\"extended_gcd(35, 15) failed\\\" << std::endl;\\n    }\\n\\n    // Test is_prime with 1\\n    if (is_prime(1) == 0) {\\n        std::cout << \\\"is_prime(1) passed\\\" << std::endl;\\n    } else {\\n        std::cout << \\\"is_prime(1) failed\\\" << std::endl;\\n    }\\n\\n    // Test is_prime with 9\\n    if (is_prime(9) == 0) {\\n        std::cout << \\\"is_prime(9) passed\\\" << std::endl;\\n    } else {\\n        std::cout << \\\"is_prime(9) failed\\\" << std::endl;\\n    }\\n\\n    // Test is_prime with 13\\n    if (is_prime(13) == 1) {\\n        std::cout << \\\"is_prime(13) passed\\\" << std::endl;\\n    } else {\\n        std::cout << \\\"is_prime(13) failed\\\" << std::endl;\\n    }\\n\\n    // Test lcm with 7 and 9\\n    if (lcm(7, 9) == 63) {\\n        std::cout << \\\"lcm(7, 9) passed\\\" << std::endl;\\n    } else {\\n        std::cout << \\\"lcm(7, 9) failed\\\" << std::endl;\\n    }\\n\\n    // Test gcd with 12 and 18\\n    if (gcd(12, 18) == 6) {\\n        std::cout << \\\"gcd(12, 18) passed\\\" << std::endl;\\n    } else {\\n        std::cout << \\\"gcd(12, 18) failed\\\" << std::endl;\\n    }\\n\\n    // Test gcd with two primes\\n    if (gcd(7, 13) == 1) {\\n        std::cout << \\\"gcd(7, 13) passed\\\" << std::endl;\\n    } else {\\n        std::cout << \\\"gcd(7, 13) failed\\\" << std::endl;\\n    }\\n\\n    // Test is_prime with 97\\n    if (is_prime(97) == 1) {\\n        std::cout << \\\"is_prime(97) passed\\\" << std::endl;\\n    } else {\\n        std::cout << \\\"is_prime(97) failed\\\" << std::endl;\\n    }\\n\\n    // Test extended_gcd with 48 and 18\\n    int x2, y2;\\n    int g2 = extended_gcd(48, 18, x2, y2);\\n    if (g2 == 6 && 48 * x2 + 18 * y2 == g2) {\\n        std::cout << \\\"extended_gcd(48, 18) passed\\\" << std::endl;\\n    } else {\\n        std::cout << \\\"extended_gcd(48, 18) failed\\\" << std::endl;\\n    }\\n\\n    // Test gcd with 27 and 18\\n    if (gcd(27, 18) == 9) {\\n        std::cout << \\\"gcd(27, 18) passed\\\" << std::endl;\\n    } else {\\n        std::cout << \\\"gcd(27, 18) failed\\\" << std::endl;\\n    }\\n    // test 999 and 123\\n    if (gcd(999, 123) == 3) {\\n        std::cout << \\\"gcd(999, 123) passed\\\" << std::endl;\\n    } else {\\n        std::cout << \\\"gcd(999, 123) failed\\\" << std::endl;\\n    }\\n    \\n    \\n}\\n\\nint main() {\\n    run_tests();\\n    return 0;\\n}\"}}"
          }
        ],
        "preamble": ""
      }
    },
    "@type": "type.googleapis.com/google.cloud.cloudaicompanion.logging.v1.RequestLog"
  },
  "resource": {
    "type": "cloudaicompanion.googleapis.com/Instance",
    "labels": {
      "resource_container": "my-project-id",
      "instance_id": "default",
      "location": "global"
    }
  },
  "timestamp": "2025-10-08T10:10:03.457717366Z",
  "severity": "INFO",
  "labels": {
    "request_id": "4b66a582bad9cf2c",
    "method": "CompleteTask",
    "client_version": "unknown",
    "product": "code_assist",
    "client_name": "cloudcode_cli",
    "user_id": "user@company.com"
  },
  "logName": "projects/my-project-id/logs/cloudaicompanion.googleapis.com%2Frequest",
  "receiveTimestamp": "2025-10-08T10:10:03.606059154Z"
}

レスポンス ログエントリ

{
  "insertId": "4qvt8nb2m",
  "jsonPayload": {
    "taskCompletionResponse": {
      "output": {
        "messages": [
          {
            "author": "MODEL",
            "content": "**Testing the functions**\\n\\nI'm focusing on adding a new test case to `test.cpp`.  The existing `run_tests` function is a great starting point. I'm considering which function to test further – maybe `extended_gcd`? I'll review the current tests for that function and then devise a new test scenario to add.\\n\\n\\n"
          },
          {
            "author": "MODEL",
            "content": "**Evaluating LCM Test**\\n\\nI've finalized the new test case for the `lcm` function within the `test.cpp` file.  I'm adding a test for `lcm(12, 18)` to confirm the result is 36. I plan to use the `replace` command to inject this new test directly before the closing brace of the `run_tests` function.  I've identified a unique line in `test.cpp` as the anchor for replacement.\\n\\n\\n"
          },
          {
            "author": "MODEL",
            "content": "**Inserting the new test**\\n\\nI've created a test case for `lcm(12, 18)`, confirming the expected result of 36. To implement this, I'm targeting the `run_tests` function.  I'll use the `replace` command and will search the end of the `run_tests` function to inject the new test, right before the closing brace.  I'm ready to implement this and confirm that it passes.\\n\\n\\n"
          },
          {
            "author": "MODEL",
            "content": "I've reviewed the file. I'll add a test case for the `lcm` function with inputs 12 and 18."
          },
          {
            "content": "replace({\"file_path\":\"/usr/local/google/home/pdec/test.cpp\",\"instruction\":\"add a test for the lcm function with 12 and 18\",\"new_string\":\"    // test 999 and 123\\n    if (gcd(999, 123) == 3) {\\n        std::cout << \\\"gcd(999, 123) passed\\\" << std::endl;\\n    } else {\\n        std::cout << \\\"gcd(999, 123) failed\\\" << std::endl;\\n    }\\n    \\n    // Test lcm with 12 and 18\\n    if (lcm(12, 18) == 36) {\\n        std::cout << \\\"lcm(12, 18) passed\\\" << std::endl;\\n    } else {\\n        std::cout << \\\"lcm(12, 18) failed\\\" << std::endl;\\n    }\\n    \\n}\",\"old_string\":\"    // test 999 and 123\\n    if (gcd(999, 123) == 3) {\\n        std::cout << \\\"gcd(999, 123) passed\\\" << std::endl;\\n    } else {\\n        std::cout << \\\"gcd(999, 123) failed\\\" << std::endl;\\n    }\\n    \\n    \\n}\"})",
            "author": "MODEL"
          }
        ]
      }
    },
    "@type": "type.googleapis.com/google.cloud.cloudaicompanion.logging.v1.ResponseLog"
  },
  "resource": {
    "type": "cloudaicompanion.googleapis.com/Instance",
    "labels": {
      "location": "global",
      "resource_container": "my-project-id",
      "instance_id": "default"
    }
  },
  "timestamp": "2025-10-08T10:10:03.461137399Z",
  "severity": "INFO",
  "labels": {
    "client_name": "cloudcode_cli",
    "client_version": "unknown",
    "method": "CompleteTask",
    "request_id": "4b66a582bad9cf2c",
    "product": "code_assist",
    "user_id": "user@company.com"
  },
  "logName": "projects/my-project-id/logs/cloudaicompanion.googleapis.com%2Fresponse",
  "receiveTimestamp": "2025-10-08T10:10:03.606059154Z"
}

メタデータ ログエントリ

{
  "insertId": "4qvt8nb2l",
  "jsonPayload": {
    "clientVersion": "unknown",
    "apiRequest": {},
    "clientName": "cloudcode_cli",
    "requestId": "4b66a582bad9cf2c",
    "@type": "type.googleapis.com/google.cloud.cloudaicompanion.logging.v1.MetadataLog"
  },
  "resource": {
    "type": "cloudaicompanion.googleapis.com/Instance",
    "labels": {
      "resource_container": "my-project-id",
      "location": "global",
      "instance_id": "default"
    }
  },
  "timestamp": "2025-10-08T10:10:03.459902984Z",
  "severity": "INFO",
  "labels": {
    "product": "code_assist",
    "user_id": "user@company.com",
    "method": "CompleteTask"
  },
  "logName": "projects/my-project-id/logs/cloudaicompanion.googleapis.com%2Fmetadata",
  "receiveTimestamp": "2025-10-08T10:10:03.606059154Z"
}

Gemini for Google Cloud の回答

次の表に、Gemini for Google Cloud の回答フィールドとその説明を示します。

フィールド 値とメモ
LogEntry.resource.type Gemini for Google Cloud リソースタイプ: cloudaicompanion.googleapis.com/Instance
LogEntry.resource.labels.resource_container Gemini for Google Cloud が使用されたリソース コンテナの一意の ID。
LogEntry.resource.labels.location Gemini for Google Cloud が使用されたロケーション。
LogEntry.resource.labels.instance_id Gemini for Google Cloud が使用されたリソースの一意の ID。
LogEntry.labels.method logEntry を呼び出した内容に応じて、次のいずれかになります。

CompleteTask: Gemini Code Assist またはその他の Gemini for Google Cloud サービスからのチャット リクエストなど。

GenerateCode: コード生成リクエスト(Gemini Code Assist 内のコード変換リクエストなど)。

CompleteCode: IDE での作業中にコードを補完するリクエスト(Gemini Code Assist 内のインライン候補など)。
LogEntry.labels.product Gemini for Google Cloud のサービス名。Gemini for Google Cloud プロダクトが Gemini Code Assist の場合、この値は code_assist です。Gemini for Google Cloud プロダクトが Gemini Cloud Assist の場合、この値は cloud_assist です。そうでない場合、この値は unknown です。
LogEntry.labels.request_id リクエストを回答のログエントリに関連付けるための固有識別子。
LogEntry.labels.user_id このリクエストを開始したユーザーの ID。
LogEntry.jsonPayload ログエントリのペイロード。回答の生成に使用されたソースの引用は、attribution_context としてこのオブジェクトに含まれます。
LogEntry.logName ログを識別します。

Gemini for Google Cloud のメタデータログ

メタデータログを生成するには、VS Code 拡張機能と IntelliJ 拡張機能の両方で Gemini Code Assist 拡張機能テレメトリー設定を有効にする必要があります。また、VS Code では、グローバル テレメトリー収集設定も有効にする必要があります。

Gemini for Google Cloud メタデータログは、Gemini for Google Cloud ログと同じ構造ですが、指定するフィールドが異なります。次の表に、ユーザー リクエスト ログエントリに含まれるフィールドのリストを示します。

フィールド 値とメモ
LogEntry.@type Gemini for Google Cloud のメタデータ リソースタイプ: type.googleapis.com/google.cloud.cloudaicompanion.logging.v1.MetadataLog
LogEntry.labels.method メタデータログの場合、このラベル値は Export.Metrics です。
LogEntry.labels.product Gemini for Google Cloud のサービス名。Gemini for Google Cloud プロダクトが Gemini Code Assist の場合、この値は code_assist です。Gemini for Google Cloud プロダクトが Gemini Cloud Assist の場合、この値は cloud_assist です。そうでない場合、この値は unknown です。
LogEntry.labels.user_id このリクエストを開始したユーザーの ID。
LogEntry.jsonPayload codeExposure イベントまたは code.Acceptance イベントのいずれかを示します。codeExposure イベントは、コード候補がユーザーに表示されたことを示します。code.Acceptance イベントは、ユーザーによる承認イベント(上書き、タブ、完全な承認など)があったことを示します。
LogEntry.jsonPayload.clientName IDE 名(CloudCodeVscode など)。
LogEntry.jsonPayload.clientVersion IDE のバージョン番号。
LogEntry.jsonPayload.codeAcceptance VS Code と IntelliJ IDE の場合のみ、ユーザーによる承認イベント(上書き、タブ、完全な承認など)があったことを示します。次のフィールドも含まれます。
  • linesCount: ユーザーが承認したコード行の合計数。
  • commentLinesCount: ユーザーが許可するコード内のコメント行数。このプロパティは、Gemini Code Assist が、受け入れられた行のうちコメント行の数を判断できる場合にのみ表示されます。
  • originalRequestId: codeExposure イベントを 0 個以上の codeAcceptance イベントにリンクする識別子。これを使用して、受け入れ率受け入れられたコード行数の指標を計算できます。
  • programmingLanguage: 受け入れられたコードのプログラミング言語(python など)。
LogEntry.jsonPayload.codeExposure VS Code と IntelliJ IDE の場合のみ、コード候補がユーザーに公開されたことを示します。次のフィールドも含まれます。
  • programmingLanguage: 公開のプログラミング言語(python など)。
  • originalRequestId: codeExposure イベントを 0 個以上の codeAcceptance イベントにリンクする識別子。これを使用して、受け入れ率受け入れられたコード行数の指標を計算できます。
LogEntry.jsonPayload.chatExposure ユーザーにチャットによる回答が公開されたことを示します。次のフィールドも含まれます。
  • originalRequestId: chatExposure イベントを 0 個以上の chatAcceptance イベントにリンクする識別子。これを使用して、チャットの受け入れ率受け入れられたチャット行数の指標を計算できます。
  • is_agentic: chatExposure がエージェント モードから発生したかどうかを示す識別子。これを使用して、チャットの受け入れ率と受け入れられたコード行数の指標をエージェント モードの場合とエージェント モード以外の場合に分けて計算できます。
LogEntry.jsonPayload.chatAcceptance チャットの回答のコードブロックに対してユーザーによる承認イベントがあったことを示します。次のフィールドも含まれます。
  • interactionType: ユーザーがコードブロックに対して行った操作のタイプ(ACCEPT_CODE_BLOCK など)。
  • programmingLanguage: 受け入れられたコードのプログラミング言語(python など)。
  • linesCount: ユーザーが承認したコード行の合計数。
  • originalRequestId: chatExposure イベントを 0 個以上の chatAcceptance イベントにリンクする識別子。
  • is_agentic: chatAcceptance がエージェント モードから発生したかどうかを示す識別子。これを使用して、チャットの受け入れ率と受け入れられたコード行数の指標をエージェント モードの場合とエージェント モード以外の場合に分けて計算できます。

次のサンプルは、codeExposure ログエントリの例を示しています。

{
  insertId: "whfrqgc1gj"
  jsonPayload: {
    @type: "type.googleapis.com/google.cloud.cloudaicompanion.logging.v1.MetadataLog"
    clientName: "CloudCodeVscode"
    clientVersion: "1.93.1"
    codeExposure: {
      originalRequestId: "cac019824a0b25ba"
      programmingLanguage: "python"
    }
  requestId: "0c5178fe-446f-4ab6-b996-520dec100cf8"
  }
  labels: {
    method: "Export.Metrics"
    product: "code_assist"
    user_id: "user@company.com"
  }
  logName: "projects/my-project-id/logs/cloudaicompanion.googleapis.com%2Fmetadata"
  receiveTimestamp: "2025-02-03T23:34:35.662837985Z"
  resource: {
    labels: {
      instance_id: "default"
      location: "global"
      resource_container: "my-project-id"
    }
  type: "cloudaicompanion.googleapis.com/Instance"
  }
  severity: "INFO"
  timestamp: "2025-02-03T23:34:35.021564463Z"
}

次のサンプルは、codeAcceptance ログエントリの例を示しています。

{
  insertId: "whfrqgc1gk"
  jsonPayload: {
    @type: "type.googleapis.com/google.cloud.cloudaicompanion.logging.v1.MetadataLog"
    clientName: "CloudCodeVscode"
    clientVersion: "1.93.1"
    codeAcceptance: {
      linesCount: 2
      originalRequestId: "cac019824a0b25ba"
      programmingLanguage: "python"
    }
    requestId: "ddf11040-c315-452e-b7cd-928c3f97984e"
  }
  labels: {
    method: "Export.Metrics"
    product: "code_assist"
    user_id: "user@company.com"
  }
  logName: "projects/my-project-id/logs/cloudaicompanion.googleapis.com%2Fmetadata"
  receiveTimestamp: "2025-02-03T23:34:37.632662272Z"
  resource: {
    labels: {
      instance_id: "default"
      location: "global"
      resource_container: "my-project-id"
    }
    type: "cloudaicompanion.googleapis.com/Instance"
  }
  severity: "INFO"
  timestamp: "2025-02-03T23:34:36.778692483Z"
} 

次のサンプルは、chatAcceptance ログエントリの例を示しています。

{
  "insertId": "1oru1grbow",
  "jsonPayload": {
    "clientVersion": "1.103.2",
    "requestId": "32a0b0b8c967d8e8",
    "clientName": "CloudCodeVscode",
    "chatAcceptance": {
      "interactionType": "ACCEPT_CODE_BLOCK",
      "programmingLanguage": "go",
      "linesCount": "15",
      "originalRequestId": "75f7c41e63162567"
    },
    "@type": "type.googleapis.com/google.cloud.cloudaicompanion.logging.v1.MetadataLog"
  },
  "resource": {
    "type": "cloudaicompanion.googleapis.com/Instance",
    "labels": {
      "resource_container": "my-project-id",
      "instance_id": "default",
      "location": "global"
    }
  },
  "timestamp": "2025-08-25T09:34:01.240377123Z",
  "severity": "INFO",
  "labels": {
    "product": "code_assist",
    "method": "Export.Metrics",
    "user_id": "user@company.com"
  },
  "logName": "projects/my-project-id/logs/cloudaicompanion.googleapis.com%2Fmetadata",
  "receiveTimestamp": "2025-08-25T09:34:01.704925625Z"
}

次のサンプルは、chatExposure ログエントリの例を示しています。

{
  insertId: "3diaj2c208"
  jsonPayload: {
    @type: "type.googleapis.com/google.cloud.cloudaicompanion.logging.v1.MetadataLog"
    clientName: "CloudCodeVscode"
    clientVersion: "1.93.1"
    chatExposure: {
      originalRequestId: "cac019824a0b25ba"
    }
  requestId: "0c5178fe-446f-4ab6-b996-520dec100cf8"
  }
  labels: {
    method: "Export.Metrics"
    product: "code_assist"
    user_id: "user@company.com"
  }
  logName: "projects/my-project-id/logs/cloudaicompanion.googleapis.com%2Fmetadata"
  receiveTimestamp: "2025-02-03T23:34:35.662837985Z"
  resource: {
    labels: {
      instance_id: "default"
      location: "global"
      resource_container: "my-project-id"
    }
  type: "cloudaicompanion.googleapis.com/Instance"
  }
  severity: "INFO"
  timestamp: "2025-02-03T23:34:35.021564463Z"
}

受け入れ率を計算する

以下のセクションでは、Gemini Code Assist メタデータログを使用して、コード候補の受け入れ率、チャットの回答の受け入れ率、総受け入れ率を計算する方法について説明します。

コードの受け入れ率を計算する

Gemini Code Assist メタデータログを使用してコードの受け入れ率を計算するには、codeAcceptance.originalRequestId を含むイベントの一意の ID の総数を、codeExposure.originalRequestId を含むイベントの一意の ID の総数で割ります。

プログラミング言語とユーザー ID のメタデータ ログイベント フィールドを使用して、この指標をプログラミング言語ごと、またはユーザーごとに計算できます。

チャットの受け入れ率を計算する

Gemini Code Assist メタデータログを使用してチャットの受け入れ率を計算するには、chatAcceptance.originalRequestId を含むイベントの一意の ID の総数を、chatExposure.originalRequestId を含むイベントの一意の ID の総数で割ります。

プログラミング言語とユーザー ID のメタデータ ログイベント フィールドを使用して、この指標をプログラミング言語ごと、またはユーザーごとに計算できます。

総受け入れ率を計算する

Gemini Code Assist メタデータログを使用して総受け入れ率を計算するには、承認イベントの総数を公開イベントの総数で割ります。

総受け入れ率 = 承認イベントの総数 ÷ 公開イベントの総数

  • 承認イベントの総数: codeAcceptance.originalRequestId を含むイベントの一意の ID の総数と、chatAcceptance.originalRequestId を含むイベントの一意の ID の総数を加算した数。
  • 公開イベントの総数: codeExposure.originalRequestId を含むイベントの一意の ID の総数と、chatExposure.originalRequestId を含むイベントの一意の ID の総数を加算した数。

この式によって算出される受け入れ率は、Gemini Code Assist のどの機能によって提案がなされたかを問わず、Gemini Code Assist による提案が受け入れられた全体的な確率を反映しています。

受け入れられたコード行数を計算する

以下のセクションでは、Gemini Code Assist メタデータログを使用して、コード提案から受け入れられたコード行数、チャットから受け入れられたコード行数、受け入れられたコードの総行数を計算する方法について説明します。

受け入れられたコード行数を計算する

受け入れられたコード行数を計算するには、一意の codeAcceptance.originalRequestId ごとに codeAcceptance.linesCount の最大値を見つけます。次に、これらの最大値を合計して、受け入れられたコードの総行数を計算します。

プログラミング言語とユーザー ID のメタデータ ログイベント フィールドを使用して、この指標をプログラミング言語ごと、またはユーザーごとに計算できます。

チャットから受け入れられたコード行数を計算する

チャットから受け入れられたコード行数を計算するには、一意の chatAcceptance.originalRequestId ごとに chatAcceptance.linesCount フィールドの値を見つけます。次に、これらの最大値を合計して、受け入れられたチャットの総行数を計算します。

受け入れられたコードの総行数を計算する

Gemini Code Assist メタデータログを使用して受け入れられたコードの総行数を計算するには、受け入れられたコード行数チャットから受け入れられたコード行数を加算します。

次のステップ