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

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

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

データ分析情報スキャンジョブ(jsonPayload.type="DATA_DOCUMENTATION")が SUCCEEDED 状態で完了すると、Knowledge Catalog は dataplex.googleapis.com/data_scan ログにログエントリを書き込みます。このログエントリには、ジョブのトークンの内訳を記録する billableTokenUsage ブロックが jsonPayload.dataDocumentation の下に含まれています。ジョブの他のログエントリ(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 などの標準リソースとジョブの識別子が含まれています。データ分析情報スキャンが成功した場合、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)
  • モニタリングでカスタム ダッシュボードを作成する: モニタリング編集者 (roles/monitoring.editor)
  • モニタリングでカスタム ダッシュボードを表示する: モニタリング閲覧者 (roles/monitoring.viewer)

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

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

API を有効にする

Dataplex API、Logging API、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 ログをドロップする除外フィルタがない。

Console

  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 回はデータ分析情報スキャンを実行してください。

Console

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

    ログストレージに移動

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

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

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 を使用します。プロジェクト全体の時間単位または日単位 の集計については、オブザーバビリティ分析を使用して ダッシュボードを作成できます。

Console

  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 に置き換えます。

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

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

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

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

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

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

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

Console

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

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

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

  3. ツールバーで、 [ Settings] をクリックし、 [JSON] を選択して、[JSON Editor] を選択します。

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

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

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

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

gcloud

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

    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 件のジョブが最大で表示されます。古いジョブを調べるには、ログ エクスプローラをクエリします。

次のステップ