ضبط إعدادات تسجيل Gemini Code Assist Standard وEnterprise

يوضّح هذا المستند كيفية ضبط إعدادات تسجيل Gemini Code Assist Standard وEnterprise لأحد المشاريع باستخدام Google Cloud Console أو إحدى واجهات برمجة التطبيقات.

القيود

  • يقتصر تسجيل بيانات السجلّ في Gemini Standard وEnterprise في Google Cloud على تفاعلات المستخدمين مع Gemini Code Assist ضمن بيئة تطوير متكاملة (IDE).

  • يتم تلقائيًا جمع سجلات "Gemini في Google Cloud" على مستوى كل مشروع. للحصول على تعليمات حول كيفية إعداد مشروع مركزي لجمع السجلات من مشاريع متعددة، يُرجى الاطّلاع على إعداد تسجيل الدخول إلى مشاريع متعددة.

  • لا يتيح Gemini Code Assist على GitHub تسجيل الدخول باستخدام Cloud Logging.

قبل البدء

تأكَّد من أنّ مشروعك على Google Cloud مرتبط بحساب فوترة.

التحقّق من أذونات "إدارة الهوية وإمكانية الوصول"

لضبط إعدادات تسجيل Gemini Code Assist، تحتاج إلى أذونات IAM معيّنة. للتوافق مع مبدأ الحدّ الأدنى من الأذونات المميّزة، امنح دورًا مخصّصًا يحتوي على الأذونات اللازمة فقط.

اطلب من المشرف إنشاء دور مخصّص يتضمّن الأذونات التالية:

  • serviceusage.services.enable: لتفعيل واجهات برمجة التطبيقات لمشروعك
  • cloudaicompanion.loggingSettings.create—لإنشاء إعدادات التسجيل
  • cloudaicompanion.loggingSettings.get لعرض إعدادات التسجيل
  • cloudaicompanion.loggingSettings.list: لعرض إعدادات التسجيل
  • cloudaicompanion.loggingSettings.update لتعديل إعدادات التسجيل
  • cloudaicompanion.loggingSettingBindings.create—لربط إعدادات التسجيل بمشروع.
  • cloudaicompanion.loggingSettingBindings.get—لعرض عمليات الربط الخاصة بإعدادات التسجيل.
  • cloudaicompanion.loggingSettingBindings.list—لعرض قائمة بعمليات ربط إعدادات التسجيل.

بدلاً من ذلك، يمكنك منح الأدوار المحدّدة مسبقًا مشرف إعدادات Gemini في Google Cloud (roles/cloudaicompanion.settingsAdmin) ومشرف استخدام الخدمة (roles/serviceusage.serviceUsageAdmin). ومع ذلك، تتضمّن هذه الأدوار أذونات لتعديل جميع إعدادات مشرفي Gemini في Google Cloud وإدارة استخدام الخدمة، ما قد يكون أكثر من المطلوب لتعديل إعدادات التسجيل.

ضبط إعدادات تسجيل Gemini Code Assist

توفّر الأقسام التالية الخطوات المطلوبة لتفعيل جمع نشاط Gemini Code Assist Standard وEnterprise وتخزينه في Cloud Logging، بما في ذلك:

  • سجلات الطلبات والردود في Gemini Code Assist Standard وEnterprise، مثل بيانات أدخلها المستخدم والمعلومات السياقية والردود

  • سجلات بيانات وصفية لإصدارَي Standard وEnterprise من Gemini Code Assist، مثل بيانات وصفية عن قياس استخدام المنتج وأسطر الرموز البرمجية التي يوافق عليها المستخدم

لمزيد من التفاصيل حول كلا النوعين من السجلات، راجِع عرض سجلّات Gemini.

تفعيل التسجيل في Gemini Code Assist في أحد المشاريع

اختر أحد الخيارات التالية:

وحدة التحكّم

  1. تأكَّد من تفعيل واجهة برمجة التطبيقات Cloud Logging في المشروع.

  2. في وحدة تحكّم Google Cloud، انتقِل إلى صفحة مشرف Gemini.

    الانتقال إلى "Gemini في Google Cloud"

    يتم تحميل صفحة Gemini في Google Cloud.

  3. انقر على الإعدادات في قائمة التنقّل اليمنى.

    يتم تحميل صفحة الإعدادات.

  4. (اختياري) انقر على تسجيل بيانات وصفية في Code Assist لتسجيل البيانات الوصفية التي ينشئها مستخدمو Gemini Code Assist Standard وEnterprise في المشروع.

  5. (اختياري) انقر على تسجيل الطلبات والردود في Gemini Code Assist لتسجيل الطلبات والردود التي ينشئها مستخدمو Gemini Code Assist Standard وEnterprise في المشروع.

  6. انقر على حفظ التغييرات.

واجهة برمجة التطبيقات

لتفعيل تسجيل البيانات في Gemini Code Assist Standard وEnterprise، استخدِم المورد loggingSettings لتحديد إعدادات تسجيل البيانات التي تريدها، واستخدِم المورد loggingSettings.settingBindings لربط الإعدادات بمشروع:

  1. تأكَّد من تفعيل واجهة برمجة التطبيقات Cloud Logging في المشروع.

  2. أنشئ الإعداد وقيمة خاصة به:

    1. الحصول على الرمز المميّز:

      TOKEN=$(gcloud auth print-access-token)
      
  3. فعِّل سجلات Gemini Code Assist Standard وEnterprise. يتم تفعيل سجلّات المستخدمين وسجلّات البيانات الوصفية باستخدام الحقلَين log_prompts_and_responses وlog_metadata على التوالي. إذا كنت لا تريد تفعيل أحد الحقول، استبعِده من الطلب.

    1. نفِّذ الأمر التالي لإنشاء الإعداد:

      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"
      

      غيِّر القيم في السلسلة على الشكل التالي:

      • استبدِل CONTAINER_PROJECT_NAME برقم تعريف المشروع الذي يتم فيه تخزين المورد الرابط. هذا هو المشروع الرئيسي لعملية الربط.
      • LOGS_SETTING_ID: أدخِل اسمًا فريدًا للإعدادات، مثل gcalm.

      في حال نجاح الأمر، سيعرض نص الاستجابة القيمتين log_prompts_and_responses وlog_metadata مضبوطتَين على 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. نفِّذ الأمر التالي لإنشاء ربط إعدادات سجلّات Gemini Code Assist Standard و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"
      

    غيِّر القيم في السلسلة على الشكل التالي:

    • TARGET_PROJECT_NAME: أدخِل المشروع المستهدَف الذي يجب ربط عملية الربط به. ويكون هذا المعرّف غالبًا هو نفسه معرّف مشروع الحاوية. ومع ذلك، يمكنك ربط إعداد بمشاريع متعددة حتى لا تحتاج إلى تكرار مورد الإعداد.
    • LOGS_BINDING_ID: استخدِم LOGS_SETTING_ID نفسه عند إنشاء الإعداد، ولكن أضِف إليه b1. على سبيل المثال، استخدِم gcalmb1.

    في حال نجاح الأمر، سيعرض بيانات العملية الوصفية بالتنسيق التالي:

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

إيقاف التسجيل في Gemini Code Assist في أحد المشاريع

اختر أحد الخيارات التالية:

وحدة التحكّم

  1. في وحدة تحكّم Google Cloud، انتقِل إلى صفحة مشرف Gemini.

    الانتقال إلى "Gemini في Google Cloud"

    يتم تحميل صفحة Gemini في Google Cloud.

  2. انقر على الإعدادات في قائمة التنقّل اليمنى.

    يتم تحميل صفحة الإعدادات.

  3. انقر على تسجيل بيانات Gemini Code Assist الوصفية لإيقاف تسجيل البيانات الوصفية من استخدام Gemini Code Assist Standard وEnterprise في المشروع.

  4. انقر على حفظ التغييرات.

واجهة برمجة التطبيقات

لإيقاف التسجيل في Gemini Code Assist Standard وEnterprise، استخدِم طريقة loggingSetting.

  1. أنشئ الإعداد وقيمة خاصة به:

    1. الحصول على الرمز المميّز:

      TOKEN=$(gcloud auth print-access-token)
      
  2. نفِّذ الأمر التالي لإيقاف إعدادات سجلات Gemini Code Assist Standard و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"
    

    غيِّر القيم في السلسلة على الشكل التالي:

    • CONTAINER_PROJECT_NAME: أدخِل رقم تعريف المشروع الرئيسي.
    • LOGS_SETTING_ID: أدخِل اسم الإعداد الحالي، مثل gcalm.

      في حال نجاح الأمر، سيعرض نص الاستجابة القيمتين log_prompts_and_responses وlog_metadata مضبوطتَين على 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
      }
      

إعداد تسجيل الدخول إلى مشاريع متعددة

يمكنك استخدام السجلات من Gemini Code Assist لإنشاء مقاييس ولوحات بيانات لرصد الاستخدام لكل مشروع. إذا كانت مؤسستك لديها مشاريع متعددة، يمكنك إعداد مشروع تسجيل مركزي لجمع السجلات من مشاريع متعددة وإنشاء لوحات بيانات على مستوى هذه المشاريع.

إنشاء مشروع تسجيل مركزي

سيكون هذا المشروع مركزًا لسجلات مشاريعك الأخرى.

  1. في Google Cloud Console، انتقِل إلى صفحة إنشاء المشاريع.

    الانتقال إلى "إنشاء مشروع"

  2. في نافذة مشروع جديد، أدخِل قيمًا للحقول التالية:

    • اسم المشروع: اسم مشروع التسجيل في مكان مركزي واحد.
    • حساب الفوترة: اختَر حساب فوترة.
    • المؤسسة: اختَر مؤسستك. يمكن لمشروع مركزي جمع السجلات من مشاريع في المؤسسة نفسها فقط.
    • الموقع الجغرافي: اختَر موقعًا جغرافيًا.
  3. انقر على إنشاء.

ضبط مصادر تسجيل الدخول

لتوجيه السجلّات إلى المشروع المركزي، اضبط إعدادات مخازن السجلّات في كل مشروع من المشاريع الفردية التي تريد جمع السجلّات منها.

لضبط إعدادات مخازن السجلّات لكل مشروع، اتّبِع الخطوات التالية:

  1. في Google Cloud Console، انتقِل إلى مشروع تريد جمع السجلات منه.
  2. انتقِل إلى صفحة Log Router:

    الانتقال إلى "موجّه السجلّ"

  3. انقر على إنشاء مصرف.

  4. بالنسبة إلى تفاصيل المخزَن، أدخِل اسمًا ووصفًا للمخزَن، ثم انقر على التالي.

  5. بالنسبة إلى وجهة Sink، اتّبِع الخطوات التالية:

    1. في قائمة اختيار خدمة مصدر، اختَر حزمة تسجيل الدخول.
    2. في قائمة حزمة السجلّ، اختَر استخدام حزمة السجلّ في مشروع آخر.
    3. في الحقل وجهة المصرف، أدخِل ما يلي:

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

      استبدِل CENTRALIZED_PROJECT_ID برقم تعريف مشروع تسجيل البيانات المركزي الذي أنشأته.

    4. انقر على التالي.

  6. بالنسبة إلى اختيار السجلات المطلوب تضمينها في مصدر التجميع، أنشئ فلتر تضمين من خلال إدخال ما يلي في حقل فلتر التضمين:

    resource.type="cloudaicompanion.googleapis.com/Instance"
    
  7. انقر على التالي.

  8. بالنسبة إلى اختيار السجلات المطلوب استبعادها من الحوض، اترُك فلتر الاستبعاد فارغًا وانقر على إنشاء حوض.

  9. بعد إنشاء المخزَن، ابحث عن المخزَن الذي أنشأته في صفحة Log Router.

  10. في عمود هوية الكاتب، انسخ عنوان البريد الإلكتروني الكامل لحساب الخدمة.

ضبط أذونات الوصول

لمنح الحوض إذن كتابة السجلات في المشروع المركزي، اتّبِع الخطوات التالية:

  1. في Google Cloud Console، انتقِل إلى المشروع المركزي الذي أنشأته.
  2. انتقِل إلى صفحة إدارة الهوية وإمكانية الوصول:

    الانتقال إلى "إدارة الهوية وإمكانية الوصول"

  3. انقر على منح إذن الوصول.

  4. في حقل الجهات الرئيسية الجديدة، الصِق عنوان البريد الإلكتروني لحساب الخدمة الذي نسخته في القسم السابق.

  5. انقر على إضافة دور آخر.

  6. ابحث عن دور مسؤول تعديل حزمة السجلّات (roles/logging.bucketWriter) واختَره.

  7. انقر على حفظ.

إنشاء لوحة بيانات في مشروع مركزي

بعد ضبط مشروعك المركزي لتلقّي السجلات، يمكنك إنشاء لوحة بيانات لعرض المقاييس من مشاريع متعددة:

  1. في وحدة تحكّم Google Cloud، انتقِل إلى المراقبة > لوحات البيانات:

    الانتقال إلى "لوحات البيانات"

  2. انقر على إنشاء لوحة بيانات.

  3. في شريط الأدوات، انقر على الإعدادات، ثمّ اختَر JSON > محرّر JSON.

  4. في "أداة تعديل JSON"، ألصِق الرمز التالي:

    {
      "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. غيِّر القيم في السلسلة على الشكل التالي:

    • استبدِل CENTRALIZED_PROJECT_ID برقم تعريف المشروع الذي أنشأته لتسجيل البيانات بشكل مركزي.
    • SOURCE_PROJECT_ID_1 وSOURCE_PROJECT_ID_2: أرقام تعريف المشاريع التي تريد جمع السجلات منها. إذا أردت جمع السجلات من أكثر من مشروعَين، يمكنك إضافة المزيد من معرّفات المشاريع إلى عبارات in في طلب البحث.

إيقاف تسجيل البيانات في مشاريع متعددة

إذا أعددت تسجيل Gemini Code Assist في سجلّات مشاريع متعددة، يمكنك إيقافه عن طريق حذف مصادر البيانات التي توجّه السجلّات إلى المشروع المركزي. لإيقاف إرسال السجلات من مشروع فردي إلى المشروع المركزي، احذف مصرف السجل الذي أنشأته في ذلك المشروع:

  1. في Google Cloud Console، انتقِل إلى مشروع تريد إيقاف جمع السجلات منه.
  2. انتقِل إلى صفحة Log Router:

    الانتقال إلى "موجّه السجلّ"

  3. تحديد الحوض الذي يوجّه السجلات إلى مشروعك المركزي

  4. في صفّ أداة الربط هذه، انقر على مزيد من الإجراءات، ثم اختَر حذف أداة الربط.

  5. في مربّع الحوار الذي يظهر، انقر على حذف.

كرِّر هذه الخطوات لكل مشروع تريد إيقاف إرسال السجلات إليه في المشروع المركزي.

الخطوات التالية