Lihat log Gemini Code Assist

Dengan mengumpulkan aktivitas Gemini Code Assist di Cloud Logging, Anda dapat mengaudit perintah developer, respons model, dan log metadata seperti data telemetri dan baris kode yang diterima. Anda dapat mengkueri entri log ini untuk mengevaluasi interaksi asisten di seluruh organisasi Anda. Untuk melacak tren gabungan, bukan log mentah, lihat Memantau penggunaan Gemini Code Assist.

Gemini Code Assist tidak mengumpulkan atau mengirim ke Cloud Logging interaksi pengguna lain yang mungkin dilakukan pengguna dengan Gemini Code Assist, termasuk masukan tertulis. Data yang dikumpulkan dikirim ke Cloud Logging untuk disimpan. Anda dapat meninjau data ini dengan menelusuri entri log dengan jenis resource cloudaicompanion.googleapis.com/Instance.

Fitur ini tidak mencatat perintah atau respons dalam Gemini di Vertex AI. Untuk mengaktifkan log untuk Gemini di Vertex AI, lihat Mengaktifkan log audit Akses Data.

Peran Identity and Access Management (IAM) mengontrol kemampuan akun utama untuk mengakses log. Anda dapat memberikan peran yang telah ditetapkan kepada akun utama, atau membuat peran khusus. Untuk mengetahui informasi selengkapnya tentang izin yang diperlukan, lihat Kontrol akses.

Secara default, Cloud Logging mengenkripsi konten pelanggan yang disimpan dalam penyimpanan. Data yang disimpan di bucket log oleh Logging akan dienkripsi menggunakan kunci enkripsi kunci, sebuah proses yang dikenal dengan sebutan enkripsi envelope. Akses ke data logging Anda membutuhkan akses ke kunci enkripsi kunci yang dikelola Google untuk Anda, dan Anda tidak perlu melakukan tindakan apa pun.

Organisasi Anda mungkin memiliki persyaratan peraturan, kepatuhan, atau enkripsi lanjutan yang tidak disediakan oleh enkripsi dalam penyimpanan default kami. Untuk memenuhi persyaratan organisasi, Anda dapat mengelola kunci enkripsi sendiri, bukan membiarkan Google mengelola kunci enkripsi yang melindungi data Anda.

Untuk informasi spesifik tentang penggunaan kunci enkripsi yang dikelola pelanggan (CMEK), termasuk keuntungan dan batasannya, lihat Kunci enkripsi yang dikelola pelanggan.

Batasan

  • Perekaman data log Gemini Code Assist terbatas pada interaksi pengguna dengan Gemini Code Assist dalam IDE.

  • Secara default, log Gemini Code Assist dikumpulkan per project. Untuk mengetahui petunjuk tentang cara mengonfigurasi project terpusat untuk mengumpulkan log dari beberapa project, lihat Menyiapkan logging multi-project.

  • Log Gemini Code Assist mencatat jumlah token gabungan (totalTokenCount) untuk setiap permintaan chat dan agen (CompleteTask), dan Anda dapat mengatribusikannya kepada pengguna dengan label labels.user_id. Jumlah ini muncul di kolom RequestLog.metadata.totalTokenCount, ResponseLog.metadata.totalTokenCount, dan MetadataLog.apiRequest.totalTokenCount. Log untuk permintaan penyelesaian kode dan permintaan pembuatan kode (CompleteCode dan GenerateCode) serta log metadata yang mencatat peristiwa telemetri, seperti peristiwa codeExposure, codeAcceptance, chatExposure, dan chatAcceptance, tidak menyertakan jumlah token. Log dan metrik Cloud Monitoring tidak mencatat jumlah token perintah dan respons yang terpisah. Untuk melihat penggunaan token gabungan untuk project Anda, lihat Metrik token dan kuota.

Sebelum memulai

Melihat log pengguna dan log metadata Gemini Code Assist

Untuk melihat log pengguna dan log metadata Gemini Code Assist, lakukan salah satu hal berikut:

Konsol

  1. Di konsol Google Cloud , buka halaman Logs Explorer:

    Buka Logs Explorer

    Jika Anda menggunakan kotak penelusuran untuk menemukan halaman ini, pilih hasil yang subjudulnya adalah Logging.

  2. Di toolbar, pilih project konsol Google Cloud .
  3. Di toolbar, luaskan menu All resources, lalu pilih resource Cloud AI Companion Instance.

gcloud

Jalankan perintah berikut:

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

Ganti PROJECT_ID dengan ID project yang log Gemini Code Assist-nya ingin Anda lihat.

API

  1. Buat file JSON yang berisi informasi berikut:

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

    Ganti PROJECT_ID dengan ID project yang log Gemini Code Assist-nya ingin Anda lihat.

  2. Dapatkan token autentikasi:

    TOKEN=$(gcloud auth print-access-token)
    
  3. Gunakan cURL untuk memanggil metode 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"

    Ganti JSON_FILE_NAME dengan jalur untuk file JSON yang Anda buat di langkah sebelumnya.

    Untuk mengetahui informasi selengkapnya tentang autentikasi, lihat Melakukan autentikasi untuk menggunakan REST.

    Respons akan menampilkan kumpulan entri log.

Log Gemini Code Assist

LogEntry merupakan satuan dasar data dalam Cloud Logging. Bagian berikut memberikan daftar kolom yang ditemukan di LogEntry untuk peristiwa platform Gemini Code Assist, seperti permintaan pengguna dan respons Gemini Code Assist.

Permintaan pengguna

Tabel berikut menampilkan daftar kolom yang ditemukan dalam entri log permintaan pengguna:

Kolom Nilai dan catatan
LogEntry.resource.type Jenis resource Gemini Code Assist: cloudaicompanion.googleapis.com/Instance.
LogEntry.resource.labels.resource_container ID unik Resource Container tempat Gemini Code Assist digunakan.
LogEntry.resource.labels.location Lokasi tempat Gemini Code Assist digunakan.
LogEntry.resource.labels.instance_id ID unik resource tempat Gemini Code Assist digunakan.
LogEntry.labels.method Dapat berupa salah satu dari hal berikut, bergantung pada apa yang memanggil logEntry:

CompleteTask: misalnya, permintaan chat dari Gemini Code Assist.

GenerateCode: misalnya, permintaan untuk membuat kode, seperti dengan permintaan transformasi kode dalam Gemini Code Assist.

CompleteCode: misalnya, permintaan untuk menyelesaikan kode saat bekerja di IDE, seperti dengan saran inline dalam Gemini Code Assist.
LogEntry.labels.product Nama layanan yang menerapkan log. Log yang relevan untuk Gemini Code Assist menggunakan nilai produk code_assist. Jika log relevan untuk Gemini Cloud Assist, nilai ini adalah cloud_assist. Jika tidak, nilai ini adalah unknown.
LogEntry.labels.request_id ID unik untuk menghubungkan permintaan ke suatu entri log respons.
LogEntry.labels.user_id ID pengguna yang memulai permintaan ini.
LogEntry.jsonPayload Payload entri log.
LogEntry.logName Mengidentifikasi log.

Contoh berikut menunjukkan contoh entri log untuk peristiwa perintah chat:

{
  "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"
}

Contoh berikut menunjukkan contoh entri RequestLog untuk perintah saran kode inline otomatis dan memberikan perintah ke Gemini Code Assist dalam file kode.

Data perintah untuk saran kode inline menggunakan objek codeCompletionRequest (seperti yang ditunjukkan dalam contoh berikut), sedangkan pembuatan yang dipicu secara manual menggunakan 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"
}

Log interaksi agen

Beberapa interaksi dengan Gemini dapat menghasilkan beberapa entri log (permintaan, respons, dan metadata) untuk satu tindakan pengguna. Contoh interaksi tersebut meliputi:

  • Agen yang melakukan tugas yang melibatkan penggunaan alat (misalnya, model yang memanggil fungsi internal seperti read_file atau replace, seperti yang ditunjukkan dalam contoh log).
  • Agen yang berinteraksi dengan agen lain.
Entri log permintaan

Contoh berikut menunjukkan contoh entri log untuk permintaan yang memulai interaksi agen:

{
  "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"
}
Entri log respons

Contoh berikut menunjukkan contoh entri log respons dari interaksi agen yang menyertakan beberapa pesan:

{
  "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"
}
Entri log metadata

Contoh berikut menunjukkan contoh entri log metadata dari interaksi agen:

{
  "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"
}

Contoh berikut menunjukkan contoh lain entri log untuk interaksi agen, dengan ID permintaan 4b66a582bad9cf2c:

Entri log permintaan

{
  "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"
}

Entri log respons

{
  "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"
}

Entri log metadata

{
  "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"
}

Respons Gemini Code Assist

Tabel berikut menunjukkan kolom dan deskripsi respons Gemini Code Assist:

Kolom Nilai dan catatan
LogEntry.resource.type Jenis resource Gemini Code Assist: cloudaicompanion.googleapis.com/Instance.
LogEntry.resource.labels.resource_container ID unik Resource Container tempat Gemini Code Assist digunakan.
LogEntry.resource.labels.location Lokasi tempat Gemini Code Assist digunakan.
LogEntry.resource.labels.instance_id ID unik resource tempat Gemini Code Assist digunakan.
LogEntry.labels.method Dapat berupa salah satu dari hal berikut, bergantung pada apa yang memanggil logEntry:

CompleteTask: misalnya, permintaan chat dari Gemini Code Assist.

GenerateCode: misalnya, permintaan untuk membuat kode, seperti dengan permintaan transformasi kode dalam Gemini Code Assist.

CompleteCode: misalnya, permintaan untuk menyelesaikan kode saat bekerja di IDE, seperti dengan saran inline dalam Gemini Code Assist.
LogEntry.labels.product Nama layanan yang menerapkan log. Log yang relevan untuk Gemini Code Assist menggunakan nilai produk code_assist. Jika log relevan untuk Gemini Cloud Assist, nilai ini adalah cloud_assist. Jika tidak, nilai ini adalah unknown.
LogEntry.labels.request_id ID unik untuk menghubungkan permintaan ke suatu entri log respons.
LogEntry.labels.user_id ID pengguna yang memulai permintaan ini.
LogEntry.jsonPayload Payload entri log. Setiap kutipan sumber yang digunakan untuk menghasilkan respons disertakan dalam objek ini sebagai attribution_context.
LogEntry.logName Mengidentifikasi log.

Log metadata Gemini Code Assist

Agar log metadata dapat dibuat, setelan telemetri ekstensi Gemini Code Assist harus diaktifkan untuk ekstensi VS Code dan IntelliJ.

Log metadata Gemini Code Assist mengikuti struktur yang sama dengan log Gemini Code Assist, tetapi menentukan kolom yang berbeda. Log metadata mencakup jenis entri berikut:

  • Metadata permintaan: Gemini Code Assist menulis entri log metadata untuk setiap permintaan chat dan agen, pembuatan kode, dan penyelesaian kode. Entri ini memiliki nilai labels.method dari CompleteTask, GenerateCode, atau CompleteCode. Untuk permintaan chat dan agen (CompleteTask), entri menyertakan jumlah token gabungan dalam apiRequest.totalTokenCount. Untuk permintaan pembuatan kode dan penyelesaian kode, apiRequest kosong.
  • Peristiwa telemetri: IDE mengirimkan peristiwa telemetri, seperti peristiwa codeExposure, codeAcceptance, chatExposure, dan chatAcceptance, serta jumlah baris yang diterima. Entri ini memiliki nilai labels.method Export.Metrics dan tidak menyertakan jumlah token.

Tabel berikut menunjukkan daftar kolom yang ditemukan dalam entri log permintaan pengguna:

Kolom Nilai dan catatan
LogEntry.@type Jenis resource metadata Gemini Code Assist: type.googleapis.com/google.cloud.cloudaicompanion.logging.v1.MetadataLog.
LogEntry.labels.method Dapat berupa salah satu dari hal berikut, bergantung pada jenis entri log metadata:

Export.Metrics: peristiwa telemetri yang dikirim oleh IDE, seperti codeExposure, codeAcceptance, chatExposure, dan chatAcceptance.

CompleteTask, GenerateCode, atau CompleteCode: meminta metadata untuk chat dan agen, pembuatan kode, dan permintaan penyelesaian kode.
LogEntry.labels.product Nama layanan yang menerapkan log. Log yang relevan untuk Gemini Code Assist menggunakan nilai produk code_assist. Jika log relevan untuk Gemini Cloud Assist, nilai ini adalah cloud_assist. Jika tidak, nilai ini adalah unknown.
LogEntry.labels.user_id ID pengguna yang memulai permintaan ini.
LogEntry.jsonPayload Payload entri log metadata. Untuk entri metadata permintaan, payload menyertakan objek apiRequest. Untuk entri telemetri, payload menyertakan salah satu peristiwa telemetri berikut: codeExposure, codeAcceptance, chatExposure, atau chatAcceptance. Setiap peristiwa telemetri dijelaskan dalam baris berikut.
LogEntry.jsonPayload.clientName Nama IDE, seperti CloudCodeVscode.
LogEntry.jsonPayload.clientVersion Nomor versi IDE.
LogEntry.jsonPayload.apiRequest Ada dalam entri metadata permintaan (CompleteTask, GenerateCode, dan CompleteCode). Untuk permintaan chat dan agen (CompleteTask), mencakup totalTokenCount: jumlah token gabungan untuk permintaan. Untuk permintaan pembuatan kode dan penyelesaian kode (GenerateCode dan CompleteCode), objek ini kosong ({}).
LogEntry.jsonPayload.codeAcceptance Khusus untuk VS Code dan IntelliJ IDE, menunjukkan bahwa terdapat peristiwa penerimaan oleh pengguna, seperti typeover, tab, atau penerimaan penuh. Juga mencakup kolom berikut:
  • linesCount: jumlah total baris kode yang diterima oleh pengguna.
  • commentLinesCount: jumlah baris komentar dalam kode yang diterima oleh pengguna. Properti ini hanya muncul jika Gemini Code Assist dapat menentukan jumlah baris yang diterima yang merupakan baris komentar.
  • originalRequestId: ID yang menautkan peristiwa codeExposure ke nol atau beberapa peristiwa codeAcceptance. Hal ini dapat digunakan untuk menghitung ukuran tingkat penerimaan dan baris kode yang diterima.
  • programmingLanguage: bahasa pemrograman kode yang diterima, seperti python.
LogEntry.jsonPayload.codeExposure Khusus untuk IDE VS Code dan IntelliJ, menunjukkan bahwa saran kode telah ditampilkan kepada pengguna. Juga mencakup kolom berikut:
  • programmingLanguage: bahasa pemrograman eksposur, seperti python.
  • originalRequestId: ID yang menautkan peristiwa codeExposure ke nol atau beberapa peristiwa codeAcceptance. Hal ini dapat digunakan untuk menghitung ukuran tingkat penerimaan dan baris kode yang diterima.
LogEntry.jsonPayload.chatExposure Menunjukkan bahwa ada eksposur respons chat kepada pengguna. Juga mencakup kolom berikut:
  • originalRequestId: ID yang menautkan peristiwa chatExposure ke nol atau beberapa peristiwa chatAcceptance. Hal ini dapat digunakan untuk menghitung ukuran tingkat penerimaan chat dan baris chat yang diterima.
  • is_agentic: ID yang menunjukkan apakah chatExposure berasal dari Mode Agen. Hal ini dapat digunakan untuk membedakan tingkat penerimaan chat dan baris kode yang diterima antara Mode Agen dan Mode non-Agen.
LogEntry.jsonPayload.chatAcceptance Menunjukkan adanya peristiwa penerimaan oleh pengguna pada blok kode dalam respons chat. Juga mencakup kolom berikut:
  • interactionType: jenis interaksi yang dilakukan pengguna dengan blok kode, seperti ACCEPT_CODE_BLOCK.
  • programmingLanguage: bahasa pemrograman kode yang diterima, seperti python.
  • linesCount: jumlah total baris kode yang diterima oleh pengguna.
  • originalRequestId: ID yang menautkan peristiwa chatExposure ke nol atau beberapa peristiwa chatAcceptance.
  • is_agentic: ID yang menunjukkan apakah chatAcceptance berasal dari Mode Agen. Hal ini dapat digunakan untuk membedakan tingkat penerimaan chat dan baris kode yang diterima antara Mode Agen dan Mode non-Agen.

Contoh berikut menunjukkan contoh entri log 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"
}

Contoh berikut menunjukkan contoh entri log 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"
} 

Contoh berikut menunjukkan contoh entri log 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"
}

Contoh berikut menunjukkan contoh entri log 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"
}

Menghitung tingkat penerimaan

Bagian berikut menjelaskan cara menghitung rasio penerimaan saran kode, rasio penerimaan respons chat, dan total rasio penerimaan gabungan menggunakan log metadata Gemini Code Assist.

Menghitung tingkat penerimaan kode

Untuk menghitung rasio penerimaan kode menggunakan log metadata Gemini Code Assist, temukan jumlah total ID unik dari peristiwa dengan codeAcceptance.originalRequestId dan bagi dengan jumlah total ID unik dari peristiwa dengan codeExposure.originalRequestId.

Anda dapat menyaring penghitungan ini lebih lanjut berdasarkan bahasa pemrograman dan pengguna menggunakan kolom peristiwa log metadata masing-masing.

Menghitung tingkat penerimaan chat

Untuk menghitung rasio penerimaan chat menggunakan log metadata Gemini Code Assist, temukan jumlah total ID unik dari peristiwa dengan chatAcceptance.originalRequestId dan bagi dengan jumlah total ID unik dari peristiwa dengan chatExposure.originalRequestId.

Anda dapat menyaring penghitungan ini lebih lanjut berdasarkan bahasa pemrograman dan pengguna menggunakan kolom peristiwa log metadata masing-masing.

Menghitung total tingkat penerimaan

Untuk menghitung total rasio penerimaan menggunakan log metadata Gemini Code Assist, temukan total jumlah peristiwa yang diterima dan bagi dengan total jumlah peristiwa eksposur:

Total rasio penerimaan = Total peristiwa yang diterima ÷ Total peristiwa eksposur

  • Total acara yang diterima: total jumlah ID unik dari acara dengan codeAcceptance.originalRequestId ditambah total jumlah ID unik dari acara dengan chatAcceptance.originalRequestId.
  • Total peristiwa eksposur: total jumlah ID unik dari peristiwa dengan codeExposure.originalRequestId ditambah total jumlah ID unik dari peristiwa dengan chatExposure.originalRequestId.

Formula ini memberikan rasio penerimaan yang mencerminkan probabilitas keseluruhan dari saran yang diterima di semua fitur Gemini Code Assist.

Menghitung baris kode yang diterima

Bagian berikut menjelaskan cara menghitung jumlah baris kode yang diterima dari saran kode, jumlah baris kode yang diterima dari chat, dan total baris kode yang diterima menggunakan log metadata Gemini Code Assist.

Menghitung baris kode yang diterima

Untuk menghitung baris kode yang diterima, temukan nilai maksimum untuk codeAcceptance.linesCount untuk setiap codeAcceptance.originalRequestId yang unik. Kemudian, jumlahkan nilai maksimum ini untuk menghitung total baris kode yang diterima.

Anda dapat menyaring penghitungan ini lebih lanjut berdasarkan bahasa pemrograman dan pengguna menggunakan kolom peristiwa log metadata masing-masing.

Menghitung baris kode yang diterima dari chat

Untuk menghitung baris kode yang diterima dari chat, temukan nilai kolom chatAcceptance.linesCount untuk setiap chatAcceptance.originalRequestId yang unik. Kemudian, jumlahkan nilai maksimum ini untuk menghitung total baris chat yang diterima.

Menghitung total baris kode yang diterima

Untuk menghitung total baris yang diterima menggunakan log metadata Gemini Code Assist, tambahkan baris kode yang diterima dan baris kode yang diterima dari chat.

Langkah berikutnya