Neste documento, descrevemos como ativar a coleta e o armazenamento da atividade do Gemini para Google Cloud , incluindo o seguinte:
- Registros de comandos e respostas do Gemini para Google Cloud , como entrada do usuário, informações contextuais e respostas.
- Registros de metadados do Gemini para Google Cloud , como metadados de telemetria e linhas de código aceitas pelo usuário.
Se precisar gerar métricas do Gemini Code Assist, consulte Monitorar o uso do Gemini para Google Cloud .
O Gemini para Google Cloud não coleta nem envia ao
Cloud Logging outras interações que o usuário possa ter tido
com o Gemini para Google Cloud, incluindo feedback por escrito. Os dados coletados
são enviados ao Cloud Logging para armazenamento. Para analisar esses dados,
pesquise entradas de registro com o tipo de recurso
cloudaicompanion.googleapis.com/Instance.
Esse recurso não registra comandos nem respostas no Gemini na Vertex AI. Para ativar os registros do Gemini na Vertex AI, consulte Ativar registros de auditoria de acesso a dados.
Os papéis do Identity and Access Management (IAM) controlam a capacidade de um principal acessar registros. É possível conceder papéis predefinidos a principais ou criar papéis personalizados. Para mais informações sobre as permissões necessárias, consulte Controle de acesso.
Por padrão, o Cloud Logging criptografa o conteúdo do cliente armazenado em repouso. Os dados armazenados em buckets de registros pelo Logging são criptografados usando chaves de criptografia de chaves, um processo conhecido como criptografia de envelope. Para acessar os dados de registro, é preciso ter acesso a essas chaves de criptografia de chaves. Elas são gerenciadas pelo Google sem que você precise realizar nenhuma ação.
Sua organização pode ter requisitos de criptografia regulamentares, relacionados à conformidade ou avançados que nossa criptografia em repouso padrão não oferece. Para atender aos requisitos da sua organização, em vez de o Google gerenciar as chaves de criptografia que protegem seus dados, você pode gerenciar suas chaves.
Para informações específicas sobre o uso de chaves de criptografia gerenciadas pelo cliente (CMEK), incluindo vantagens e limitações, consulte Chaves de criptografia gerenciadas pelo cliente.
Limitações
A gravação de dados de registro do Gemini no Google Cloud é limitada às interações do usuário com o Gemini Code Assist em um ambiente de desenvolvimento integrado.
O Gemini Code Assist no GitHub não oferece suporte ao registro em log com o Cloud Logging.
Antes de começar
-
Para receber as permissões necessárias para ver os registros do Gemini para Google Cloud , peça ao administrador para conceder a você o papel do IAM de Leitor de registros (
roles/logging.viewer) no seu projeto. Para mais informações sobre a concessão de papéis, consulte Gerenciar o acesso a projetos, pastas e organizações.Também é possível conseguir as permissões necessárias usando papéis personalizados ou outros papéis predefinidos.
Revise os preços do Cloud Logging e os preços do Gemini para Google Cloud antes de ativar o registro de Gemini para Google Cloud .
Ver registros de usuários e de metadados do Gemini para Google Cloud
Para ver os registros de usuário e de metadados do Gemini para Google Cloud , faça o seguinte:
Console
-
No console do Google Cloud , acesse a página Análise de registros:
Acessar a Análise de registros
Se você usar a barra de pesquisa para encontrar essa página, selecione o resultado com o subtítulo Logging.
- Na barra de ferramentas, selecione um projeto do console Google Cloud .
- Na barra de ferramentas, expanda o menu Todos os recursos e selecione o recurso Instância da Cloud AI Companion.
gcloud
Execute este comando:
gcloud logging read "resource.type=cloudaicompanion.googleapis.com/Instance" --project PROJECT_ID --limit 3
Substitua PROJECT_ID pelo ID do projeto cujos
registros do Gemini para Google Cloud você quer visualizar.
API
Crie um arquivo JSON com as informações a seguir:
{ "resourceNames": [ "projects/PROJECT_ID" ], "pageSize": 5, "filter": "resource.type: cloudaicompanion.googleapis.com/Instance" }Substitua
PROJECT_IDpelo ID do projeto cujos registros do Gemini para Google Cloud você quer visualizar.Consiga um token de autenticação:
TOKEN=$(gcloud auth print-access-token)Use
cURLpara chamar o métodoentries.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"
Substitua
JSON_FILE_NAMEpelo caminho para o arquivo JSON criado na etapa anterior.Para mais informações sobre autenticação, consulte Autenticar para usar REST.
A resposta retorna um conjunto de entradas de registro.
Registros do Gemini para Google Cloud
Um LogEntry é a unidade básica
de dados no Cloud Logging. As seções a seguir fornecem listas de campos encontrados
no LogEntry para um evento da plataforma Gemini para Google Cloud , como
solicitações do usuário e respostas do Gemini para Google Cloud .
Solicitações de usuários
A tabela a seguir mostra uma lista de campos encontrados em uma entrada de registro de solicitação do usuário:
| Campo | Valores e observações |
|---|---|
LogEntry.resource.type |
Tipo de recurso do Gemini para Google Cloud : cloudaicompanion.googleapis.com/Instance. |
LogEntry.resource.labels.resource_container |
ID exclusivo do contêiner de recursos em que o Gemini para Google Cloud foi usado. |
LogEntry.resource.labels.location |
Local onde o Gemini para Google Cloud foi usado. |
LogEntry.resource.labels.instance_id |
ID exclusivo do recurso em que o Gemini para Google Cloud foi usado. |
LogEntry.labels.method |
Pode ser uma das seguintes opções, dependendo do que invocou logEntry:CompleteTask: por exemplo, uma solicitação de chat do Gemini Code Assist ou outro serviço do Gemini para Google Cloud .GenerateCode: por exemplo, uma solicitação para gerar código, como uma solicitação de transformação de código no Gemini Code Assist.CompleteCode: por exemplo, uma solicitação para completar o código ao trabalhar no ambiente de desenvolvimento integrado, como com sugestões inline no Gemini Code Assist. |
LogEntry.labels.product |
Nome do serviço do Gemini para Google Cloud . Se o produto do Gemini para Google Cloud for o Gemini Code Assist, o valor será code_assist. Se o produto do Gemini para Google Cloud for o Gemini Cloud Assist, o valor será cloud_assist. Caso contrário, o valor será unknown. |
LogEntry.labels.request_id |
Um identificador exclusivo para correlacionar uma solicitação a uma entrada de registro de resposta. |
LogEntry.labels.user_id |
O identificador do usuário que iniciou esta solicitação. |
LogEntry.jsonPayload |
O payload da entrada de registro. |
LogEntry.logName |
Identifica o registro. |
A amostra a seguir mostra um exemplo de entrada de registro para um evento de solicitação 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 a seguir mostra uma entrada RequestLog para comandos de sugestão de código inline automática
e
pedir ao Gemini para Google Cloud em um arquivo de código.
Os dados de solicitação para sugestões de código inline usam o objeto codeCompletionRequest
(conforme mostrado no exemplo a seguir), 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"
}
Registros de interação com o agente
Algumas interações com o Gemini podem gerar várias entradas de registro (solicitação, resposta e metadados) para uma única ação do usuário. Confira alguns exemplos dessas interações:
- Um agente realizando uma tarefa que envolve o uso de ferramentas (por exemplo, o modelo
invocando funções internas como
read_fileoureplace, conforme mostrado nos exemplos de registros). - Um agente interagindo com outros agentes.
Entrada de registro de solicitação
Confira a seguir um exemplo de entrada de registro para uma solicitação que inicia uma interação com o 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 resposta
Confira a seguir um exemplo de entrada de registro de resposta de uma interação do 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 de registro de metadados
Confira a seguir um exemplo de entrada de registro de metadados 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 a seguir mostram outro exemplo de entradas de registro para uma interação do agente, com o ID da solicitação 4b66a582bad9cf2c:
Entrada de registro de solicitação
{
"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 resposta
{
"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 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 a seguir mostra os campos de resposta e as descrições do Gemini para Google Cloud :
| Campo | Valores e observações |
|---|---|
LogEntry.resource.type |
Tipo de recurso do Gemini para Google Cloud : cloudaicompanion.googleapis.com/Instance. |
LogEntry.resource.labels.resource_container |
ID exclusivo do contêiner de recursos em que o Gemini para Google Cloud foi usado. |
LogEntry.resource.labels.location |
Local onde o Gemini para Google Cloud foi usado. |
LogEntry.resource.labels.instance_id |
ID exclusivo do recurso em que o Gemini para Google Cloud foi usado. |
LogEntry.labels.method |
Pode ser uma das seguintes opções, dependendo do que invocou logEntry:CompleteTask: por exemplo, uma solicitação de chat do Gemini Code Assist ou outro serviço do Gemini para Google Cloud .GenerateCode: por exemplo, uma solicitação para gerar código, como uma solicitação de transformação de código no Gemini Code Assist.CompleteCode: por exemplo, uma solicitação para completar o código ao trabalhar no ambiente de desenvolvimento integrado, como com sugestões inline no Gemini Code Assist. |
LogEntry.labels.product |
Nome do serviço do Gemini para Google Cloud . Se o produto do Gemini para Google Cloud for o Gemini Code Assist, o valor será code_assist. Se o produto do Gemini para Google Cloud for o Gemini Cloud Assist, o valor será cloud_assist. Caso contrário, o valor será unknown. |
LogEntry.labels.request_id |
Um identificador exclusivo para correlacionar uma solicitação a uma entrada de registro de resposta. |
LogEntry.labels.user_id |
O identificador do usuário que iniciou esta solicitação. |
LogEntry.jsonPayload |
O payload da entrada de registro. Todas as citações de origem usadas para gerar a resposta estão incluídas nesse objeto como attribution_context. |
LogEntry.logName |
Identifica o registro. |
Registros de metadados do Gemini para Google Cloud
Para que os registros de metadados sejam gerados, a configuração de telemetria da extensão do Gemini Code Assist precisa estar ativada para as extensões do VS Code e do IntelliJ.
Os registros de metadados do Gemini para Google Cloud seguem a mesma estrutura dos registros do Gemini para Google Cloud , mas especificam campos diferentes. A tabela a seguir mostra uma lista de campos encontrados em uma entrada de registro de solicitação do usuário:
| Campo | Valores e observações |
|---|---|
LogEntry.@type |
Tipo de recurso de metadados do Gemini para Google Cloud : type.googleapis.com/google.cloud.cloudaicompanion.logging.v1.MetadataLog. |
LogEntry.labels.method |
Para registros de metadados, o valor do rótulo é Export.Metrics. |
LogEntry.labels.product |
Nome do serviço do Gemini para Google Cloud . Se o produto do Gemini para Google Cloud for o Gemini Code Assist, o valor será code_assist. Se o produto do Gemini para Google Cloud for o Gemini Cloud Assist, o valor será cloud_assist. Caso contrário, o valor será unknown. |
LogEntry.labels.user_id |
O identificador do usuário que iniciou esta solicitação. |
LogEntry.jsonPayload |
Indica um evento codeExposure ou code.Acceptance. Um evento codeExposure indica a exposição de uma sugestão de código a um usuário. Um evento code.Acceptance indica que houve algum evento de aceitação por parte do usuário, como digitação, tabulação ou aceitação total. |
LogEntry.jsonPayload.clientName |
O nome da IDE, como CloudCodeVscode. |
LogEntry.jsonPayload.clientVersion |
O número da versão do IDE. |
LogEntry.jsonPayload.codeAcceptance |
Somente para VS Code e IDEs IntelliJ. Indica que houve algum evento de aceitação por parte do usuário, como substituição, tabulação ou aceitação total. Também inclui os seguintes campos:
|
LogEntry.jsonPayload.codeExposure |
Para ambientes de desenvolvimento integrados VS Code e IntelliJ, indica que uma sugestão de código foi mostrada a um usuário. Também inclui os seguintes campos:
|
LogEntry.jsonPayload.chatExposure |
Indica que houve exposição de uma resposta de chat a um usuário. Também inclui os seguintes campos:
|
LogEntry.jsonPayload.chatAcceptance |
Indica que houve algum evento de aceitação por parte do usuário nos blocos de código na resposta do chat. Também inclui os seguintes campos:
|
Confira a seguir um exemplo de 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"
}
Confira a seguir um exemplo de 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"
}
Confira a seguir um exemplo de 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"
}
Confira a seguir um exemplo de 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 a taxa de aceitação
As seções a seguir 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 usando os registros de metadados do Gemini Code Assist.
Calcular a taxa de aceitação de código
Para calcular a taxa de aceitação de código usando os registros de metadados
do Gemini Code Assist, encontre o número total de IDs exclusivos de eventos
com codeAcceptance.originalRequestId e divida pelo número total de IDs exclusivos
de eventos com codeExposure.originalRequestId.
É possível refinar ainda mais esse cálculo por linguagem de programação e por usuário usando os respectivos campos de evento de registro de metadados.
Calcular a taxa de aceitação de chat
Para calcular a taxa de aceitação de chat usando os registros de metadados
do Gemini Code Assist, encontre o número total de IDs exclusivos de eventos
com chatAcceptance.originalRequestId e divida pelo número total de IDs exclusivos
de eventos com chatExposure.originalRequestId.
É possível refinar ainda mais esse cálculo por linguagem de programação e por usuário usando os respectivos campos de evento de registro de metadados.
Calcular a taxa total de aceitação
Para calcular a taxa de aceitação total usando os registros de metadados do Gemini Code Assist, encontre o número total de eventos aceitos e divida pelo número total de eventos de exposição:
Taxa total de aceitação = total de eventos aceitos ÷ total de eventos de exposição
- Total de eventos aceitos: o número total de IDs exclusivos de eventos com
codeAcceptance.originalRequestIdmais o número total de IDs exclusivos de eventos comchatAcceptance.originalRequestId. - Total de eventos de exposição: o número total de IDs exclusivos de eventos com
codeExposure.originalRequestIdmais o número total de IDs exclusivos de eventos comchatExposure.originalRequestId.
Essa fórmula fornece uma taxa de aceitação que reflete a probabilidade geral de qualquer sugestão ser aceita em todos os recursos do Gemini Code Assist.
Calcular linhas de código aceitas
As seções a seguir descrevem como calcular o número de linhas de código aceitas das sugestões de código, o número de linhas de código aceitas do chat e o total de linhas de código aceitas usando registros de metadados do Gemini Code Assist.
Calcular linhas de código aceitas
Para calcular as linhas de código aceitas, encontre o valor máximo de
codeAcceptance.linesCount para cada codeAcceptance.originalRequestId exclusivo.
Em seguida, some esses valores máximos para calcular o total de linhas de código aceitas.
É possível refinar ainda mais esse cálculo por linguagem de programação e por usuário usando os respectivos campos de evento de registro de metadados.
Calcular linhas de código aceitas da conversa
Para calcular as linhas de código aceitas do chat, encontre o valor do campo
chatAcceptance.linesCount para cada chatAcceptance.originalRequestId exclusivo. Em seguida, some esses valores máximos para calcular o total de linhas de chat aceitas.
Calcular o total de linhas de código aceitas
Para calcular o total de linhas aceitas usando os registros de metadados do Gemini Code Assist, adicione as linhas de código aceitas e as linhas de código aceitas do chat.
A seguir
- Saiba como ver, analisar e monitorar seus registros em Google Cloud.
- Saiba mais sobre como monitorar o uso do Gemini para Google Cloud.