Konfigurowanie rejestrowania Gemini Code Assist Standard i Enterprise

Ten dokument opisuje, jak skonfigurować logowanie Gemini Code Assist w wersji Standard i Enterprise w projekcie za pomocą konsoli Google Cloud lub interfejsu API.

Ograniczenia

  • Rejestrowanie danych logowania Gemini Standard i Enterprise w Google Cloud jest ograniczone do interakcji użytkownika z Gemini Code Assist w IDE.

  • Domyślnie logi Gemini w Google Cloud są zbierane w poszczególnych projektach. Instrukcje konfigurowania scentralizowanego projektu do zbierania logów z wielu projektów znajdziesz w artykule Konfigurowanie logowania w wielu projektach.

  • Gemini Code Assist w GitHubie nie obsługuje logowania za pomocą Cloud Logging.

Zanim zaczniesz

Sprawdź, czy Twój projekt w chmurze Google Cloud jest połączony z kontem rozliczeniowym.

Sprawdzanie uprawnień

Aby skonfigurować logowanie w Gemini Code Assist, musisz mieć określone uprawnienia IAM. Aby przestrzegać zasady jak najmniejszych uprawnień, przyznaj rolę niestandardową, która zawiera tylko niezbędne uprawnienia.

Poproś administratora o utworzenie roli niestandardowej, która obejmuje te uprawnienia:

  • serviceusage.services.enable – aby włączyć interfejsy API w projekcie.
  • cloudaicompanion.loggingSettings.create – aby utworzyć ustawienia rejestrowania.
  • cloudaicompanion.loggingSettings.get – aby wyświetlić ustawienia rejestrowania.
  • cloudaicompanion.loggingSettings.list – aby wyświetlić ustawienia rejestrowania.
  • cloudaicompanion.loggingSettings.update– aby zaktualizować ustawienia logowania.
  • cloudaicompanion.loggingSettingBindings.create– aby powiązać ustawienia logowania z projektem.
  • cloudaicompanion.loggingSettingBindings.get– aby wyświetlić powiązania ustawień rejestrowania.
  • cloudaicompanion.loggingSettingBindings.list– aby wyświetlić listę powiązań ustawień rejestrowania.

Możesz też przyznać wstępnie zdefiniowane role Administrator ustawień Gemini w Google Cloud (roles/cloudaicompanion.settingsAdmin) i Administrator korzystania z usług (roles/serviceusage.serviceUsageAdmin). Role te obejmują jednak uprawnienia do konfigurowania wszystkich ustawień administratora Gemini w Google Cloud i zarządzania korzystaniem z usług, co może być więcej niż potrzeba do skonfigurowania ustawień logowania.

Konfigurowanie logowania Gemini Code Assist

W sekcjach poniżej znajdziesz instrukcje włączania zbierania i przechowywania w Cloud Logging danych o aktywności w Gemini Code Assist Standard i Enterprise, w tym:

  • Logi promptów i odpowiedzi Gemini Code Assist Standard i Enterprise, takie jak dane wejściowe użytkownika, informacje kontekstowe i odpowiedzi.

  • logi metadanych Gemini Code Assist Standard i Enterprise, takie jak metadane telemetryczne i wiersze kodu zaakceptowane przez użytkownika;

Więcej informacji o obu typach dzienników znajdziesz w artykule Wyświetlanie dzienników Gemini.

Włączanie logowania dla Gemini Code Assist w projekcie

Wybierz jedną z tych opcji:

Konsola

  1. Sprawdź, czy w projekcie włączony jest interfejs API Cloud Logging.

  2. W konsoli Google Cloud otwórz stronę Admin for Gemini.

    Otwórz Gemini w Google Cloud

    Otworzy się strona Gemini w Google Cloud.

  3. W menu nawigacyjnym po lewej stronie kliknij Ustawienia.

    Wczytuje się strona Ustawienia.

  4. (Opcjonalnie) Kliknij Logowanie metadanych Code Assist, aby rejestrować metadane wygenerowane przez użytkowników Gemini Code Assist w wersji Standard i Enterprise w projekcie.

  5. (Opcjonalnie) Kliknij Logowanie promptów i odpowiedzi Code Assist, aby rejestrować prompty i odpowiedzi wygenerowane przez użytkowników Gemini Code Assist w wersji Standard i Enterprise w projekcie.

  6. Kliknij Zapisz zmiany.

Interfejs API

Aby włączyć logowanie w przypadku Gemini Code Assist Standard i Enterprise, użyj zasobu loggingSettings, aby zdefiniować wybrane ustawienia logowania, a następnie użyj zasobu loggingSettings.settingBindings, aby powiązać ustawienia z projektem:

  1. Sprawdź, czy w projekcie włączony jest interfejs Cloud Logging API.

  2. Utwórz ustawienie i wartość związaną z tym ustawieniem:

    1. Uzyskaj token:

      TOKEN=$(gcloud auth print-access-token)
      
  3. Włącz logi Gemini Code Assist Standard i Enterprise. Dzienniki użytkowników i dzienniki metadanych są włączone odpowiednio w polach log_prompts_and_responseslog_metadata. Jeśli nie chcesz włączyć któregoś z pól, wyklucz je z żądania.

    1. Aby utworzyć ustawienie, uruchom to polecenie:

      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"
      

      Zastąp następujące elementy:

      • CONTAINER_PROJECT_NAME: wpisz identyfikator projektu, w którym przechowywany jest zasób powiązania. Jest to projekt nadrzędny powiązania.
      • LOGS_SETTING_ID: Wpisz unikalną nazwę ustawienia, np. gcalm.

      Jeśli polecenie się powiedzie, zwróci treść odpowiedzi, w której pola log_prompts_and_responseslog_metadata będą miały wartość 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. Uruchom to polecenie, aby utworzyć powiązanie ustawień logów Gemini Code Assist w wersji Standard i 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"
      

    Zastąp następujące elementy:

    • TARGET_PROJECT_NAME: wpisz projekt docelowy, z którym ma być powiązane powiązanie. Często jest to ten sam projekt co projekt kontenera. Możesz jednak powiązać ustawienie z kilkoma projektami, aby nie trzeba było duplikować zasobu ustawienia.
    • LOGS_BINDING_ID: użyj tego samego identyfikatora LOGS_SETTING_ID, który został użyty podczas tworzenia ustawienia, ale dodaj do niego b1. Na przykład użyj elementu gcalmb1.

    Jeśli polecenie się powiedzie, zwróci metadane operacji w tym formacie:

    {
      "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
    }
    

Wyłączanie logowania dla Gemini Code Assist w projekcie

Wybierz jedną z tych opcji:

Konsola

  1. W konsoli Google Cloud otwórz stronę Admin for Gemini.

    Otwórz Gemini w Google Cloud

    Otworzy się strona Gemini w Google Cloud.

  2. W menu nawigacyjnym po lewej stronie kliknij Ustawienia.

    Wczytuje się strona Ustawienia.

  3. Kliknij Logowanie metadanych Code Assist, aby wyłączyć rejestrowanie metadanych z użycia Gemini Code Assist Standard i Enterprise w projekcie.

  4. Kliknij Zapisz zmiany.

Interfejs API

Aby wyłączyć logowanie w przypadku Gemini Code Assist Standard i Enterprise, użyj metody loggingSetting.

  1. Utwórz ustawienie i wartość związaną z tym ustawieniem:

    1. Uzyskaj token:

      TOKEN=$(gcloud auth print-access-token)
      
  2. Aby wyłączyć ustawienia logów Gemini Code Assist Standard i Enterprise, uruchom to polecenie:

      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"
    

    Zastąp następujące elementy:

    • CONTAINER_PROJECT_NAME: wpisz identyfikator projektu nadrzędnego.
    • LOGS_SETTING_ID: wpisz nazwę istniejącego ustawienia, np. gcalm.

      Jeśli polecenie się powiedzie, zwróci treść odpowiedzi, w której pola log_prompts_and_responseslog_metadata będą miały wartość 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
      }
      

Konfigurowanie logowania w wielu projektach

Możesz używać logów z Gemini Code Assist do tworzenia danych i paneli do monitorowania wykorzystania w poszczególnych projektach. Jeśli Twoja organizacja ma wiele projektów, możesz skonfigurować scentralizowany projekt logowania, aby zbierać logi z wielu projektów i generować panele w tych projektach.

Tworzenie projektu scentralizowanej analizy logów

Ten projekt będzie służyć jako centrum logów z innych projektów.

  1. W konsoli Google Cloud otwórz stronę Tworzenie projektu.

    Otwórz stronę Utwórz projekt

  2. W oknie Nowy projekt wpisz wartości w tych polach:

    • Nazwa projektu: nazwa scentralizowanego projektu logowania.
    • Konto rozliczeniowe: wybierz konto rozliczeniowe.
    • Organizacja: wybierz swoją organizację. Scentralizowany projekt może zbierać logi tylko z projektów w tej samej organizacji.
    • Lokalizacja: wybierz lokalizację.
  3. Kliknij Utwórz.

Konfigurowanie ujść logów

Aby kierować logi do scentralizowanego projektu, skonfiguruj ujścia logów w każdym z projektów, z których chcesz zbierać logi.

Aby skonfigurować ujścia logów w każdym projekcie:

  1. W konsoli Google Cloud przejdź do projektu, z którego chcesz zbierać logi.
  2. Otwórz stronę Router logów:

    Otwórz router logów

  3. Kliknij Utwórz ujście.

  4. W sekcji Szczegóły ujścia wpisz nazwę i opis ujścia, a następnie kliknij Dalej.

  5. W sekcji Miejsce docelowe ujścia wykonaj te czynności:

    1. W menu Wybierz usługę ujścia wybierz Zasobnik Logging.
    2. W menu Zasobnik logów wybierz Użyj zasobnika logów w innym projekcie.
    3. W polu Miejsce docelowe wpisz:

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

      Zastąp CENTRALIZED_PROJECT_ID identyfikatorem projektu centralnego rejestrowania, który został utworzony.

    4. Kliknij Dalej.

  6. W sekcji Wybierz logi do uwzględnienia w ujściu utwórz filtr uwzględniania, wpisując w polu Filtr uwzględniania ten tekst:

    resource.type="cloudaicompanion.googleapis.com/Instance"
    
  7. Kliknij Dalej.

  8. W sekcji Wybierz logi, które mają być odfiltrowywane z ujścia pozostaw filtr wykluczania pusty i kliknij Utwórz ujście.

  9. Po utworzeniu ujścia na stronie Router logów znajdź utworzone ujście.

  10. W kolumnie Tożsamość osoby piszącej skopiuj pełny adres e-mail konta usługi.

Konfigurowanie dostępu

Aby przyznać ujściu uprawnienia do zapisywania logów w scentralizowanym projekcie, wykonaj te czynności:

  1. W konsoli Google Cloud przełącz się na utworzony projekt centralny.
  2. Otwórz stronę Uprawnienia

    Otwórz uprawnienia

  3. Kliknij Przyznaj dostęp.

  4. W polu Nowe podmioty zabezpieczeń wklej adres e-mail konta usługi, który został skopiowany w poprzedniej sekcji.

  5. Kliknij Dodaj kolejną rolę.

  6. Wyszukaj i wybierz rolę Zapisujący w zasobniku logów (roles/logging.bucketWriter).

  7. Kliknij Zapisz.

Tworzenie panelu w scentralizowanym projekcie

Po skonfigurowaniu centralnego projektu do odbierania logów możesz utworzyć panel, aby wyświetlać wskaźniki z wielu projektów:

  1. W konsoli Google Cloud otwórz Monitorowanie > Panele:

    Otwórz stronę Panele

  2. Kliknij Utwórz panel.

  3. Na pasku narzędzi kliknij Ustawienia, a następnie wybierz JSON > Edytor JSON.

  4. Wklej w edytorze JSON ten kod:

    {
      "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. Zastąp następujące elementy:

    • CENTRALIZED_PROJECT_ID: identyfikator projektu logowania scentralizowanego, który został utworzony.
    • SOURCE_PROJECT_ID_1SOURCE_PROJECT_ID_2: identyfikatory projektów, z których chcesz zbierać logi. Jeśli chcesz zbierać logi z więcej niż 2 projektów, możesz dodać więcej identyfikatorów projektów do klauzul in w zapytaniu.

Wyłączanie logowania w wielu projektach

Jeśli logowanie w Gemini Code Assist zostało skonfigurowane w wielu projektach, możesz je wyłączyć, usuwając ujścia logów, które kierują logi do projektu centralnego. Aby przestać wysyłać logi z poszczególnych projektów do projektu centralnego, usuń utworzone w nich ujścia logów:

  1. W konsoli Google Cloud przejdź do projektu, z którego chcesz przestać zbierać logi.
  2. Otwórz stronę Router logów:

    Otwórz router logów

  3. Określ ujście, które przekierowuje logi do scentralizowanego projektu.

  4. W wierszu tego miejsca docelowego kliknij Więcej działań, a następnie wybierz Usuń miejsce docelowe.

  5. W oknie, które się pojawi, kliknij Usuń.

Powtórz te czynności w przypadku każdego projektu, z którego chcesz przestać wysyłać logi do projektu centralnego.

Co dalej?