Supervisa el uso de tokens de estadísticas de datos

En este documento, se explica cómo supervisar el consumo de tokens para los análisis de estadísticas de datos de Knowledge Catalog (antes Dataplex Universal Catalog) con Cloud Logging y Cloud Monitoring. Hacer un seguimiento del uso de tokens por análisis y por trabajo te permite comprender las tendencias de uso de los modelos y estimar los costos facturados en todo tu proyecto.

Cómo funciona el registro del uso de tokens

Cuando un trabajo de análisis de estadísticas de datos (jsonPayload.type="DATA_DOCUMENTATION") se completa con un estado SUCCEEDED, Knowledge Catalog escribe una entrada de registro en el registro dataplex.googleapis.com/data_scan. Esta entrada de registro contiene un bloque billableTokenUsage en jsonPayload.dataDocumentation que registra el desglose de tokens del trabajo. Otras entradas de registro para el trabajo (como los eventos CREATED, STARTED, FAILED o CANCELLED) no incluyen un bloque billableTokenUsage.

En el bloque billableTokenUsage, puedes hacer un seguimiento de tres categorías principales de tokens para estimar la facturación:

Métrica Descripción Fórmula (con campos de billableTokenUsage)
Tokens de entrada no almacenados en caché Son los tokens de entrada que no se entregaron desde la caché de contexto, incluidos los tokens de instrucciones de uso de herramientas. max(promptTokenCount - cachedContentTokenCount, 0) + toolUsePromptTokenCount
Tokens de entrada almacenados en caché Son los tokens de entrada que se entregan desde la caché de contexto. Los tokens almacenados en caché se registran por separado porque no se les aplica la tarifa de entrada estándar sin almacenamiento en caché. cachedContentTokenCount
Tokens de salida Son los tokens de respuesta generados más los tokens de razonamiento (pensamiento). Los tokens de razonamiento se facturan como tokens de salida. candidatesTokenCount + thoughtsTokenCount

Para obtener detalles sobre los precios de los tokens, consulta Precios de Data Cloud Agent.

Campos de token en la entrada de registro

Cada entrada de registro de dataplex.googleapis.com/data_scan incluye identificadores estándar de recursos y trabajos, como resource.labels.datascan_id, resource.labels.location, jsonPayload.jobId y jsonPayload.state. Para los análisis de estadísticas de datos que se realizaron correctamente, el objeto jsonPayload.dataDocumentation.billableTokenUsage contiene los siguientes campos:

Campo Descripción
promptTokenCount Es el total de tokens de instrucción enviados al modelo, incluidos los tokens almacenados en caché.
cachedContentTokenCount Es la parte de los tokens de instrucción que se entregan desde la caché de contexto.
toolUsePromptTokenCount Son los tokens de instrucciones que agregan las llamadas a herramientas (como el contexto del esquema, el perfil o el historial de consultas).
candidatesTokenCount Son los tokens de respuesta generados, sin incluir los tokens de razonamiento.
thoughtsTokenCount Son los tokens de razonamiento (pensamiento) que genera el modelo.

En el siguiente ejemplo, se muestra una entrada de registro de dataplex.googleapis.com/data_scan para un trabajo de análisis de estadísticas de datos que se completó correctamente:

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

En este ejemplo, el trabajo no usó el almacenamiento en caché de contexto, los tokens de razonamiento ni las llamadas a herramientas. Como resultado, los tokens de entrada no almacenados en caché equivalen a 20,412, los tokens de entrada almacenados en caché equivalen a 0 y los tokens de salida equivalen a 7,053.

Antes de comenzar

Antes de consultar los registros de tokens de estadísticas de datos o crear un panel de supervisión, completa los siguientes requisitos previos.

Roles obligatorios

Para obtener los permisos que necesitas para supervisar el uso de tokens de estadísticas de datos, pídele a tu administrador que te otorgue los siguientes roles de IAM en tu proyecto:

  • Visualiza los registros de análisis de datos y ejecuta consultas de Estadísticas de observabilidad: Visor de registros (roles/logging.viewer)
  • Crea paneles personalizados en Monitoring: Editor de Monitoring (roles/monitoring.editor)
  • Visualiza paneles personalizados en Monitoring: Visualizador de Monitoring (roles/monitoring.viewer)

Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso a proyectos, carpetas y organizaciones.

También puedes obtener los permisos necesarios a través de roles personalizados o cualquier otro rol predefinido.

Habilita las APIs

Habilita las APIs de Dataplex, Logging y Monitoring, si aún no están habilitadas.

Roles necesarios para habilitar las APIs

Para habilitar las APIs, necesitas el permiso serviceusage.services.enable. Si creaste el proyecto, es probable que ya tengas este permiso a través del rol de propietario (roles/owner). De lo contrario, puedes obtenerlo a través del rol de administrador de Service Usage (roles/serviceusage.serviceUsageAdmin). Obtén información para otorgar roles.

Habilitar las API

Verifica la configuración del enrutamiento de registros

Los análisis de estadísticas de datos escriben registros con el nombre de registro dataplex.googleapis.com/data_scan. Las configuraciones del panel de este documento leen esos registros del bucket de registros _Default de tu proyecto. Verifica que el enrutamiento de registros de tu proyecto cumpla con las siguientes condiciones:

  • El receptor _Default está habilitado y enruta los registros al bucket de registros _Default.
  • El receptor _Default no tiene un filtro de exclusión que descarte los registros dataplex.googleapis.com/data_scan o DATA_DOCUMENTATION.

Console

  1. En la consola de Google Cloud , ve a la página Logging > Enrutador de registros.

    Ir a Enrutador de registros

  2. Ubica el receptor _Default y verifica que su estado sea Habilitado y que su destino sea el bucket _Default.

  3. Haz clic en el menú del receptor () y selecciona Ver detalles del receptor. Verifica que ningún filtro de exclusión coincida con dataplex.googleapis.com/data_scan o DATA_DOCUMENTATION.

gcloud

Describe el receptor _Default para inspeccionar su estado, destino y filtros de exclusión:

gcloud logging sinks describe _Default --project=PROJECT_ID

Reemplaza PROJECT_ID por el ID del proyecto de Google Cloud.

Verifica que disabled no esté configurado como true, que destination termine con /buckets/_Default y que ninguna entrada en exclusions coincida con data_scan.

Habilita las Estadísticas de observabilidad en el bucket _Default

Para ejecutar consultas en SQL en los registros de análisis de estadísticas de datos y potenciar el panel personalizado de Estadísticas de observabilidad, actualiza el bucket de registros _Default de tu proyecto para usar Estadísticas de observabilidad.

Antes de habilitar las Estadísticas de observabilidad en el bucket de registros _Default, revisa las siguientes consideraciones:

  • La actualización de un bucket a Estadísticas de observabilidad no se puede deshacer y no genera cargos adicionales.
  • No es necesario que crees un conjunto de datos de BigQuery vinculado.
  • Las consultas en SQL de Estadísticas de observabilidad solo devuelven los registros que llegan después de que se completa la actualización. Los registros más antiguos siguen disponibles en el Explorador de registros, pero no aparecen en los resultados de la consulta en SQL. Después de actualizar el bucket, ejecuta al menos un análisis de estadísticas de datos para que tu panel tenga datos que mostrar.

Console

  1. En la consola de Google Cloud , ve a la página Logging > Almacenamiento de registros.

    Ir a Almacenamiento de registros

  2. Busca la fila del bucket _Default y verifica la columna Estadísticas de observabilidad disponibles:

    • Si la columna muestra Abrir, significa que las Estadísticas de observabilidad ya están habilitadas.
    • Si la columna muestra Actualizar, haz clic en Actualizar y confirma la actualización.
  3. Espera unos minutos hasta que el estado de la columna cambie a Abierto.

gcloud

  1. Actualiza el bucket de registros _Default para habilitar las Estadísticas de observabilidad:

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

    Reemplaza PROJECT_ID por el ID del proyecto de Google Cloud .

  2. Después de unos minutos, verifica que se haya completado la actualización:

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

    Confirma que el resultado incluya analyticsEnabled: true.

Visualiza el uso de tokens por trabajo en el Explorador de registros

Para inspeccionar el consumo de tokens de los trabajos de análisis de estadísticas de datos individuales, usa el Explorador de registros o Google Cloud CLI. Para realizar agregaciones por hora o por día en todo tu proyecto, puedes crear un panel con Estadísticas de observabilidad.

Console

  1. En la consola de Google Cloud , accede a la página Logging > Explorador de registros.

    Ve al Explorador de registros

  2. Si el editor de consultas no está visible, activa Mostrar consulta.

  3. Ingresa la siguiente consulta en el editor de consultas:

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

    Opcional: Para filtrar por un análisis o una ejecución de trabajo específicos, agrega una de las siguientes líneas a la consulta:

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

    Reemplaza lo siguiente:

    • DATA_SCAN_ID: Es el ID del análisis de estadísticas de datos.
    • JOB_ID: Es el ID de una ejecución de trabajo de análisis específica.
  4. Selecciona un intervalo de tiempo (por ejemplo, Últimas 24 horas) y, luego, haz clic en Ejecutar consulta.

  5. Expande una entrada de registro y abre jsonPayload > dataDocumentation > billableTokenUsage para inspeccionar los recuentos de tokens de ese trabajo.

gcloud

Lee las entradas de registro de análisis de estadísticas de datos recientes y formatea los campos de token como una tabla:

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

Reemplaza PROJECT_ID por el ID del proyecto de Google Cloud.

Una columna vacía en la tabla de salida indica tokens 0 para ese campo. Para convertir estos campos en las métricas, usa las fórmulas que se indican en Cómo funciona el registro del uso de tokens.

Consulta el uso de tokens con Estadísticas de observabilidad

También puedes ejecutar o personalizar las consultas en SQL de los widgets directamente en la página de Análisis de registros en la consola deGoogle Cloud .

Los gráficos diarios y por hora comparten la misma consulta de gráfico, que devuelve una fila por trabajo de análisis. Cada widget de gráfico agrupa y suma las filas por día (timeBinSize: 86400s) o por hora (timeBinSize: 3600s). Si editas una consulta de gráfico y la vuelves a pegar en un widget del panel, conserva los alias de columna timestamp, total_non_cached_input_tokens, total_cached_input_tokens y total_output_tokens.

Para filtrar una consulta a un solo análisis, agrega la siguiente condición a la cláusula WHERE:

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

Reemplaza DATA_SCAN_ID por el ID de tu análisis de estadísticas de datos.

Consulta de gráficos de muestra (gráficos diarios y por hora)

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

Reemplaza PROJECT_ID por el ID del proyecto de Google Cloud.

Consulta de muestra por trabajo de análisis

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

Reemplaza PROJECT_ID por el ID del proyecto de Google Cloud.

Crea un panel con Estadísticas de observabilidad

Para visualizar y hacer un seguimiento del consumo de tokens de modelos a lo largo del tiempo, puedes crear un panel de Monitoring personalizado con Estadísticas de observabilidad.

Este enfoque ejecuta consultas en SQL directamente en los registros de análisis de estadísticas de datos en el bucket de registros _Default. Ofrece varios beneficios:

  • Precisión: Las consultas calculan los recuentos exactos de tokens directamente a partir de las cargas útiles de JSON de las entradas de registro, en lugar de las estimaciones de métricas agregadas.
  • Historial de trabajos detallado: Además de los gráficos agregados, puedes inspeccionar los trabajos de análisis individuales en una vista tabular.
  • Sin costo adicional: Actualizar el bucket de registros _Default a Estadísticas de observabilidad no genera cargos adicionales.

Esta opción crea un panel de Monitoring con tres widgets que ejecutan consultas en SQL en tus registros:

  • Uso diario de tokens (gráfico de barras apiladas)
  • Uso de tokens por hora (gráfico de líneas)
  • Uso de tokens por trabajo de análisis (tabla que muestra los 500 trabajos más recientes)

La siguiente configuración de JSON del panel usa la variable integrada @__project_id (@__project_id.global._Default._Default), que consulta automáticamente el proyecto en el que abres el panel. No es necesario que edites ningún marcador de posición del proyecto en el JSON antes de importarlo.

Console

  1. En la consola de Google Cloud , ve a la página Monitoring > Paneles.

    Ir a Paneles

  2. Haz clic en Crear panel de control.

  3. En la barra de herramientas, haz clic en Configuración de , selecciona JSON y, luego, Editor de JSON.

  4. Reemplaza el contenido existente del editor por la definición de JSON del panel que se proporciona en la siguiente sección.

  5. Haz clic en Aplicar cambios. Con el guardado automático habilitado, Monitoring guarda el panel como Data Insights - Token Usage.

  6. La primera vez que abras el panel, cada widget te pedirá que confirmes la ejecución de la consulta en SQL en el motor de BigQuery para tu proyecto. Verifica que en el mensaje se indique tu proyecto y, luego, haz clic en Continuar con la ejecución en cada widget.

  7. Selecciona un período en la barra de herramientas del panel (por ejemplo, Últimos 7 días).

gcloud

  1. Guarda la definición de JSON del panel en un archivo local llamado dashboard.json.
  2. Crea el panel en Monitoring:

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

    Reemplaza PROJECT_ID por el ID del proyecto deGoogle Cloud .

  3. Abre la página Paneles en la consola de Google Cloud , selecciona Análisis de estadísticas: uso de tokens y haz clic en Continuar con la ejecución en cada widget para autorizar la ejecución de la consulta en SQL.

Definición de JSON del panel

Para crear el panel, expande la siguiente sección y copia la definición de JSON:

Definición de 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"
          }
        }
      }
    ]
  }
}

Limitaciones

  • Las métricas de tokens solo se completan si los registros de dataplex.googleapis.com/data_scan no se excluyen ni se enrutan fuera del bucket de registros _Default.
  • Solo se cuentan los trabajos que se completaron correctamente y que tienen metadatos de tokens. Las entradas de registro sin un bloque billableTokenUsage se excluyen de las consultas y métricas.
  • Usa estos paneles para supervisar las tendencias de uso y estimar los costos, no para conciliar una factura oficial de Facturación de Cloud.
  • Cada proyecto de Google Cloud requiere su propia configuración del panel.
  • Las consultas en SQL no devuelven entradas de registro escritas antes de que se habilitaran las Estadísticas de observabilidad en el bucket _Default.
  • El widget de tabla por trabajo muestra, como máximo, los 500 trabajos más recientes dentro del período seleccionado. Para inspeccionar trabajos más antiguos, consulta el Explorador de registros.

¿Qué sigue?