Configura la registrazione di Gemini Code Assist Standard ed Enterprise

Il logging di Gemini Code Assist Standard ed Enterprise ti consente di monitorare le interazioni e l'utilizzo degli sviluppatori nei tuoi progetti. Questo documento descrive come utilizzare la console Google Cloud o l'API REST per configurare il logging per Gemini Code Assist.

Limitazioni

  • La registrazione dei dati di log di Gemini Code Assist Standard ed Enterprise è limitata alle interazioni degli utenti con Gemini Code Assist all'interno di un IDE.

  • Per impostazione predefinita, i log di Gemini Code Assist vengono raccolti per progetto. Per istruzioni su come configurare un progetto centralizzato per raccogliere i log da più progetti, consulta Configura il logging multiprogetto.

  • Gemini Code Assist su GitHub non supporta il logging con Cloud Logging.

  • I log di Gemini Code Assist registrano un conteggio dei token combinato (totalTokenCount) per ogni richiesta di chat e agente (CompleteTask), che puoi attribuire a un utente con l'etichetta labels.user_id. Questo conteggio viene visualizzato nei campi RequestLog.metadata.totalTokenCount, ResponseLog.metadata.totalTokenCount e MetadataLog.apiRequest.totalTokenCount. I log per le richieste di completamento e generazione del codice (CompleteCode e GenerateCode) e i log dei metadati che registrano eventi di telemetria, come gli eventi codeExposure, codeAcceptance, chatExposure e chatAcceptance, non includono i conteggi dei token. I log e le metriche di Cloud Monitoring non registrano conteggi separati dei token di prompt e di risposta. Per visualizzare l'utilizzo aggregato dei token per il tuo progetto, consulta Metriche relative a token e quote.

Prima di iniziare

Verifica che il tuo progetto Google Cloud sia collegato a un account di fatturazione.

Verifica le autorizzazioni IAM

Per configurare il logging di Gemini Code Assist, devi disporre di autorizzazioni IAM specifiche. Per seguire il principio del privilegio minimo, concedi un ruolo personalizzato che contenga solo le autorizzazioni necessarie.

Chiedi all'amministratore di creare un ruolo personalizzato che includa le seguenti autorizzazioni:

  • serviceusage.services.enable: per abilitare le API per il tuo progetto.
  • cloudaicompanion.loggingSettings.createper creare le impostazioni di logging.
  • cloudaicompanion.loggingSettings.get: per visualizzare le impostazioni di logging.
  • cloudaicompanion.loggingSettings.list: per elencare le impostazioni di logging.
  • cloudaicompanion.loggingSettings.update: per aggiornare le impostazioni di logging.
  • cloudaicompanion.loggingSettingBindings.create: per associare le impostazioni di logging a un progetto.
  • cloudaicompanion.loggingSettingBindings.get: per visualizzare le associazioni delle impostazioni di logging.
  • cloudaicompanion.loggingSettingBindings.list: per elencare le associazioni delle impostazioni di logging.

In alternativa, puoi concedere i ruoli predefiniti Amministratore impostazioni Gemini per Google Cloud (roles/cloudaicompanion.settingsAdmin) e Amministratore utilizzo servizi (roles/serviceusage.serviceUsageAdmin). Tuttavia, questi ruoli includono le autorizzazioni per configurare altre impostazioni di amministratore di Gemini inGoogle Cloud e gestire l'utilizzo dei servizi in Google Cloud, che potrebbero essere più di quelle necessarie per configurare le impostazioni di logging.

Configura il logging di Gemini Code Assist

Le sezioni seguenti descrivono i passaggi necessari per abilitare la raccolta e l'archiviazione dell'attività di Gemini Code Assist Standard ed Enterprise in Cloud Logging, tra cui:

  • Log dei prompt e delle risposte di Gemini Code Assist Standard ed Enterprise, come input utente, informazioni contestuali e risposte.

  • Log dei metadati di Gemini Code Assist Standard ed Enterprise, ad esempio i metadati di telemetria e le righe di codice accettate dall'utente.

Per maggiori dettagli su entrambi i tipi di log, consulta Visualizza i log di Gemini Code Assist.

Abilita il logging per Gemini Code Assist in un progetto

Seleziona una delle seguenti opzioni:

Console

  1. Verifica di aver abilitato l'API Cloud Logging nel progetto.

  2. Nella console Google Cloud , vai alla pagina Amministratore per Gemini.

    Vai ad Amministratore di Gemini

  3. Fai clic su Impostazioni nel menu di navigazione a sinistra.

  4. (Facoltativo) Fai clic su Logging per i metadati di Code Assist per registrare i metadati generati dagli utenti di Gemini Code Assist Standard ed Enterprise nel progetto.

  5. (Facoltativo) Fai clic su Logging per prompt e risposte di Code Assist per registrare i prompt e le risposte generati dagli utenti di Gemini Code Assist Standard ed Enterprise nel progetto.

  6. Fai clic su Salva modifiche.

API

Per abilitare il logging per Gemini Code Assist Standard ed Enterprise, utilizza la risorsa loggingSettings per definire le impostazioni di logging che preferisci e la risorsa loggingSettings.settingBindings per associare le impostazioni a un progetto:

  1. Verifica di aver abilitato l'API Cloud Logging nel progetto.

  2. Crea l'impostazione e un valore specifico per l'impostazione:

    1. Ottieni il token:

      TOKEN=$(gcloud auth print-access-token)
      
  3. Abilita i log di Gemini Code Assist Standard ed Enterprise. I log degli utenti e i log dei metadati sono abilitati rispettivamente con i campi log_prompts_and_responses e log_metadata. Se non vuoi attivare uno dei campi, escludilo dalla richiesta.

    1. Esegui questo comando per creare l'impostazione:

      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"
      

      Sostituisci quanto segue:

      • CONTAINER_PROJECT_NAME: inserisci l'ID progetto in cui è archiviata la risorsa di associazione. Questo è il progetto principale dell'associazione.
      • LOGS_SETTING_ID: inserisci un nome univoco per l'impostazione, ad esempio gcalm.

      Se il comando ha esito positivo, restituisce un corpo della risposta che mostra log_prompts_and_responses e log_metadata impostati su 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. Esegui il comando seguente per creare l'associazione dell'impostazione dei log di Gemini Code Assist Standard ed 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"
      

    Sostituisci quanto segue:

    • TARGET_PROJECT_NAME: inserisci il progetto di destinazione a cui deve essere associata l'associazione. Spesso corrisponde al progetto container. Tuttavia, puoi associare un'impostazione a più progetti in modo che la risorsa di impostazione non debba essere duplicata.
    • LOGS_BINDING_ID: utilizza lo stesso LOGS_SETTING_ID di quando hai creato l'impostazione, ma aggiungi b1. Ad esempio, utilizza gcalmb1.

    Se il comando ha esito positivo, restituisce i metadati dell'operazione nel seguente 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
    }
    

Disabilita il logging per Gemini Code Assist in un progetto

Seleziona una delle seguenti opzioni:

Console

  1. Nella console Google Cloud , vai alla pagina Amministratore per Gemini.

    Vai ad Amministratore di Gemini

  2. Fai clic su Impostazioni nel menu di navigazione a sinistra.

  3. Fai clic su Logging per i metadati di Code Assist per disattivare la registrazione dei metadati relativi all'utilizzo di Gemini Code Assist Standard ed Enterprise nel progetto.

  4. Fai clic su Salva modifiche.

API

Per disattivare il logging per Gemini Code Assist Standard ed Enterprise, utilizza il metodo loggingSetting.

  1. Crea l'impostazione e un valore specifico per l'impostazione:

    1. Ottieni il token:

      TOKEN=$(gcloud auth print-access-token)
      
  2. Esegui questo comando per disattivare le impostazioni dei log di Gemini Code Assist Standard ed 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"
    

    Sostituisci quanto segue:

    • CONTAINER_PROJECT_NAME: inserisci l'ID progetto principale.
    • LOGS_SETTING_ID: inserisci il nome dell'impostazione esistente, ad esempio gcalm.

      Se il comando ha esito positivo, restituisce un corpo della risposta che mostra log_prompts_and_responses e log_metadata impostati su 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
      }
      

Configura il logging multi-progetto

Puoi utilizzare i log di Gemini Code Assist per creare metriche e dashboard per monitorare l'utilizzo per progetto. Se la tua organizzazione ha più progetti, puoi configurare un progetto di logging centralizzato per raccogliere i log da più progetti e generare dashboard per questi progetti.

Crea un progetto di logging centralizzato

Questo progetto fungerà da hub per i log degli altri progetti.

  1. Nella console Google Cloud , vai alla pagina Creazione progetto.

    Vai a Crea progetto

  2. Nella finestra Nuovo progetto, inserisci i valori per i seguenti campi:

    • Nome progetto: un nome per il progetto di logging centralizzato.
    • Account di fatturazione: seleziona un account di fatturazione.
    • Organizzazione: seleziona la tua organizzazione. Un progetto centralizzato può raccogliere log solo dai progetti della stessa organizzazione.
    • Località: seleziona una località.
  3. Fai clic su Crea.

Configura i sink di log

Per indirizzare i log al progetto centralizzato, configura i sink di log in ciascuno dei singoli progetti da cui vuoi raccogliere i log.

Per configurare i sink di log per ogni progetto, segui questi passaggi:

  1. Nella console Google Cloud , passa a un progetto da cui vuoi raccogliere i log.
  2. Vai alla pagina Router dei log:

    Vai al router dei log

  3. Fai clic su Crea sink.

  4. In Dettagli sink, inserisci un nome e una descrizione per il sink, quindi fai clic su Avanti.

  5. In Destinazione sink, segui questi passaggi:

    1. Nel menu Seleziona il servizio sink, seleziona Bucket di Logging.
    2. Nel menu Bucket di log, seleziona Utilizza il bucket di log in un altro progetto.
    3. Nel campo Destinazione sink, inserisci quanto segue:

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

      Sostituisci CENTRALIZED_PROJECT_ID con l'ID progetto del progetto di logging centralizzato che hai creato.

    4. Fai clic su Avanti.

  6. In Scegli i log da includere nel sink, crea un filtro di inclusione inserendo quanto segue nel campo Filtro di inclusione:

    resource.type="cloudaicompanion.googleapis.com/Instance"
    
  7. Fai clic su Avanti.

  8. In Scegli i log da escludere dal sink, lascia vuoto il filtro di esclusione e fai clic su Crea sink.

  9. Dopo aver creato il sink, nella pagina Router dei log, individua il sink che hai creato.

  10. Nella colonna Identità writer, copia l'indirizzo email completo del account di servizio.

Configura l'accesso

Per concedere al sink l'accesso per scrivere i log nel progetto centralizzato, segui questi passaggi:

  1. Nella console Google Cloud , passa al progetto centralizzato che hai creato.
  2. Vai alla pagina IAM:

    Vai a IAM

  3. Fai clic su Concedi l'accesso.

  4. Nel campo Nuove entità, incolla l'indirizzo email del account di servizio che hai copiato nella sezione precedente.

  5. Fai clic su Aggiungi un altro ruolo.

  6. Cerca e seleziona il ruolo Writer bucket di log (roles/logging.bucketWriter).

  7. Fai clic su Salva.

Crea una dashboard nel progetto centralizzato

Dopo aver configurato il progetto centralizzato per la ricezione dei log, puoi creare una dashboard per visualizzare le metriche di più progetti:

  1. Nella console Google Cloud , vai a Monitoring > Dashboard:

    Vai a Dashboard

  2. Fai clic su Crea dashboard.

  3. Nella barra degli strumenti, fai clic su Impostazioni, quindi seleziona JSON > Editor JSON.

  4. Nell'editor JSON, incolla il seguente codice:

    {
      "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. Sostituisci quanto segue:

    • CENTRALIZED_PROJECT_ID: l'ID progetto del progetto di logging centralizzato che hai creato.
    • SOURCE_PROJECT_ID_1 e SOURCE_PROJECT_ID_2: gli ID progetto dei progetti da cui vuoi raccogliere i log. Se vuoi raccogliere i log da più di due progetti, puoi aggiungere altri ID progetto alle clausole in della query.

Disabilita il logging multi-progetto

Se hai configurato il logging di Gemini Code Assist per più progetti, puoi disattivarlo eliminando i sink di log che instradano i log al progetto centralizzato. Per interrompere l'invio dei log da un singolo progetto al progetto centralizzato, elimina il sink di log che hai creato in quel progetto:

  1. Nella console Google Cloud , passa a un progetto da cui vuoi interrompere la raccolta dei log.
  2. Vai alla pagina Router dei log:

    Vai al router dei log

  3. Identifica il sink che indirizza i log al tuo progetto centralizzato.

  4. Nella riga del sink, fai clic su Altre azioni e seleziona Elimina sink.

  5. Nella finestra di dialogo visualizzata, fai clic su Elimina.

Ripeti questi passaggi per ogni progetto per cui vuoi interrompere l'invio dei log al progetto centralizzato.

Passaggi successivi