Este documento descreve como pode ativar a recolha e o armazenamento da atividade do Gemini for Google Cloud , incluindo o seguinte:
- Gemini para Google Cloud comandos e registos de respostas, como introdução do utilizador, informações contextuais e respostas.
- Gemini para Google Cloud registos de metadados, como metadados de telemetria e linhas de código aceites pelo utilizador.
Se precisar de gerar métricas do Gemini Code Assist, consulte o artigo Monitorizar a utilização do Google Cloud Gemini.
O Gemini para Google Cloud não recolhe nem envia para o Cloud Logging quaisquer outras interações que o utilizador possa ter tido com o
Gemini para Google Cloud, incluindo feedback escrito. Os
dados recolhidos são enviados para o Cloud Logging para armazenamento. Pode rever estes dados pesquisando entradas de registo com o tipo de recurso cloudaicompanion.googleapis.com/Instance.
Esta funcionalidade não regista comandos nem respostas no Gemini no Vertex AI. Para ativar os registos do Gemini no Vertex AI, consulte o artigo Ative os registos de auditoria de acesso a dados.
As funções de gestão de identidade e de acesso (IAM) controlam a capacidade de um principal aceder aos registos. Pode conceder funções predefinidas a responsáveis ou criar funções personalizadas. Para mais informações sobre as autorizações necessárias, consulte o artigo Controlo de acesso.
Por predefinição, o Cloud Logging encripta o conteúdo do cliente armazenado em repouso. Os dados armazenados em contentores de registos pelo Logging são encriptados usando chaves de encriptação de chaves, um processo conhecido como encriptação de envelope. O acesso aos seus dados de registo requer acesso a essas chaves de encriptação de chaves, que a Google gere por si sem que tenha de realizar qualquer ação.
A sua organização pode ter requisitos regulamentares, relacionados com a conformidade ou de encriptação avançada que a nossa encriptação em repouso predefinida não oferece. Para cumprir os requisitos da sua organização, em vez de a Google gerir as chaves de encriptação que protegem os seus dados, pode gerir as suas chaves.
Para informações específicas sobre a utilização de chaves de encriptação geridas pelo cliente (CMEK), incluindo vantagens e limitações, consulte o artigo Chaves de encriptação geridas pelo cliente.
Limitações
A gravação de dados de registo do Gemini está limitada às interações do utilizador com o Gemini Code Assist num IDE. Google Cloud
O Gemini Code Assist no GitHub não suporta o registo com o Cloud Logging.
Antes de começar
-
Para receber as autorizações de que precisa para ver os registos do Gemini Google Cloud , peça ao seu administrador para lhe conceder a função de IAM de leitor de registos (
roles/logging.viewer) no seu projeto. Para mais informações sobre a atribuição de funções, consulte o artigo Faça a gestão do acesso a projetos, pastas e organizações.Também pode conseguir as autorizações necessárias através de funções personalizadas ou outras funções predefinidas.
Reveja os preços do Cloud Logging e os preços do Gemini para Google Cloud antes de ativar o Gemini para Google Cloud registo.
Veja os Google Cloud registos de utilizadores e os registos de metadados do Gemini
Para ver os registos de utilizador e os registos de metadados do Gemini for Google Cloud Google Workspace: faça uma das seguintes ações:
Consola
-
Na Google Cloud consola, aceda à página Explorador de registos:
Aceda ao Explorador de registos
Se usar a barra de pesquisa para encontrar esta página, selecione o resultado cuja legenda é Registo.
- Na barra de ferramentas, selecione um Google Cloud projeto da consola.
- Na barra de ferramentas, expanda o menu Todos os recursos e selecione o recurso Instância do Cloud AI Companion.
gcloud
Execute o seguinte comando:
gcloud logging read "resource.type=cloudaicompanion.googleapis.com/Instance" --project PROJECT_ID --limit 3
Substitua PROJECT_ID pelo ID do projeto cujos registos do
Gemini for Google Cloud quer ver.
API
Crie um ficheiro JSON que contenha as seguintes informações:
{ "resourceNames": [ "projects/PROJECT_ID" ], "pageSize": 5, "filter": "resource.type: cloudaicompanion.googleapis.com/Instance" }Substitua
PROJECT_IDpelo ID do projeto cujos registos do Gemini for Google Cloud quer ver.Obtenha um token de autenticação:
TOKEN=$(gcloud auth print-access-token)Use
cURLpara chamar oentries.listmé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"
Substitua
JSON_FILE_NAMEpelo caminho do ficheiro JSON que criou no passo anterior.Para mais informações sobre a autenticação, consulte o artigo Autentique-se para usar REST.
A resposta devolve um conjunto de entradas de registo.
Gemini para registos Google Cloud
Uma LogEntry é a unidade básica de dados no Cloud Logging. As secções seguintes fornecem listas de campos encontrados no LogEntry para um evento da plataforma do Gemini para Google Cloud , como pedidos do utilizador e respostas do Gemini para Google Cloud .
Pedidos de utilizadores
A tabela seguinte mostra uma lista de campos encontrados numa entrada do registo de pedidos do utilizador:
| Campo | Valores e notas |
|---|---|
LogEntry.resource.type |
Gemini para o Google Cloud tipo de recurso: cloudaicompanion.googleapis.com/Instance. |
LogEntry.resource.labels.resource_container |
ID exclusivo do contentor de recursos onde o Gemini for Google Cloud foi usado. |
LogEntry.resource.labels.location |
Localização onde o Gemini para Google Cloud foi usado. |
LogEntry.resource.labels.instance_id |
ID exclusivo do recurso onde o Gemini for Google Cloud foi usado. |
LogEntry.labels.method |
Pode ser uma das seguintes opções, consoante o que invocou logEntry:CompleteTask: por exemplo, um pedido de chat do Gemini Code Assist ou outro serviço do Gemini for Google Cloud .GenerateCode: por exemplo, um pedido para gerar código, como um pedido de transformação de código no Gemini Code Assist.CompleteCode: por exemplo, um pedido para concluir código quando trabalha no IDE, como com sugestões inline no Gemini Code Assist. |
LogEntry.labels.product |
Gemini para Google Cloud service name. Se o produto Gemini for o Gemini Code Assist, este valor é code_assist. Google Cloud Se o produto Gemini for o Gemini Cloud Assist, este valor é cloud_assist. Google Cloud Caso contrário, este valor é unknown. |
LogEntry.labels.request_id |
Um identificador exclusivo para correlacionar um pedido com uma entrada do registo de resposta. |
LogEntry.labels.user_id |
O identificador do utilizador que iniciou este pedido. |
LogEntry.jsonPayload |
O payload da entrada do registo. |
LogEntry.logName |
Identifica o registo. |
O exemplo seguinte mostra uma entrada de registo de exemplo para um evento de comando 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"
}
O exemplo seguinte mostra uma entrada RequestLog para sugestões de código inline
automáticas
e comandos para
pedir ao Gemini Google Cloud num ficheiro de código.
Os dados de comandos para sugestões de código inline usam o objeto codeCompletionRequest (conforme mostrado no exemplo seguinte), enquanto a geração acionada 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"
}
Registos de interações do agente
Algumas interações com o Gemini podem gerar várias entradas de registo (pedido, resposta e metadados) para uma única ação do utilizador. Alguns exemplos de tais interações incluem o seguinte:
- Um agente que executa uma tarefa que envolve a utilização de ferramentas (por exemplo, o modelo que invoca funções internas como
read_fileoureplace, conforme mostrado nos exemplos de registos). - Um agente a interagir com outros agentes.
Entrada do registo de pedidos
O exemplo seguinte mostra uma entrada de registo de exemplo para um pedido que inicia uma interação com um 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 do registo de respostas
A amostra seguinte mostra uma entrada de registo de resposta de exemplo de uma interação de agente que inclui várias mensagens:
{
"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 do registo de metadados
O exemplo seguinte mostra uma entrada de registo de metadados de exemplo de uma interação com um 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"
}
Os exemplos seguintes mostram outro exemplo de entradas de registo para uma interação com um agente, com o ID do pedido 4b66a582bad9cf2c:
Pedir entrada no registo
{
"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 do registo de respostas
{
"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 do registo de metadados
{
"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"
}
Respostas do Gemini para Google Cloud
A tabela seguinte mostra os campos de resposta e as descrições do Gemini for Google Cloud :
| Campo | Valores e notas |
|---|---|
LogEntry.resource.type |
Gemini para o Google Cloud tipo de recurso: cloudaicompanion.googleapis.com/Instance. |
LogEntry.resource.labels.resource_container |
ID exclusivo do contentor de recursos onde o Gemini for Google Cloud foi usado. |
LogEntry.resource.labels.location |
Localização onde o Gemini para Google Cloud foi usado. |
LogEntry.resource.labels.instance_id |
ID exclusivo do recurso onde o Gemini for Google Cloud foi usado. |
LogEntry.labels.method |
Pode ser uma das seguintes opções, consoante o que invocou logEntry:CompleteTask: por exemplo, um pedido de chat do Gemini Code Assist ou outro serviço do Gemini for Google Cloud .GenerateCode: por exemplo, um pedido para gerar código, como um pedido de transformação de código no Gemini Code Assist.CompleteCode: por exemplo, um pedido para concluir código quando trabalha no IDE, como com sugestões inline no Gemini Code Assist. |
LogEntry.labels.product |
Gemini para Google Cloud service name. Se o produto Gemini for o Gemini Code Assist, este valor é code_assist. Google Cloud Se o produto Gemini for o Gemini Cloud Assist, este valor é cloud_assist. Google Cloud Caso contrário, este valor é unknown. |
LogEntry.labels.request_id |
Um identificador exclusivo para correlacionar um pedido com uma entrada do registo de resposta. |
LogEntry.labels.user_id |
O identificador do utilizador que iniciou este pedido. |
LogEntry.jsonPayload |
O payload da entrada do registo. Todas as citações de fontes usadas para gerar a resposta estão incluídas neste objeto como attribution_context. |
LogEntry.logName |
Identifica o registo. |
Gemini para Google Cloud registos de metadados
Para que os registos de metadados sejam gerados, a definição de telemetria da extensão Gemini Code Assist tem de estar ativada para as extensões do VS Code e do IntelliJ.
Os registos de metadados do Gemini seguem a mesma estrutura que os registos do Gemini, mas especificam campos diferentes. Google Cloud Google Cloud A tabela seguinte mostra uma lista de campos encontrados numa entrada do registo de pedidos do utilizador:
| Campo | Valores e notas |
|---|---|
LogEntry.@type |
Gemini para o Google Cloud tipo de recursode metadados: type.googleapis.com/google.cloud.cloudaicompanion.logging.v1.MetadataLog. |
LogEntry.labels.method |
Para registos de metadados, o valor desta etiqueta é Export.Metrics. |
LogEntry.labels.product |
Gemini para Google Cloud service name. Se o produto Gemini for o Gemini Code Assist, este valor é code_assist. Google Cloud Se o produto Gemini for o Gemini Cloud Assist, este valor é cloud_assist. Google Cloud Caso contrário, este valor é unknown. |
LogEntry.labels.user_id |
O identificador do utilizador que iniciou este pedido. |
LogEntry.jsonPayload |
Indica um evento codeExposure ou um evento code.Acceptance. Um evento codeExposure indica uma exposição de uma sugestão de código a um utilizador. Um evento code.Acceptance indica que houve algum evento de aceitação por parte do utilizador, como a substituição de texto, a utilização da tecla Tab ou a aceitação total. |
LogEntry.jsonPayload.clientName |
O nome do IDE, como CloudCodeVscode. |
LogEntry.jsonPayload.clientVersion |
O número da versão do IDE. |
LogEntry.jsonPayload.codeAcceptance |
Apenas para os IDEs VS Code e IntelliJ, indica que houve algum evento de aceitação por parte do utilizador, como substituição, tabulação ou aceitação total. Também inclui os seguintes campos:
|
LogEntry.jsonPayload.codeExposure |
Apenas para os IDEs VS Code e IntelliJ, indica que houve exposição de uma sugestão de código a um utilizador. Também inclui os seguintes campos:
|
LogEntry.jsonPayload.chatExposure |
Indica que houve exposição de uma resposta de chat a um utilizador. Também inclui os seguintes campos:
|
LogEntry.jsonPayload.chatAcceptance |
Indica que o utilizador aceitou algum evento nos blocos de código na resposta do chat. Também inclui os seguintes campos:
|
O exemplo seguinte mostra uma entrada de registo codeExposure de exemplo:
{
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"
}
O exemplo seguinte mostra uma entrada de registo codeAcceptance de exemplo:
{
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"
}
O exemplo seguinte mostra uma entrada de registo chatAcceptance de exemplo:
{
"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"
}
O exemplo seguinte mostra uma entrada de registo chatExposure de exemplo:
{
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"
}
Calcule a taxa de aceitação
As secções seguintes descrevem como calcular a taxa de aceitação de sugestões de código, a taxa de aceitação de respostas do chat e a taxa de aceitação combinada total através dos registos de metadados do Gemini Code Assist.
Calcule a taxa de aceitação de códigos
Para calcular a taxa de aceitação de código através dos registos de metadados do Gemini Code Assist, encontre o número total de IDs únicos de eventos com codeAcceptance.originalRequestId e divida-o pelo número total de IDs únicos de eventos com codeExposure.originalRequestId.
Pode refinar ainda mais este cálculo por linguagem de programação e por utilizador através dos respetivos campos de eventos de registo de metadados.
Calcule a taxa de aceitação de chats
Para calcular a taxa de aceitação de chat com os registos de metadados do Gemini Code Assist, encontre o número total de IDs únicos de eventos com chatAcceptance.originalRequestId e divida-o pelo número total de IDs únicos de eventos com chatExposure.originalRequestId.
Pode refinar ainda mais este cálculo por linguagem de programação e por utilizador através dos respetivos campos de eventos de registo de metadados.
Calcule a taxa de aceitação total
Para calcular a taxa de aceitação total através dos registos de metadados do Gemini Code Assist, encontre o número total de eventos aceites e divida-o pelo número total de eventos de exposição:
Taxa de aceitação total = Total de eventos aceites ÷ Total de eventos de exposição
- Total de eventos aceites: o número total de IDs únicos de eventos com
codeAcceptance.originalRequestId, mais o número total de IDs únicos de eventos comchatAcceptance.originalRequestId. - Total de eventos de exposição: o número total de IDs únicos de eventos com
codeExposure.originalRequestId, mais o número total de IDs únicos de eventos comchatExposure.originalRequestId.
Esta fórmula oferece uma taxa de aceitação que reflete a probabilidade geral de qualquer sugestão ser aceite em todas as funcionalidades do Gemini Code Assist.
Calcule as linhas de código aceites
As secções seguintes descrevem como calcular o número de linhas de código aceites a partir de sugestões de código, o número de linhas de código aceites a partir do chat e o total de linhas de código aceites através dos registos de metadados do Gemini Code Assist.
Calcule as linhas de código aceites
Para calcular as linhas de código aceites, encontre o valor máximo para codeAcceptance.linesCount para cada codeAcceptance.originalRequestId único.
Em seguida, some estes valores máximos para calcular o total de linhas de código aceites.
Pode refinar ainda mais este cálculo por linguagem de programação e por utilizador através dos respetivos campos de eventos de registo de metadados.
Calcule as linhas de código aceites a partir do chat
Para calcular as linhas de código aceites do chat, encontre o valor do campo chatAcceptance.linesCount para cada chatAcceptance.originalRequestId único. Em seguida, some estes valores máximos para calcular o total de linhas de chat aceites.
Calcular o total de linhas de código aceites
Para calcular o total de linhas aceites através dos registos de metadados do Gemini Code Assist, adicione as linhas de código aceites e as linhas de código aceites do chat.
O que se segue?
- Saiba como ver, analisar e monitorizar os seus registos no Google Cloud.
- Saiba como monitorizar a utilização do Gemini para Google Cloud.