Logging für Gemini Code Assist Standard und Enterprise konfigurieren

In diesem Dokument wird beschrieben, wie Sie die Protokollierung für Gemini Code Assist Standard und Enterprise für ein Projekt über die Google Cloud Console oder eine API konfigurieren.

Beschränkungen

  • Die Aufzeichnung von Logdaten für Gemini Standard und Enterprise in Google Cloud ist auf Nutzerinteraktionen mit Gemini Code Assist in einer IDE beschränkt.

  • Standardmäßig werden Gemini for Google Cloud-Logs pro Projekt erfasst. Eine Anleitung zum Konfigurieren eines zentralisierten Projekts zum Erfassen von Logs aus mehreren Projekten finden Sie unter Logging für mehrere Projekte einrichten.

  • Gemini Code Assist in GitHub unterstützt kein Logging mit Cloud Logging.

Hinweis

Prüfen Sie, ob Ihr Google Cloud-Projekt mit einem Rechnungskonto verknüpft ist.

IAM-Berechtigungen überprüfen

Zum Konfigurieren des Loggings für Gemini Code Assist benötigen Sie bestimmte IAM-Berechtigungen. Um das Prinzip der geringsten Berechtigung zu befolgen, weisen Sie eine benutzerdefinierte Rolle zu, die nur die erforderlichen Berechtigungen enthält.

Bitten Sie Ihren Administrator, eine benutzerdefinierte Rolle mit den folgenden Berechtigungen zu erstellen:

  • serviceusage.services.enable – zum Aktivieren von APIs für Ihr Projekt
  • cloudaicompanion.loggingSettings.create – zum Erstellen von Logging-Einstellungen
  • cloudaicompanion.loggingSettings.get – zum Aufrufen von Logging-Einstellungen
  • cloudaicompanion.loggingSettings.list – zum Auflisten von Logging-Einstellungen
  • cloudaicompanion.loggingSettings.update – zum Aktualisieren von Logging-Einstellungen
  • cloudaicompanion.loggingSettingBindings.create– zum Binden von Logging-Einstellungen an ein Projekt
  • cloudaicompanion.loggingSettingBindings.get– zum Aufrufen von Bindungen für Logging-Einstellungen
  • cloudaicompanion.loggingSettingBindings.list– zum Auflisten von Bindungen für Logging-Einstellungen

Alternativ können Sie die vordefinierten Rollen Gemini for Google Cloud Settings Admin (roles/cloudaicompanion.settingsAdmin) und Service Usage Admin (roles/serviceusage.serviceUsageAdmin) zuweisen. Diese Rollen enthalten jedoch Berechtigungen zum Konfigurieren aller Administratoreinstellungen für Gemini for Google Cloud und zum Verwalten der Dienstnutzung. Das ist möglicherweise mehr als zum Konfigurieren von Logging-Einstellungen erforderlich.

Logging für Gemini Code Assist konfigurieren

In den folgenden Abschnitten finden Sie die erforderlichen Schritte, um die Erfassung und Speicherung von Gemini Code Assist Standard- und Enterprise-Aktivitäten in Cloud Logging zu aktivieren. Dazu gehören:

  • Gemini Code Assist Standard- und Enterprise-Logs für Prompts und Antworten, z. B. Nutzereingaben, Kontextinformationen und Antworten.

  • Metadatenlogs für Gemini Code Assist Standard und Enterprise, z. B. Telemetriedaten und vom Nutzer akzeptierte Codezeilen.

Weitere Informationen zu beiden Logtypen finden Sie unter Gemini-Logs ansehen.

Logging für Gemini Code Assist in einem Projekt aktivieren

Wählen Sie eine der folgenden Optionen aus:

Console

  1. Kontrollieren Sie, dass Sie die Cloud Logging API im Projekt aktiviert haben.

  2. Rufen Sie in der Google Cloud Console die Seite Administrator für Gemini auf.

    Zu Gemini für Google Cloud

    Die Seite Gemini for Google Cloud wird geladen.

  3. Klicken Sie im linken Navigationsmenü auf Einstellungen.

    Die Seite Einstellungen wird geladen.

  4. Optional: Klicken Sie auf Logging für Code Assist-Metadaten, um die Metadaten aufzuzeichnen, die von Nutzern von Gemini Code Assist Standard und Enterprise im Projekt generiert wurden.

  5. Optional: Klicken Sie auf Logging für Code Assist-Prompts und ‑Antworten, um die Prompts und Antworten aufzuzeichnen, die von Nutzern von Gemini Code Assist Standard und Enterprise im Projekt generiert wurden.

  6. Klicken Sie auf Änderungen speichern.

API

Wenn Sie das Logging für Gemini Code Code Assist Standard und Enterprise aktivieren möchten, verwenden Sie die Ressource loggingSettings, um die gewünschten Logging Einstellungen zu definieren, und die Ressource loggingSettings.settingBindings, um die Einstellungen an ein Projekt zu binden:

  1. Kontrollieren Sie, dass Sie die Cloud Logging API im Projekt aktiviert haben.

  2. Erstellen Sie die Einstellung und einen einstellungsspezifischen Wert:

    1. Token abrufen:

      TOKEN=$(gcloud auth print-access-token)
      
  3. Aktivieren Sie Logs für Gemini Code Assist Standard und Enterprise. Nutzer- und Metadatenlogs werden mit den Feldern log_prompts_and_responses bzw. log_metadata aktiviert. Wenn Sie eines der Felder nicht aktivieren möchten, schließen Sie es aus der Anfrage aus.

    1. Führen Sie den folgenden Befehl aus, um die Einstellung zu erstellen:

      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"
      

      Ersetzen Sie Folgendes:

      • CONTAINER_PROJECT_NAME: Geben Sie die Projekt-ID des Projekts ein, in dem die Bindungsressource gespeichert ist. Dies ist das übergeordnete Projekt der Bindung.
      • LOGS_SETTING_ID: Geben Sie einen eindeutigen Namen für die Einstellung ein, z. B. gcalm.

      Wenn der Befehl erfolgreich ausgeführt wurde, wird ein Antworttext zurückgegeben, in dem log_prompts_and_responses und log_metadata auf true gesetzt sind:

      {
        "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. Führen Sie den folgenden Befehl aus, um die Bindung für die Einstellung für Gemini Code Assist Standard- und Enterprise-Logs zu erstellen:

      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"
      

    Ersetzen Sie Folgendes:

    • TARGET_PROJECT_NAME: Geben Sie das Zielprojekt ein, an das die Bindung gebunden werden soll. Das ist oft dasselbe wie das Containerprojekt. Sie können eine Einstellung jedoch an mehrere Projekte binden, sodass die Einstellungsressource nicht dupliziert werden muss.
    • LOGS_BINDING_ID: Verwenden Sie dieselbe LOGS_SETTING_ID, die Sie beim Erstellen der Einstellung verwendet haben, hängen Sie aber b1 an. Verwenden Sie zum Beispiel gcalmb1.

    Wenn der Befehl erfolgreich ist, werden die Metadaten des Vorgangs im folgenden Format zurückgegeben:

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

Logging für Gemini Code Assist in einem Projekt deaktivieren

Wählen Sie eine der folgenden Optionen aus:

Console

  1. Rufen Sie in der Google Cloud Console die Seite Administrator für Gemini auf.

    Zu Gemini für Google Cloud

    Die Seite Gemini for Google Cloud wird geladen.

  2. Klicken Sie im linken Navigationsmenü auf Einstellungen.

    Die Seite Einstellungen wird geladen.

  3. Klicken Sie auf Logging für Code Assist-Metadaten, um die Aufzeichnung der Metadaten der Nutzung von Gemini Code Assist Standard und Enterprise im Projekt zu deaktivieren.

  4. Klicken Sie auf Änderungen speichern.

API

Wenn Sie das Logging für Gemini Code Assist Standard und Enterprise deaktivieren möchten, verwenden Sie die Methode loggingSetting.

  1. Erstellen Sie die Einstellung und einen einstellungsspezifischen Wert:

    1. Token abrufen:

      TOKEN=$(gcloud auth print-access-token)
      
  2. Führen Sie den folgenden Befehl aus, um die Einstellungen für die Logs von Gemini Code Assist Standard und Enterprise zu deaktivieren:

      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"
    

    Ersetzen Sie Folgendes:

    • CONTAINER_PROJECT_NAME: Geben Sie die ID des übergeordneten Projekts ein.
    • LOGS_SETTING_ID: Geben Sie den Namen der vorhandenen Einstellung ein, z. B. gcalm.

      Wenn der Befehl erfolgreich ausgeführt wurde, wird ein Antworttext zurückgegeben, in dem log_prompts_and_responses und log_metadata auf false gesetzt sind:

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

Logging für mehrere Projekte einrichten

Sie können Logs von Gemini Code Assist verwenden, um Messwerte und Dashboards für das Monitoring der Nutzung pro Projekt zu erstellen. Wenn Ihre Organisation mehrere Projekte hat, können Sie ein zentralisiertes Logging-Projekt konfigurieren, um Logs aus mehreren Projekten zu erfassen und Dashboards für diese Projekte zu generieren.

Zentralisiertes Logging-Projekt erstellen

Dieses Projekt dient als Hub für Logs aus Ihren anderen Projekten.

  1. Rufen Sie in der Google Cloud Console die Seite Projekterstellung auf.

    Projekt erstellen

  2. Geben Sie im Fenster Neues Projekt Werte für die folgenden Felder ein:

    • Projektname: ein Name für Ihr zentralisiertes Logging-Projekt
    • Rechnungskonto: Wählen Sie ein Rechnungskonto aus.
    • Organisation: Wählen Sie Ihre Organisation aus. Ein zentralisiertes Projekt kann nur Logs aus Projekten in derselben Organisation erfassen.
    • Standort: Wählen Sie einen Standort aus.
  3. Klicken Sie auf Erstellen.

Logsenken konfigurieren

Wenn Sie Logs an das zentralisierte Projekt weiterleiten möchten, konfigurieren Sie Logsenken in jedem der einzelnen Projekte, aus denen Sie Logs erfassen möchten.

gesendet werden.

So konfigurieren Sie Logsenken für jedes Projekt:

  1. Wechseln Sie in der Google Cloud Console zu einem Projekt, aus dem Sie Logs erfassen möchten.
  2. Rufen Sie die Seite Log Router auf.

    Zum "Log Router"

  3. Klicken Sie auf Senke erstellen.

  4. Geben Sie unter Senkendetails einen Namen und eine Beschreibung für die Senke ein und klicken Sie dann auf Weiter.

  5. Gehen Sie für das Senkenziel so vor:

    1. Wählen Sie im Menü Senkendienst auswählen die Option Logging-Bucket aus.
    2. Wählen Sie im Menü Log-Bucket die Option Log-Bucket in einem anderen Projekt verwenden aus.
    3. Geben Sie im Feld Senkenziel Folgendes ein:

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

      Ersetzen Sie CENTRALIZED_PROJECT_ID durch die Projekt-ID des von Ihnen erstellten zentralisierten Logging-Projekts.

    4. Klicken Sie auf Weiter.

  6. Erstellen Sie unter Logs auswählen, die in der Senke enthalten sind einen Einschlussfilter, indem Sie Folgendes in das Feld Einschlussfilter eingeben:

    resource.type="cloudaicompanion.googleapis.com/Instance"
    
  7. Klicken Sie auf Weiter.

  8. Lassen Sie unter Logs zum Filtern aus der Senke auswählen den Ausschlussfilter leer und klicken Sie auf Senke erstellen.

  9. Suchen Sie nach dem Erstellen der Senke auf der Seite Log Router die von Ihnen erstellte Senke.

  10. Kopieren Sie in der Spalte Autor-Identität die vollständige E-Mail-Adresse des Dienstkontos.

Zugriff konfigurieren

So gewähren Sie Ihrer Senke Zugriff, um Logs in das zentralisierte Projekt zu schreiben:

  1. Wechseln Sie in der Google Cloud Console zu dem von Ihnen erstellten zentralisierten Projekt.
  2. Rufen Sie die Seite IAM auf.

    IAM aufrufen

  3. Klicken Sie auf Zugriff erlauben.

  4. Fügen Sie im Feld Neue Hauptkonten die E-Mail-Adresse des Dienstkontos ein, die Sie im vorherigen Abschnitt kopiert haben.

  5. Klicken Sie auf Weitere Rolle hinzufügen.

  6. Suchen Sie nach der Rolle Logs Bucket Writer (roles/logging.bucketWriter) und wählen Sie sie aus.

  7. Klicken Sie auf Speichern.

Dashboard im zentralisierten Projekt erstellen

Nachdem Sie Ihr zentralisiertes Projekt für den Empfang von Logs konfiguriert haben, können Sie ein Dashboard erstellen, um Messwerte aus mehreren Projekten aufzurufen:

  1. Rufen Sie in der Google Cloud Console Monitoring > Dashboards auf:

    Dashboards aufrufen

  2. Klicken Sie auf Dashboard erstellen.

  3. Klicken Sie in der Symbolleiste auf Einstellungen und wählen Sie dann JSON > JSON-Editor aus.

  4. Fügen Sie im JSON-Editor den folgenden Code ein:

    {
      "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. Ersetzen Sie Folgendes:

    • CENTRALIZED_PROJECT_ID: Die Projekt-ID des von Ihnen erstellten zentralisierten Logging-Projekts.
    • SOURCE_PROJECT_ID_1 und SOURCE_PROJECT_ID_2: Die Projekt-IDs der Projekte, aus denen Sie Logs erfassen möchten. Wenn Sie Logs aus mehr als zwei Projekten erfassen möchten, können Sie der Abfrage weitere Projekt-IDs in den in-Klauseln hinzufügen.

Logging für mehrere Projekte deaktivieren

Wenn Sie das Logging für Gemini Code Assist für mehrere Projekte konfiguriert haben, können Sie es deaktivieren, indem Sie die Logsenken löschen, die Logs an das zentralisierte Projekt weiterleiten. Wenn Sie keine Logs mehr von einem einzelnen Projekt an das zentralisierte Projekt senden möchten, löschen Sie die Logsenke, die Sie in diesem Projekt erstellt haben:

  1. Wechseln Sie in der Google Cloud Console zu einem Projekt, aus dem Sie keine Logs mehr erfassen möchten.
  2. Rufen Sie die Seite Log Router auf.

    Zum "Log Router"

  3. Suchen Sie die Senke, die Logs an Ihr zentralisiertes Projekt weiterleitet.

  4. Klicken Sie in der Zeile für diese Senke auf Weitere Aktionen und wählen Sie dann Senke löschen aus.

  5. Klicken Sie im angezeigten Dialogfeld auf Löschen.

Wiederholen Sie diese Schritte für jedes Projekt, aus dem Sie keine Logs mehr an das zentralisierte Projekt senden möchten.

Nächste Schritte