이 문서에서는 Google Cloud 콘솔 또는 API를 사용하여 프로젝트의 Gemini Code Assist Standard 및 Enterprise 로깅을 구성하는 방법을 설명합니다.
제한사항
Google Cloud에서 Gemini Standard 및 Enterprise의 로그 데이터 기록은 IDE 내에서 Gemini Code Assist와의 사용자 상호작용으로 제한됩니다.
기본적으로 Google Cloud용 Gemini 로그는 프로젝트별로 수집됩니다. 여러 프로젝트의 로그를 수집하도록 중앙 집중식 프로젝트를 구성하는 방법은 다중 프로젝트 로깅 설정을 참고하세요.
GitHub의 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: 로깅 설정 바인딩을 나열합니다.
또는 사전 정의된 역할인 Google Cloud용 Gemini 설정 관리자 (roles/cloudaicompanion.settingsAdmin) 및 서비스 사용량 관리자 (roles/serviceusage.serviceUsageAdmin)를 부여할 수 있습니다. 하지만 이러한 역할에는 Google Cloud용 Gemini의 모든 관리자 설정을 구성하고 서비스 사용량을 관리할 수 있는 권한이 포함되어 있으므로 로깅 설정을 구성하는 데 필요한 것보다 많을 수 있습니다.
Gemini Code Assist 로깅 구성
다음 섹션에서는 Cloud Logging에서 Gemini Code Assist Standard 및 Enterprise 활동의 수집 및 저장을 사용 설정하는 데 필요한 단계를 제공합니다. 해당되는 활동으로는 다음과 같은 것들이 있습니다.
사용자 입력, 문맥 정보, 응답 등 Gemini Code Assist Standard 및 Enterprise 프롬프트 및 응답 로그
원격 분석 메타데이터, 사용자가 수락한 코드 줄 등 Gemini Code Assist Standard 및 Enterprise 메타데이터 로그
두 유형의 로그에 대한 자세한 내용은 Gemini 로그 보기를 참고하세요.
프로젝트에서 Gemini Code Assist 로깅 사용 설정
다음 옵션 중 하나를 선택합니다.
콘솔
프로젝트에서 Cloud Logging API를 사용 설정했는지 확인합니다.
Google Cloud 콘솔에서 Gemini 관리자 페이지로 이동합니다.
Gemini for Google Cloud 페이지가 로드됩니다.
왼쪽 탐색 메뉴에서 설정을 클릭합니다.
설정 페이지가 로드됩니다.
(선택사항) Code Assist 메타데이터 로깅을 클릭하여 프로젝트에서 Gemini Code Assist Standard 및 Enterprise 사용자가 생성한 메타데이터를 기록합니다.
(선택사항) Gemini Code Assist 프롬프트 및 대답 로깅을 클릭하여 프로젝트에서 Gemini Code Assist Standard 및 Enterprise 사용자가 생성한 프롬프트와 대답을 기록합니다.
변경사항 저장을 클릭합니다.
API
Gemini Code Assist Standard 및 Enterprise의 로깅을 사용 설정하려면 loggingSettings 리소스를 사용하여 원하는 로깅 설정을 정의하고 loggingSettings.settingBindings 리소스를 사용하여 설정을 프로젝트에 바인딩합니다.
프로젝트에서 Cloud Logging API를 사용 설정했는지 확인합니다.
설정 및 설정별 값을 만듭니다.
토큰을 가져옵니다.
TOKEN=$(gcloud auth print-access-token)
Gemini Code Assist Standard 및 Enterprise 로그를 사용 설정합니다. 사용자 로그와 메타데이터 로그는 각각
log_prompts_and_responses및log_metadata필드로 사용 설정됩니다. 필드 중 하나를 사용 설정하지 않으려면 요청에서 제외하세요.다음 명령어를 실행하여 설정을 만듭니다.
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: 바인딩 리소스가 저장된 프로젝트의 프로젝트 ID. 이는 바인딩의 상위 프로젝트입니다.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 }다음 명령어를 실행하여 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: 설정을 만들 때와 동일한 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 로깅 사용 중지
다음 옵션 중 하나를 선택합니다.
콘솔
Google Cloud 콘솔에서 Gemini 관리자 페이지로 이동합니다.
Gemini for Google Cloud 페이지가 로드됩니다.
왼쪽 탐색 메뉴에서 설정을 클릭합니다.
설정 페이지가 로드됩니다.
Code Assist 메타데이터 로깅을 클릭하여 프로젝트에서 Gemini Code Assist Standard 및 Enterprise 사용 시의 메타데이터 기록을 사용 중지합니다.
변경사항 저장을 클릭합니다.
API
Gemini Code Assist Standard 및 Enterprise의 로깅을 사용 중지하려면 loggingSetting 메서드를 사용합니다.
설정 및 설정별 값을 만듭니다.
토큰을 가져옵니다.
TOKEN=$(gcloud auth print-access-token)
다음 명령어를 실행하여 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: 상위 프로젝트 IDLOGS_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의 로그를 사용하여 프로젝트별 사용량을 모니터링하는 측정항목과 대시보드를 만들 수 있습니다. 조직에 여러 프로젝트가 있는 경우 중앙 집중식 로깅 프로젝트를 구성하여 여러 프로젝트에서 로그를 수집하고 이러한 프로젝트 전반에서 대시보드를 생성할 수 있습니다.
중앙 집중식 로깅 프로젝트 만들기
이 프로젝트는 다른 프로젝트의 로그 허브 역할을 합니다.
Google Cloud 콘솔에서 프로젝트 생성 페이지로 이동합니다.
새 프로젝트 창에서 다음 필드의 값을 입력합니다.
- 프로젝트 이름: 중앙 집중식 로깅 프로젝트의 이름입니다.
- 결제 계정: 결제 계정을 선택합니다.
- 조직: 조직을 선택합니다. 중앙 집중식 프로젝트는 동일한 조직의 프로젝트에서만 로그를 수집할 수 있습니다.
- 위치: 위치를 선택합니다.
만들기를 클릭합니다.
로그 싱크 구성
로그를 중앙 집중식 프로젝트로 전달하려면 로그를 수집하려는 각 개별 프로젝트에서 로그 싱크를 구성합니다.
각 프로젝트의 로그 싱크를 구성하려면 다음 단계를 따르세요.
- Google Cloud 콘솔에서 로그를 수집할 프로젝트로 전환합니다.
로그 라우터 페이지로 이동합니다.
싱크 만들기를 클릭합니다.
싱크 세부정보에서 싱크의 이름과 설명을 입력한 후 다음을 클릭합니다.
싱크 대상 위치에 대해 다음을 수행합니다.
- 싱크 서비스 선택 메뉴에서 Logging 버킷을 선택합니다.
- 로그 버킷 메뉴에서 다른 프로젝트의 로그 버킷 사용을 선택합니다.
싱크 대상 위치 필드에 다음을 입력합니다.
logging.googleapis.com/projects/CENTRALIZED_PROJECT_ID/locations/global/buckets/_DefaultCENTRALIZED_PROJECT_ID를 생성한 중앙 집중식 로깅 프로젝트의 프로젝트 ID로 바꿉니다.다음을 클릭합니다.
싱크에 포함할 로그 선택의 경우 포함 필터 필드에 다음을 입력하여 포함 필터를 빌드합니다.
resource.type="cloudaicompanion.googleapis.com/Instance"다음을 클릭합니다.
싱크에서 필터링할 로그 선택에서 제외 필터를 비워 두고 싱크 만들기를 클릭합니다.
싱크가 생성되면 로그 라우터 페이지에서 생성한 싱크를 찾습니다.
작성자 ID 열에서 전체 서비스 계정 이메일 주소를 복사합니다.
액세스 구성
싱크가 중앙 집중식 프로젝트에 로그를 작성할 수 있는 액세스 권한을 부여하려면 다음을 수행하세요.
- Google Cloud 콘솔에서 생성한 중앙 집중식 프로젝트로 전환합니다.
IAM 페이지로 이동합니다.
액세스 권한 부여를 클릭합니다.
새 주 구성원 필드에 이전 섹션에서 복사한 서비스 계정 이메일 주소를 붙여넣습니다.
다른 역할 추가를 클릭합니다.
로그 버킷 작성자 역할(
roles/logging.bucketWriter)을 검색하여 선택합니다.저장을 클릭합니다.
중앙 프로젝트에서 대시보드 만들기
로그를 수신하도록 중앙 집중식 프로젝트를 구성한 후 대시보드를 만들어 여러 프로젝트의 측정항목을 볼 수 있습니다.
Google Cloud 콘솔에서 Monitoring > 대시보드로 이동합니다.
대시보드 만들기를 클릭합니다.
툴바에서 설정을 클릭한 다음 JSON > JSON 편집기를 선택합니다.
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" } } } } ] } }다음을 바꿉니다.
CENTRALIZED_PROJECT_ID: 생성한 중앙 집중식 로깅 프로젝트의 프로젝트 ID입니다.SOURCE_PROJECT_ID_1및SOURCE_PROJECT_ID_2: 로그를 수집할 프로젝트의 프로젝트 ID입니다. 3개 이상의 프로젝트에서 로그를 수집하려면 쿼리의in절에 프로젝트 ID를 추가하면 됩니다.
다중 프로젝트 로깅 사용 중지
여러 프로젝트에 대해 Gemini Code Assist 로깅을 구성한 경우 로그를 중앙 집중식 프로젝트로 라우팅하는 로그 싱크를 삭제하여 사용 중지할 수 있습니다. 개별 프로젝트에서 중앙 집중식 프로젝트로 로그 전송을 중지하려면 해당 프로젝트에서 만든 로그 싱크를 삭제하세요.
- Google Cloud 콘솔에서 로그 수집을 중지할 프로젝트로 전환합니다.
로그 라우터 페이지로 이동합니다.
로그를 중앙 집중식 프로젝트로 라우팅하는 싱크를 식별합니다.
해당 싱크의 행에서 작업 더보기를 클릭한 다음 싱크 삭제를 선택합니다.
대화상자가 표시되면 삭제를 클릭합니다.
중앙 집중식 프로젝트로 로그 전송을 중지하려는 각 프로젝트에 대해 이 단계를 반복합니다.