Consulta los registros de Gemini para Google Cloud

En este documento, se describe cómo habilitar la recopilación y el almacenamiento de Gemini para Google Cloud actividad, lo que incluye lo siguiente:

  • Gemini pararegistros de instrucciones y respuestas, como la entrada del usuario, la información contextual y las respuestas Google Cloud
  • Gemini pararegistros de Google Cloud metadatos, como los metadatos de telemetría y las líneas de código aceptadas por el usuario

Si necesitas generar métricas de Gemini Code Assist, consulta Supervisa el uso de Gemini para Google Cloud el uso.

Gemini for Google Cloud no recopila ni envía a Cloud Logging ninguna otra interacción del usuario que este pueda haber tenido con Gemini for Google Cloud, incluidos los comentarios escritos. Los datos recopilados se envían a Cloud Logging para su almacenamiento. Puedes revisar estos datos buscando entradas de registro con el tipo de recurso cloudaicompanion.googleapis.com/Instance.

Esta función no registra instrucciones ni respuestas en Gemini en Vertex AI. Para habilitar los registros de Gemini en Vertex AI, consulta Habilita los registros de auditoría de acceso a los datos.

Los roles de Identity and Access Management (IAM) controlan la capacidad de una principal para acceder a los registros. Puedes otorgar roles predefinidos a las principales o crear roles personalizados. Para obtener más información sobre los permisos obligatorios, consulta Control de acceso.

De forma predeterminada, Cloud Logging encripta el contenido del cliente almacenado en reposo. Los datos almacenados en buckets de registro por Logging se encriptan mediante claves de encriptación de claves, un proceso conocido como encriptación de sobre. Acceder a tus datos de registro requiere acceso a esas claves de encriptación de claves, que Google administra sin que tengas que realizar ninguna acción.

Tu organización puede tener requisitos de encriptación avanzados, regulatorios o relacionados con el cumplimiento que nuestra encriptación en reposo predeterminada no proporciona. Para cumplir con los requisitos de tu organización, en lugar de que Google administre las claves de encriptación que protegen tus datos, puedes administrar tus claves.

Para obtener información específica sobre el uso de claves de encriptación administradas por el cliente (CMEK), incluidas las ventajas y limitaciones, consulta Claves de encriptación administradas por el cliente.

Limitaciones

  • El registro de datos de Gemini in Google Cloud parase limita a las interacciones del usuario con Gemini Code Assist dentro de un IDE.

  • De forma predeterminada, los registros de Gemini para Google Cloud se recopilan por proyecto. Para obtener instrucciones sobre cómo configurar un proyecto centralizado para recopilar registros de varios proyectos, consulta Configura el registro de varios proyectos.

  • Gemini Code Assist en GitHub no admite el registro con Cloud Logging.

Antes de comenzar

Visualiza los registros de usuarios Google Cloud y los registros de metadatos de Gemini para

Para ver los registros de usuarios y los registros de metadatos de Gemini para Google Cloud , realiza una de las siguientes acciones:

Console

  1. En la Google Cloud consola de, accede a la página Explorador de registros:

    Accede al Explorador de registros.

    Si usas la barra de búsqueda para encontrar esta página, selecciona el resultado cuyo subtítulo es Logging.

  2. En la barra de herramientas, selecciona un Google Cloud proyecto de la consola de.
  3. En la barra de herramientas, expande el menú Todos los recursos y selecciona el recurso Instancia de Cloud AI Companion.

gcloud

Ejecuta el siguiente comando:

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

Reemplaza PROJECT_ID por el ID del proyecto cuyos registros de Gemini para Google Cloud quieres ver.

API

  1. Crea un archivo JSON que contenga la siguiente información:

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

    Reemplaza PROJECT_ID por el ID del proyecto cuyos registros de Gemini para Google Cloud quieres ver.

  2. Obtén un token de autenticación:

    TOKEN=$(gcloud auth print-access-token)
    
  3. Usa cURL para llamar al entries.list método:

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

    Reemplaza JSON_FILE_NAME por la ruta de acceso al archivo JSON que creaste en el paso anterior.

    Para obtener más información sobre la autenticación, consulta Autentícate para usar REST.

    La respuesta muestra un conjunto de entradas de registro.

Registros de Gemini para Google Cloud

Un LogEntry es la unidad básica de datos en Cloud Logging. En las siguientes secciones, se proporcionan listas de campos que se encuentran en la LogEntry para un evento de la plataforma de Gemini para Google Cloud , como las solicitudes del usuario y las respuestas de Gemini para Google Cloud .

Solicitudes del usuario

En la siguiente tabla, se muestra una lista de los campos que se encuentran en una entrada de registro de solicitud del usuario:

Campo Valores y notas
LogEntry.resource.type Tipo de recurso de Gemini para Google Cloud : cloudaicompanion.googleapis.com/Instance.
LogEntry.resource.labels.resource_container Es el ID único del contenedor de recursos en el que se usó Gemini para Google Cloud .
LogEntry.resource.labels.location Es la ubicación en la que se usó Gemini para Google Cloud .
LogEntry.resource.labels.instance_id Es el ID único del recurso en el que se usó Gemini para Google Cloud .
LogEntry.labels.method Puede ser uno de los siguientes, según lo que invocó logEntry:

CompleteTask: por ejemplo, una solicitud de chat de Gemini Code Assist o de otro servicio de Gemini para.

GenerateCode: por ejemplo, una solicitud para generar código, como con una solicitud de transformación de código dentro de Gemini Code Assist.

CompleteCode: por ejemplo, una solicitud para completar código cuando se trabaja en el IDE, como con sugerencias intercaladas dentro de Gemini Code Assist. Google Cloud
LogEntry.labels.product Es el nombre del servicio de Gemini para Google Cloud . Si el producto de Gemini para Google Cloud es Gemini Code Assist, este valor es code_assist. Si el producto de Gemini para Google Cloud es Gemini Cloud Assist, este valor es cloud_assist. De lo contrario, este valor es unknown.
LogEntry.labels.request_id Es un identificador único para correlacionar una solicitud con una entrada de registro de respuesta.
LogEntry.labels.user_id Es el identificador del usuario que inició esta solicitud.
LogEntry.jsonPayload Es la carga útil de la entrada de registro.
LogEntry.logName Identifica el registro.

En el siguiente ejemplo, se muestra una entrada de registro de ejemplo para un evento de instrucción de 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"
}

En el siguiente ejemplo, se muestra una entrada RequestLog de ejemplo para automáticas sugerencias de código intercaladas instrucciones y para solicitar Gemini para Google Cloud en un archivo de código.

Los datos de instrucciones para las sugerencias de código intercaladas usan el objeto codeCompletionRequest (como se muestra en el siguiente ejemplo), mientras que la generación activada de forma manual usa 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"
}

Registros de interacción del agente

Algunas interacciones con Gemini pueden generar varias entradas de registro (solicitud, respuesta y metadatos) para una sola acción del usuario. Estos son algunos ejemplos de tales interacciones:

  • Un agente que realiza una tarea que implica el uso de herramientas (por ejemplo, el modelo que invoca funciones internas como read_file o replace, como se muestra en los ejemplos de registro ).
  • Un agente que interactúa con otros agentes
Entrada de registro de solicitud

En el siguiente ejemplo, se muestra una entrada de registro de ejemplo para una solicitud que inicia una interacción del 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"
}
Entrada de registro de respuesta

En el siguiente ejemplo, se muestra una entrada de registro de respuesta de ejemplo de una interacción del agente que incluye varios mensajes:

{
  "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"
}
Entrada de registro de metadatos

En el siguiente ejemplo, se muestra una entrada de registro de metadatos de ejemplo de una interacción del 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"
}

En los siguientes ejemplos, se muestra otro ejemplo de entradas de registro para una interacción del agente, con el ID de solicitud 4b66a582bad9cf2c:

Entrada de registro de solicitud

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

Entrada de registro de respuesta

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

Entrada de registro de metadatos

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

Respuestas de Gemini para Google Cloud

En la siguiente tabla, se muestran los campos y las Google Cloud descripciones de las respuestas de Gemini para:

Campo Valores y notas
LogEntry.resource.type Tipo de recurso de Gemini para Google Cloud : cloudaicompanion.googleapis.com/Instance.
LogEntry.resource.labels.resource_container Es el ID único del contenedor de recursos en el que se usó Gemini para Google Cloud .
LogEntry.resource.labels.location Es la ubicación en la que se usó Gemini para Google Cloud .
LogEntry.resource.labels.instance_id Es el ID único del recurso en el que se usó Gemini para Google Cloud .
LogEntry.labels.method Puede ser uno de los siguientes, según lo que invocó logEntry:

CompleteTask: por ejemplo, una solicitud de chat de Gemini Code Assist o de otro servicio de Gemini para.

GenerateCode: por ejemplo, una solicitud para generar código, como con una solicitud de transformación de código dentro de Gemini Code Assist.

CompleteCode: por ejemplo, una solicitud para completar código cuando se trabaja en el IDE, como con sugerencias intercaladas dentro de Gemini Code Assist. Google Cloud
LogEntry.labels.product Es el nombre del servicio de Gemini para Google Cloud . Si el producto de Gemini para Google Cloud es Gemini Code Assist, este valor es code_assist. Si el producto de Gemini para Google Cloud es Gemini Cloud Assist, este valor es cloud_assist. De lo contrario, este valor es unknown.
LogEntry.labels.request_id Es un identificador único para correlacionar una solicitud con una entrada de registro de respuesta.
LogEntry.labels.user_id Es el identificador del usuario que inició esta solicitud.
LogEntry.jsonPayload Es la carga útil de la entrada de registro. Cualquier cita de origen que se use para generar la respuesta se incluye en este objeto como attribution_context.
LogEntry.logName Identifica el registro.

Registros de metadatos de Gemini para Google Cloud

Para que se generen los registros de metadatos, se debe habilitar la configuración de telemetría de la extensión de Gemini Code Assist para las extensiones de VS Code y IntelliJ.

Los registros de metadatos de Gemini para Google Cloud siguen la misma estructura que los registros de Gemini para Google Cloud pero especifican campos diferentes. En la siguiente tabla, se muestra una lista de los campos que se encuentran en una entrada de registro de solicitud del usuario:

Campo Valores y notas
LogEntry.@type Tipo de recurso de metadatos de Gemini para: type.googleapis.com/google.cloud.cloudaicompanion.logging.v1.MetadataLog. Google Cloud
LogEntry.labels.method Para los registros de metadatos, este valor de etiqueta es Export.Metrics.
LogEntry.labels.product Es el nombre del servicio de Gemini para Google Cloud . Si el producto de Gemini para Google Cloud es Gemini Code Assist, este valor es code_assist. Si el producto de Gemini para Google Cloud es Gemini Cloud Assist, este valor es cloud_assist. De lo contrario, este valor es unknown.
LogEntry.labels.user_id Es el identificador del usuario que inició esta solicitud.
LogEntry.jsonPayload Indica un evento codeExposure o un evento code.Acceptance. Un evento codeExposure indica la exposición de una sugerencia de código a un usuario. Un evento code.Acceptance indica que hubo algún evento de aceptación por parte del usuario, como la escritura, la tabulación o la aceptación completa.
LogEntry.jsonPayload.clientName Es el nombre del IDE, como CloudCodeVscode.
LogEntry.jsonPayload.clientVersion Es el número de versión del IDE.
LogEntry.jsonPayload.codeAcceptance Solo para los IDE de VS Code y IntelliJ, indica que hubo algún evento de aceptación por parte del usuario, como la escritura, la tabulación o la aceptación completa. También incluye los siguientes campos:
  • linesCount: Es la cantidad total de líneas de código aceptadas por el usuario.
  • commentLinesCount: Es la cantidad de líneas de comentarios en el código aceptado por el usuario. Esta propiedad solo aparece si Gemini Code Assist puede determinar cuántas de las líneas aceptadas son líneas de comentarios.
  • originalRequestId: Es un identificador que vincula un evento codeExposure a cero o más eventos codeAcceptance. Se puede usar para calcular el porcentaje de aceptación y las medidas de líneas de código aceptadas.
  • programmingLanguage: Es el lenguaje de programación del código aceptado, como python.
LogEntry.jsonPayload.codeExposure Solo para los IDE de VS Code y IntelliJ, indica que hubo exposición de una sugerencia de código a un usuario. También incluye los siguientes campos:
  • programmingLanguage: Es el lenguaje de programación de la exposición, como python.
  • originalRequestId: Es un identificador que vincula un evento codeExposure a cero o más eventos codeAcceptance. Se puede usar para calcular el porcentaje de aceptación y las medidas de líneas de código aceptadas.
LogEntry.jsonPayload.chatExposure Indica que hubo exposición de una respuesta de chat a un usuario. También incluye los siguientes campos:
  • originalRequestId: Es un identificador que vincula un evento chatExposure a cero o más eventos chatAcceptance. Se puede usar para calcular el porcentaje de aceptación del chat y las medidas de líneas de chat aceptadas.
  • is_agentic: Es un identificador que indica si chatExposure proviene del modo de agente. Se puede usar para distinguir el porcentaje de aceptación del chat en el modo de agente y en el modo sin agente, y las medidas de líneas de código aceptadas.
LogEntry.jsonPayload.chatAcceptance Indica que hubo algún evento de aceptación por parte del usuario en los bloques de código de la respuesta de chat. También incluye los siguientes campos:
  • interactionType: Es el tipo de interacción que tuvo el usuario con el bloque de código, como ACCEPT_CODE_BLOCK.
  • programmingLanguage: Es el lenguaje de programación del código aceptado, como python.
  • linesCount: Es la cantidad total de líneas de código aceptadas por el usuario.
  • originalRequestId: Es un identificador que vincula un evento chatExposure a cero o más eventos chatAcceptance.
  • is_agentic: Es un identificador que indica si chatAcceptance proviene del modo de agente. Se puede usar para distinguir el porcentaje de aceptación del chat en el modo de agente y en el modo sin agente, y las medidas de líneas de código aceptadas.

En el siguiente ejemplo, se muestra una entrada de registro codeExposure de ejemplo:

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

En el siguiente ejemplo, se muestra una entrada de registro codeAcceptance de ejemplo:

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

En el siguiente ejemplo, se muestra una entrada de registro chatAcceptance de ejemplo:

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

En el siguiente ejemplo, se muestra una entrada de registro chatExposure de ejemplo:

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

Calcula el porcentaje de aceptación

En las siguientes secciones, se describe cómo calcular el porcentaje de aceptación de sugerencias de código, el porcentaje de aceptación de respuestas de chat y el porcentaje de aceptación combinado total con los registros de metadatos de Gemini Code Assist.

Calcula el porcentaje de aceptación de código

Para calcular el porcentaje de aceptación de código con los registros de metadatos de Gemini Code Assist, busca la cantidad total de IDs únicos de eventos con codeAcceptance.originalRequestId y divídela por la cantidad total de IDs únicos de eventos con codeExposure.originalRequestId.

Puedes refinar aún más este cálculo por lenguaje de programación y por usuario con los campos de eventos de registro de metadatos respectivos.

Calcula el porcentaje de aceptación del chat

Para calcular el porcentaje de aceptación del chat con los registros de metadatos de Gemini Code Assist, busca la cantidad total de IDs únicos de eventos con chatAcceptance.originalRequestId y divídela por la cantidad total de IDs únicos de eventos con chatExposure.originalRequestId.

Puedes refinar aún más este cálculo por lenguaje de programación y por usuario con los campos de eventos de registro de metadatos respectivos.

Calcula el porcentaje de aceptación total

Para calcular el porcentaje de aceptación total con los registros de metadatos de Gemini Code Assist, busca la cantidad total de eventos aceptados y divídela por la cantidad total de eventos de exposición:

Porcentaje de aceptación total = Cantidad total de eventos aceptados ÷ Cantidad total de eventos de exposición

  • Cantidad total de eventos aceptados: Es la cantidad total de IDs únicos de eventos con codeAcceptance.originalRequestId más la cantidad total de IDs únicos de eventos con chatAcceptance.originalRequestId.
  • Cantidad total de eventos de exposición: Es la cantidad total de IDs únicos de eventos con codeExposure.originalRequestId más la cantidad total de IDs únicos de eventos con chatExposure.originalRequestId.

Esta fórmula proporciona un porcentaje de aceptación que refleja la probabilidad general de que se acepte cualquier sugerencia en todas las funciones de Gemini Code Assist.

Calcula las líneas de código aceptadas

En las siguientes secciones, se describe cómo calcular la cantidad de líneas de código aceptadas de las sugerencias de código, la cantidad de líneas de código aceptadas del chat y la cantidad total de líneas de código aceptadas con los registros de metadatos de Gemini Code Assist.

Calcula las líneas de código aceptadas

Para calcular las líneas de código aceptadas, busca el valor máximo de codeAcceptance.linesCount para cada codeAcceptance.originalRequestId único. Luego, suma estos valores máximos para calcular la cantidad total de líneas de código aceptadas.

Puedes refinar aún más este cálculo por lenguaje de programación y por usuario con los campos de eventos de registro de metadatos respectivos.

Calcula las líneas de código aceptadas del chat

Para calcular las líneas de código aceptadas del chat, busca el valor del chatAcceptance.linesCount campo para cada chatAcceptance.originalRequestId único. Luego, suma estos valores máximos para calcular la cantidad total de líneas de chat aceptadas.

Calcula la cantidad total de líneas de código aceptadas

Para calcular la cantidad total de líneas aceptadas con los registros de metadatos de Gemini Code Assist, suma las líneas de código aceptadas y las líneas de código aceptadas del chat.

¿Qué sigue?