Mengonfigurasi logging Gemini Code Assist Standard dan Enterprise

Dokumen ini menjelaskan cara mengonfigurasi logging Standar dan Enterprise Gemini Code Assist untuk project menggunakan konsol Google Cloud atau API.

Batasan

  • Pencatatan data log Gemini Standard dan Enterprise dibatasi untuk interaksi pengguna dengan Gemini Code Assist dalam IDE. Google Cloud

  • Secara default, log Gemini untuk Google Cloud dikumpulkan berdasarkan per project. Untuk mengetahui petunjuk tentang cara mengonfigurasi project terpusat untuk mengumpulkan log dari beberapa project, lihat Menyiapkan logging multi-project.

  • Gemini Code Assist di GitHub tidak mendukung logging dengan Cloud Logging.

Sebelum memulai

Pastikan Google Cloud project Anda dilampirkan ke akun penagihan.

Memverifikasi izin IAM

Untuk mengonfigurasi logging Gemini Code Assist Standard dan Enterprise, Anda dapat memberi peran bawaan Identity and Access Management (IAM) Admin Setelan Gemini untuk Google Cloud (roles/cloudaicompanion.settingsAdmin), yang mencakup semua izin yang diperlukan untuk menggunakan semua setelan administrator Gemini untuk Google Cloud.

Atau, Anda dapat memperbarui peran IAM kustom. Anda harus memiliki izin IAM tertentu, yang dijelaskan di bagian berikut.

Mengonfigurasi logging Gemini Code Assist

Bagian berikut memberikan langkah-langkah yang diperlukan untuk mengaktifkan pengumpulan dan penyimpanan aktivitas Gemini Code Assist Standard dan Enterprise di Cloud Logging, termasuk:

  • Log perintah dan respons Gemini Code Assist Standard dan Enterprise, seperti input pengguna, informasi kontekstual, dan respons.

  • Log metadata Gemini Code Assist Standard dan Enterprise, seperti metadata telemetri dan baris kode yang diterima oleh pengguna.

Untuk mengetahui detail selengkapnya tentang kedua jenis log, lihat Melihat log Gemini.

Mengaktifkan logging untuk Gemini Code Assist dalam project

Pilih salah satu opsi berikut:

Konsol

  1. Pastikan Anda telah mengaktifkan Cloud Logging API di project.

  2. Pastikan Anda memiliki izin IAM berikut di project yang memiliki langganan:

    • instance.queryEffectiveSetting
    • instance.queryEffectiveSettingBindings
    • loggingSettings.create
    • loggingSettings.list
    • loggingSettings.update
    • loggingSettings.get
    • cloudaicompanion.instances.loggingSettings.use
    • cloudaicompanion.instances.queryEffectiveSetting
    • settingBindings.loggingSettingsList
    • settingBindings.loggingSettingsGet
    • settingBindings.loggingSettingsUpdate
    • settingBindings.loggingSettingsCreate
    • cloudaicompanion.settingBindings.loggingSettingsUse
    • cloudaicompanion.instances.queryEffectiveSettingBindings
  3. Di konsol Google Cloud , buka halaman Admin untuk Gemini.

    Buka Gemini untuk Google Cloud

    Halaman Gemini untuk Google Cloud akan dimuat.

  4. Klik Setelan di menu navigasi kiri.

    Halaman Setelan akan dimuat.

  5. (Opsional) Klik Logging for Code Assist metadata untuk merekam metadata yang dihasilkan oleh pengguna Gemini Code Assist Standard dan Enterprise dalam project.

  6. (Opsional) Klik Logging untuk perintah dan respons Code Assist untuk mencatat perintah dan respons yang dihasilkan oleh pengguna Gemini Code Assist Standard dan Enterprise dalam project.

  7. Klik Simpan Perubahan.

API

Untuk mengaktifkan logging untuk Gemini Code Assist Standard dan Enterprise, gunakan resource loggingSettings untuk menentukan setelan logging yang Anda inginkan, dan gunakan resource loggingSettings.settingBindings untuk mengikat setelan ke project:

  1. Pastikan Anda telah mengaktifkan Cloud Logging API di project.

  2. Pastikan Anda memiliki izin IAM berikut di project yang memiliki langganan:

    • instance.queryEffectiveSetting
    • instance.queryEffectiveSettingBindings
    • loggingSettings.create
    • loggingSettings.list
    • loggingSettings.update
    • loggingSettings.get
    • cloudaicompanion.instances.loggingSettings.use
    • cloudaicompanion.instances.queryEffectiveSetting
    • settingBindings.loggingSettingsList
    • settingBindings.loggingSettingsGet
    • settingBindings.loggingSettingsUpdate
    • settingBindings.loggingSettingsCreate
    • cloudaicompanion.settingBindings.loggingSettingsUse
    • cloudaicompanion.instances.queryEffectiveSettingBindings
  3. Buat setelan dan nilai khusus setelan:

    1. Dapatkan token:

      TOKEN=$(gcloud auth print-access-token)
      
  4. Aktifkan log Gemini Code Assist Standard dan Enterprise. Log pengguna dan log metadata diaktifkan dengan kolom log_prompts_and_responses dan log_metadata. Jika Anda tidak ingin mengaktifkan salah satu kolom, kecualikan kolom tersebut dari permintaan.

    1. Jalankan perintah berikut untuk membuat setelan:

      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"
      

      Ganti kode berikut:

      • CONTAINER_PROJECT_NAME: Masukkan project ID project tempat resource binding disimpan. Ini adalah project induk binding.
      • LOGS_SETTING_ID: Masukkan nama setelan unik, seperti gcalm.

      Jika berhasil, perintah akan menampilkan isi respons yang menunjukkan log_prompts_and_responses dan log_metadata ditetapkan ke 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. Jalankan perintah berikut untuk membuat binding setelan log Gemini Code Assist Standard dan 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"
      

    Ganti kode berikut:

    • TARGET_PROJECT_NAME: Masukkan project target yang akan mengikat binding. Project ini sering kali sama dengan project penampung. Namun, Anda dapat mengikat setelan ke beberapa project sehingga resource setelan tidak perlu diduplikasi.
    • LOGS_BINDING_ID: Gunakan LOGS_SETTING_ID yang sama saat Anda membuat setelan, tetapi tambahkan b1. Misalnya, gunakan gcalmb1.

    Jika berhasil, perintah akan menampilkan metadata operasi dalam format berikut:

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

Menonaktifkan logging untuk Gemini Code Assist dalam project

Pilih salah satu opsi berikut:

Konsol

  1. Pastikan Anda memiliki izin IAM berikut di project yang memiliki langganan:

    • instance.queryEffectiveSetting
    • instance.queryEffectiveSettingBindings
    • loggingSettings.delete
    • loggingSettings.list
    • loggingSettings.update
    • loggingSettings.get
    • cloudaicompanion.instances.loggingSettings.use
    • cloudaicompanion.instances.queryEffectiveSetting
    • settingBindings.loggingSettingsList
    • settingBindings.loggingSettingsGet
    • settingBindings.loggingSettingsUpdate
    • settingBindings.loggingSettingsDelete
    • cloudaicompanion.settingBindings.loggingSettingsUse
    • cloudaicompanion.instances.queryEffectiveSettingBindings
  2. Di konsol Google Cloud , buka halaman Admin untuk Gemini.

    Buka Gemini untuk Google Cloud

    Halaman Gemini untuk Google Cloud akan dimuat.

  3. Klik Setelan di menu navigasi kiri.

    Halaman Setelan akan dimuat.

  4. Klik Logging for Code Assist metadata untuk menonaktifkan perekaman metadata dari penggunaan Gemini Code Assist Standard dan Enterprise di project.

  5. Klik Simpan Perubahan.

API

Untuk menonaktifkan logging untuk Gemini Code Assist Standard dan Enterprise, gunakan metode loggingSetting.

  1. Pastikan Anda memiliki izin IAM berikut di project yang memiliki langganan:

    • instance.queryEffectiveSetting
    • instance.queryEffectiveSettingBindings
    • loggingSettings.create
    • loggingSettings.list
    • loggingSettings.update
    • loggingSettings.get
    • cloudaicompanion.instances.loggingSettings.use
    • cloudaicompanion.instances.queryEffectiveSetting
    • settingBindings.loggingSettingsList
    • settingBindings.loggingSettingsGet
    • settingBindings.loggingSettingsUpdate
    • settingBindings.loggingSettingsCreate
    • serviceusage.services.enable
  2. Buat setelan dan nilai khusus setelan:

    1. Dapatkan token:

      TOKEN=$(gcloud auth print-access-token)
      
  3. Jalankan perintah berikut untuk menonaktifkan setelan log Gemini Code Assist Standard dan 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"
    

    Ganti kode berikut:

    • CONTAINER_PROJECT_NAME: Masukkan project ID induk.
    • LOGS_SETTING_ID: Masukkan nama setelan yang ada, seperti gcalm.

      Jika berhasil, perintah akan menampilkan isi respons yang menunjukkan log_prompts_and_responses dan log_metadata ditetapkan ke 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
      }
      

Menyiapkan logging multi-project

Anda dapat menggunakan log dari Gemini Code Assist untuk membuat metrik dan dasbor untuk memantau penggunaan per project. Jika organisasi Anda memiliki beberapa project, Anda dapat mengonfigurasi project logging terpusat untuk mengumpulkan log dari beberapa project dan membuat dasbor di seluruh project tersebut.

Membuat project logging terpusat

Project ini akan berfungsi sebagai hub untuk log dari project Anda yang lain.

  1. Di konsol Google Cloud , buka halaman Project creation.

    Buka Buat Project

  2. Di jendela New Project, masukkan nilai untuk kolom berikut:

    • Nama project: nama untuk project logging terpusat Anda.
    • Akun penagihan: pilih akun penagihan.
    • Organisasi: pilih organisasi Anda. Project terpusat hanya dapat mengumpulkan log dari project dalam organisasi yang sama.
    • Lokasi: pilih lokasi.
  3. Klik Create.

Mengonfigurasi sink log

Untuk mengarahkan log ke project terpusat, konfigurasi sink log di setiap project individual yang ingin Anda kumpulkan lognya.

Untuk mengonfigurasi sink log untuk setiap project, lakukan hal berikut:

  1. Di konsol Google Cloud , beralihlah ke project yang ingin Anda kumpulkan lognya.
  2. Buka halaman Log Router:

    Buka Log Router

  3. Klik Create sink.

  4. Untuk Sink details, masukkan nama dan deskripsi untuk sink, lalu klik Next.

  5. Untuk Sink destination, lakukan hal berikut:

    1. Di menu Select sink service, pilih Logging bucket.
    2. Di menu Bucket log, pilih Gunakan bucket log di project lain.
    3. Di kolom Sink destination, masukkan berikut ini:

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

      Ganti CENTRALIZED_PROJECT_ID dengan project ID project logging terpusat yang Anda buat.

    4. Klik Berikutnya.

  6. Untuk Pilih log untuk disertakan dalam sink, buat filter penyertaan dengan memasukkan perintah berikut di kolom Filter penyertaan:

    resource.type="cloudaicompanion.googleapis.com/Instance"
    
  7. Klik Berikutnya.

  8. Untuk Choose logs to filter out of sink, biarkan filter pengecualian kosong, lalu klik Create sink.

  9. Setelah sink dibuat, di halaman Log Router, temukan sink yang Anda buat.

  10. Di kolom Writer Identity, salin alamat email akun layanan lengkap.

Konfigurasi akses

Untuk memberikan akses bagi sink Anda agar dapat menulis log ke project terpusat, lakukan hal berikut:

  1. Di konsol Google Cloud , beralihlah ke project terpusat yang Anda buat.
  2. Buka halaman IAM:

    Buka IAM

  3. Klik Grant access.

  4. Di kolom New principals, tempel alamat email akun layanan yang Anda salin di bagian sebelumnya.

  5. Klik Add another role.

  6. Telusuri dan pilih peran Logs Bucket Writer (roles/logging.bucketWriter).

  7. Klik Simpan.

Membuat dasbor di project terpusat

Setelah mengonfigurasi project terpusat untuk menerima log, Anda dapat membuat dasbor untuk melihat metrik dari beberapa project:

  1. Di konsol Google Cloud , buka Monitoring > Dashboards:

    Buka Dasbor

  2. Klik Buat Dasbor.

  3. Di toolbar, klik Setelan, lalu pilih JSON > Editor JSON.

  4. Di JSON Editor, tempel kode berikut:

    {
      "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. Ganti kode berikut:

    • CENTRALIZED_PROJECT_ID: Project ID dari project logging terpusat yang Anda buat.
    • SOURCE_PROJECT_ID_1 dan SOURCE_PROJECT_ID_2: Project ID project yang ingin Anda kumpulkan lognya. Jika ingin mengumpulkan log dari lebih dari dua project, Anda dapat menambahkan lebih banyak ID project ke klausa in kueri.

Menonaktifkan logging multi-project

Jika Anda mengonfigurasi logging Gemini Code Assist untuk beberapa project, Anda dapat menonaktifkannya dengan menghapus sink log yang merutekan log ke project terpusat. Untuk berhenti mengirim log dari project individual ke project terpusat, hapus sink log yang Anda buat di project tersebut:

  1. Di konsol Google Cloud , beralihlah ke project yang ingin Anda hentikan pengumpulan lognya.
  2. Buka halaman Log Router:

    Buka Log Router

  3. Identifikasi sink yang merutekan log ke project terpusat Anda.

  4. Di baris untuk sink tersebut, klik Tindakan lainnya, lalu pilih Hapus sink.

  5. Pada dialog yang muncul, klik Hapus.

Ulangi langkah-langkah ini untuk setiap project yang ingin Anda hentikan pengiriman lognya ke project terpusat.

Langkah berikutnya