データ分析情報のトークン使用量をモニタリングする

このドキュメントでは、Cloud Logging と Cloud Monitoring を使用して、Knowledge Catalog(旧 Dataplex Universal Catalog)のデータ インサイト スキャンのトークン消費量をモニタリングする方法について説明します。スキャンごと、ジョブごとのトークン使用量を追跡することで、モデルの使用傾向を把握し、プロジェクト全体の請求額を見積もることができます。

トークン使用状況のロギングの仕組み

データ分析情報スキャンジョブ(jsonPayload.type="DATA_DOCUMENTATION")が SUCCEEDED 状態で完了すると、Knowledge Catalog は dataplex.googleapis.com/data_scan ログにログエントリを書き込みます。このログエントリには、ジョブのトークンの内訳を記録する jsonPayload.dataDocumentation の下に billableTokenUsage ブロックが含まれています。ジョブの他のログエントリ(CREATED、STARTED、FAILED、CANCELLED イベントなど)には、billableTokenUsage ブロックは含まれません。

billableTokenUsage ブロックから、3 つの主要なトークン カテゴリを追跡して、課金を推定できます。

指標 説明 数式(billableTokenUsage フィールドを使用)
キャッシュに保存されていない入力トークン コンテキスト キャッシュから提供されなかった入力トークン(ツール使用プロンプト トークンを含む)。 max(promptTokenCount - cachedContentTokenCount, 0) + toolUsePromptTokenCount
キャッシュに保存された入力トークン コンテキスト キャッシュから提供された入力トークン。キャッシュに保存されたトークンは、標準のキャッシュに保存されていない入力レートで課金されないため、個別に追跡されます。 cachedContentTokenCount
出力トークン 生成されたレスポンス トークンと推論(思考)トークン。思考トークンは出力トークンとして課金されます。 candidatesTokenCount + thoughtsTokenCount

トークンの料金の詳細については、データクラウド Agent の料金をご覧ください。

ログエントリのトークン フィールド

各 dataplex.googleapis.com/data_scan ログエントリには、resource.labels.datascan_id、resource.labels.location、jsonPayload.jobId、jsonPayload.state などの標準のリソース ID とジョブ ID が含まれます。成功したデータ分析情報スキャンの場合、jsonPayload.dataDocumentation.billableTokenUsage オブジェクトには次のフィールドが含まれます。

フィールド 説明
promptTokenCount モデルに送信されたプロンプト トークンの合計数(キャッシュに保存されたトークンを含む)。
cachedContentTokenCount コンテキスト キャッシュから提供されたプロンプト トークンの割合。
toolUsePromptTokenCount ツール呼び出しによって追加されたプロンプト トークン(スキーマ、プロファイル、クエリ履歴のコンテキストなど)。
candidatesTokenCount 生成されたレスポンス トークン(思考トークンを除く)。
thoughtsTokenCount モデルによって生成された推論(思考)トークン。

次の例は、成功したデータ分析情報スキャンジョブの dataplex.googleapis.com/data_scan ログエントリを示しています。

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

この例では、ジョブはコンテキスト キャッシュ、思考トークン、ツール呼び出しを使用していません。その結果、キャッシュに保存されていない入力トークンは 20,412、キャッシュに保存された入力トークンは 0、出力トークンは 7,053 になります。

始める前に

データ分析情報トークンログをクエリする、またはモニタリング ダッシュボードを作成する前に、次の前提条件を満たしてください。

必要なロール

データ分析情報のトークン使用量をモニタリングするために必要な権限を取得するには、プロジェクトに対する次の IAM ロールを付与するよう管理者に依頼してください。

  • データスキャン ログを表示し、オブザーバビリティ分析クエリを実行する: ログビューア (roles/logging.viewer)
  • Monitoring でカスタム ダッシュボードを作成する: モニタリング編集者 (roles/monitoring.editor)
  • Monitoring でカスタム ダッシュボードを表示する: モニタリング閲覧者 (roles/monitoring.viewer)

ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。

必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。

API を有効にする

Dataplex、Logging、Monitoring の各 API がまだ有効になっていない場合は、有効にします。

API を有効にするために必要なロール

API を有効にするには、serviceusage.services.enable 権限が必要です。プロジェクトを作成した場合は、オーナーロール(roles/owner)を介してこの権限がすでに付与されている可能性があります。それ以外の場合は、Service Usage 管理者ロール(roles/serviceusage.serviceUsageAdmin)を介してこの権限を取得できます。ロールを付与する方法を確認する。

API を有効にする

ログ ルーティングの構成を確認する

データ インサイト スキャンは、dataplex.googleapis.com/data_scan という名前のログにログを書き込みます。このドキュメントのダッシュボード構成では、プロジェクトの _Default ログバケットからこれらのログを読み取ります。プロジェクトのログ ルーティングが次の条件を満たしていることを確認します。

  • _Default シンクが有効になり、_Default ログバケットにログがルーティングされます。
  • _Default シンクには、dataplex.googleapis.com/data_scan ログまたは DATA_DOCUMENTATION ログをドロップする除外フィルタがありません。

コンソール

  1. Google Cloud コンソールで、[ロギング] > [ログルーター] ページに移動します。

    [ログルーター] に移動

  2. _Default シンクを見つけて、ステータスが [有効] で、宛先が _Default バケットであることを確認します。

  3. シンクのメニュー()をクリックし、[シンクの詳細を表示] を選択します。除外フィルタが dataplex.googleapis.com/data_scan または DATA_DOCUMENTATION と一致しないことを確認します。

gcloud

_Default シンクを記述して、ステータス、宛先、除外フィルタを検査します。

gcloud logging sinks describe _Default --project=PROJECT_ID

PROJECT_ID は、実際の Google Cloudプロジェクト ID に置き換えます。

disabled が true に設定されていないこと、destination が /buckets/_Default で終わっていること、exclusions のエントリが data_scan と一致していないことを確認します。

_Default バケットでオブザーバビリティ分析を有効にする

データ分析情報スキャンログに対して SQL クエリを実行し、カスタムのオブザーバビリティ分析ダッシュボードを強化するには、プロジェクトの _Default ログバケットをアップグレードしてオブザーバビリティ分析を使用します。

_Default ログバケットでオブザーバビリティ分析を有効にする前に、次の考慮事項を確認してください。

  • バケットをオブザーバビリティ分析にアップグレードすると、元に戻すことはできません。追加料金は発生しません。
  • リンクされた BigQuery データセットを作成する必要はありません。
  • オブザーバビリティ分析の SQL クエリは、アップグレードの完了後に到着したログのみを返します。古いログはログ エクスプローラで引き続き使用できますが、SQL クエリの結果には表示されません。バケットをアップグレードしたら、少なくとも 1 つのデータ インサイト スキャンを実行して、ダッシュボードに表示するデータを用意します。

コンソール

  1. Google Cloud コンソールで、[ロギング] > [ログストレージ] ページに移動します。

    ログストレージに移動

  2. _Default バケット行を見つけて、[オブザーバビリティ分析を使用可能] 列を確認します。

    • 列に [開く] と表示されている場合、オブザーバビリティ分析はすでに有効になっています。
    • 列に [アップグレード] と表示されている場合は、[アップグレード] をクリックしてアップグレードを確定します。
  3. 列のステータスが [Open] に変わるまで数分待ちます。

gcloud

  1. _Default ログバケットをアップグレードして、オブザーバビリティ分析を有効にします。

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

    PROJECT_ID は、実際の Google Cloud プロジェクト ID に置き換えます。

  2. 数分後、アップグレードが完了したことを確認します。

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

    出力に analyticsEnabled: true が含まれていることを確認します。

ログ エクスプローラでジョブごとのトークン使用量を表示する

個々のデータ インサイト スキャンジョブのトークン消費量を検査するには、ログ エクスプローラまたは Google Cloud CLI を使用します。プロジェクト全体で 1 時間ごとまたは 1 日ごとの集計を行うには、オブザーバビリティ分析を使用してダッシュボードを作成します。

コンソール

  1. Google Cloud コンソールで、[ロギング] > [ログ エクスプローラ] ページに移動します。

    [ログ エクスプローラ] に移動

  2. クエリエディタが表示されない場合は、[クエリを表示] をオンにします。

  3. クエリエディタに以下のクエリを入力します。

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

    省略可: 特定のスキャンまたはジョブ実行をフィルタするには、クエリに次のいずれかの行を追加します。

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

    次のように置き換えます。

    • DATA_SCAN_ID: データ分析情報スキャンの ID。
    • JOB_ID: 特定のスキャンジョブ実行の ID。
  4. 期間([過去 24 時間] など)を選択し、[クエリを実行] をクリックします。

  5. ログエントリを開いて、jsonPayload > dataDocumentation > billableTokenUsage を開き、そのジョブのトークン数を確認します。

gcloud

最近のデータ インサイト スキャン ログエントリを読み取り、トークン フィールドをテーブルとしてフォーマットします。

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

PROJECT_ID は、実際の Google Cloudプロジェクト ID に置き換えます。

出力テーブルの空の列は、そのフィールドの 0 トークンを示します。これらのフィールドを指標に変換するには、トークン使用状況ロギングの仕組みの数式を使用します。

オブザーバビリティ分析を使用してトークンの使用状況をクエリする

Google Cloud コンソールの [ログ分析] ページで、ウィジェットの SQL クエリを直接実行またはカスタマイズすることもできます。

日次グラフと時間別グラフは同じグラフクエリを共有します。このクエリは、スキャンジョブごとに 1 行を返します。各グラフ ウィジェットは、行を日(timeBinSize: 86400s)または時間(timeBinSize: 3600s)ごとにビン化して合計します。グラフクエリを編集してダッシュボード ウィジェットに貼り付ける場合は、列エイリアス timestamp、total_non_cached_input_tokens、total_cached_input_tokens、total_output_tokens を保持します。

クエリを 1 つのスキャンにフィルタするには、次の条件を WHERE 句に追加します。

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

DATA_SCAN_ID は、データ分析情報スキャンの ID に置き換えます。

サンプルグラフ クエリ(日別グラフと時間別グラフ)

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

PROJECT_ID は、実際の Google Cloudプロジェクト ID に置き換えます。

スキャンジョブごとのサンプルクエリ

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

PROJECT_ID は、実際の Google Cloudプロジェクト ID に置き換えます。

オブザーバビリティ分析を使用してダッシュボードを作成する

モデルトークンの消費量を時系列で可視化して追跡するには、オブザーバビリティ分析を使用してカスタム Monitoring ダッシュボードを作成します。

このアプローチでは、_Default ログバケット内のデータ分析情報スキャンログに対して SQL クエリを直接実行します。これには次のようなメリットがあります。

  • 精度: クエリは、集計された指標の推定値ではなく、ログエントリの JSON ペイロードから直接正確なトークン数を計算します。
  • 詳細なジョブ履歴: 集計グラフに加えて、個々のスキャンジョブを表形式で検査できます。
  • 追加料金なし: _Default ログバケットをオブザーバビリティ分析にアップグレードしても、追加料金は発生しません。

このオプションを使用すると、ログに対して SQL クエリを実行する 3 つのウィジェットを含む Monitoring ダッシュボードが作成されます。

  • 1 日あたりのトークン使用量(積み上げ棒グラフ)
  • 1 時間あたりのトークン使用量(折れ線グラフ)
  • スキャンジョブあたりのトークン使用量(最新の 500 件のジョブを示す表)

次のダッシュボード JSON 構成では、組み込みの @__project_id 変数(@__project_id.global._Default._Default)を使用します。これにより、ダッシュボードを開いたプロジェクトが自動的にクエリされます。インポートする前に、JSON のプロジェクト プレースホルダを編集する必要はありません。

コンソール

  1. Google Cloud コンソールで、[モニタリング] > [ダッシュボード] ページに移動します。

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

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

  3. ツールバーで、 [設定] をクリックし、[JSON] を選択してから、[JSON エディタ] を選択します。

  4. エディタの既存の内容を、次のセクションで説明するダッシュボードの JSON 定義に置き換えます。

  5. [変更を適用] をクリックします。自動保存が有効になっている場合、Monitoring はダッシュボードを Data Insights - Token Usage として保存します。

  6. ダッシュボードを初めて開くと、各ウィジェットで、プロジェクトの BigQuery エンジンで SQL クエリを実行することを確認するよう求められます。プロンプトにプロジェクトが一覧表示されていることを確認し、各ウィジェットで [実行を続行] をクリックします。

  7. ダッシュボードのツールバーで期間を選択します([過去 7 日間] など)。

gcloud

  1. ダッシュボードの JSON 定義を dashboard.json という名前のローカル ファイルに保存します。
  2. Monitoring でダッシュボードを作成します。

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

    PROJECT_ID は、実際のGoogle Cloud プロジェクト ID に置き換えます。

  3. Google Cloud コンソールの [ダッシュボード] ページを開き、[Insights Scan - Token Usage] を選択して、各ウィジェットで [実行を続行] をクリックして SQL クエリの実行を承認します。

ダッシュボードの JSON 定義

ダッシュボードを作成するには、次のセクションを開いて JSON 定義をコピーします。

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

制限事項

  • トークン指標は、dataplex.googleapis.com/data_scan ログが除外されていないか、_Default ログバケットからルーティングされていない場合にのみ完了します。
  • トークン メタデータを含む成功したジョブのみがカウントされます。billableTokenUsage ブロックのないログエントリは、クエリと指標から除外されます。
  • これらのダッシュボードは、使用状況の傾向をモニタリングして費用を見積もるために使用します。公式の Cloud Billing 請求書の調整には使用しないでください。
  • Google Cloud プロジェクトごとに独自のダッシュボードの設定が必要です。
  • SQL クエリは、_Default バケットでオブザーバビリティ分析が有効になる前に書き込まれたログエントリを返しません。
  • ジョブごとのテーブル ウィジェットには、選択した期間内の最新のジョブが最大 500 件表示されます。古いジョブを調べるには、ログ エクスプローラにクエリを実行します。

次のステップ