กำหนดค่าการบันทึกของ Gemini Code Assist แบบมาตรฐานและ Enterprise

เอกสารนี้อธิบายวิธีกำหนดค่าการบันทึก Gemini Code Assist แบบ Standard และแบบ Enterprise สำหรับโปรเจ็กต์โดยใช้คอนโซล Google Cloud หรือ API

ข้อจำกัด

  • การบันทึกข้อมูลบันทึกของ Gemini Standard และ Enterprise ใน Google Cloud จะจำกัดอยู่เพียงการโต้ตอบของผู้ใช้กับ Gemini Code Assist ภายใน IDE

  • โดยค่าเริ่มต้น ระบบจะรวบรวมบันทึกของ Gemini สำหรับ Google Cloud ตามโปรเจ็กต์ ดูวิธีการกำหนดค่าโปรเจ็กต์ส่วนกลาง เพื่อรวบรวมบันทึกจากหลายโปรเจ็กต์ได้ที่ ตั้งค่าการบันทึกหลายโปรเจ็กต์

  • Gemini Code Assist ใน GitHub ไม่รองรับการบันทึกด้วย 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 (roles/cloudaicompanion.settingsAdmin) และ ผู้ดูแลระบบการใช้บริการ (roles/serviceusage.serviceUsageAdmin) ก็ได้ อย่างไรก็ตาม บทบาทเหล่านี้มีสิทธิ์ในการกำหนดค่าการตั้งค่าผู้ดูแลระบบทั้งหมดของ Gemini สำหรับ Google Cloud และจัดการการใช้บริการ ซึ่งอาจมีสิทธิ์มากกว่าที่จำเป็นสำหรับการกำหนดค่าการตั้งค่าการบันทึก

กำหนดค่าการบันทึก Gemini Code Assist

ส่วนต่อไปนี้แสดงขั้นตอนที่จำเป็นในการเปิดใช้การรวบรวมและจัดเก็บกิจกรรม Gemini Code Assist แบบมาตรฐานและแบบ Enterprise ใน Cloud Logging ซึ่งรวมถึง

  • บันทึกพรอมต์และคำตอบของ Gemini Code Assist แบบ Standard และแบบ Enterprise เช่น ข้อมูลจากผู้ใช้ ข้อมูลตามบริบท และคำตอบ

  • บันทึกข้อมูลเมตาของ Gemini Code Assist แบบมาตรฐานและแบบ Enterprise เช่น ข้อมูลเมตาการวัดและส่งข้อมูลทางไกลและจำนวนบรรทัดของโค้ดที่ผู้ใช้ยอมรับ

ดูรายละเอียดเพิ่มเติมเกี่ยวกับบันทึกทั้ง 2 ประเภทได้ที่ ดูบันทึกของ Gemini

เปิดใช้การบันทึกสำหรับ Gemini Code Assist ในโปรเจ็กต์

โปรดเลือกจากตัวเลือกต่อไปนี้

คอนโซล

  1. ตรวจสอบว่าคุณได้เปิดใช้ API **Cloud Logging** ในโปรเจ็กต์แล้ว

  2. ในคอนโซล Google Cloud ให้ไปที่หน้าผู้ดูแลระบบสำหรับ Gemini

    ไปที่ Gemini สำหรับ Google Cloud

    หน้า Gemini สำหรับ Google Cloud จะโหลดขึ้น

  3. คลิกการตั้งค่า ในเมนูการนำทางด้านซ้าย

    หน้าการตั้งค่า จะโหลดขึ้น

  4. (ไม่บังคับ) คลิกการบันทึกข้อมูลเมตาของ Code Assist เพื่อบันทึกข้อมูลเมตาที่ผู้ใช้ Gemini Code Assist แบบมาตรฐานและแบบ Enterprise สร้างขึ้นในโปรเจ็กต์

  5. (ไม่บังคับ) คลิกการบันทึกพรอมต์และคำตอบของ Code Assist เพื่อบันทึกพรอมต์และคำตอบที่ผู้ใช้ Gemini Code Assist แบบมาตรฐานและแบบ Enterprise สร้างขึ้นในโปรเจ็กต์

  6. คลิกบันทึกการเปลี่ยนแปลง

API

หากต้องการเปิดใช้การบันทึกสำหรับ Gemini Code Assist แบบมาตรฐานและ Enterprise ให้ใช้ทรัพยากร loggingSettings เพื่อกำหนดการตั้งค่าการบันทึก ที่ต้องการ และใช้ทรัพยากร loggingSettings.settingBindings เพื่อ ผูกการตั้งค่ากับโปรเจ็กต์

  1. ตรวจสอบว่าคุณได้เปิดใช้ API Cloud Logging ในโปรเจ็กต์แล้ว

  2. สร้างการตั้งค่าและค่าเฉพาะการตั้งค่า

    1. รับโทเค็น

      TOKEN=$(gcloud auth print-access-token)
      
  3. เปิดใช้บันทึกของ Gemini Code Assist แบบมาตรฐานและแบบ 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 แบบมาตรฐานและแบบ 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. คลิกการบันทึกข้อมูลเมตาของ Code Assist เพื่อปิดการบันทึกข้อมูลเมตาจากการใช้งาน Gemini Code Assist แบบมาตรฐานและแบบ Enterprise ในโปรเจ็กต์

  4. คลิกบันทึกการเปลี่ยนแปลง

API

หากต้องการปิดใช้การบันทึกสำหรับ Gemini Code Assist แบบมาตรฐานและแบบ Enterprise ให้ใช้เมธอด loggingSetting

  1. สร้างการตั้งค่าและค่าเฉพาะการตั้งค่า

    1. รับโทเค็น

      TOKEN=$(gcloud auth print-access-token)
      
  2. เรียกใช้คำสั่งต่อไปนี้เพื่อปิดใช้การตั้งค่าบันทึกของ Gemini Code Assist แบบมาตรฐานและแบบ 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 ให้ไปที่หน้าการสร้างโปรเจ็กต์

    ไปที่สร้างโปรเจ็กต์

  2. ในหน้าต่างโปรเจ็กต์ใหม่ ให้ป้อนค่าสำหรับช่องต่อไปนี้

    • ชื่อโปรเจ็กต์: ชื่อสำหรับโปรเจ็กต์การบันทึกส่วนกลาง
    • บัญชีสำหรับการเรียกเก็บเงิน: เลือกบัญชีสำหรับการเรียกเก็บเงิน
    • องค์กร: เลือกองค์กร โปรเจ็กต์ส่วนกลางจะรวบรวมบันทึกจากโปรเจ็กต์ในองค์กรเดียวกันได้เท่านั้น
    • ตำแหน่ง: เลือกตำแหน่ง
  3. คลิกสร้าง

กำหนดค่าซิงก์บันทึก

หากต้องการส่งบันทึกไปยังโปรเจ็กต์ส่วนกลาง ให้กำหนดค่าซิงก์บันทึกในแต่ละโปรเจ็กต์ที่คุณต้องการรวบรวมบันทึก

หากต้องการกำหนดค่าซิงก์บันทึกสำหรับแต่ละโปรเจ็กต์ ให้ทำดังนี้

  1. ในคอนโซล Google Cloud ให้เปลี่ยนไปใช้โปรเจ็กต์ที่คุณต้องการรวบรวมบันทึก
  2. ไปที่หน้า Log Router

    ไปที่ Log Router

  3. คลิกสร้างซิงก์

  4. สำหรับรายละเอียดซิงก์ ให้ป้อนชื่อและคำอธิบายสำหรับซิงก์ แล้ว คลิก ถัดไป

  5. สำหรับปลายทางซิงก์ ให้ทำดังนี้

    1. ในเมนูเลือกบริการซิงก์ ให้เลือกBucket บันทึก
    2. ในเมนูBucket บันทึก ให้เลือกใช้ Bucket บันทึกในโปรเจ็กต์อื่น
    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 ให้เปลี่ยนไปใช้โปรเจ็กต์ส่วนกลางที่คุณสร้างขึ้น
  2. ไปที่หน้า IAM

    ไปที่ IAM

  3. คลิกให้สิทธิ์เข้าถึง

  4. วางอีเมลบัญชีบริการที่คุณคัดลอกไว้ในส่วนก่อนหน้าลงในช่องผู้รับสิทธิ์รายใหม่

  5. คลิกเพิ่มบทบาทอื่น

  6. ค้นหาและเลือกบทบาทผู้เขียน Bucket บันทึก (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: รหัสโปรเจ็กต์ของโปรเจ็กต์ที่คุณต้องการรวบรวมบันทึก หากต้องการรวบรวมบันทึกจากโปรเจ็กต์มากกว่า 2 โปรเจ็กต์ คุณสามารถเพิ่มรหัสโปรเจ็กต์เพิ่มเติมลงในอนุประโยค in ของการค้นหาได้

ปิดใช้การบันทึกหลายโปรเจ็กต์

หากกำหนดค่าการบันทึก Gemini Code Assist สำหรับหลายโปรเจ็กต์ คุณสามารถปิดใช้ได้โดยลบซิงก์บันทึกที่กำหนดเส้นทางบันทึกไปยังโปรเจ็กต์ส่วนกลาง หากต้องการหยุดส่งบันทึกจากโปรเจ็กต์แต่ละโปรเจ็กต์ไปยังโปรเจ็กต์ส่วนกลาง ให้ลบซิงก์บันทึกที่คุณสร้างขึ้นในโปรเจ็กต์นั้นโดยทำดังนี้

  1. ในคอนโซล Google Cloud ให้เปลี่ยนไปใช้โปรเจ็กต์ที่คุณต้องการหยุดรวบรวมบันทึก
  2. ไปที่หน้า Log Router

    ไปที่ Log Router

  3. ระบุซิงก์ที่กำหนดเส้นทางบันทึกไปยังโปรเจ็กต์ส่วนกลาง

  4. ในแถวของซิงก์นั้น ให้คลิกการดำเนินการเพิ่มเติม แล้วเลือก ลบซิงก์

  5. คลิกลบ ในกล่องโต้ตอบที่ปรากฏขึ้น

ทำตามขั้นตอนเหล่านี้ซ้ำสำหรับแต่ละโปรเจ็กต์ที่คุณต้องการหยุดส่งบันทึกลงในโปรเจ็กต์ส่วนกลาง

ขั้นตอนถัดไป