Configurer la journalisation Gemini Code Assist Standard et Enterprise

Ce document explique comment configurer la journalisation Gemini Code Assist Standard et Enterprise pour un projet à l'aide de la console Google Cloud ou d'une API.

Limites

  • L'enregistrement des données de journaux Gemini Standard et Enterprise dans Google Cloud est limité aux interactions des utilisateurs avec Gemini Code Assist dans un IDE.

  • Par défaut, les journaux Gemini pour Google Cloud sont collectés par projet. Pour savoir comment configurer un projet centralisé afin de collecter les journaux de plusieurs projets, consultez Configurer la journalisation multiprojet.

  • Gemini Code Assist sur GitHub n'est pas compatible avec la journalisation avec Cloud Logging.

Avant de commencer

Vérifiez que votre projet Google Cloud est associé à un compte de facturation.

Vérifier les autorisations IAM

Pour configurer la journalisation Gemini Code Assist, vous avez besoin d'autorisations IAM spécifiques. Pour suivre le principe du moindre privilège, accordez un rôle personnalisé qui ne contient que les autorisations nécessaires.

Demandez à votre administrateur de créer un rôle personnalisé incluant les autorisations suivantes :

  • serviceusage.services.enable pour activer les API pour votre projet.
  • cloudaicompanion.loggingSettings.create pour créer des paramètres de journalisation.
  • cloudaicompanion.loggingSettings.get : permet d'afficher les paramètres de journalisation.
  • cloudaicompanion.loggingSettings.list pour lister les paramètres de journalisation.
  • cloudaicompanion.loggingSettings.update pour mettre à jour les paramètres de journalisation.
  • cloudaicompanion.loggingSettingBindings.create : permet d'associer les paramètres de journalisation à un projet.
  • cloudaicompanion.loggingSettingBindings.get : permet d'afficher les liaisons des paramètres de journalisation.
  • cloudaicompanion.loggingSettingBindings.list : pour lister les liaisons des paramètres de journalisation.

Vous pouvez également attribuer les rôles prédéfinis Administrateur des paramètres de Gemini pour Google Cloud (roles/cloudaicompanion.settingsAdmin) et Administrateur de l'utilisation des services (roles/serviceusage.serviceUsageAdmin). Toutefois, ces rôles incluent des autorisations permettant de configurer tous les paramètres d'administrateur de Gemini pour Google Cloud et de gérer l'utilisation des services, ce qui peut être plus que nécessaire pour configurer les paramètres de journalisation.

Configurer la journalisation Gemini Code Assist

Les sections suivantes décrivent les étapes à suivre pour activer la collecte et le stockage de l'activité Gemini Code Assist Standard et Enterprise dans Cloud Logging, y compris :

  • les journaux des prompts et des réponses de Gemini Code Assist Standard et Enterprise, tels que les entrées utilisateur, les informations contextuelles et les réponses ;

  • les journaux de métadonnées Gemini Code Assist Standard et Enterprise, tels que les métadonnées de télémétrie et les lignes de code acceptées par l'utilisateur.

Pour en savoir plus sur les deux types de journaux, consultez Afficher les journaux Gemini.

Activer la journalisation pour Gemini Code Assist dans un projet

Sélectionnez l'une des options suivantes :

Console

  1. Vérifiez que vous avez activé l'API Cloud Logging dans le projet.

  2. Dans la console Google Cloud, accédez à la page Administration de Gemini.

    Accéder à Gemini pour Google Cloud

    La page Gemini pour Google Cloud se charge.

  3. Cliquez sur Paramètres dans le menu de navigation de gauche.

    La page Paramètres se charge.

  4. (Facultatif) Cliquez sur Journalisation des métadonnées Code Assist pour enregistrer les métadonnées générées par les utilisateurs de Gemini Code Assist Standard et Enterprise dans le projet.

  5. (Facultatif) Cliquez sur Journalisation des prompts et des réponses de Code Assist pour enregistrer les prompts et les réponses générés par les utilisateurs de Gemini Code Assist Standard et Enterprise dans le projet.

  6. Cliquez sur Enregistrer les modifications.

API

Pour activer la journalisation pour Gemini Code Assist Standard et Enterprise, utilisez la ressource loggingSettings pour définir les paramètres de journalisation souhaités, puis utilisez la ressource loggingSettings.settingBindings pour associer les paramètres à un projet :

  1. Vérifiez que vous avez activé l'API Cloud Logging dans le projet.

  2. Créez le paramètre et une valeur spécifique à ce paramètre :

    1. Obtenez le jeton :

      TOKEN=$(gcloud auth print-access-token)
      
  3. Activez les journaux Gemini Code Assist Standard et Enterprise. Les journaux utilisateur et les journaux de métadonnées sont activés avec les champs log_prompts_and_responses et log_metadata, respectivement. Si vous ne souhaitez pas activer l'un des champs, excluez-le de la requête.

    1. Exécutez la commande suivante pour créer le paramètre :

      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"
      

      Remplacez les éléments suivants :

      • CONTAINER_PROJECT_NAME : saisissez l'ID du projet dans lequel la ressource de liaison est stockée. Il s'agit du projet parent de la liaison.
      • LOGS_SETTING_ID : saisissez un nom de paramètre unique, tel que gcalm.

      Si la commande aboutit, elle renvoie un corps de réponse qui indique que log_prompts_and_responses et log_metadata sont définis sur 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. Exécutez la commande suivante pour créer la liaison du paramètre de journaux Gemini Code Assist Standard et 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"
      

    Remplacez les éléments suivants :

    • TARGET_PROJECT_NAME : saisissez le projet cible auquel la liaison doit être associée. Il s'agit souvent du projet de conteneur. Toutefois, vous pouvez associer un paramètre à plusieurs projets afin que la ressource de paramètre n'ait pas besoin d'être dupliquée.
    • LOGS_BINDING_ID : utilisez le même LOGS_SETTING_ID que celui que vous avez utilisé pour créer le paramètre, mais ajoutez-y b1. Par exemple, utilisez gcalmb1.

    Si la commande aboutit, elle renvoie les métadonnées de l'opération au format suivant :

    {
      "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
    }
    

Désactiver la journalisation pour Gemini Code Assist dans un projet

Sélectionnez l'une des options suivantes :

Console

  1. Dans la console Google Cloud, accédez à la page Administration de Gemini.

    Accéder à Gemini pour Google Cloud

    La page Gemini pour Google Cloud se charge.

  2. Cliquez sur Paramètres dans le menu de navigation de gauche.

    La page Paramètres se charge.

  3. Cliquez sur Journalisation des métadonnées Code Assist pour désactiver l'enregistrement des métadonnées liées à l'utilisation de Gemini Code Assist Standard et Enterprise dans le projet.

  4. Cliquez sur Enregistrer les modifications.

API

Pour désactiver la journalisation pour Gemini Code Assist Standard et Enterprise, utilisez la méthode loggingSetting.

  1. Créez le paramètre et une valeur spécifique à ce paramètre :

    1. Obtenez le jeton :

      TOKEN=$(gcloud auth print-access-token)
      
  2. Exécutez la commande suivante pour désactiver les paramètres de journaux Gemini Code Assist Standard et 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"
    

    Remplacez les éléments suivants :

    • CONTAINER_PROJECT_NAME : saisissez l'ID du projet parent.
    • LOGS_SETTING_ID : saisissez le nom du paramètre existant, par exemple gcalm.

      Si la commande aboutit, elle renvoie un corps de réponse qui indique que log_prompts_and_responses et log_metadata sont définis sur 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
      }
      

Configurer la journalisation multiprojet

Vous pouvez utiliser les journaux de Gemini Code Assist pour créer des métriques et des tableaux de bord permettant de surveiller l'utilisation par projet. Si votre organisation possède plusieurs projets, vous pouvez configurer un projet de journalisation centralisée pour collecter les journaux de plusieurs projets et générer des tableaux de bord pour ces projets.

Créer un projet de journalisation centralisée

Ce projet servira de plate-forme pour les journaux de vos autres projets.

  1. Dans la console Google Cloud, accédez à la page Création de projet.

    Accéder à "Créer un projet"

  2. Dans la fenêtre Nouveau projet, saisissez les valeurs suivantes :

    • Nom du projet : nom de votre projet de journalisation centralisée.
    • Compte de facturation : sélectionnez un compte de facturation.
    • Organisation : sélectionnez votre organisation. Un projet centralisé ne peut collecter les journaux que des projets de la même organisation.
    • Emplacement : sélectionnez un emplacement.
  3. Cliquez sur Créer.

Configurer des récepteurs de journaux

Pour rediriger les journaux vers le projet centralisé, configurez des récepteurs de journaux dans chacun des projets individuels à partir desquels vous souhaitez collecter des journaux.

Pour configurer des récepteurs de journaux pour chaque projet, procédez comme suit :

  1. Dans la console Google Cloud, basculez vers un projet à partir duquel vous souhaitez collecter des journaux.
  2. Accédez à la page Routeur de journaux :

    Accéder au Routeur de journaux

  3. Cliquez sur Créer un récepteur.

  4. Dans Détails du récepteur, saisissez un nom et une description pour le récepteur, puis cliquez sur Suivant.

  5. Pour Destination du récepteur, procédez comme suit :

    1. Dans le menu Sélectionner le service de récepteur, sélectionnez Bucket Logging.
    2. Dans le menu Bucket de journaux, sélectionnez Utiliser un bucket de journaux dans un autre projet.
    3. Dans le champ Destination du récepteur, saisissez ce qui suit :

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

      Remplacez CENTRALIZED_PROJECT_ID par l'ID du projet de journalisation centralisée que vous avez créé.

    4. Cliquez sur Suivant.

  6. Dans Choisissez des journaux à inclure dans le récepteur, créez un filtre d'inclusion en saisissant ce qui suit dans le champ Filtre d'inclusion :

    resource.type="cloudaicompanion.googleapis.com/Instance"
    
  7. Cliquez sur Suivant.

  8. Dans Choisir des journaux à exclure du récepteur, laissez le filtre d'exclusion vide, puis cliquez sur Créer un récepteur.

  9. Une fois le récepteur créé, sur la page Routeur de journaux, recherchez le récepteur que vous avez créé.

  10. Dans la colonne Identité du rédacteur, copiez l'adresse e-mail complète du compte de service.

Configure access

Pour autoriser votre récepteur à écrire des journaux dans le projet centralisé, procédez comme suit :

  1. Dans la console Google Cloud, basculez vers le projet centralisé que vous avez créé.
  2. Accédez à la page IAM :

    Accéder à IAM

  3. Cliquez sur Accorder l'accès.

  4. Dans le champ Nouveaux comptes principaux, collez l'adresse e-mail du compte de service que vous avez copiée dans la section précédente.

  5. Cliquez sur Ajouter un autre rôle.

  6. Recherchez et sélectionnez le rôle Rédacteur de bucket de journaux (roles/logging.bucketWriter).

  7. Cliquez sur Enregistrer.

Créer un tableau de bord dans un projet centralisé

Une fois que vous avez configuré votre projet centralisé pour recevoir les journaux, vous pouvez créer un tableau de bord pour afficher les métriques de plusieurs projets :

  1. Dans la console Google Cloud, accédez à Surveillance > Tableaux de bord :

    Accéder à la page "Tableaux de bord"

  2. Cliquez sur Créer un tableau de bord.

  3. Dans la barre d'outils, cliquez sur Paramètres, puis sélectionnez JSON > Éditeur JSON.

  4. Dans l'éditeur JSON, collez le code suivant :

    {
      "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. Remplacez les éléments suivants :

    • CENTRALIZED_PROJECT_ID : ID du projet de journalisation centralisée que vous avez créé.
    • SOURCE_PROJECT_ID_1 et SOURCE_PROJECT_ID_2 : ID des projets à partir desquels vous souhaitez collecter les journaux. Si vous souhaitez collecter des journaux provenant de plus de deux projets, vous pouvez ajouter d'autres ID de projet aux clauses in de la requête.

Désactiver la journalisation multiprojets

Si vous avez configuré la journalisation Gemini Code Assist pour plusieurs projets, vous pouvez la désactiver en supprimant les récepteurs de journaux qui acheminent les journaux vers le projet centralisé. Pour arrêter d'envoyer des journaux d'un projet individuel vers le projet centralisé, supprimez le récepteur de journaux que vous avez créé dans ce projet :

  1. Dans la console Google Cloud, basculez vers un projet dont vous souhaitez arrêter la collecte des journaux.
  2. Accédez à la page Routeur de journaux :

    Accéder au Routeur de journaux

  3. Identifiez le récepteur qui achemine les journaux vers votre projet centralisé.

  4. Sur la ligne correspondant à ce récepteur, cliquez sur Autres actions, puis sélectionnez Supprimer le récepteur.

  5. Dans la boîte de dialogue qui s'affiche, cliquez sur Supprimer.

Répétez ces étapes pour chaque projet dont vous souhaitez arrêter d'envoyer les journaux au projet centralisé.

Étape suivante