Veja os registos do Gemini para Google Cloud

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 na Vertex AI. Para ativar os registos do Gemini na 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 com 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 no IDE. Google Cloud

Antes de começar

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

  1. 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.

  2. Na barra de ferramentas, selecione um Google Cloud projeto da consola.
  3. 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

  1. 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_ID pelo ID do projeto cujos registos do Gemini for Google Cloud quer ver.

  2. Obtenha um token de autenticação:

    TOKEN=$(gcloud auth print-access-token)
    
  3. Use cURL para chamar o entries.list método:

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

    Substitua JSON_FILE_NAME pelo 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 para 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 de 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"
}

Respostas do Gemini para o Google Cloud

A tabela seguinte mostra os campos de resposta do Gemini for Google Cloud e as descrições.

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 para 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 de 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. Além disso, para o VS Code, a definição de recolha de telemetria global também tem de estar ativada.

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 recursodemetadados: 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:
  • linesCount: o número total de linhas de código aceites pelo utilizador.
  • commentLinesCount: o número de linhas de comentários no código aceite pelo utilizador. Esta propriedade só aparece se o Gemini Code Assist conseguir determinar quantas das linhas aceites são linhas de comentários.
  • originalRequestId: um identificador que associa um evento codeExposure a zero ou mais eventos codeAcceptance. Pode usar esta informação para calcular a taxa de aceitação e as medidas de linhas de código aceites.
  • programmingLanguage: linguagem de programação do código aceite, como python.
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:
  • programmingLanguage: linguagem de programação da exposição, como python.
  • originalRequestId: um identificador que associa um evento codeExposure a zero ou mais eventos codeAcceptance. Pode usar esta informação para calcular a taxa de aceitação e as medidas de linhas de código aceites.
LogEntry.jsonPayload.chatExposure Indica que houve exposição de uma resposta de chat a um utilizador. Também inclui o seguinte campo:
  • originalRequestId: um identificador que associa um evento chatExposure a zero ou mais eventos codeAcceptance ou codeExposure. Pode usar esta informação para calcular a taxa de aceitação e as medidas de linhas de código aceites.
LogEntry.jsonPayload.chatAcceptance Indica que o utilizador aceitou algo nos blocos de código na resposta do chat. Também inclui os seguintes campos:
  • interactionType: o tipo de interação que o utilizador teve com o bloco de código, como ACCEPT_CODE_BLOCK.
  • programmingLanguage: linguagem de programação do código aceite, como python.
  • linesCount: o número total de linhas de código aceites pelo utilizador.
  • originalRequestId: um identificador que associa um evento chatExposure a zero ou mais eventos chatAcceptance.

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 de códigos

Para calcular a taxa de aceitação 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.

Calcular linhas de código aceites

Para calcular as linhas de código aceites, encontre o valor máximo de codeAcceptance.linesCount para um codeAcceptance.originalRequestId único. Em seguida, adicione o valor linesCount para todos os eventos codeAcceptance finais para cada originalRequestId 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 campos de eventos de registo de metadados respetivos.

O que se segue?