Visualizza i log di Gemini Code Assist

La raccolta dell'attività di Gemini Code Assist in Cloud Logging ti consente di controllare i prompt degli sviluppatori, le risposte del modello e i log dei metadati, come i dati di telemetria e le righe di codice accettate. Puoi eseguire query su queste voci di log per valutare le interazioni con l'assistente nella tua organizzazione. Per monitorare le tendenze aggregate anziché i log non elaborati, consulta Monitora l'utilizzo di Gemini Code Assist.

Gemini Code Assist non raccoglie né invia a Cloud Logging altre interazioni che l'utente potrebbe aver avuto con Gemini Code Assist, inclusi i feedback scritti. I dati raccolti vengono inviati a Cloud Logging per l'archiviazione. Puoi esaminare questi dati cercando le voci di log con il tipo di risorsa cloudaicompanion.googleapis.com/Instance.

Questa funzionalità non registra i prompt o le risposte in Gemini in Vertex AI. Per abilitare i log per Gemini in Vertex AI, consulta Abilita gli audit log di accesso ai dati.

I ruoli IAM (Identity and Access Management) controllano la possibilità per un'entità di accedere ai log. Puoi concedere ruoli predefiniti alle entità o creare ruoli personalizzati. Per ulteriori informazioni sulle autorizzazioni richieste, consulta Controllo degli accessi.

Per impostazione predefinita, Cloud Logging cripta i contenuti inattivi dei clienti. I dati archiviati nei bucket di log da Logging vengono criptati utilizzando chiavi di crittografia delle chiavi, un processo noto come crittografia envelope. L'accesso ai dati di logging richiede l'accesso alle chiavi di crittografia delle chiavi, che Google gestisce per te senza che tu debba fare nulla.

La tua organizzazione potrebbe avere requisiti normativi, di conformità o di crittografia avanzata che non sono soddisfatti dalla nostra crittografia at-rest predefinita. Per soddisfare i requisiti della tua organizzazione, puoi gestire le chiavi di crittografia che proteggono i tuoi dati, invece di lasciare che sia Google a farlo.

Per informazioni specifiche sull'utilizzo delle chiavi di crittografia gestite dal cliente (CMEK), inclusi vantaggi e limitazioni, consulta Chiavi di crittografia gestite dal cliente.

Limitazioni

  • La registrazione dei dati di log di Gemini Code Assist è limitata alle interazioni degli utenti con Gemini Code Assist all'interno di un IDE.

  • Per impostazione predefinita, i log di Gemini Code Assist vengono raccolti per progetto. Per istruzioni su come configurare un progetto centralizzato per raccogliere i log da più progetti, consulta Configura il logging multiprogetto.

  • I log di Gemini Code Assist registrano un conteggio dei token combinato (totalTokenCount) per ogni richiesta di chat e agente (CompleteTask), che puoi attribuire a un utente con l'etichetta labels.user_id. Questo conteggio viene visualizzato nei campi RequestLog.metadata.totalTokenCount, ResponseLog.metadata.totalTokenCount e MetadataLog.apiRequest.totalTokenCount. I log per le richieste di completamento e generazione del codice (CompleteCode e GenerateCode) e i log dei metadati che registrano eventi di telemetria, come gli eventi codeExposure, codeAcceptance, chatExposure e chatAcceptance, non includono i conteggi dei token. I log e le metriche di Cloud Monitoring non registrano conteggi separati dei token di prompt e di risposta. Per visualizzare l'utilizzo aggregato dei token per il tuo progetto, consulta Metriche relative a token e quote.

Prima di iniziare

Visualizza i log utente e i log dei metadati di Gemini Code Assist

Per visualizzare i log utente e i log dei metadati di Gemini Code Assist, esegui una delle seguenti operazioni:

Console

  1. Nella console Google Cloud , vai alla pagina Esplora log:

    Vai a Esplora log

    Se utilizzi la barra di ricerca per trovare questa pagina, seleziona il risultato con il sottotitolo Logging.

  2. Nella barra degli strumenti, seleziona un progetto della console Google Cloud .
  3. Nella barra degli strumenti, espandi il menu Tutte le risorse e seleziona la risorsa Istanza Cloud AI Companion.

gcloud

Esegui questo comando:

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

Sostituisci PROJECT_ID con l'ID del progetto di cui vuoi visualizzare i log di Gemini Code Assist.

API

  1. Crea un file JSON che contenga le seguenti informazioni:

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

    Sostituisci PROJECT_ID con l'ID del progetto di cui vuoi visualizzare i log di Gemini Code Assist.

  2. Ottieni un token di autenticazione:

    TOKEN=$(gcloud auth print-access-token)
    
  3. Utilizza cURL per chiamare il metodo 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"

    Sostituisci JSON_FILE_NAME con il percorso del file JSON che hai creato nel passaggio precedente.

    Per saperne di più sull'autenticazione, consulta Autenticati per usare REST.

    La risposta restituisce un insieme di voci di log.

Log di Gemini Code Assist

Una LogEntry è l'unità di dati di base in Cloud Logging. Le sezioni seguenti forniscono elenchi di campi presenti in LogEntry per un evento della piattaforma Gemini Code Assist, ad esempio richieste degli utenti e risposte di Gemini Code Assist.

Richieste da parte degli utenti

La tabella seguente mostra un elenco di campi presenti in una voce di log delle richieste degli utenti:

Campo Valori e note
LogEntry.resource.type Tipo di risorsa Gemini Code Assist: cloudaicompanion.googleapis.com/Instance.
LogEntry.resource.labels.resource_container ID univoco del container di risorse in cui è stato utilizzato Gemini Code Assist.
LogEntry.resource.labels.location Località in cui è stato utilizzato Gemini Code Assist.
LogEntry.resource.labels.instance_id ID univoco della risorsa in cui è stato utilizzato Gemini Code Assist.
LogEntry.labels.method Può essere uno dei seguenti, a seconda di ciò che ha richiamato logEntry:

CompleteTask: ad esempio, una richiesta di chat da Gemini Code Assist.

GenerateCode: ad esempio, una richiesta di generazione di codice, come una richiesta di trasformazione del codice all'interno di Gemini Code Assist.

CompleteCode: ad esempio, una richiesta di completamento del codice quando si lavora nell'IDE, come con i suggerimenti incorporati all'interno di Gemini Code Assist.
LogEntry.labels.product Nome del servizio a cui si applica il log. I log pertinenti per Gemini Code Assist utilizzano il valore del prodotto code_assist. Se il log è pertinente per Gemini Cloud Assist, questo valore è cloud_assist. In caso contrario, questo valore è unknown.
LogEntry.labels.request_id Un identificatore univoco per correlare una richiesta a una voce di log della risposta.
LogEntry.labels.user_id L'identificatore dell'utente che ha avviato la richiesta.
LogEntry.jsonPayload Il payload della voce di log.
LogEntry.logName Identifica il log.

L'esempio seguente mostra una voce di log di esempio per un evento di prompt della 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"
}

L'esempio seguente mostra una voce RequestLog di esempio per i prompt di suggerimento di codice incorporato automatico e i prompt di Gemini Code Assist in un file di codice.

I dati dei prompt per i suggerimenti di codice incorporato utilizzano l'oggetto codeCompletionRequest (come mostrato nell'esempio seguente), mentre la generazione attivata manualmente utilizza 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 delle interazioni con l'agente

Alcune interazioni con Gemini possono generare più voci di log (richiesta, risposta e metadati) per una singola azione utente. Esempi di queste interazioni includono:

  • Un agente che esegue un'attività che prevede l'utilizzo di strumenti (ad esempio, il modello che richiama funzioni interne come read_file o replace, come mostrato negli esempi di log).
  • Un agente che interagisce con altri agenti.
Voce di log della richiesta

L'esempio seguente mostra una voce di log di esempio per una richiesta che avvia un'interazione con l'agente:

{
  "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"
}
Voce di log della risposta

L'esempio seguente mostra una voce di log di risposta di esempio di un'interazione con l'agente che include più messaggi:

{
  "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"
}
Voce di log dei metadati

L'esempio seguente mostra una voce di log dei metadati di esempio di un'interazione con l'agente:

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

Gli esempi seguenti mostrano un altro esempio di voci di log per un'interazione con l'agente, con ID richiesta 4b66a582bad9cf2c:

Voce di log delle richieste

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

Voce di log della risposta

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

Voce di log dei metadati

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

Risposte di Gemini Code Assist

La tabella seguente mostra i campi e le descrizioni delle risposte di Gemini Code Assist:

Campo Valori e note
LogEntry.resource.type Tipo di risorsa Gemini Code Assist: cloudaicompanion.googleapis.com/Instance.
LogEntry.resource.labels.resource_container ID univoco del container di risorse in cui è stato utilizzato Gemini Code Assist.
LogEntry.resource.labels.location Località in cui è stato utilizzato Gemini Code Assist.
LogEntry.resource.labels.instance_id ID univoco della risorsa in cui è stato utilizzato Gemini Code Assist.
LogEntry.labels.method Può essere uno dei seguenti, a seconda di ciò che ha richiamato logEntry:

CompleteTask: ad esempio, una richiesta di chat da Gemini Code Assist.

GenerateCode: ad esempio, una richiesta di generazione di codice, come una richiesta di trasformazione del codice all'interno di Gemini Code Assist.

CompleteCode: ad esempio, una richiesta di completamento del codice quando si lavora nell'IDE, come con i suggerimenti incorporati all'interno di Gemini Code Assist.
LogEntry.labels.product Nome del servizio a cui si applica il log. I log pertinenti per Gemini Code Assist utilizzano il valore del prodotto code_assist. Se il log è pertinente per Gemini Cloud Assist, questo valore è cloud_assist. In caso contrario, questo valore è unknown.
LogEntry.labels.request_id Un identificatore univoco per correlare una richiesta a una voce di log della risposta.
LogEntry.labels.user_id L'identificatore dell'utente che ha avviato la richiesta.
LogEntry.jsonPayload Il payload della voce di log. Le citazioni delle fonti utilizzate per generare la risposta sono incluse in questo oggetto come attribution_context.
LogEntry.logName Identifica il log.

Log dei metadati di Gemini Code Assist

Affinché i log dei metadati vengano generati, l'impostazione di telemetria dell'estensione Gemini Code Assist deve essere abilitata sia per le estensioni VS Code che per quelle IntelliJ.

I log dei metadati di Gemini Code Assist seguono la stessa struttura dei log di Gemini Code Assist, ma specificano campi diversi. I log dei metadati includono i seguenti tipi di voci:

  • Metadati della richiesta: Gemini Code Assist scrive una voce di log dei metadati per ogni richiesta di chat e agente, generazione di codice e completamento del codice. Queste voci hanno un valore labels.method di CompleteTask, GenerateCode o CompleteCode. Per le richieste di chat e agente (CompleteTask), la voce include un conteggio dei token combinato in apiRequest.totalTokenCount. Per le richieste di generazione e completamento del codice, apiRequest è vuoto.
  • Eventi di telemetria: l'IDE invia eventi di telemetria, come gli eventi codeExposure, codeAcceptance, chatExposure e chatAcceptance, nonché i conteggi delle righe accettate. Queste voci hanno un valore labels.method di Export.Metrics e non includono i conteggi dei token.

La tabella seguente mostra un elenco di campi presenti in una voce di log delle richieste degli utenti:

Campo Valori e note
LogEntry.@type Tipo di risorsa dei metadati di Gemini Code Assist: type.googleapis.com/google.cloud.cloudaicompanion.logging.v1.MetadataLog.
LogEntry.labels.method Può essere uno dei seguenti, a seconda del tipo di voce di log dei metadati:

Export.Metrics: eventi di telemetria inviati dall'IDE, ad esempio codeExposure, codeAcceptance, chatExposure e chatAcceptance.

CompleteTask, GenerateCode o CompleteCode: richiedi i metadati rispettivamente per le richieste di chat e agente, generazione di codice e completamento del codice.
LogEntry.labels.product Nome del servizio a cui si applica il log. I log pertinenti per Gemini Code Assist utilizzano il valore del prodotto code_assist. Se il log è pertinente per Gemini Cloud Assist, questo valore è cloud_assist. In caso contrario, questo valore è unknown.
LogEntry.labels.user_id L'identificatore dell'utente che ha avviato la richiesta.
LogEntry.jsonPayload Il payload della voce di log dei metadati. Per le voci dei metadati della richiesta, il payload include un oggetto apiRequest. Per le voci di telemetria, il payload include uno dei seguenti eventi di telemetria: codeExposure, codeAcceptance, chatExposure o chatAcceptance. Ogni evento di telemetria è descritto nelle righe seguenti.
LogEntry.jsonPayload.clientName Il nome dell'IDE, ad esempio CloudCodeVscode.
LogEntry.jsonPayload.clientVersion Il numero di versione dell'IDE.
LogEntry.jsonPayload.apiRequest Presente nelle voci dei metadati della richiesta (CompleteTask, GenerateCode e CompleteCode). Per le richieste di chat e agenti (CompleteTask), include totalTokenCount: il conteggio dei token combinati per la richiesta. Per le richieste di generazione e completamento del codice (GenerateCode e CompleteCode), questo oggetto è vuoto ({}).
LogEntry.jsonPayload.codeAcceptance Solo per gli IDE VS Code e IntelliJ, indica che l'utente ha eseguito un evento di accettazione, ad esempio sovrascrittura, tabulazione o accettazione completa. Include anche i seguenti campi:
  • linesCount: il numero totale di righe di codice accettate dall'utente.
  • commentLinesCount: il numero di righe di commento nel codice accettato dall'utente. Questa proprietà viene visualizzata solo se Gemini Code Assist è in grado di determinare quante delle righe accettate sono righe di commento.
  • originalRequestIdcodeExposurecodeAcceptance Può essere utilizzato per calcolare le metriche relative al tasso di accettazione e alle righe di codice accettate.
  • programmingLanguage: linguaggio di programmazione del codice accettato, ad esempio python.
LogEntry.jsonPayload.codeExposure Solo per gli IDE VS Code e IntelliJ, indica che un suggerimento di codice è stato esposto a un utente. Include anche i seguenti campi:
  • programmingLanguage: il linguaggio di programmazione dell'esposizione, ad esempio python.
  • originalRequestIdcodeExposurecodeAcceptance Può essere utilizzato per calcolare le metriche relative al tasso di accettazione e alle righe di codice accettate.
LogEntry.jsonPayload.chatExposure Indica che una risposta della chat è stata mostrata a un utente. Include anche i seguenti campi:
  • originalRequestIdchatExposurechatAcceptance Può essere utilizzato per calcolare le metriche Tasso di accettazione della chat e Righe di chat accettate.
  • is_agentic: un identificatore che indica se chatExposure proviene dalla modalità Agente. Questo può essere utilizzato per distinguere il tasso di accettazione della chat in modalità Agent e non in modalità Agent e le misure delle righe di codice accettate.
LogEntry.jsonPayload.chatAcceptance Indica che l'utente ha accettato i blocchi di codice nella risposta della chat. Include anche i seguenti campi:
  • interactionType: il tipo di interazione che l'utente ha avuto con il blocco di codice, ad esempio ACCEPT_CODE_BLOCK.
  • programmingLanguage: linguaggio di programmazione del codice accettato, ad esempio python.
  • linesCount: il numero totale di righe di codice accettate dall'utente.
  • originalRequestIdchatExposurechatAcceptance
  • is_agentic: un identificatore che indica se chatAcceptance proviene dalla modalità Agente. Questo può essere utilizzato per distinguere il tasso di accettazione della chat in modalità Agent e non in modalità Agent e le misure delle righe di codice accettate.

L'esempio seguente mostra una voce di log codeExposure di esempio:

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

L'esempio seguente mostra una voce di log codeAcceptance di esempio:

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

L'esempio seguente mostra una voce di log chatAcceptance di esempio:

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

L'esempio seguente mostra una voce di log chatExposure di esempio:

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

Calcola il tasso di accettazione

Le sezioni seguenti descrivono come calcolare il tasso di accettazione dei suggerimenti di codice, il tasso di accettazione delle risposte della chat e il tasso di accettazione totale combinato utilizzando i log dei metadati di Gemini Code Assist.

Calcola il tasso di accettazione del codice

Per calcolare il tasso di accettazione del codice utilizzando i log dei metadati di Gemini Code Assist, trova il numero totale di ID univoci degli eventi con codeAcceptance.originalRequestId e dividilo per il numero totale di ID univoci degli eventi con codeExposure.originalRequestId.

Puoi perfezionare ulteriormente questo calcolo in base al linguaggio di programmazione e all'utente utilizzando i rispettivi campi degli eventi dei log dei metadati.

Calcola il tasso di accettazione delle chat

Per calcolare il tasso di accettazione della chat utilizzando i log dei metadati di Gemini Code Assist, trova il numero totale di ID univoci degli eventi con chatAcceptance.originalRequestId e dividilo per il numero totale di ID univoci degli eventi con chatExposure.originalRequestId.

Puoi perfezionare ulteriormente questo calcolo in base al linguaggio di programmazione e all'utente utilizzando i rispettivi campi degli eventi dei log dei metadati.

Calcola il tasso di accettazione totale

Per calcolare il tasso di accettazione totale utilizzando i log dei metadati di Gemini Code Assist, trova il numero totale di eventi accettati e dividilo per il numero totale di eventi di esposizione:

Percentuale di accettazione totale = Eventi accettati totali ÷ Eventi di esposizione totali

  • Eventi accettati totali: il numero totale di ID univoci degli eventi con codeAcceptance.originalRequestId più il numero totale di ID univoci degli eventi con chatAcceptance.originalRequestId.
  • Eventi di esposizione totali: il numero totale di ID univoci degli eventi con codeExposure.originalRequestId più il numero totale di ID univoci degli eventi con chatExposure.originalRequestId.

Questa formula fornisce un tasso di accettazione che riflette la probabilità complessiva che un suggerimento venga accettato in tutte le funzionalità di Gemini Code Assist.

Calcola le righe di codice accettate

Le sezioni seguenti descrivono come calcolare il numero di righe di codice accettate dai suggerimenti di codice, il numero di righe di codice accettate dalla chat e il numero totale di righe di codice accettate utilizzando i log dei metadati di Gemini Code Assist.

Calcola le righe di codice accettate

Per calcolare le righe di codice accettate, trova il valore massimo per codeAcceptance.linesCount per ogni codeAcceptance.originalRequestId univoco. Poi, somma questi valori massimi per calcolare il totale delle righe di codice accettate.

Puoi perfezionare ulteriormente questo calcolo in base al linguaggio di programmazione e all'utente utilizzando i rispettivi campi degli eventi dei log dei metadati.

Calcola le righe di codice accettate dalla chat

Per calcolare le righe di codice accettate dalla chat, trova il valore del campo chatAcceptance.linesCount per ogni chatAcceptance.originalRequestId univoco. Poi, somma questi valori massimi per calcolare il numero totale di righe di chat accettate.

Calcola le righe di codice totali accettate

Per calcolare il totale delle righe accettate utilizzando i log dei metadati di Gemini Code Assist, somma le righe di codice accettate e le righe di codice accettate dalla chat.

Passaggi successivi