Acessar os registros do Gemini para Google Cloud

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 registros do Gemini no Google Cloud é limitada às interações do usuário com o Gemini Code Assist no ambiente de desenvolvimento integrado.

Além disso, se o usuário final desativar a configuração de telemetria do VS Code, o Gemini para Google Cloud não vai registrar metadados. No entanto, os registros de comandos e respostas ainda são gerados quando os administradores ativam o registro de comandos e respostas.

Antes de começar

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

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

  2. Na barra de ferramentas, selecione um projeto do console Google Cloud .
  3. Na barra de ferramentas, expanda o menu Todos os recursos e selecione o recurso Instância do 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

  1. 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_ID pelo ID do projeto cujos registros do Gemini para Google Cloud você quer visualizar.

  2. Consiga um token de autenticação:

    TOKEN=$(gcloud auth print-access-token)
    
  3. Use cURL para chamar o 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"

    Substitua JSON_FILE_NAME pelo 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.

Gemini para registros do 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 Gemini para tipo de recurso do 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 Gemini para Google Cloud nome do serviço. 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": "my-user@example.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 solicitações 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": "my-user@example.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 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 Gemini para tipo de recurso do 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 Gemini para Google Cloud nome do serviço. 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. Além disso, para o VS Code, a configuração global de coleta de telemetria também precisa estar ativada.

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 Gemini para Google Cloud nome do serviço. 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:
  • linesCount: o número total de linhas de código aceitas pelo usuário.
  • commentLinesCount: o número de linhas de comentários no código aceito pelo usuário. Essa propriedade só aparece se o Gemini Code Assist conseguir determinar quantas das linhas aceitas são linhas de comentário.
  • originalRequestId: um identificador que vincula um evento codeExposure a zero ou mais eventos codeAcceptance. Isso pode ser usado para calcular a taxa de aceitação e as medidas de linhas de código aceitas.
  • programmingLanguage: linguagem de programação do código aceito, como python.
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:
  • programmingLanguage: linguagem de programação da exposição, como python.
  • originalRequestId: um identificador que vincula um evento codeExposure a zero ou mais eventos codeAcceptance. Isso pode ser usado para calcular a taxa de aceitação e as medidas de linhas de código aceitas.
LogEntry.jsonPayload.chatExposure Indica que houve exposição de uma resposta de chat a um usuário. Também inclui o seguinte campo:
  • originalRequestId: um identificador que vincula um evento chatExposure a zero ou mais eventos codeAcceptance ou codeExposure. Isso pode ser usado para calcular a taxa de aceitação e as medidas de linhas de código aceitas.

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

Para calcular a taxa de aceitação 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 linhas de código aceitas

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

A seguir