Configurar geração de registro do Gemini Code Assist Standard e Enterprise

Com os registros do Gemini Code Assist Standard e Enterprise, é possível acompanhar as interações e o uso dos desenvolvedores nos seus projetos. Neste documento, descrevemos como usar o console Google Cloud ou a API REST para configurar a geração de registros do Gemini Code Assist.

Limitações

  • A gravação de dados de registro do Gemini Code Assist Standard e Enterprise é limitada às interações do usuário com o Gemini Code Assist em um ambiente de desenvolvimento integrado.

  • Por padrão, os registros do Gemini Code Assist são coletados por projeto. Para instruções sobre como configurar um projeto centralizado para coletar registros de vários projetos, consulte Configurar a geração de registros de vários projetos.

  • O Gemini Code Assist no GitHub não é compatível com o Cloud Logging.

  • Os registros do Gemini Code Assist registram uma contagem combinada de tokens (totalTokenCount) para cada solicitação de chat e agente (CompleteTask), e você pode atribuí-la a um usuário com o rótulo labels.user_id. Essa contagem aparece nos campos RequestLog.metadata.totalTokenCount, ResponseLog.metadata.totalTokenCount e MetadataLog.apiRequest.totalTokenCount. Os registros de solicitações de preenchimento e solicitação de geração de código (CompleteCode e GenerateCode) e os registros de metadados que registram eventos de telemetria, como eventos codeExposure, codeAcceptance, chatExposure e chatAcceptance, não incluem contagens de tokens. Os registros e as métricas do Cloud Monitoring não registram contagens separadas de tokens de comando e resposta. Para conferir o uso agregado de tokens do seu projeto, consulte Métricas de token e cota.

Antes de começar

Verifique se o projeto do Google Cloud está vinculado a uma conta de faturamento.

Verificar permissões do IAM

Para configurar a geração de registros do Gemini Code Assist, você precisa de permissões específicas do IAM. Para seguir o princípio de privilégio mínimo, conceda um papel personalizado que contenha apenas as permissões necessárias.

Peça ao administrador para criar um papel personalizado que inclua as seguintes permissões:

  • serviceusage.services.enable: para ativar as APIs no projeto.
  • cloudaicompanion.loggingSettings.create: para criar configurações de geração de registros.
  • cloudaicompanion.loggingSettings.get: para ver as configurações de geração de registros.
  • cloudaicompanion.loggingSettings.list: para listar as configurações de geração de registros.
  • cloudaicompanion.loggingSettings.update: para atualizar as configurações de geração de registros.
  • cloudaicompanion.loggingSettingBindings.create: para vincular as configurações de geração de registros a um projeto.
  • cloudaicompanion.loggingSettingBindings.get: para ver as vinculações de configuração de geração de registros.
  • cloudaicompanion.loggingSettingBindings.list: para listar as vinculações de configuração de geração de registros.

Como alternativa, é possível conceder os papéis predefinidos Administrador das configurações do Gemini para Google Cloud (roles/cloudaicompanion.settingsAdmin) e Administrador do Service Usage (roles/serviceusage.serviceUsageAdmin). No entanto, esses papéis incluem permissões para definir outras configurações de administrador do Gemini no Google Cloud e gerenciar o uso do serviço no Google Cloud, o que pode ser mais do que o necessário para definir as configurações de geração de registros.

Configurar a geração de registros do Gemini Code Assist

As seções a seguir fornecem as etapas necessárias para ativar a coleta e o armazenamento da atividade do Gemini Code Assist Standard e Enterprise no Cloud Logging, incluindo:

  • Registros de comandos e respostas do Gemini Code Assist Standard e Enterprise, como entradas do usuário, informações contextuais e respostas.

  • Registros de metadados do Gemini Code Assist Standard e Enterprise, como metadados de telemetria e linhas de código aceitas pelo usuário.

Para mais detalhes sobre os dois tipos de registros, consulte Ver registros do Gemini Code Assist.

Ativar a geração de registros do Gemini Code Assist em um projeto

Selecione uma das seguintes opções:

Console

  1. Verifique se você ativou a API Cloud Logging no projeto.

  2. No console do Google Cloud , acesse a página Admin do Gemini.

    Acessar Admin do Gemini

  3. Clique em Configurações no menu de navegação à esquerda.

  4. (Opcional) Clique em Registro em log de metadados do Code Assist para registrar os metadados gerados pelos usuários do Gemini Code Assist Standard e Enterprise no projeto.

  5. (Opcional) Clique em Registros de comandos e respostas do Code Assist para registrar os comandos e as respostas gerados pelos usuários do Gemini Code Assist Standard e Enterprise no projeto.

  6. Clique em Salvar alterações.

API

Para ativar a geração de registros do Gemini Code Assist Standard e Enterprise, use o recurso loggingSettings para definir as configurações de geração de registros desejadas e o recurso loggingSettings.settingBindings para vincular as configurações a um projeto:

  1. Verifique se você ativou a API Cloud Logging no projeto.

  2. Crie a configuração e um valor específico dela:

    1. Receba o token:

      TOKEN=$(gcloud auth print-access-token)
      
  3. Ative os registros do Gemini Code Assist Standard e Enterprise. Os registros de usuários e de metadados são ativados com os campos log_prompts_and_responses e log_metadata, respectivamente. Se você não quiser ativar um dos campos, exclua-o da solicitação.

    1. Execute o comando a seguir para criar a configuração:

      curl -X POST \
        -H "Authorization: Bearer $TOKEN" \
        -H 'Content-Type: application/json' \
        -d '{
          "log_prompts_and_responses": true,
          "log_metadata": true,
          } ' \
        "https://cloudaicompanion.googleapis.com/v1/projects/CONTAINER_PROJECT_NAME/locations/global/loggingSettings?logging_setting_id=LOGS_SETTING_ID"
      

      Substitua:

      • CONTAINER_PROJECT_NAME: insira o ID do projeto em que o recurso de vinculação está armazenado. Esse é o projeto principal da vinculação.
      • LOGS_SETTING_ID: insira um nome exclusivo para a configuração, como gcalm.

      Se o comando for bem-sucedido, ele vai retornar um corpo de resposta que mostra log_prompts_and_responses e log_metadata definidos como true:

      {
        "name": "projects/CONTAINER_PROJECT_NAME/locations/global/loggingSettings/LOGS_SETTING_ID",
        "createTime": "2025-01-23T15:22:49.717166932Z",
        "updateTime": "2025-01-23T15:22:49.717166932Z",
        "log_prompts_and_responses": true,
        "log_metadata": true
      }
      
    2. Execute o comando a seguir para criar a vinculação de configuração dos registros do Gemini Code Assist Standard e Enterprise:

      curl -X POST \
        -H "Authorization: Bearer $TOKEN" \
        -H 'Content-Type: application/json' \
        -d '{
          "target": "projects/TARGET_PROJECT_NAME"
          }' \
        "https://cloudaicompanion.googleapis.com/v1/projects/CONTAINER_PROJECT_NAME/locations/global/loggingSettings/LOGS_SETTING_ID/settingBindings?setting_binding_id=LOGS_BINDING_ID"
      

    Substitua:

    • TARGET_PROJECT_NAME: insira o projeto de destino a que a vinculação deve ser associada. Geralmente, é o mesmo que o projeto do contêiner. No entanto, é possível vincular uma configuração a vários projetos para que o recurso de configuração não precise ser duplicado.
    • LOGS_BINDING_ID: use o mesmo LOGS_SETTING_ID de quando você criou a configuração, mas adicione b1. Por exemplo, use gcalmb1.

    Se o comando for bem-sucedido, ele vai retornar os metadados da operação no seguinte formato:

    {
      "name": "projects/<var>CONTAINER_PROJECT_NAME</var>/locations/global/operations/operation-1737646069712-62c6140bb04bb-49261230-43701daf",
      "metadata": {
        "@type": "type.googleapis.com/google.cloud.cloudaicompanion.v1.OperationMetadata",
        "createTime": "2025-01-23T15:27:50.076075570Z",
        "target": "projects/<var>TARGET_PROJECT_NAME</var>/locations/global/loggingSettings/<var>LOGS_SETTING_ID</var>/settingBindings/<var>LOGS_BINDING_ID</var>",
        "verb": "create",
        "requestedCancellation": false,
        "apiVersion": "v1"
      },
      "done": false
    }
    

Desativar a geração de registros do Gemini Code Assist em um projeto

Selecione uma das seguintes opções:

Console

  1. No console do Google Cloud , acesse a página Admin do Gemini.

    Acessar Admin do Gemini

  2. Clique em Configurações no menu de navegação à esquerda.

  3. Clique em Registros de metadados do Code Assist para desativar a gravação dos metadados do uso do Gemini Code Assist Standard e Enterprise no projeto.

  4. Clique em Salvar alterações.

API

Para desativar a geração de registros do Gemini Code Assist Standard e Enterprise, use o método loggingSetting.

  1. Crie a configuração e um valor específico dela:

    1. Receba o token:

      TOKEN=$(gcloud auth print-access-token)
      
  2. Execute o comando a seguir para desativar as configurações de registros do Gemini Code Assist Standard e Enterprise:

      curl -X POST \
        -H "Authorization: Bearer $TOKEN" \
        -H 'Content-Type: application/json' \
        -d '{
          "log_prompts_and_responses": false,
          "log_metadata": false,
          } ' \
        "https://cloudaicompanion.googleapis.com/v1/projects/CONTAINER_PROJECT_NAME/locations/global/loggingSettings?logging_metadata_id=LOGS_SETTING_ID"
    

    Substitua:

    • CONTAINER_PROJECT_NAME: insira o ID do projeto principal.
    • LOGS_SETTING_ID: insira o nome da configuração atual, como gcalm.

      Se o comando for bem-sucedido, ele vai retornar um corpo de resposta que mostra log_prompts_and_responses e log_metadata definidos como false:

      {
        "name": "projects/CONTAINER_PROJECT_NAME/locations/global/loggingSettings/LOGS_SETTING_ID",
        "createTime": "2025-01-23T15:22:49.717166932Z",
        "updateTime": "2025-01-23T15:22:49.717166932Z",
        "log_prompts_and_responses": false,
        "log_metadata": false
      }
      

Configurar a geração de registros de vários projetos

É possível usar os registros do Gemini Code Assist para criar métricas e painéis para monitorar o uso por projeto. Se a organização tiver vários projetos, será possível configurar um projeto de geração de registros centralizada para coletar registros de vários projetos e gerar painéis neles.

Criar um projeto de geração de registros centralizada

Esse projeto vai servir como um hub para registros dos seus outros projetos.

  1. No console do Google Cloud , acesse a página Criação de projetos.

    Acessar "Criar projeto"

  2. Na janela Novo projeto, insira valores nos seguintes campos:

    • Nome do projeto: um nome para o projeto de geração de registros centralizada.
    • Conta de faturamento: selecione uma conta de faturamento.
    • Organização: selecione a sua. Um projeto centralizado só pode coletar registros de projetos na mesma organização.
    • Local: selecione um local.
  3. Clique em Criar.

Configurar coletores de registros

Para direcionar os registros ao projeto centralizado, configure coletores de registros em cada um dos projetos individuais de onde você quer coletar registros.

Para configurar coletores de registros para cada projeto, faça o seguinte:

  1. No console do Google Cloud , mude para um projeto do qual você quer coletar registros.
  2. Acesse a página Roteador de registros:

    Acessar o roteador de registros

  3. Clique em Criar coletor.

  4. Em Detalhes do coletor, insira um nome e uma descrição para o coletor e clique em Avançar.

  5. Em Destino do coletor, faça o seguinte:

    1. No menu Selecionar serviço do coletor, escolha Bucket do Logging.
    2. No menu Bucket de registros, selecione Usar bucket de registros em outro projeto.
    3. No campo Destino do coletor, insira o seguinte:

      logging.googleapis.com/projects/CENTRALIZED_PROJECT_ID/locations/global/buckets/_Default
      

      Substitua CENTRALIZED_PROJECT_ID pelo ID do projeto de geração de registros centralizada que você criou.

    4. Clique em Próxima.

  6. Em Escolher registros para incluir no coletor, crie um filtro de inclusão inserindo o seguinte no campo Filtro de inclusão:

    resource.type="cloudaicompanion.googleapis.com/Instance"
    
  7. Clique em Próxima.

  8. Em Escolher registros para filtrar fora do coletor, deixe o filtro de exclusão em branco e clique em Criar coletor.

  9. Depois que o coletor for criado, na página Roteador de registros, encontre o coletor que você criou.

  10. Na coluna Identidade do gravador, copie o endereço de e-mail completo da conta de serviço.

Configurar acesso

Para conceder acesso ao coletor para gravar registros no projeto centralizado, faça o seguinte:

  1. No console do Google Cloud , mude para o projeto centralizado que você criou.
  2. Acesse a página do IAM:

    Acessar IAM

  3. Clique em Conceder acesso.

  4. No campo Novos principais, cole o endereço de e-mail da conta de serviço que você copiou na seção anterior.

  5. Clique em Adicionar outro papel.

  6. Pesquise e selecione o papel Gravador do bucket de registros (roles/logging.bucketWriter).

  7. Clique em Salvar.

Criar um painel no projeto centralizado

Depois de configurar o projeto centralizado para receber registros, crie um painel para visualizar métricas de vários projetos:

  1. No console do Google Cloud , acesse Monitoring > Painéis:

    Ir para "Painéis"

  2. Clique em Criar painel.

  3. Na barra de ferramentas, clique em Configurações e selecione JSON > Editor JSON.

  4. No editor JSON, cole o seguinte código:

    {
      "displayName": "Multi-Project Gemini Code Assist Overview from Metadata Logs",
      "dashboardFilters": [],
      "labels": {},
      "mosaicLayout": {
        "columns": 48,
        "tiles": [
          {
            "height": 16,
            "width": 24,
            "widget": {
              "title": "Active Users by Day",
              "id": "",
              "xyChart": {
                "chartOptions": {
                  "displayHorizontal": false,
                  "mode": "COLOR",
                  "showLegend": false
                },
                "dataSets": [
                  {
                    "breakdowns": [],
                    "dimensions": [
                      {
                        "column": "event_date",
                        "columnType": "DATE",
                        "maxBinCount": 0,
                        "sortColumn": "event_date",
                        "sortOrder": "SORT_ORDER_ASCENDING",
                        "timeBinSize": "0s",
                        "xMax": 0,
                        "xMin": 0
                      }
                    ],
                    "legendTemplate": "",
                    "measures": [
                      {
                        "aggregationFunction": {
                          "parameters": [],
                          "type": "average"
                        },
                        "column": "DAU"
                      }
                    ],
                    "plotType": "LINE",
                    "targetAxis": "Y1",
                    "timeSeriesQuery": {
                      "opsAnalyticsQuery": {
                        "queryExecutionRules": {
                          "useReservedSlots": false
                        },
                        "queryHandle": "",
                        "savedQueryId": "",
                        "sql": "SELECT\n COUNT (DISTINCT JSON_VALUE(labels, '$.user_id')) as DAU, CAST(timestamp AS DATE) AS event_date\nFROM\n `CENTRALIZED_PROJECT_ID.global._Default._Default`\nWHERE\n JSON_VALUE(labels, '$.user_id') is not NULL\n AND (\n   JSON_VALUE(json_payload, '$.chatExposure.originalRequestId') is not NULL\n   OR JSON_VALUE(json_payload, '$.codeAcceptance.originalRequestId') is not NULL\n   OR JSON_VALUE(json_payload, '$.codeExposure.originalRequestId') is not NULL\n )\n AND resource.type = \"cloudaicompanion.googleapis.com/Instance\"\n AND (JSON_VALUE(resource.labels, '$.resource_container') in ('SOURCE_PROJECT_ID_1', 'SOURCE_PROJECT_ID_2') or JSON_VALUE(resource.labels, '$.project_id') in ('SOURCE_PROJECT_ID_1', 'SOURCE_PROJECT_ID_2'))\nGROUP BY\nevent_date\nORDER BY\nevent_date\n"
                      },
                      "outputFullDuration": false,
                      "unitOverride": ""
                    }
                  }
                ],
                "thresholds": [],
                "yAxis": {
                  "label": "",
                  "scale": "LINEAR"
                }
              }
            }
          },
          {
            "xPos": 24,
            "height": 16,
            "width": 24,
            "widget": {
              "title": "Acceptance Rate by Day",
              "id": "",
              "xyChart": {
                "chartOptions": {
                  "displayHorizontal": false,
                  "mode": "COLOR",
                  "showLegend": false
                },
                "dataSets": [
                  {
                    "breakdowns": [],
                    "dimensions": [
                      {
                        "column": "exposures_date",
                        "columnType": "DATE",
                        "maxBinCount": 0,
                        "sortColumn": "exposures_date",
                        "sortOrder": "SORT_ORDER_ASCENDING",
                        "timeBinSize": "0s",
                        "xMax": 0,
                        "xMin": 0
                      }
                    ],
                    "legendTemplate": "",
                    "measures": [
                      {
                        "aggregationFunction": {
                          "parameters": [],
                          "type": "average"
                        },
                        "column": "acceptance_rate"
                      }
                    ],
                    "plotType": "LINE",
                    "targetAxis": "Y1",
                    "timeSeriesQuery": {
                      "opsAnalyticsQuery": {
                        "queryExecutionRules": {
                          "useReservedSlots": false
                        },
                        "queryHandle": "",
                        "savedQueryId": "",
                        "sql": "SELECT\nexposures_date,\nacceptances_count / exposures_count as acceptance_rate\nFROM\n(\nSELECT\nCOUNT (DISTINCT JSON_VALUE(json_payload, '$.codeAcceptance.originalRequestId')) as acceptances_count, CAST(timestamp AS DATE) AS acceptances_date\nFROM\n`CENTRALIZED_PROJECT_ID.global._Default._Default`\nWHERE\nJSON_VALUE(json_payload, '$.codeAcceptance.originalRequestId') is not NULL\nAND resource.type = \"cloudaicompanion.googleapis.com/Instance\"\nAND (JSON_VALUE(resource.labels, '$.resource_container') in ('SOURCE_PROJECT_ID_1', 'SOURCE_PROJECT_ID_2') or JSON_VALUE(resource.labels, '$.project_id') in ('SOURCE_PROJECT_ID_1', 'SOURCE_PROJECT_ID_2'))\nGROUP BY\nacceptances_date\n) as acceptances\nJOIN\n(\nSELECT\nCOUNT (DISTINCT JSON_VALUE(json_payload, '$.codeExposure.originalRequestId')) as exposures_count, CAST(timestamp AS DATE) AS exposures_date\nFROM\n`CENTRALIZED_PROJECT_ID.global._Default._Default`\nWHERE\nJSON_VALUE(json_payload, '$.codeExposure.originalRequestId') is not NULL\nAND resource.type = \"cloudaicompanion.googleapis.com/Instance\"\nAND (JSON_VALUE(resource.labels, '$.resource_container') in ('SOURCE_PROJECT_ID_1', 'SOURCE_PROJECT_ID_2') or JSON_VALUE(resource.labels, '$.project_id') in ('SOURCE_PROJECT_ID_1', 'SOURCE_PROJECT_ID_2'))\nGROUP BY\nexposures_date\n) as exposures\nON\nexposures.exposures_date = acceptances.acceptances_date\nORDER BY\nexposures_date ASC"
                      },
                      "outputFullDuration": false,
                      "unitOverride": ""
                    }
                  }
                ],
                "thresholds": [],
                "yAxis": {
                  "label": "",
                  "scale": "LINEAR"
                }
              }
            }
          },
          {
            "yPos": 16,
            "height": 16,
            "width": 24,
            "widget": {
              "title": "Code Suggestions by Day",
              "id": "",
              "xyChart": {
                "chartOptions": {
                  "displayHorizontal": false,
                  "mode": "COLOR",
                  "showLegend": false
                },
                "dataSets": [
                  {
                    "breakdowns": [],
                    "dimensions": [
                      {
                        "column": "exposures_date",
                        "columnType": "DATE",
                        "maxBinCount": 0,
                        "sortColumn": "exposures_date",
                        "sortOrder": "SORT_ORDER_ASCENDING",
                        "timeBinSize": "0s",
                        "xMax": 0,
                        "xMin": 0
                      }
                    ],
                    "legendTemplate": "",
                    "measures": [
                      {
                        "aggregationFunction": {
                          "parameters": [],
                          "type": "average"
                        },
                        "column": "exposures_count"
                      }
                    ],
                    "plotType": "STACKED_BAR",
                    "targetAxis": "Y1",
                    "timeSeriesQuery": {
                      "opsAnalyticsQuery": {
                        "queryExecutionRules": {
                          "useReservedSlots": false
                        },
                        "queryHandle": "",
                        "savedQueryId": "",
                        "sql": "SELECT\n  COUNT (DISTINCT JSON_VALUE(json_payload, '$.codeExposure.originalRequestId')) as exposures_count, CAST(timestamp AS DATE) AS exposures_date\nFROM\n  `CENTRALIZED_PROJECT_ID.global._Default._Default`\nWHERE\n  JSON_VALUE(json_payload, '$.codeExposure.originalRequestId') is not NULL\n  AND resource.type = \"cloudaicompanion.googleapis.com/Instance\"\n  AND (JSON_VALUE(resource.labels, '$.resource_container') in ('SOURCE_PROJECT_ID_1', 'SOURCE_PROJECT_ID_2') or JSON_VALUE(resource.labels, '$.project_id') in ('SOURCE_PROJECT_ID_1', 'SOURCE_PROJECT_ID_2'))\nGROUP BY\n  exposures_date\nORDER BY\n  exposures_date"
                      },
                      "outputFullDuration": false,
                      "unitOverride": ""
                    }
                  }
                ],
                "thresholds": [],
                "yAxis": {
                  "label": "",
                  "scale": "LINEAR"
                }
              }
            }
          },
          {
            "yPos": 16,
            "xPos": 24,
            "height": 16,
            "width": 24,
            "widget": {
              "title": "Code Acceptances by Day",
              "id": "",
              "xyChart": {
                "chartOptions": {
                  "displayHorizontal": false,
                  "mode": "COLOR",
                  "showLegend": false
                },
                "dataSets": [
                  {
                    "breakdowns": [],
                    "dimensions": [
                      {
                        "column": "acceptances_date",
                        "columnType": "DATE",
                        "maxBinCount": 0,
                        "sortColumn": "acceptances_date",
                        "sortOrder": "SORT_ORDER_ASCENDING",
                        "timeBinSize": "0s",
                        "xMax": 0,
                        "xMin": 0
                      }
                    ],
                    "legendTemplate": "",
                    "measures": [
                      {
                        "aggregationFunction": {
                          "parameters": [],
                          "type": "average"
                        },
                        "column": "acceptances_count"
                      }
                    ],
                    "plotType": "STACKED_BAR",
                    "targetAxis": "Y1",
                    "timeSeriesQuery": {
                      "opsAnalyticsQuery": {
                        "queryExecutionRules": {
                          "useReservedSlots": false
                        },
                        "queryHandle": "",
                        "savedQueryId": "",
                        "sql": "SELECT\n  COUNT (DISTINCT JSON_VALUE(json_payload, '$.codeAcceptance.originalRequestId')) as acceptances_count, CAST(timestamp AS DATE) AS acceptances_date\nFROM\n  `CENTRALIZED_PROJECT_ID.global._Default._Default`\nWHERE\n  JSON_VALUE(json_payload, '$.codeAcceptance.originalRequestId') is not NULL\n  AND resource.type = \"cloudaicompanion.googleapis.com/Instance\"\n  AND (JSON_VALUE(resource.labels, '$.resource_container') in ('SOURCE_PROJECT_ID_1', 'SOURCE_PROJECT_ID_2') or JSON_VALUE(resource.labels, '$.project_id') in ('SOURCE_PROJECT_ID_1', 'SOURCE_PROJECT_ID_2'))\nGROUP BY\n  acceptances_date\nORDER BY\n  acceptances_date\n"
                      },
                      "outputFullDuration": false,
                      "unitOverride": ""
                    }
                  }
                ],
                "thresholds": [],
                "yAxis": {
                  "label": "",
                  "scale": "LINEAR"
                }
              }
            }
          },
          {
            "yPos": 32,
            "height": 16,
            "width": 24,
            "widget": {
              "title": "Lines of Code Accepted by Day",
              "id": "",
              "xyChart": {
                "chartOptions": {
                  "displayHorizontal": false,
                  "mode": "COLOR",
                  "showLegend": false
                },
                "dataSets": [
                  {
                    "breakdowns": [],
                    "dimensions": [
                      {
                        "column": "line_count_day",
                        "columnType": "DATE",
                        "maxBinCount": 0,
                        "sortColumn": "line_count_day",
                        "sortOrder": "SORT_ORDER_ASCENDING",
                        "timeBinSize": "0s",
                        "xMax": 0,
                        "xMin": 0
                      }
                    ],
                    "legendTemplate": "",
                    "measures": [
                      {
                        "aggregationFunction": {
                          "parameters": [],
                          "type": "average"
                        },
                        "column": "lines_count"
                      }
                    ],
                    "plotType": "STACKED_BAR",
                    "targetAxis": "Y1",
                    "timeSeriesQuery": {
                      "opsAnalyticsQuery": {
                        "queryExecutionRules": {
                          "useReservedSlots": false
                        },
                        "queryHandle": "",
                        "savedQueryId": "",
                        "sql": "SELECT\n SUM(lines) as lines_count,\n CAST(max_timestamp AS DATE) AS line_count_day\nFROM\n(\n SELECT\n   JSON_VALUE(json_payload, '$.codeAcceptance.originalRequestId') as request_id,\n   MAX(CAST(JSON_VALUE(json_payload, '$.codeAcceptance.linesCount') AS INT)) as lines,\n   MAX(timestamp) as max_timestamp\n FROM\n   `CENTRALIZED_PROJECT_ID.global._Default._Default`\n WHERE\n   JSON_VALUE(json_payload, '$.codeAcceptance.originalRequestId') is not NULL\n   AND resource.type = \"cloudaicompanion.googleapis.com/Instance\"\n   AND (JSON_VALUE(resource.labels, '$.resource_container') in ('SOURCE_PROJECT_ID_1', 'SOURCE_PROJECT_ID_2') or JSON_VALUE(resource.labels, '$.project_id') in ('SOURCE_PROJECT_ID_1', 'SOURCE_PROJECT_ID_2'))\n GROUP BY\n   request_id\n )\nGROUP BY\n line_count_day\nORDER BY\n line_count_day"
                      },
                      "outputFullDuration": false,
                      "unitOverride": ""
                    }
                  }
                ],
                "thresholds": [],
                "yAxis": {
                  "label": "",
                  "scale": "LINEAR"
                }
              }
            }
          },
          {
            "yPos": 32,
            "xPos": 24,
            "height": 16,
            "width": 24,
            "widget": {
              "title": "Chat Exposures by Day",
              "id": "",
              "xyChart": {
                "chartOptions": {
                  "displayHorizontal": false,
                  "mode": "COLOR",
                  "showLegend": false
                },
                "dataSets": [
                  {
                    "breakdowns": [],
                    "dimensions": [
                      {
                        "column": "chat_exposures_date",
                        "columnType": "DATE",
                        "maxBinCount": 0,
                        "sortColumn": "chat_exposures_date",
                        "sortOrder": "SORT_ORDER_ASCENDING",
                        "timeBinSize": "0s",
                        "xMax": 0,
                        "xMin": 0
                      }
                    ],
                    "legendTemplate": "",
                    "measures": [
                      {
                        "aggregationFunction": {
                          "parameters": [],
                          "type": "average"
                        },
                        "column": "chat_exposures_count"
                      }
                    ],
                    "plotType": "STACKED_BAR",
                    "targetAxis": "Y1",
                    "timeSeriesQuery": {
                      "opsAnalyticsQuery": {
                        "queryExecutionRules": {
                          "useReservedSlots": false
                        },
                        "queryHandle": "",
                        "savedQueryId": "",
                        "sql": "SELECT\n COUNT (DISTINCT JSON_VALUE(json_payload, '$.chatExposure.originalRequestId')) as chat_exposures_count, CAST(timestamp AS DATE) AS chat_exposures_date\nFROM\n   `CENTRALIZED_PROJECT_ID.global._Default._Default`\nWHERE\n JSON_VALUE(json_payload, '$.chatExposure.originalRequestId') is not NULL\n AND resource.type = \"cloudaicompanion.googleapis.com/Instance\"\n AND (JSON_VALUE(resource.labels, '$.resource_container') in ('SOURCE_PROJECT_ID_1', 'SOURCE_PROJECT_ID_2') or JSON_VALUE(resource.labels, '$.project_id') in ('SOURCE_PROJECT_ID_1', 'SOURCE_PROJECT_ID_2'))\nGROUP BY\n chat_exposures_date\nORDER BY\n chat_exposures_date"
                      },
                      "outputFullDuration": false,
                      "unitOverride": ""
                    }
                  }
                ],
                "thresholds": [],
                "yAxis": {
                  "label": "",
                  "scale": "LINEAR"
                }
              }
            }
          }
        ]
      }
    }
    
  5. Substitua:

    • CENTRALIZED_PROJECT_ID: o ID do projeto de geração de registros centralizada que você criou.
    • SOURCE_PROJECT_ID_1 e SOURCE_PROJECT_ID_2: os IDs dos projetos de que você quer coletar registros. Se você quiser coletar registros de mais de dois projetos, adicione mais IDs de projeto às cláusulas in da consulta.

Desativar a geração de registros de vários projetos

Se você configurou a geração de registros do Gemini Code Assist para vários projetos, é possível desativá-la excluindo os coletores de registros que encaminham registros para o projeto centralizado. Para interromper o envio de registros de um projeto individual para o projeto centralizado, exclua o coletor de registros que você criou nesse projeto:

  1. No console do Google Cloud , mude para um projeto em que você quer interromper a coleta de registros.
  2. Acesse a página Roteador de registros:

    Acessar o roteador de registros

  3. Identifique o coletor que encaminha os registros para o projeto centralizado.

  4. Na linha desse coletor, clique em Mais ações e selecione Excluir coletor.

  5. Na caixa de diálogo exibida, clique em Excluir.

Repita essas etapas para cada projeto que você quer que pare de enviar registros para o projeto centralizado.

A seguir