پیکربندی Gemini Code Assist Standard and Enterprise logging

این سند نحوه پیکربندی ثبت وقایع Gemini Code Assist Standard و Enterprise برای یک پروژه را با استفاده از کنسول Google Cloud یا یک API شرح می‌دهد.

محدودیت‌ها

  • ثبت داده‌های لاگ Gemini Standard و Enterprise در Google Cloud محدود به تعاملات کاربر با Gemini Code Assist در یک IDE است.

  • به طور پیش‌فرض، گزارش‌های Gemini برای Google Cloud بر اساس هر پروژه جمع‌آوری می‌شوند. برای دستورالعمل‌های مربوط به نحوه پیکربندی یک پروژه متمرکز برای جمع‌آوری گزارش‌ها از چندین پروژه، به بخش «تنظیم گزارش‌گیری چند پروژه‌ای» مراجعه کنید.

  • ابزار Gemini Code Assist در گیت‌هاب از ثبت وقایع با استفاده از Cloud Logging پشتیبانی نمی‌کند.

قبل از اینکه شروع کنی

تأیید کنید که پروژه Google Cloud شما به یک حساب صورتحساب متصل است.

مجوزهای IAM را تأیید کنید

برای پیکربندی ثبت وقایع Gemini Code Assist، به مجوزهای خاص IAM نیاز دارید. برای پیروی از اصل حداقل امتیاز، یک نقش سفارشی اعطا کنید که فقط شامل مجوزهای لازم باشد.

از مدیر سیستم خود بخواهید یک نقش سفارشی ایجاد کند که شامل مجوزهای زیر باشد:

  • serviceusage.services.enable — برای فعال کردن APIها برای پروژه شما.
  • cloudaicompanion.loggingSettings.create — برای ایجاد تنظیمات ثبت وقایع.
  • cloudaicompanion.loggingSettings.get — برای مشاهده تنظیمات ثبت وقایع.
  • cloudaicompanion.loggingSettings.list — برای فهرست کردن تنظیمات ثبت وقایع.
  • cloudaicompanion.loggingSettings.update — برای به‌روزرسانی تنظیمات ثبت وقایع.
  • cloudaicompanion.loggingSettingBindings.create — برای اتصال تنظیمات ثبت وقایع به یک پروژه.
  • cloudaicompanion.loggingSettingBindings.get — برای مشاهده‌ی تنظیمات ثبت وقایع.
  • cloudaicompanion.loggingSettingBindings.list — برای فهرست کردن تنظیمات ثبت وقایع.

به عنوان یک روش جایگزین، می‌توانید نقش‌های از پیش تعریف شده Gemini برای Google Cloud Settings Admin ( roles/cloudaicompanion.settingsAdmin ) و Service Usage Admin ( roles/serviceusage.serviceUsageAdmin ) را اعطا کنید. با این حال، این نقش‌ها شامل مجوزهایی برای پیکربندی تمام تنظیمات مدیریتی Gemini برای Google Cloud و مدیریت استفاده از سرویس هستند که ممکن است برای پیکربندی تنظیمات ثبت وقایع بیش از حد مورد نیاز باشد.

پیکربندی ثبت وقایع Gemini Code Assist

بخش‌های زیر مراحل لازم برای فعال کردن جمع‌آوری و ذخیره فعالیت‌های Gemini Code Assist Standard و Enterprise در Cloud Logging را ارائه می‌دهند، از جمله:

  • اعلان‌ها و گزارش‌های پاسخ Gemini Code Assist Standard و Enterprise، مانند ورودی کاربر، اطلاعات زمینه‌ای و پاسخ‌ها.

  • لاگ‌های فراداده استاندارد و سازمانی Gemini Code Assist، مانند فراداده‌های تله‌متری و خطوط کد پذیرفته‌شده توسط کاربر.

برای جزئیات بیشتر در مورد هر دو نوع لاگ، به «مشاهده لاگ‌های Gemini» مراجعه کنید.

فعال کردن ثبت وقایع برای Gemini Code Assist در یک پروژه

یکی از گزینه‌های زیر را انتخاب کنید:

کنسول

  1. تأیید کنید که API ثبت وقایع ابری (Cloud Logging API) را در پروژه فعال کرده‌اید.

  2. در کنسول گوگل کلود، به صفحه ادمین برای جمینی بروید.

    برای دسترسی به فضای ابری گوگل به Gemini بروید

    صفحه Gemini برای Google Cloud بارگذاری می‌شود.

  3. در منوی ناوبری سمت چپ، روی تنظیمات کلیک کنید.

    صفحه تنظیمات بارگذاری می‌شود.

  4. (اختیاری) برای ثبت فراداده‌های تولید شده توسط کاربران Gemini Code Assist Standard و Enterprise در پروژه ، روی Logging for Code Assist کلیک کنید.

  5. (اختیاری) برای ثبت درخواست‌ها و پاسخ‌های Code Assist توسط کاربران Gemini Code Assist Standard و Enterprise در پروژه، روی Logging کلیک کنید.

  6. روی ذخیره تغییرات کلیک کنید.

رابط برنامه‌نویسی کاربردی

برای فعال کردن ثبت وقایع برای Gemini Code Assist Standard و Enterprise، از منبع loggingSettings برای تعریف تنظیمات ثبت وقایع مورد نظر خود استفاده کنید و از منبع loggingSettings.settingBindings برای اتصال تنظیمات به یک پروژه استفاده کنید:

  1. تأیید کنید که API ثبت وقایع ابری (Cloud Logging API) را در پروژه فعال کرده‌اید.

  2. تنظیمات و یک مقدار مختص به تنظیمات را ایجاد کنید:

    1. دریافت توکن:

      TOKEN=$(gcloud auth print-access-token)
      
  3. فعال کردن لاگ‌های استاندارد و سازمانی Gemini Code Assist. لاگ‌های کاربران و لاگ‌های فراداده به ترتیب با فیلدهای 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. در کنسول گوگل کلود، به صفحه ادمین برای جمینی بروید.

    برای دسترسی به فضای ابری گوگل به Gemini بروید

    صفحه Gemini برای Google Cloud بارگذاری می‌شود.

  2. در منوی ناوبری سمت چپ، روی تنظیمات کلیک کنید.

    صفحه تنظیمات بارگذاری می‌شود.

  3. برای غیرفعال کردن ثبت فراداده‌های حاصل از استفاده از Gemini Code Assist Standard و Enterprise در پروژه، روی گزینه Logging for Code Assist کلیک کنید.

  4. روی ذخیره تغییرات کلیک کنید.

رابط برنامه‌نویسی کاربردی

برای غیرفعال کردن ثبت وقایع برای Gemini Code Assist Standard و Enterprise، از متد loggingSetting استفاده کنید.

  1. تنظیمات و یک مقدار مختص به تنظیمات را ایجاد کنید:

    1. دریافت توکن:

      TOKEN=$(gcloud auth print-access-token)
      
  2. دستور زیر را برای غیرفعال کردن تنظیمات لاگ‌های استاندارد و سازمانی Gemini Code Assist اجرا کنید:

      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. در کنسول گوگل کلود، به صفحه ایجاد پروژه بروید.

    به ایجاد پروژه بروید

  2. در پنجره پروژه جدید ، مقادیر فیلدهای زیر را وارد کنید:

    • نام پروژه : نامی برای پروژه ثبت وقایع متمرکز شما.
    • حساب صورتحساب : یک حساب صورتحساب انتخاب کنید.
    • سازمان : سازمان خود را انتخاب کنید. یک پروژه متمرکز فقط می‌تواند لاگ‌ها را از پروژه‌های همان سازمان جمع‌آوری کند.
    • مکان : یک مکان را انتخاب کنید.
  3. روی ایجاد کلیک کنید.

پیکربندی سینک‌های لاگ

برای هدایت لاگ‌ها به پروژه متمرکز، در هر یک از پروژه‌هایی که می‌خواهید لاگ‌ها را از آنها جمع‌آوری کنید، سینک‌های لاگ را پیکربندی کنید.

برای پیکربندی لاگ سینک‌ها برای هر پروژه، مراحل زیر را انجام دهید:

  1. در کنسول Google Cloud، به پروژه‌ای که می‌خواهید گزارش‌های آن را جمع‌آوری کنید، بروید.
  2. به صفحه لاگ روتر بروید:

    به گزارش روتر بروید

  3. روی ایجاد سینک کلیک کنید.

  4. برای جزئیات سینک ، نام و توضیحی برای سینک وارد کنید و سپس روی بعدی کلیک کنید.

  5. برای Sink destination ، موارد زیر را انجام دهید:

    1. در منوی «انتخاب سرویس سینک» ، گزینه «سطل ثبت وقایع» را انتخاب کنید.
    2. در منوی Log bucket ، گزینه‌ی «استفاده از Log bucket در پروژه‌ی دیگر» را انتخاب کنید.
    3. در قسمت مقصد سینک ، موارد زیر را وارد کنید:

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

      CENTRALIZED_PROJECT_ID با شناسه پروژه پروژه ثبت وقایع متمرکزی که ایجاد کرده‌اید، جایگزین کنید.

    4. روی بعدی کلیک کنید.

  6. برای انتخاب لاگ‌ها برای گنجاندن در sink ، با وارد کردن موارد زیر در فیلد فیلتر گنجاندن، یک فیلتر گنجاندن بسازید:

    resource.type="cloudaicompanion.googleapis.com/Instance"
    
  7. روی بعدی کلیک کنید.

  8. برای انتخاب گزارش‌ها برای فیلتر کردن از sink ، فیلتر استثنا را خالی بگذارید و روی Create sink کلیک کنید.

  9. پس از ایجاد سینک، در صفحه Log Router ، سینکی را که ایجاد کرده‌اید پیدا کنید.

  10. در ستون هویت نویسنده ، آدرس ایمیل کامل حساب کاربری سرویس را کپی کنید.

پیکربندی دسترسی

برای اعطای دسترسی به sink خود جهت نوشتن لاگ‌ها در پروژه متمرکز، مراحل زیر را انجام دهید:

  1. در کنسول گوگل کلود، به پروژه متمرکزی که ایجاد کرده‌اید، بروید.
  2. به صفحه IAM بروید:

    به IAM بروید

  3. روی اعطای دسترسی کلیک کنید.

  4. در فیلد New principals ، آدرس ایمیل حساب سرویس را که در بخش قبل کپی کرده‌اید، جایگذاری کنید.

  5. روی افزودن نقش دیگر کلیک کنید.

  6. نقش نویسنده‌ی باکت لاگ‌ها ( roles/logging.bucketWriter ) را جستجو و انتخاب کنید.

  7. روی ذخیره کلیک کنید.

ایجاد داشبورد در پروژه متمرکز

پس از پیکربندی پروژه متمرکز خود برای دریافت گزارش‌ها، می‌توانید یک داشبورد برای مشاهده معیارهای چندین پروژه ایجاد کنید:

  1. در کنسول گوگل کلود، به بخش Monitoring > Dashboards بروید:

    به داشبوردها بروید

  2. روی ایجاد داشبورد کلیک کنید.

  3. در نوار ابزار، روی تنظیمات کلیک کنید و سپس JSON > JSON Editor را انتخاب کنید.

  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، به پروژه‌ای بروید که می‌خواهید جمع‌آوری گزارش‌های آن متوقف شود.
  2. به صفحه لاگ روتر بروید:

    به گزارش روتر بروید

  3. چاهکی را که لاگ‌ها را به پروژه متمرکز شما هدایت می‌کند، شناسایی کنید.

  4. در ردیف مربوط به آن سینک، روی «اقدامات بیشتر» کلیک کنید و سپس «حذف سینک» را انتخاب کنید.

  5. در کادر محاوره‌ای که ظاهر می‌شود، روی «حذف» کلیک کنید.

این مراحل را برای هر پروژه‌ای که می‌خواهید ارسال لاگ‌ها به پروژه متمرکز را متوقف کنید، تکرار کنید.

قدم بعدی چیست؟