Surveiller l'utilisation des jetons Data Insights

Ce document explique comment surveiller la consommation de jetons pour les analyses d'insights sur les données de Knowledge Catalog (anciennement Dataplex Universal Catalog) à l'aide de Cloud Logging et Cloud Monitoring. Le suivi de l'utilisation des jetons par analyse et par job vous permet de comprendre les tendances d'utilisation des modèles et d'estimer les coûts facturés dans votre projet.

Fonctionnement de la journalisation de l'utilisation des jetons

Lorsqu'un job d'analyse d'insights sur les données (jsonPayload.type="DATA_DOCUMENTATION") se termine avec l'état SUCCEEDED, Knowledge Catalog écrit une entrée de journal dans le journal dataplex.googleapis.com/data_scan. Cette entrée de journal contient un bloc billableTokenUsage sous jsonPayload.dataDocumentation qui enregistre la répartition des jetons pour le job. Les autres entrées de journal pour le job (telles que les événements CREATED, STARTED, FAILED ou CANCELLED) n'incluent pas de bloc billableTokenUsage.

À partir du bloc billableTokenUsage, vous pouvez suivre trois catégories de jetons principales pour estimer la facturation :

Métrique Description Formule (à l'aide des champs billableTokenUsage)
Jetons d'entrée non mis en cache Jetons d'entrée qui n'ont pas été diffusés à partir du cache de contexte, y compris les jetons d'invite d'utilisation d'outils. max(promptTokenCount - cachedContentTokenCount, 0) + toolUsePromptTokenCount
Jetons d'entrée mis en cache Jetons d'entrée diffusés à partir du cache de contexte. Les jetons mis en cache sont suivis séparément, car ils ne sont pas facturés au tarif d'entrée non mis en cache standard. cachedContentTokenCount
Jetons de sortie Jetons de réponse générés plus jetons de raisonnement (réflexion). Les jetons de réflexion sont facturés en tant que jetons de sortie. candidatesTokenCount + thoughtsTokenCount

Pour en savoir plus sur les tarifs des jetons, consultez Tarifs de l'agent Data Cloud.

Champs de jetons dans l'entrée de journal

Chaque entrée de journal dataplex.googleapis.com/data_scan inclut des identifiants de ressource et de job standards tels que resource.labels.datascan_id, resource.labels.location, jsonPayload.jobId et jsonPayload.state. Pour les analyses d'insights sur les données réussies, l'objet jsonPayload.dataDocumentation.billableTokenUsage contient les champs suivants :

Champ Description
promptTokenCount Nombre total de jetons d'invite envoyés au modèle, y compris les jetons mis en cache.
cachedContentTokenCount Partie des jetons d'invite diffusés à partir du cache de contexte.
toolUsePromptTokenCount Jetons d'invite ajoutés par les appels d'outils (tels que le schéma, le profil ou l'historique des requêtes).
candidatesTokenCount Jetons de réponse générés, à l'exclusion des jetons de réflexion.
thoughtsTokenCount Jetons de raisonnement (réflexion) générés par le modèle.

L'exemple suivant montre une entrée de journal dataplex.googleapis.com/data_scan pour un job d'analyse d'insights sur les données réussi :

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

Dans cet exemple, le job n'a pas utilisé la mise en cache de contexte, les jetons de réflexion ni les appels d'outils. Par conséquent, les jetons d'entrée non mis en cache sont égaux à 20,412, les jetons d'entrée mis en cache sont égaux à 0 et les jetons de sortie sont égaux à 7,053.

Avant de commencer

Avant d'interroger les journaux de jetons d'insights sur les données ou de créer un tableau de bord de surveillance, remplissez les conditions préalables suivantes.

Rôles requis

Pour obtenir les autorisations nécessaires pour surveiller l'utilisation des jetons d'insights sur les données, demandez à votre administrateur de vous accorder les rôles IAM suivants sur votre projet :

  • Afficher les journaux d'analyse des données et exécuter des requêtes Analyse de l'observabilité: Visionneuse de journaux (roles/logging.viewer)
  • Créer des tableaux de bord personnalisés dans Monitoring: Éditeur Monitoring (roles/monitoring.editor)
  • Afficher les tableaux de bord personnalisés dans Monitoring: Lecteur Monitoring (roles/monitoring.viewer)

Pour en savoir plus sur l'attribution de rôles, consultez Gérer l'accès aux projets, aux dossiers et aux organisations.

Vous pouvez également obtenir les autorisations requises avec des rôles personnalisés ou d'autres rôles prédéfinis.

Activer les API

Activez les API Dataplex, Logging et Monitoring si elles ne sont pas déjà activées.

Rôles requis pour activer les API

Pour activer les API, vous avez besoin de l'autorisation serviceusage.services.enable. Si vous avez créé le projet, vous disposez probablement déjà de cette autorisation via le rôle Propriétaire (roles/owner). Sinon, vous pouvez obtenir cette autorisation via le rôle Administrateur d'utilisation du service (roles/serviceusage.serviceUsageAdmin). Découvrez comment attribuer des rôles.

Activer les API

Vérifier la configuration du routage des journaux

Les analyses d'insights sur les données écrivent des journaux sous le nom de journal dataplex.googleapis.com/data_scan. Les configurations de tableau de bord de ce document lisent ces journaux à partir du bucket de journaux _Default de votre projet. Vérifiez que le routage des journaux de votre projet répond aux conditions suivantes :

  • Le récepteur _Default est activé et achemine les journaux vers le bucket de journaux _Default.
  • Le récepteur _Default ne comporte aucun filtre "Exclure" qui supprime les journaux dataplex.googleapis.com/data_scan ou DATA_DOCUMENTATION.

Console

  1. Dans la Google Cloud console, accédez à la page Logging > Routeur de journaux.

    Accéder au routeur de journaux

  2. Localisez le récepteur _Default et vérifiez que son état est Activé et que sa destination est le bucket _Default.

  3. Cliquez sur le menu du récepteur () et sélectionnez Afficher les détails du récepteur. Vérifiez qu'aucun filtre "Exclure" ne correspond à dataplex.googleapis.com/data_scan ou DATA_DOCUMENTATION.

gcloud

Décrivez le récepteur _Default pour inspecter son état, sa destination et ses filtres d'exclusion :

gcloud logging sinks describe _Default --project=PROJECT_ID

Remplacez PROJECT_ID par l'ID de votre Google Cloud projet.

Vérifiez que disabled n'est pas défini sur true, que destination se termine par /buckets/_Default et qu'aucune entrée sous exclusions ne correspond à data_scan.

Activer l'analyse de l'observabilité sur le bucket _Default

Pour exécuter des requêtes SQL sur vos journaux d'analyse d'insights sur les données et alimenter le tableau de bord personnalisé Analyse de l'observabilité, mettez à niveau le bucket de journaux _Default de votre projet pour utiliser Analyse de l'observabilité.

Avant d'activer l'Analyse de l'observabilité sur le bucket de journaux _Default, tenez compte des points suivants :

  • La mise à niveau d'un bucket vers Analyse de l'observabilité est irréversible et n'entraîne aucun frais supplémentaire.
  • Vous n'avez pas besoin de créer un ensemble de données BigQuery associé.
  • Les requêtes SQL d'Analyse de l'observabilité ne renvoient que les journaux qui arrivent une fois la mise à niveau terminée. Les journaux plus anciens restent disponibles dans l'explorateur de journaux, mais n'apparaissent pas dans les résultats des requêtes SQL. Une fois le bucket mis à niveau, exécutez au moins une analyse d'insights sur les données afin que votre tableau de bord puisse afficher des données.

Console

  1. Dans la Google Cloud console, accédez à la page Logging > Stockage des journaux.

    Accéder à la page "Stockage des journaux"

  2. Localisez la ligne du bucket _Default et cochez la colonne Analyse de l'observabilité disponible :

    • Si la colonne affiche Ouvrir, Analyse de l'observabilité est déjà activé.
    • Si la colonne affiche Mettre à niveau, cliquez sur Mettre à niveau, puis confirmez la mise à niveau.
  3. Attendez quelques minutes que l'état de la colonne passe à Ouvrir.

gcloud

  1. Mettez à niveau le bucket de journaux _Default pour activer l'Analyse de l'observabilité :

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

    Remplacez PROJECT_ID par l'ID du Google Cloud projet.

  2. Après quelques minutes, vérifiez que la mise à niveau est terminée :

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

    Vérifiez que la sortie inclut analyticsEnabled: true.

Afficher l'utilisation des jetons par job dans l'explorateur de journaux

Pour inspecter la consommation de jetons des jobs d'analyse d'insights sur les données individuels, utilisez l'explorateur de journaux ou Google Cloud CLI. Pour les agrégations horaires ou quotidiennes dans votre projet, vous pouvez créer un tableau de bord à l'aide d'Analyse de l'observabilité.

Console

  1. Dans la Google Cloud console, accédez à la page Logging > Explorateur de journaux.

    Accéder à l'explorateur de journaux

  2. Si l'éditeur de requête n'est pas visible, activez Afficher la requête.

  3. Saisissez la requête suivante dans l'éditeur de requête :

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

    Facultatif : Pour filtrer une analyse ou une exécution de job spécifique, ajoutez l'une des lignes suivantes à la requête :

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

    Remplacez les éléments suivants :

    • DATA_SCAN_ID : ID de l'analyse d'insights sur les données.
    • JOB_ID : ID d'une exécution de job d'analyse spécifique.
  4. Sélectionnez une plage de dates (par exemple, Dernières 24 heures), puis cliquez sur Exécuter la requête.

  5. Développez une entrée de journal et ouvrez jsonPayload > dataDocumentation > billableTokenUsage pour inspecter le nombre de jetons pour ce job.

gcloud

Lisez les entrées de journal d'analyse d'insights sur les données récentes et mettez en forme les champs de jetons sous forme de tableau :

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)'

Remplacez PROJECT_ID par l'ID de votre Google Cloud projet.

Une colonne vide dans le tableau de sortie indique 0 jeton pour ce champ. Pour transformer ces champs en métriques, utilisez les formules décrites dans Fonctionnement de la journalisation de l'utilisation des jetons.

Interroger l'utilisation des jetons à l'aide de l'Analyse de l'observabilité

Vous pouvez également exécuter ou personnaliser les requêtes SQL du widget directement sur la page Analyse de journaux de la Google Cloud console.

Les graphiques quotidiens et horaires partagent la même requête de graphique, qui renvoie une ligne par job d'analyse. Chaque widget de graphique regroupe et additionne les lignes par jour (timeBinSize: 86400s) ou par heure (timeBinSize: 3600s). Si vous modifiez une requête de graphique et la collez dans un widget de tableau de bord, conservez les alias de colonne timestamp, total_non_cached_input_tokens, total_cached_input_tokens et total_output_tokens.

Pour filtrer une requête sur une seule analyse, ajoutez la condition suivante à la clause WHERE :

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

Remplacez DATA_SCAN_ID par l'ID de votre analyse d'insights sur les données.

Exemple de requête de graphique (graphiques quotidiens et horaires)

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

Remplacez PROJECT_ID par l'ID de votre Google Cloud projet.

Exemple de requête par job d'analyse

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

Remplacez PROJECT_ID par l'ID de votre Google Cloud projet.

Créer un tableau de bord à l'aide d'Analyse de l'observabilité

Pour visualiser et suivre la consommation de jetons du modèle au fil du temps, vous pouvez créer un tableau de bord Monitoring personnalisé à l'aide d'Analyse de l'observabilité.

Cette approche exécute des requêtes SQL directement sur vos journaux d'analyse d'insights sur les données dans le bucket de journaux _Default. Elle présente plusieurs avantages :

  • Précision : les requêtes calculent le nombre exact de jetons directement à partir des charges utiles JSON des entrées de journal, plutôt que des estimations de métriques agrégées.
  • Historique détaillé des jobs : en plus des graphiques agrégés, vous pouvez inspecter les jobs d'analyse individuels dans une vue tabulaire.
  • Aucun frais supplémentaire : le passage du bucket de journaux _Default à l'Analyse de l'observabilité n'entraîne aucun frais supplémentaire.

Cette option crée un tableau de bord Monitoring avec trois widgets qui exécutent des requêtes SQL sur vos journaux :

  • Utilisation quotidienne des jetons (graphique à barres empilées)
  • Utilisation horaire des jetons (graphique en courbes)
  • Utilisation des jetons par job d'analyse (tableau affichant les 500 derniers jobs)

La configuration JSON du tableau de bord suivante utilise la @__project_id variable (@__project_id.global._Default._Default), qui interroge automatiquement le projet dans lequel vous ouvrez le tableau de bord. Vous n'avez pas besoin de modifier les espaces réservés de projet dans le JSON avant de l'importer.

Console

  1. Dans la Google Cloud console, accédez à la page Monitoring > Tableaux de bord.

    Accéder aux tableaux de bord

  2. Cliquez sur Créer un tableau de bord.

  3. Dans la barre d'outils, cliquez sur Paramètres, sélectionnez JSON, puis Éditeur JSON.

  4. Remplacez le contenu existant de l'éditeur par la définition JSON du tableau de bord fournie dans la section suivante.

  5. Cliquez sur Appliquer les modifications. Lorsque l'enregistrement automatique est activé, Monitoring enregistre le tableau de bord sous le nom Data Insights - Token Usage.

  6. La première fois que vous ouvrez le tableau de bord, chaque widget vous invite à confirmer l'exécution de la requête SQL sur le moteur BigQuery pour votre projet. Vérifiez que l'invite répertorie votre projet, puis cliquez sur Continuer l'exécution sur chaque widget.

  7. Sélectionnez une plage de dates dans la barre d'outils du tableau de bord (par exemple, 7 derniers jours).

gcloud

  1. Enregistrez la définition JSON du tableau de bord dans un fichier local nommé dashboard.json.
  2. Créez le tableau de bord dans Monitoring :

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

    Remplacez PROJECT_ID par l'ID de votre Google Cloud projet.

  3. Ouvrez la page "Tableaux de bord" dans la Google Cloud console, sélectionnez Analyse d'insights – Utilisation des jetons, et cliquez sur Continuer l'exécution sur chaque widget pour autoriser l'exécution de la requête SQL.

Définition JSON du tableau de bord

Pour créer le tableau de bord, développez la section suivante et copiez la définition JSON :

Définition JSON

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

Limites

  • Les métriques de jetons ne sont complètes que si les journaux dataplex.googleapis.com/data_scan ne sont pas exclus ni acheminés en dehors du bucket de journaux _Default.
  • Seuls les jobs réussis avec des métadonnées de jetons sont comptabilisés. Les entrées de journal sans bloc billableTokenUsage sont exclues des requêtes et des métriques.
  • Utilisez ces tableaux de bord pour surveiller les tendances d'utilisation et estimer les coûts, et non pour rapprocher une facture Cloud Billing officielle.
  • Chaque Google Cloud projet nécessite sa propre configuration de tableau de bord.
  • Les requêtes SQL ne renvoient pas les entrées de journal écrites avant l'activation d'Analyse de l'observabilité sur le bucket _Default.
  • Le widget de tableau par job affiche au maximum les 500 jobs les plus récents dans la plage de dates sélectionnée. Pour inspecter les jobs plus anciens, interrogez l'explorateur de journaux.

Étape suivante