Ver los registros de Gemini para Google Cloud

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

  • Gemini para Google Cloud registros de peticiones y respuestas, como las entradas de los usuarios, la información contextual y las respuestas.
  • Gemini para los registros de metadatos, como los metadatos de telemetría y las líneas de código aceptadas por el usuario. Google Cloud

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

Gemini para Google Cloud no recoge ni envía a Cloud Logging ninguna otra interacción que el usuario pueda haber tenido con Gemini para Google Cloud, incluidos los comentarios escritos. Los datos recogidos se envían a Cloud Logging para almacenarlos. Puede consultar estos datos buscando entradas de registro con el tipo de recurso cloudaicompanion.googleapis.com/Instance.

Google Cloud

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

Los roles de Gestión de Identidades y Accesos (IAM) controlan la capacidad de una entidad de acceder a los registros. Puedes conceder roles predefinidos a los principales o crear roles personalizados. Para obtener más información sobre los permisos necesarios, consulta Control de acceso.

De forma predeterminada, Cloud Logging encripta el contenido de los clientes almacenado en reposo. Los datos que Logging almacena en los contenedores de registro se cifran mediante claves de cifrado de claves, un proceso conocido como cifrado envolvente. Para acceder a tus datos de registro, es necesario tener acceso a esas claves de cifrado de claves, que Google gestiona por ti sin que tengas que hacer nada.

Es posible que tu organización tenga requisitos normativos, de cumplimiento o de cifrado avanzado que no se cumplan con el cifrado predeterminado en reposo. Para cumplir los requisitos de tu organización, puedes gestionar tus claves en lugar de que Google gestione las claves de cifrado que protegen tus datos.

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

Limitaciones

  • La grabación de datos de registro de Gemini se limita a las interacciones de los usuarios con Gemini Code Assist en un IDE. Google Cloud

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

Antes de empezar

Ver los registros de usuario y los registros de metadatos de Gemini Google Cloud

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

Consola

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

    Ve al Explorador de registros.

    Si usas la barra de búsqueda para encontrar esta página, selecciona el resultado cuya sección sea Registro.

  2. En la barra de herramientas, selecciona un proyecto de consola Google Cloud .
  3. En la barra de herramientas, despliega 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

Sustituye PROJECT_ID por el ID del proyecto cuyos registros de Gemini para Google Cloud quieras 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"
      }
    

    Sustituye PROJECT_ID por el ID del proyecto cuyos registros de Gemini para Google Cloud quieras ver.

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

    TOKEN=$(gcloud auth print-access-token)
    
  3. Usa cURL para llamar al método 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"

    Sustituye JSON_FILE_NAME por la ruta del archivo JSON que has creado en el paso anterior.

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

    La respuesta devuelve un conjunto de entradas de registro.

Registros de Gemini para Google Cloud

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

Solicitudes de usuario

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

Campo Valores y notas
LogEntry.resource.type Gemini para Google Cloud tipo de recurso: cloudaicompanion.googleapis.com/Instance.
LogEntry.resource.labels.resource_container ID único del recurso de contenedor en el que se ha usado Gemini para Google Cloud .
LogEntry.resource.labels.location Ubicación en la que se ha usado Gemini para Google Cloud .
LogEntry.resource.labels.instance_id ID único del recurso en el que se ha usado Gemini para Google Cloud .
LogEntry.labels.method Puede ser una de las siguientes opciones, en función de lo que haya invocado a logEntry:

CompleteTask: por ejemplo, una solicitud de chat de Gemini Code Assist u otro servicio de Gemini for Google Cloud .

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

CompleteCode: por ejemplo, una solicitud para completar código al trabajar en el IDE, como con las sugerencias insertadas en Gemini Code Assist.
LogEntry.labels.product Gemini para Google Cloud nombre_del_servicio. Si el producto de Gemini es Gemini Code Assist, este valor es code_assist. Google Cloud Si el producto de Gemini es Gemini Cloud Assist, este valor es cloud_assist. Google Cloud En caso contrario, este valor será unknown.
LogEntry.labels.request_id Identificador único para correlacionar una solicitud con una entrada de registro de respuesta.
LogEntry.labels.user_id Identificador del usuario que ha iniciado esta solicitud.
LogEntry.jsonPayload La carga útil de la entrada de registro.
LogEntry.logName Identifica el registro.

En el siguiente ejemplo se muestra una entrada de registro de un evento de petició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 para peticiones de sugerencias de código insertado automáticas y para pedir a Gemini Google Cloud en un archivo de código.

Los datos de las peticiones de sugerencias de código insertadas usan el objeto codeCompletionRequest (como se muestra en el siguiente ejemplo), mientras que la generación activada manualmente 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 interacciones con agentes

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 interacciones:

  • Un agente que realiza una tarea que implica el uso de herramientas (por ejemplo, el modelo 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 solicitudes

En el siguiente ejemplo se muestra una entrada de registro de una solicitud que inicia una interacción con un 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 con un 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 una interacción con un 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 de una interacción con un agente, con el ID de solicitud 4b66a582bad9cf2c:

Entrada de registro de solicitudes

{
  "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 de respuesta y las descripciones de Gemini para Google Cloud :

Campo Valores y notas
LogEntry.resource.type Gemini para Google Cloud tipo de recurso: cloudaicompanion.googleapis.com/Instance.
LogEntry.resource.labels.resource_container ID único del recurso de contenedor en el que se ha usado Gemini para Google Cloud .
LogEntry.resource.labels.location Ubicación en la que se ha usado Gemini para Google Cloud .
LogEntry.resource.labels.instance_id ID único del recurso en el que se ha usado Gemini para Google Cloud .
LogEntry.labels.method Puede ser una de las siguientes opciones, en función de lo que haya invocado a logEntry:

CompleteTask: por ejemplo, una solicitud de chat de Gemini Code Assist u otro servicio de Gemini for Google Cloud .

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

CompleteCode: por ejemplo, una solicitud para completar código al trabajar en el IDE, como con las sugerencias insertadas en Gemini Code Assist.
LogEntry.labels.product Gemini para Google Cloud nombre_del_servicio. Si el producto de Gemini es Gemini Code Assist, este valor es code_assist. Google Cloud Si el producto de Gemini es Gemini Cloud Assist, este valor es cloud_assist. Google Cloud En caso contrario, este valor será unknown.
LogEntry.labels.request_id Identificador único para correlacionar una solicitud con una entrada de registro de respuesta.
LogEntry.labels.user_id Identificador del usuario que ha iniciado esta solicitud.
LogEntry.jsonPayload La carga útil de la entrada de registro. Las citas de las fuentes que se hayan usado para generar la respuesta se incluyen 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, debe habilitar la opción de telemetría de la extensión Gemini Code Assist en las extensiones de VS Code e IntelliJ.

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

Campo Valores y notas
LogEntry.@type Gemini para Google Cloud metadatos tipo de recurso: type.googleapis.com/google.cloud.cloudaicompanion.logging.v1.MetadataLog.
LogEntry.labels.method En los registros de metadatos, el valor de esta etiqueta es Export.Metrics.
LogEntry.labels.product Gemini para Google Cloud nombre_del_servicio. Si el producto de Gemini es Gemini Code Assist, este valor es code_assist. Google Cloud Si el producto de Gemini es Gemini Cloud Assist, este valor es cloud_assist. Google Cloud En caso contrario, este valor será unknown.
LogEntry.labels.user_id Identificador del usuario que ha iniciado esta solicitud.
LogEntry.jsonPayload Indica si se trata de un evento codeExposure o code.Acceptance. Un evento codeExposure indica que se le ha mostrado una sugerencia de código a un usuario. Un evento code.Acceptance indica que el usuario ha aceptado algo, como una sobreescritura, una tabulación o una aceptación completa.
LogEntry.jsonPayload.clientName El nombre del IDE, como CloudCodeVscode.
LogEntry.jsonPayload.clientVersion El número de versión del IDE.
LogEntry.jsonPayload.codeAcceptance Solo para los IDEs VS Code e IntelliJ, indica que el usuario ha aceptado algo, como una sustitución, una tabulación o una aceptación completa. También incluye los siguientes campos:
  • linesCount: número total de líneas de código aceptadas por el usuario.
  • commentLinesCount: número 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: un identificador que vincula un evento codeExposure con cero o más eventos codeAcceptance. Se puede usar para calcular la tasa de aceptación y las líneas de código aceptadas.
  • programmingLanguage: lenguaje de programación del código aceptado, como python.
LogEntry.jsonPayload.codeExposure Solo para los IDEs de VS Code e IntelliJ, indica que se ha mostrado una sugerencia de código a un usuario. También incluye los siguientes campos:
  • programmingLanguage: lenguaje de programación de la exposición, como python.
  • originalRequestId: un identificador que vincula un evento codeExposure con cero o más eventos codeAcceptance. Se puede usar para calcular la tasa de aceptación y las líneas de código aceptadas.
LogEntry.jsonPayload.chatExposure Indica que se ha mostrado una respuesta de chat a un usuario. También incluye los siguientes campos:
  • originalRequestId: un identificador que vincula un evento chatExposure con cero o más eventos chatAcceptance. Se puede usar para calcular la tasa de aceptación de chat y las líneas de chat aceptadas.
  • is_agentic: identificador que indica si chatExposure procede del modo Agente. Se puede usar para distinguir la tasa de aceptación de conversaciones y las líneas de código aceptadas en el modo Agente y en el modo que no es Agente.
LogEntry.jsonPayload.chatAcceptance Indica que el usuario ha aceptado algo en los bloques de código de la respuesta del chat. También incluye los siguientes campos:
  • interactionType: el tipo de interacción que ha tenido el usuario con el bloque de código, como ACCEPT_CODE_BLOCK.
  • programmingLanguage: lenguaje de programación del código aceptado, como python.
  • linesCount: número total de líneas de código aceptadas por el usuario.
  • originalRequestId: un identificador que vincula un evento chatExposure con cero o más eventos chatAcceptance.
  • is_agentic: identificador que indica si chatAcceptance procede del modo Agente. Se puede usar para distinguir la tasa de aceptación de conversaciones y las líneas de código aceptadas en el modo Agente y en el modo que no es Agente.

En el siguiente ejemplo se muestra una entrada de registro 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"
}

En el siguiente ejemplo se muestra una entrada de registro 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"
} 

En el siguiente ejemplo se muestra una entrada de registro 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"
}

En el siguiente ejemplo se muestra una entrada de registro 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"
}

Calcular el porcentaje de aceptación

En las siguientes secciones se describe cómo calcular la tasa de aceptación de sugerencias de código, la tasa de aceptación de respuestas de chat y la tasa de aceptación combinada total mediante los registros de metadatos de Gemini Code Assist.

Calcular la tasa de aceptación de códigos

Para calcular la tasa de aceptación de código mediante los registros de metadatos de Gemini Code Assist, busca el número total de IDs únicos de eventos con codeAcceptance.originalRequestId y divídelo entre el número total de IDs únicos de eventos con codeExposure.originalRequestId.

Puedes acotar aún más este cálculo por lenguaje de programación y por usuario mediante los campos de metadatos de eventos de registro correspondientes.

Calcular la tasa de aceptación de chats

Para calcular la tasa de aceptación de conversaciones mediante los registros de metadatos de Gemini Code Assist, busca el número total de IDs únicos de eventos con chatAcceptance.originalRequestId y divídelo entre el número total de IDs únicos de eventos con chatExposure.originalRequestId.

Puedes acotar aún más este cálculo por lenguaje de programación y por usuario mediante los campos de metadatos de eventos de registro correspondientes.

Calcular el porcentaje de aceptación total

Para calcular la tasa de aceptación total mediante los registros de metadatos de Gemini Code Assist, busca el número total de eventos aceptados y divídelo entre el número total de eventos de exposición:

Tasa de aceptación total = Total de eventos aceptados ÷ Total de eventos de exposición

  • Total de eventos aceptados: el número total de IDs únicos de eventos con codeAcceptance.originalRequestId más el número total de IDs únicos de eventos con chatAcceptance.originalRequestId.
  • Eventos de exposición totales: el número total de IDs únicos de eventos con codeExposure.originalRequestId más el número total de IDs únicos de eventos con chatExposure.originalRequestId.

Esta fórmula proporciona una tasa 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 el número de líneas de código aceptadas de las sugerencias de código, el número de líneas de código aceptadas de la conversación y el número total de líneas de código aceptadas mediante 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 de cada codeAcceptance.originalRequestId único. A continuación, suma estos valores máximos para calcular el total de líneas de código aceptadas.

Puedes acotar aún más este cálculo por lenguaje de programación y por usuario mediante los campos de metadatos de eventos de registro correspondientes.

Calcular las líneas de código aceptadas de la conversación

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

Calcula el total de líneas de código aceptadas

Para calcular el total de líneas aceptadas mediante 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.

Siguientes pasos