Настройка ведения журнала Gemini Code Assist Standard и Enterprise

В этом документе описывается, как настроить стандартное и корпоративное логирование Gemini Code Assist для проекта с помощью консоли Google Cloud или API.

Ограничения

  • В Google Cloud Gemini Standard и Enterprise запись логов ограничена взаимодействием пользователя с Gemini Code Assist в среде разработки.

  • По умолчанию журналы 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 for Google Cloud ( roles/cloudaicompanion.settingsAdmin ) и администратора использования сервисов ( roles/serviceusage.serviceUsageAdmin ). Однако эти роли включают разрешения на настройку всех параметров администратора Gemini for Google Cloud и управление использованием сервисов, что может быть избыточным для настройки параметров ведения журналов.

Настройка логирования Gemini Code Assist

В следующих разделах описаны шаги, необходимые для включения сбора и хранения данных об активности в системах Gemini Code Assist Standard и Enterprise в Cloud Logging, включая:

  • Журналы подсказок и ответов Gemini Code Assist Standard и Enterprise, содержащие информацию о вводимых пользователем данных, контекстную информацию и ответы.

  • Журналы метаданных Gemini Code Assist Standard и Enterprise, такие как метаданные телеметрии и строки кода, принятые пользователем.

Для получения более подробной информации об обоих типах журналов см. раздел «Просмотр журналов Gemini» .

Включите ведение журнала для Gemini Code Assist в проекте.

Выберите один из следующих вариантов:

Консоль

  1. Убедитесь, что API облачного логирования включен в проекте.

  2. В консоли Google Cloud перейдите на страницу «Администрирование Gemini» .

    Перейдите на Gemini для Google Cloud.

    Страница Gemini for Google Cloud загружается.

  3. В левом навигационном меню нажмите «Настройки» .

    Страница настроек загружается.

  4. (Необязательно) Нажмите «Ведение журнала для метаданных Code Assist» , чтобы записать метаданные, созданные пользователями Gemini Code Assist Standard и Enterprise в проекте.

  5. (Необязательно) Нажмите «Запись в журнал подсказок и ответов Code Assist» , чтобы регистрировать подсказки и ответы, генерируемые пользователями Gemini Code Assist Standard и Enterprise в проекте.

  6. Нажмите «Сохранить изменения» .

API

Чтобы включить логирование для Gemini Code Assist Standard и Enterprise, используйте ресурс loggingSettings для определения необходимых параметров логирования, а ресурс loggingSettings.settingBindings — для привязки этих параметров к проекту:

  1. Убедитесь, что API облачного логирования включен в проекте.

  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 for Google Cloud загружается.

  2. В левом навигационном меню нажмите «Настройки» .

    Страница настроек загружается.

  3. Нажмите «Ведение журнала для метаданных Code Assist» , чтобы отключить запись метаданных об использовании Gemini Code Assist Standard и Enterprise в проекте.

  4. Нажмите «Сохранить изменения» .

API

Чтобы отключить ведение журнала для 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 перейдите на страницу создания проекта .

    Перейдите в раздел «Создать проект».

  2. В окне «Новый проект» введите значения для следующих полей:

    • Название проекта : название для вашего централизованного проекта регистрации событий.
    • Платежный аккаунт : выберите платежный аккаунт.
    • Организация : выберите свою организацию. Централизованный проект может собирать журналы только из проектов, входящих в ту же организацию.
    • Местоположение : выберите местоположение.
  3. Нажмите «Создать» .

Настройка приемников журналов

Чтобы направлять журналы в централизованный проект, настройте приемники журналов в каждом из отдельных проектов, из которых вы хотите собирать журналы.

Для настройки приемников логов для каждого проекта выполните следующие действия:

  1. В консоли Google Cloud переключитесь на проект, для которого вы хотите собирать журналы.
  2. Перейдите на страницу Log Router :

    Перейдите в Log Router

  3. Нажмите «Создать приемник» .

  4. В разделе «Подробная информация о раковине» введите название и описание раковины, а затем нажмите «Далее» .

  5. Для параметра «Целевой терминал» выполните следующие действия:

    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 переключитесь на созданный вами централизованный проект.
  2. Перейдите на страницу IAM :

    Перейдите в IAM

  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 переключитесь на проект, для которого вы хотите прекратить сбор логов.
  2. Перейдите на страницу Log Router :

    Перейдите в Log Router

  3. Определите устройство, через которое журналы перенаправляются в ваш централизованный проект.

  4. В строке, соответствующей этому раковине, нажмите «Дополнительные действия» , а затем выберите «Удалить раковину» .

  5. В появившемся диалоговом окне нажмите кнопку «Удалить» .

Повторите эти шаги для каждого проекта, для которого вы хотите прекратить отправку журналов в централизованный проект.

Что дальше?