Tokennutzung für Dateneinblicke überwachen

In diesem Dokument wird erläutert, wie Sie den Tokenverbrauch für Dateneinblicke-Scans in Knowledge Catalog (früher Dataplex Universal Catalog) mit Cloud Logging und Cloud Monitoring überwachen. Wenn Sie die Tokennutzung pro Scan und pro Job im Blick behalten, können Sie Trends bei der Modellnutzung nachvollziehen und die in Rechnung gestellten Kosten für Ihr Projekt schätzen.

So funktioniert das Logging der Tokennutzung

Wenn ein Scan-Job für Dateneinblicke (jsonPayload.type="DATA_DOCUMENTATION") mit dem Status SUCCEEDED abgeschlossen wird, schreibt Knowledge Catalog einen Logeintrag in das dataplex.googleapis.com/data_scan-Log. Dieser Logeintrag enthält einen billableTokenUsage-Block unter jsonPayload.dataDocumentation, in dem die Tokenaufschlüsselung für den Job aufgezeichnet wird. Andere Logeinträge für den Job (z. B. CREATED-, STARTED-, FAILED- oder CANCELLED-Ereignisse) enthalten keinen billableTokenUsage-Block.

Im Block billableTokenUsage können Sie drei primäre Token-Kategorien verfolgen, um die Abrechnung zu schätzen:

Messwert Beschreibung Formel (mit billableTokenUsage Feldern)
Nicht im Cache gespeicherte Eingabetokens Eingabetokens, die nicht aus dem Kontext-Cache bereitgestellt wurden, einschließlich Prompt-Tokens für die Toolnutzung. max(promptTokenCount - cachedContentTokenCount, 0) + toolUsePromptTokenCount
Im Cache gespeicherte Eingabetokens Eingabetokens, die aus dem Kontext-Cache bereitgestellt werden. Im Cache gespeicherte Tokens werden separat erfasst, da sie nicht zum Standardpreis für nicht im Cache gespeicherte Eingaben abgerechnet werden. cachedContentTokenCount
Ausgabetokens Generierte Antworttokens plus Reasoning-Tokens (Thinking-Tokens). Thinking-Tokens werden als Ausgabe-Tokens abgerechnet. candidatesTokenCount + thoughtsTokenCount

Weitere Informationen zu den Tokenpreisen finden Sie unter Data Cloud-Agent – Preise.

Tokenfelder im Logeintrag

Jeder dataplex.googleapis.com/data_scan-Logeintrag enthält Standardressourcen- und Jobkennungen wie resource.labels.datascan_id, resource.labels.location, jsonPayload.jobId und jsonPayload.state. Bei erfolgreichen Scans von Dateneinblicken enthält das Objekt jsonPayload.dataDocumentation.billableTokenUsage die folgenden Felder:

Feld Beschreibung
promptTokenCount Gesamtzahl der Prompt-Tokens, die an das Modell gesendet wurden, einschließlich im Cache gespeicherter Tokens.
cachedContentTokenCount Anteil der Prompt-Tokens, die aus dem Kontext-Cache bereitgestellt werden.
toolUsePromptTokenCount Prompt-Tokens, die durch Toolaufrufe hinzugefügt wurden (z. B. Schema-, Profil- oder Abfrageverlaufskontext).
candidatesTokenCount Generierte Antworttokens, ausgenommen Thinking-Tokens.
thoughtsTokenCount Vom Modell generierte Reasoning-Token (Thinking-Token).

Das folgende Beispiel zeigt einen dataplex.googleapis.com/data_scan-Logeintrag für einen erfolgreichen Scan-Job für Dateneinblicke:

{
  "resource": {
    "type": "dataplex.googleapis.com/DataScan",
    "labels": {
      "datascan_id": "my-insights-scan",
      "location": "us-central1",
      "resource_container": "projects/1234567890"
    }
  },
  "jsonPayload": {
    "type": "DATA_DOCUMENTATION",
    "jobId": "8f2b3c4d-1234-5678-9abc-def012345678",
    "state": "SUCCEEDED",
    "dataDocumentation": {
      "billableTokenUsage": {
        "promptTokenCount": "20412",
        "candidatesTokenCount": "7053"
      }
    }
  }
}

In diesem Beispiel wurden für den Job weder Kontext-Caching noch Thinking-Tokens oder Toolaufrufe verwendet. Daraus ergibt sich Folgendes: 20,412 nicht im Cache gespeicherte Eingabetokens, 0 im Cache gespeicherte Eingabetokens und 7,053 Ausgabetokens.

Hinweis

Bevor Sie Token-Logs für Dateneinblicke abfragen oder ein Monitoring-Dashboard erstellen, müssen Sie die folgenden Voraussetzungen erfüllen.

Erforderliche Rollen

Bitten Sie Ihren Administrator, Ihnen die folgenden IAM-Rollen für Ihr Projekt zuzuweisen, um die Berechtigungen zu erhalten, die Sie zum Überwachen der Tokennutzung für Dateneinblicke benötigen:

  • Daten-Scan-Logs ansehen und Observability Analytics-Abfragen ausführen: Loganzeige (roles/logging.viewer)
  • Benutzerdefinierte Dashboards in Monitoring erstellen: Monitoring-Bearbeiter (roles/monitoring.editor)
  • Benutzerdefinierte Dashboards in Monitoring ansehen: Monitoring-Betrachter (roles/monitoring.viewer)

Weitere Informationen zum Zuweisen von Rollen finden Sie unter Zugriff auf Projekte, Ordner und Organisationen verwalten.

Sie können die erforderlichen Berechtigungen auch über benutzerdefinierte Rollen oder andere vordefinierte Rollen erhalten.

APIs aktivieren

Aktivieren Sie die Dataplex, Logging und Monitoring APIs, falls sie noch nicht aktiviert sind.

Erforderliche Rollen zum Aktivieren von APIs

Zum Aktivieren von APIs benötigen Sie die Berechtigung serviceusage.services.enable. Wenn Sie das Projekt erstellt haben, haben Sie diese Berechtigung wahrscheinlich bereits über die Inhaberrolle (roles/owner). Andernfalls können Sie diese Berechtigung über die Rolle „Service Usage-Administrator“ (roles/serviceusage.serviceUsageAdmin) erhalten. Informationen zum Zuweisen von Rollen

APIs aktivieren

Konfiguration des Logroutings prüfen

Bei Scans von Dateneinblicken werden Logs unter dem Lognamen dataplex.googleapis.com/data_scan geschrieben. Die Dashboard-Konfigurationen in diesem Dokument lesen diese Logs aus dem Log-Bucket _Default Ihres Projekts. Prüfen Sie, ob das Logrouting Ihres Projekts die folgenden Bedingungen erfüllt:

  • Die Senke _Default ist aktiviert und leitet Logs an den Log-Bucket _Default weiter.
  • Die Senke _Default hat keinen „Ausschließen“-Filter, der dataplex.googleapis.com/data_scan- oder DATA_DOCUMENTATION-Logs verwirft.

Console

  1. Rufen Sie in der Google Cloud Console die Seite Logging > Log-Router auf.

    Zum "Log Router"

  2. Suchen Sie die Senke _Default und prüfen Sie, ob der Status Aktiviert und das Ziel der Bucket _Default ist.

  3. Klicken Sie auf das Menü der Senke () und wählen Sie Senkendetails ansehen aus. Prüfen Sie, ob kein „Ausschließen“-Filter mit dataplex.googleapis.com/data_scan oder DATA_DOCUMENTATION übereinstimmt.

gcloud

Beschreiben Sie die Senke _Default, um ihren Status, ihr Ziel und ihre Ausschlussfilter zu prüfen:

gcloud logging sinks describe _Default --project=PROJECT_ID

Ersetzen Sie PROJECT_ID durch Ihre Google CloudProjekt-ID.

Prüfen Sie, ob disabled nicht auf true festgelegt ist, destination mit /buckets/_Default endet und kein Eintrag unter exclusions mit data_scan übereinstimmt.

Observability Analytics für den Bucket _Default aktivieren

Wenn Sie SQL-Abfragen für die Scanlogs Ihrer Dateneinblicke ausführen und das benutzerdefinierte Observability Analytics-Dashboard nutzen möchten, führen Sie ein Upgrade des Log-Buckets _Default Ihres Projekts durch, um Observability Analytics zu verwenden.

Bevor Sie Observability Analytics für den Log-Bucket _Default aktivieren, sollten Sie Folgendes beachten:

  • Das Upgrade eines Buckets auf Observability Analytics kann nicht rückgängig gemacht werden und es fallen keine zusätzlichen Kosten an.
  • Sie müssen kein verknüpftes BigQuery-Dataset erstellen.
  • SQL-Abfragen von Observability Analytics geben nur Logs zurück, die nach Abschluss des Upgrades eingehen. Ältere Logs sind weiterhin im Log-Explorer verfügbar, werden aber nicht in den SQL-Abfrageergebnissen angezeigt. Führen Sie nach dem Upgrade des Buckets mindestens einen Scan für Dateneinblicke aus, damit Ihr Dashboard Daten zum Anzeigen hat.

Console

  1. Rufen Sie in der Google Cloud Console die Seite Logging > Logspeicher auf.

    Zum Logspeicher

  2. Suchen Sie die Zeile für den Bucket _Default und sehen Sie sich die Spalte Observability Analytics verfügbar an:

    • Wenn in der Spalte Öffnen angezeigt wird, ist Observability Analytics bereits aktiviert.
    • Wenn in der Spalte Upgrade angezeigt wird, klicken Sie auf Upgrade und bestätigen Sie das Upgrade.
  3. Warten Sie einige Minuten, bis sich der Spaltenstatus in Offen ändert.

gcloud

  1. Führen Sie ein Upgrade des Log-Buckets _Default durch, um Observability Analytics zu aktivieren:

    gcloud logging buckets update _Default \
        --location=global --enable-analytics --project=PROJECT_ID
    

    Ersetzen Sie dabei PROJECT_ID durch die ID Ihres Projekts in Google Cloud .

  2. Prüfen Sie nach einigen Minuten, ob das Upgrade abgeschlossen ist:

    gcloud logging buckets describe _Default \
        --location=global --project=PROJECT_ID
    

    Prüfen Sie, ob die Ausgabe analyticsEnabled: true enthält.

Tokennutzung pro Job im Log-Explorer ansehen

Wenn Sie den Tokenverbrauch einzelner Scanaufträge für Dateneinblicke prüfen möchten, verwenden Sie den Log-Explorer oder die Google Cloud CLI. Für stündliche oder tägliche Aggregationen in Ihrem Projekt können Sie ein Dashboard mit Observability Analytics erstellen.

Console

  1. Rufen Sie in der Google Cloud Console die Seite Logging > Log-Explorer auf.

    Zum Log-Explorer

  2. Wenn der Abfrageeditor nicht angezeigt wird, aktivieren Sie Abfrage anzeigen.

  3. Geben Sie im Abfrageeditor die folgende Abfrage ein:

    log_id("dataplex.googleapis.com/data_scan")
    jsonPayload.type="DATA_DOCUMENTATION"
    jsonPayload.dataDocumentation.billableTokenUsage.promptTokenCount:*
    

    Optional: Wenn Sie nach einem bestimmten Scan oder einer bestimmten Jobausführung filtern möchten, hängen Sie eine der folgenden Zeilen an die Abfrage an:

    resource.labels.datascan_id="DATA_SCAN_ID"
    jsonPayload.jobId="JOB_ID"
    

    Ersetzen Sie Folgendes:

    • DATA_SCAN_ID: die ID des Dateneinblicke-Scans.
    • JOB_ID: die ID einer bestimmten Ausführung des Scan-Jobs.
  4. Wählen Sie einen Zeitraum aus (z. B. Letzte 24 Stunden) und klicken Sie dann auf Abfrage ausführen.

  5. Maximieren Sie einen Logeintrag und öffnen Sie jsonPayload > dataDocumentation > billableTokenUsage, um die Tokenanzahl für diesen Job zu prüfen.

gcloud

Lesen Sie die letzten Logeinträge für den Dateneinblicke-Scan und formatieren Sie die Tokenfelder als Tabelle:

gcloud logging read \
    'log_id("dataplex.googleapis.com/data_scan") AND jsonPayload.type="DATA_DOCUMENTATION" AND jsonPayload.dataDocumentation.billableTokenUsage.promptTokenCount:*' \
    --project=PROJECT_ID --freshness=1d --limit=20 \
    --format='table(timestamp, resource.labels.datascan_id:label=SCAN,
jsonPayload.jobId:label=JOB,
jsonPayload.dataDocumentation.billableTokenUsage.promptTokenCount:label=PROMPT,
jsonPayload.dataDocumentation.billableTokenUsage.cachedContentTokenCount:label=CACHED,
jsonPayload.dataDocumentation.billableTokenUsage.toolUsePromptTokenCount:label=TOOL_USE,
jsonPayload.dataDocumentation.billableTokenUsage.candidatesTokenCount:label=CANDIDATES,
jsonPayload.dataDocumentation.billableTokenUsage.thoughtsTokenCount:label=THOUGHTS)'

Ersetzen Sie PROJECT_ID durch Ihre Google CloudProjekt-ID.

Eine leere Spalte in der Ausgabetabelle gibt an, dass für dieses Feld 0 Tokens vorhanden sind. Wenn Sie diese Felder in Messwerte umwandeln möchten, verwenden Sie die Formeln unter So funktioniert das Logging der Tokennutzung.

Tokennutzung mit Observability Analytics abfragen

Sie können die SQL-Abfragen des Widgets auch direkt auf der Seite Loganalysen in derGoogle Cloud -Console ausführen oder anpassen.

Die täglichen und stündlichen Diagramme verwenden dieselbe Diagrammabfrage, die eine Zeile pro Scan-Job zurückgibt. In jedem Diagramm-Widget werden die Zeilen nach Tag (timeBinSize: 86400s) oder Stunde (timeBinSize: 3600s) gruppiert und summiert. Wenn Sie eine Diagrammabfrage bearbeiten und wieder in ein Dashboard-Widget einfügen, behalten Sie die Spaltenaliasse timestamp, total_non_cached_input_tokens, total_cached_input_tokens und total_output_tokens bei.

Wenn Sie eine Abfrage auf einen einzelnen Scan filtern möchten, hängen Sie die folgende Bedingung an die WHERE-Klausel an:

AND JSON_VALUE(resource.labels, '$.datascan_id') = 'DATA_SCAN_ID'

Ersetzen Sie DATA_SCAN_ID durch die ID Ihres Scans für Datenstatistiken.

Beispiel für eine Diagrammabfrage (Tages- und Stundendiagramme)

SELECT
  timestamp,
  GREATEST(
    IFNULL(SAFE_CAST(JSON_VALUE(json_payload, '$.dataDocumentation.billableTokenUsage.promptTokenCount') AS INT64), 0)
    - IFNULL(SAFE_CAST(JSON_VALUE(json_payload, '$.dataDocumentation.billableTokenUsage.cachedContentTokenCount') AS INT64), 0),
    0)
  + IFNULL(SAFE_CAST(JSON_VALUE(json_payload, '$.dataDocumentation.billableTokenUsage.toolUsePromptTokenCount') AS INT64), 0)
    AS total_non_cached_input_tokens,
  IFNULL(SAFE_CAST(JSON_VALUE(json_payload, '$.dataDocumentation.billableTokenUsage.cachedContentTokenCount') AS INT64), 0)
    AS total_cached_input_tokens,
  IFNULL(SAFE_CAST(JSON_VALUE(json_payload, '$.dataDocumentation.billableTokenUsage.candidatesTokenCount') AS INT64), 0)
  + IFNULL(SAFE_CAST(JSON_VALUE(json_payload, '$.dataDocumentation.billableTokenUsage.thoughtsTokenCount') AS INT64), 0)
    AS total_output_tokens
FROM `PROJECT_ID.global._Default._Default`
WHERE
  log_id = 'dataplex.googleapis.com/data_scan'
  AND JSON_VALUE(json_payload, '$.type') = 'DATA_DOCUMENTATION'
  AND JSON_VALUE(json_payload, '$.dataDocumentation.billableTokenUsage.promptTokenCount') IS NOT NULL

Ersetzen Sie PROJECT_ID durch Ihre Google CloudProjekt-ID.

Beispielabfrage pro Scan-Job

SELECT
  timestamp,
  JSON_VALUE(resource.labels, '$.datascan_id') AS data_scan_id,
  JSON_VALUE(resource.labels, '$.location') AS location,
  JSON_VALUE(json_payload, '$.jobId') AS job_id,
  JSON_VALUE(json_payload, '$.state') AS state,
  GREATEST(
    IFNULL(SAFE_CAST(JSON_VALUE(json_payload, '$.dataDocumentation.billableTokenUsage.promptTokenCount') AS INT64), 0)
    - IFNULL(SAFE_CAST(JSON_VALUE(json_payload, '$.dataDocumentation.billableTokenUsage.cachedContentTokenCount') AS INT64), 0),
    0)
  + IFNULL(SAFE_CAST(JSON_VALUE(json_payload, '$.dataDocumentation.billableTokenUsage.toolUsePromptTokenCount') AS INT64), 0)
    AS non_cached_input_tokens,
  IFNULL(SAFE_CAST(JSON_VALUE(json_payload, '$.dataDocumentation.billableTokenUsage.cachedContentTokenCount') AS INT64), 0)
    AS cached_input_tokens,
  IFNULL(SAFE_CAST(JSON_VALUE(json_payload, '$.dataDocumentation.billableTokenUsage.candidatesTokenCount') AS INT64), 0)
  + IFNULL(SAFE_CAST(JSON_VALUE(json_payload, '$.dataDocumentation.billableTokenUsage.thoughtsTokenCount') AS INT64), 0)
    AS output_tokens
FROM `PROJECT_ID.global._Default._Default`
WHERE
  log_id = 'dataplex.googleapis.com/data_scan'
  AND JSON_VALUE(json_payload, '$.type') = 'DATA_DOCUMENTATION'
  AND JSON_VALUE(json_payload, '$.dataDocumentation.billableTokenUsage.promptTokenCount') IS NOT NULL
ORDER BY timestamp DESC
LIMIT 500

Ersetzen Sie PROJECT_ID durch Ihre Google CloudProjekt-ID.

Dashboard mit Observability Analytics erstellen

Wenn Sie den Tokenverbrauch des Modells im Zeitverlauf visualisieren und verfolgen möchten, können Sie mit Observability Analytics ein benutzerdefiniertes Monitoring-Dashboard erstellen.

Bei diesem Ansatz werden SQL-Abfragen direkt für die Scanlogs der Dateneinblicke im Log-Bucket _Default ausgeführt. Das bietet mehrere Vorteile:

  • Genauigkeit: Abfragen berechnen die genaue Tokenanzahl direkt aus den JSON-Nutzlasten der Logeinträge und nicht aus aggregierten Messwertschätzungen.
  • Detaillierter Jobverlauf: Neben aggregierten Diagrammen können Sie einzelne Scanjobs in einer Tabellenansicht prüfen.
  • Keine zusätzlichen Kosten: Für das Upgrade des Log-Buckets _Default auf Observability Analytics fallen keine zusätzlichen Kosten an.

Mit dieser Option wird ein Monitoring-Dashboard mit drei Widgets erstellt, die SQL-Abfragen für Ihre Logs ausführen:

  • Tägliche Tokennutzung (gestapeltes Balkendiagramm)
  • Stündliche Tokennutzung (Liniendiagramm)
  • Tokennutzung pro Scanjob (Tabelle mit den letzten 500 Jobs)

In der folgenden JSON-Konfiguration des Dashboards wird die integrierte Variable @__project_id (@__project_id.global._Default._Default) verwendet, die automatisch das Projekt abfragt, in dem Sie das Dashboard öffnen. Sie müssen vor dem Importieren keine Projektplatzhalter in der JSON-Datei bearbeiten.

Console

  1. Rufen Sie in der Google Cloud Console die Seite Monitoring > Dashboards auf.

    Dashboards aufrufen

  2. Klicken Sie auf Dashboard erstellen.

  3. Klicken Sie in der Symbolleiste auf Einstellungen, wählen Sie JSON und dann JSON-Editor aus.

  4. Ersetzen Sie den vorhandenen Inhalt des Editors durch die JSON-Definition des Dashboards, die im nächsten Abschnitt bereitgestellt wird.

  5. Klicken Sie auf Änderungen übernehmen. Wenn die automatische Speicherung aktiviert ist, speichert Monitoring das Dashboard als Data Insights - Token Usage.

  6. Wenn Sie das Dashboard zum ersten Mal öffnen, werden Sie von jedem Widget aufgefordert, die Ausführung der SQL-Abfrage in der BigQuery-Engine für Ihr Projekt zu bestätigen. Prüfen Sie, ob Ihr Projekt in der Eingabeaufforderung aufgeführt ist, und klicken Sie dann bei jedem Widget auf Ausführung fortsetzen.

  7. Wählen Sie in der Dashboard-Symbolleiste einen Zeitraum aus (z. B. Letzte 7 Tage).

gcloud

  1. Speichern Sie die JSON-Definition des Dashboards in einer lokalen Datei mit dem Namen dashboard.json.
  2. Erstellen Sie das Dashboard in Monitoring:

    gcloud monitoring dashboards create \
        --project=PROJECT_ID \
        --config-from-file=dashboard.json
    

    Ersetzen Sie dabei PROJECT_ID durch IhreGoogle Cloud -Projekt-ID.

  3. Öffnen Sie in der Google Cloud Console die Seite Dashboards, wählen Sie Insights Scan – Tokennutzung aus und klicken Sie in jedem Widget auf Ausführung fortsetzen, um die Ausführung der SQL-Abfrage zu autorisieren.

JSON-Definition des Dashboards

Erweitern Sie den folgenden Abschnitt und kopieren Sie die JSON-Definition, um das Dashboard zu erstellen:

JSON-Definition

{
  "displayName": "Data Insights - Token Usage",
  "mosaicLayout": {
    "columns": 48,
    "tiles": [
      {
        "xPos": 0,
        "yPos": 0,
        "width": 24,
        "height": 16,
        "widget": {
          "title": "Daily token usage",
          "xyChart": {
            "chartOptions": {
              "mode": "COLOR",
              "displayHorizontal": false
            },
            "dataSets": [
              {
                "plotType": "STACKED_BAR",
                "targetAxis": "Y1",
                "breakdowns": [],
                "dimensions": [
                  {
                    "column": "timestamp",
                    "columnType": "TIMESTAMP",
                    "sortColumn": "timestamp",
                    "sortOrder": "SORT_ORDER_ASCENDING",
                    "timeBinSize": "86400s"
                  }
                ],
                "measures": [
                  {
                    "column": "total_non_cached_input_tokens",
                    "aggregationFunction": {
                      "type": "sum",
                      "parameters": []
                    }
                  },
                  {
                    "column": "total_cached_input_tokens",
                    "aggregationFunction": {
                      "type": "sum",
                      "parameters": []
                    }
                  },
                  {
                    "column": "total_output_tokens",
                    "aggregationFunction": {
                      "type": "sum",
                      "parameters": []
                    }
                  }
                ],
                "timeSeriesQuery": {
                  "opsAnalyticsQuery": {
                    "sql": "SELECT\n  timestamp,\n  GREATEST(\n    IFNULL(SAFE_CAST(JSON_VALUE(json_payload, '$.dataDocumentation.billableTokenUsage.promptTokenCount') AS INT64), 0)\n    - IFNULL(SAFE_CAST(JSON_VALUE(json_payload, '$.dataDocumentation.billableTokenUsage.cachedContentTokenCount') AS INT64), 0),\n    0)\n  + IFNULL(SAFE_CAST(JSON_VALUE(json_payload, '$.dataDocumentation.billableTokenUsage.toolUsePromptTokenCount') AS INT64), 0)\n    AS total_non_cached_input_tokens,\n  IFNULL(SAFE_CAST(JSON_VALUE(json_payload, '$.dataDocumentation.billableTokenUsage.cachedContentTokenCount') AS INT64), 0)\n    AS total_cached_input_tokens,\n  IFNULL(SAFE_CAST(JSON_VALUE(json_payload, '$.dataDocumentation.billableTokenUsage.candidatesTokenCount') AS INT64), 0)\n  + IFNULL(SAFE_CAST(JSON_VALUE(json_payload, '$.dataDocumentation.billableTokenUsage.thoughtsTokenCount') AS INT64), 0)\n    AS total_output_tokens\nFROM `@__project_id.global._Default._Default`\nWHERE\n  log_id = 'dataplex.googleapis.com/data_scan'\n  AND JSON_VALUE(json_payload, '$.type') = 'DATA_DOCUMENTATION'\n  AND JSON_VALUE(json_payload, '$.dataDocumentation.billableTokenUsage.promptTokenCount') IS NOT NULL"
                  }
                }
              }
            ],
            "yAxis": {
              "label": "tokens",
              "scale": "LINEAR"
            }
          }
        }
      },
      {
        "xPos": 24,
        "yPos": 0,
        "width": 24,
        "height": 16,
        "widget": {
          "title": "Hourly token usage",
          "xyChart": {
            "chartOptions": {
              "mode": "COLOR",
              "displayHorizontal": false
            },
            "dataSets": [
              {
                "plotType": "LINE",
                "targetAxis": "Y1",
                "breakdowns": [],
                "dimensions": [
                  {
                    "column": "timestamp",
                    "columnType": "TIMESTAMP",
                    "sortColumn": "timestamp",
                    "sortOrder": "SORT_ORDER_ASCENDING",
                    "timeBinSize": "3600s"
                  }
                ],
                "measures": [
                  {
                    "column": "total_non_cached_input_tokens",
                    "aggregationFunction": {
                      "type": "sum",
                      "parameters": []
                    }
                  },
                  {
                    "column": "total_cached_input_tokens",
                    "aggregationFunction": {
                      "type": "sum",
                      "parameters": []
                    }
                  },
                  {
                    "column": "total_output_tokens",
                    "aggregationFunction": {
                      "type": "sum",
                      "parameters": []
                    }
                  }
                ],
                "timeSeriesQuery": {
                  "opsAnalyticsQuery": {
                    "sql": "SELECT\n  timestamp,\n  GREATEST(\n    IFNULL(SAFE_CAST(JSON_VALUE(json_payload, '$.dataDocumentation.billableTokenUsage.promptTokenCount') AS INT64), 0)\n    - IFNULL(SAFE_CAST(JSON_VALUE(json_payload, '$.dataDocumentation.billableTokenUsage.cachedContentTokenCount') AS INT64), 0),\n    0)\n  + IFNULL(SAFE_CAST(JSON_VALUE(json_payload, '$.dataDocumentation.billableTokenUsage.toolUsePromptTokenCount') AS INT64), 0)\n    AS total_non_cached_input_tokens,\n  IFNULL(SAFE_CAST(JSON_VALUE(json_payload, '$.dataDocumentation.billableTokenUsage.cachedContentTokenCount') AS INT64), 0)\n    AS total_cached_input_tokens,\n  IFNULL(SAFE_CAST(JSON_VALUE(json_payload, '$.dataDocumentation.billableTokenUsage.candidatesTokenCount') AS INT64), 0)\n  + IFNULL(SAFE_CAST(JSON_VALUE(json_payload, '$.dataDocumentation.billableTokenUsage.thoughtsTokenCount') AS INT64), 0)\n    AS total_output_tokens\nFROM `@__project_id.global._Default._Default`\nWHERE\n  log_id = 'dataplex.googleapis.com/data_scan'\n  AND JSON_VALUE(json_payload, '$.type') = 'DATA_DOCUMENTATION'\n  AND JSON_VALUE(json_payload, '$.dataDocumentation.billableTokenUsage.promptTokenCount') IS NOT NULL"
                  }
                }
              }
            ],
            "yAxis": {
              "label": "tokens",
              "scale": "LINEAR"
            }
          }
        }
      },
      {
        "xPos": 0,
        "yPos": 16,
        "width": 48,
        "height": 20,
        "widget": {
          "title": "Token usage per scan job (latest 500)",
          "timeSeriesTable": {
            "columnSettings": [],
            "dataSets": [
              {
                "tableTemplate": "",
                "timeSeriesQuery": {
                  "opsAnalyticsQuery": {
                    "sql": "SELECT\n  timestamp,\n  JSON_VALUE(resource.labels, '$.datascan_id') AS data_scan_id,\n  JSON_VALUE(resource.labels, '$.location') AS location,\n  JSON_VALUE(json_payload, '$.jobId') AS job_id,\n  JSON_VALUE(json_payload, '$.state') AS state,\n  GREATEST(\n    IFNULL(SAFE_CAST(JSON_VALUE(json_payload, '$.dataDocumentation.billableTokenUsage.promptTokenCount') AS INT64), 0)\n    - IFNULL(SAFE_CAST(JSON_VALUE(json_payload, '$.dataDocumentation.billableTokenUsage.cachedContentTokenCount') AS INT64), 0),\n    0)\n  + IFNULL(SAFE_CAST(JSON_VALUE(json_payload, '$.dataDocumentation.billableTokenUsage.toolUsePromptTokenCount') AS INT64), 0)\n    AS non_cached_input_tokens,\n  IFNULL(SAFE_CAST(JSON_VALUE(json_payload, '$.dataDocumentation.billableTokenUsage.cachedContentTokenCount') AS INT64), 0)\n    AS cached_input_tokens,\n  IFNULL(SAFE_CAST(JSON_VALUE(json_payload, '$.dataDocumentation.billableTokenUsage.candidatesTokenCount') AS INT64), 0)\n  + IFNULL(SAFE_CAST(JSON_VALUE(json_payload, '$.dataDocumentation.billableTokenUsage.thoughtsTokenCount') AS INT64), 0)\n    AS output_tokens\nFROM `@__project_id.global._Default._Default`\nWHERE\n  log_id = 'dataplex.googleapis.com/data_scan'\n  AND JSON_VALUE(json_payload, '$.type') = 'DATA_DOCUMENTATION'\n  AND JSON_VALUE(json_payload, '$.dataDocumentation.billableTokenUsage.promptTokenCount') IS NOT NULL\nORDER BY timestamp DESC\nLIMIT 500"
                  }
                }
              }
            ],
            "metricVisualization": "NUMBER"
          }
        }
      }
    ]
  }
}

Beschränkungen

  • Tokenmesswerte sind nur vollständig, wenn dataplex.googleapis.com/data_scan-Logs nicht ausgeschlossen oder vom Log-Bucket _Default weggeleitet werden.
  • Es werden nur erfolgreiche Jobs mit Token-Metadaten gezählt. Logeinträge ohne billableTokenUsage-Block werden von den Abfragen und Messwerten ausgeschlossen.
  • Verwenden Sie diese Dashboards, um Nutzungstrends zu beobachten und Kosten zu schätzen, nicht um eine offizielle Cloud Billing-Rechnung abzugleichen.
  • Für jedes Google Cloud -Projekt ist eine eigene Dashboard-Einrichtung erforderlich.
  • SQL-Abfragen geben keine Logeinträge zurück, die geschrieben wurden, bevor Observability Analytics für den Bucket _Default aktiviert wurde.
  • Im Tabellen-Widget pro Job werden maximal die 500 neuesten Jobs im ausgewählten Zeitraum angezeigt. Wenn Sie ältere Jobs prüfen möchten, fragen Sie den Log-Explorer ab.

Nächste Schritte