Gemini Code Assist Standard と Gemini Code Assist Enterprise のロギングを構成する

このドキュメントでは、Google Cloud コンソールまたは API を使用して、プロジェクトの Gemini Code Assist Standard と Gemini Code Assist Enterprise のロギングを構成する方法について説明します。

制限事項

  • Google Cloud の Gemini Standard と Gemini Enterprise のログデータの記録は、IDE 内の Gemini Code Assist でのユーザー インタラクションに限定されます。

  • デフォルトでは、Gemini for Google Cloud のログはプロジェクトごとに収集されます。複数のプロジェクトからログを収集するように一元化された プロジェクトを構成する手順については、 マルチプロジェクト ロギングを設定するをご覧ください。

  • 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- ロギング設定のバインディングを一覧表示する。

または、事前定義ロールの Gemini for Google Cloud 設定管理者roles/cloudaicompanion.settingsAdmin)と Service Usage 管理者roles/serviceusage.serviceUsageAdmin)を付与することもできます。 ただし、これらのロールには、Gemini for Google Cloud のすべての管理者設定を構成してサービスの使用状況を管理する権限が含まれています。これは、ロギング設定を構成するのに必要な権限よりも多くなる可能性があります。

Gemini Code Assist のロギングを構成する

以降のセクションでは、Gemini Code Assist Standard と Gemini Code Assist Enterprise のアクティビティを Cloud Logging で収集して保存するために必要な手順について説明します。

  • Gemini Code Assist Standard と Gemini Code Assist Enterprise のプロンプトとレスポンスのログ(ユーザー入力、コンテキスト情報、レスポンスなど)。

  • Gemini Code Assist Standard と Gemini Code Assist Enterprise のメタデータログ(テレメトリー メタデータやユーザーが承認したコード行など)。

両方のタイプのログの詳細については、 Gemini ログを確認するをご覧ください。

プロジェクトで Gemini Code Assist のロギングを有効にする

次のオプションのいずれかを選択します。

コンソール

  1. プロジェクトで Cloud Logging API が有効になっていることを確認します。

  2. Google Cloud コンソールで、[Gemini の管理] ページに移動します。

    [Gemini for Google Cloud] に移動

    [Gemini for Google Cloud] ページが読み込まれます。

  3. 左側のナビゲーション メニューで [設定] をクリックします。

    [設定] ページが読み込まれます。

  4. (省略可)[Gemini Code Assist メタデータのロギング] をクリックして、プロジェクトで Gemini Code Assist Standard と Gemini Code Assist Enterprise のユーザーによって生成されたメタデータを記録します。

  5. (省略可)[Gemini Code Assist のプロンプトと回答のロギング] をクリックして、プロジェクト内の Gemini Code Assist Standard と Gemini Code Assist Enterprise のユーザーによって生成されたプロンプトと回答を記録します。

  6. [変更を保存] をクリックします。

API

Gemini Code Assist Standard と Gemini Code Assist Enterprise のロギングを有効にするには、loggingSettings リソースを使用して必要なロギング設定を定義し、loggingSettings.settingBindings リソースを使用して設定をプロジェクトにバインドします。

  1. プロジェクトで Cloud Logging API が有効になっていることを確認します。

  2. 設定と設定固有の値を作成します。

    1. トークンを取得します。

      TOKEN=$(gcloud auth print-access-token)
      
  3. Gemini Code Assist Standard と 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: バインディング リソースが保存されているプロジェクトのプロジェクト ID を入力します。これはバインディングの親プロジェクトです。
      • LOGS_SETTING_ID: 一意の設定名を入力します(gcalm など)。

      コマンドが成功すると、log_prompts_and_responseslog_metadatatrue に設定されていることを示すレスポンス本文が返されます。

      {
        "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 と 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 for Google Cloud] に移動

    [Gemini for Google Cloud] ページが読み込まれます。

  2. 左側のナビゲーション メニューで [設定] をクリックします。

    [設定] ページが読み込まれます。

  3. [Gemini Code Assist メタデータのロギング] をクリックして、プロジェクトでの Gemini Code Assist Standard と Gemini Code Assist Enterprise の使用状況に関するメタデータの記録をオフにします。

  4. [変更を保存] をクリックします。

API

Gemini Code Assist Standard と Gemini Code Assist Enterprise のロギングを無効にするには、loggingSetting メソッドを使用します。

  1. 設定と設定固有の値を作成します。

    1. トークンを取得します。

      TOKEN=$(gcloud auth print-access-token)
      
  2. 次のコマンドを実行して、Gemini Code Assist Standard と 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: 親プロジェクト ID を入力します。
    • LOGS_SETTING_ID: 既存の設定名を入力します(gcalm など)。

      コマンドが成功すると、log_prompts_and_responseslog_metadatafalse に設定されていることを示すレスポンス本文が返されます。

      {
        "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. [ログルーター] ページに移動します。

    [ログルーター] に移動

  3. [シンクを作成] をクリックします。

  4. [シンクの詳細] で、シンクの名前と説明を入力し、 [次へ] をクリックします。

  5. [シンクのエクスポート先] で、次の操作を行います。

    1. [シンクサービスの選択] メニューで、[Logging バケット] を選択します。
    2. [ログバケット] メニューで、[別のプロジェクトでログバケットを使用] を選択します。
    3. [シンクのエクスポート先] フィールドに、次のように入力します。

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

      CENTRALIZED_PROJECT_ID は、作成した一元化されたロギング プロジェクトのプロジェクト ID に置き換えます。

    4. [次へ] をクリックします。

  6. [シンクに含めるログの選択] で、 [一致フィルタ] フィールドに次のように入力して、一致フィルタを作成します。

    resource.type="cloudaicompanion.googleapis.com/Instance"
    
  7. [次へ] をクリックします。

  8. [シンクに含めないログの選択] で、除外フィルタを空白のままにして [シンクを作成] をクリックします。

  9. シンクが作成されたら、[ログルーター] ページで、作成したシンクを見つけます。

  10. [ライター ID] 列で、サービス アカウントの完全なメールアドレスをコピーします。

アクセスを構成する

シンクに一元化されたプロジェクトにログを書き込む権限を付与するには、次の操作を行います。

  1. Google Cloud コンソールで、作成した一元化されたプロジェクトに切り替えます。
  2. [IAM] ページに移動します。

    IAM に移動

  3. [アクセス権を付与] をクリックします。

  4. [新しいプリンシパル] フィールドに、前のセクションでコピーしたサービス アカウントのメールアドレスを貼り付けます。

  5. [別のロールを追加] をクリックします。

  6. ログバケット書き込み ロール(roles/logging.bucketWriter)を検索して選択します。

  7. [保存] をクリックします。

一元化されたプロジェクトでダッシュボードを作成する

ログを受信するように一元化されたプロジェクトを構成したら、ダッシュボードを作成して複数のプロジェクトの指標を表示できます。

  1. Google Cloud コンソールで、[Monitoring] > [ダッシュボード] に移動します。

    ダッシュボードに移動する

  2. [CREATE DASHBOARD] をクリックします。

  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: 作成した一元化されたロギング プロジェクトのプロジェクト ID。
    • SOURCE_PROJECT_ID_1SOURCE_PROJECT_ID_2: ログを収集するプロジェクトのプロジェクト ID。 3 つ以上のプロジェクトからログを収集する場合は、クエリの in 句にプロジェクト ID を追加できます。

マルチプロジェクト ロギングを無効にする

複数のプロジェクトに対して Gemini Code Assist のロギングを構成した場合は、ログを一元化されたプロジェクトに転送するログシンクを削除することで無効にできます。個々のプロジェクトから一元化されたプロジェクトへのログの送信を停止するには、そのプロジェクトで作成したログシンクを削除します。

  1. Google Cloud コンソールで、ログの収集を停止するプロジェクトに切り替えます。
  2. [ログルーター] ページに移動します。

    [ログルーター] に移動

  3. ログを一元化されたプロジェクトに転送するシンクを特定します。

  4. そのシンクの行で、[その他の操作] アイコンをクリックし、 [シンクを削除] を選択します。

  5. 表示されるダイアログで [削除] をクリックします。

一元化されたプロジェクトへのログの送信を停止するプロジェクトごとに、上記の手順を繰り返します。

次のステップ