이 문서에서는 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 블록에서 세 가지 기본 토큰 카테고리를 추적하여 청구액을 추정할 수 있습니다.
| 측정항목 | 설명 | 수식 (billableTokenUsage 필드 사용) |
|---|---|---|
| 캐시되지 않은 입력 토큰 | 도구 사용 프롬프트 토큰을 포함하여 컨텍스트 캐시에서 제공되지 않은 입력 토큰입니다. | max(promptTokenCount - cachedContentTokenCount, 0) + toolUsePromptTokenCount |
| 캐시된 입력 토큰 | 컨텍스트 캐시에서 제공된 입력 토큰입니다. 캐시된 토큰은 표준 캐시되지 않은 입력 요금으로 가격이 책정되지 않으므로 별도로 추적됩니다. | cachedContentTokenCount |
| 출력 토큰 | 생성된 응답 토큰과 추론 (사고) 토큰입니다. 사고 토큰은 출력 토큰으로 청구됩니다. | candidatesTokenCount + thoughtsTokenCount |
토큰 가격 책정에 대한 자세한 내용은 데이터 클라우드 에이전트 가격 책정을 참조하세요.
로그 항목의 토큰 필드
각 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 역할을 부여해 달라고 요청하세요.
-
데이터 스캔 로그를 보고 Observability Analytics 쿼리 실행:
로그 뷰어 (
roles/logging.viewer) -
Monitoring에서 커스텀 대시보드 만들기:
모니터링 편집자 (
roles/monitoring.editor) -
Monitoring에서 커스텀 대시보드 보기:
모니터링 뷰어 (
roles/monitoring.viewer)
역할 부여에 대한 자세한 내용은 프로젝트, 폴더, 조직에 대한 액세스 관리를 참조하세요.
커스텀 역할이나 다른 사전 정의된 역할을 통해 필요한 권한을 얻을 수도 있습니다.
API 사용 설정
아직 사용 설정되지 않은 Dataplex, Logging, Monitoring API를 사용 설정합니다.
API 사용 설정에 필요한 역할
API를 사용 설정하려면 serviceusage.services.enable 권한이 필요합니다. 프로젝트를 만든 경우 소유자 역할 (roles/owner)을 통해 이 권한을 이미 보유하고 있을 가능성이 높습니다. 그렇지 않은 경우 서비스 사용량 관리자 역할 (roles/serviceusage.serviceUsageAdmin)을 통해 이 권한을 얻을 수 있습니다. 역할 부여 방법을 알아보세요.
로그 라우팅 구성 확인
데이터 인사이트 스캔은 로그 이름 dataplex.googleapis.com/data_scan으로 로그를 씁니다. 이 문서의 대시보드 구성은 프로젝트의 _Default 로그 버킷에서 이러한 로그를 읽습니다. 프로젝트의 로그 라우팅이 다음 조건을 충족하는지 확인합니다.
_Default싱크가 사용 설정되어 있고 로그를_Default로그 버킷으로 라우팅합니다._Default싱크에는dataplex.googleapis.com/data_scan또는DATA_DOCUMENTATION로그를 삭제하는 제외 필터가 없습니다.
콘솔
콘솔 Google Cloud 에서 Logging > 로그 라우터 페이지로 이동합니다.
_Default싱크를 찾고 상태가 사용 설정됨 이고 대상이_Default버킷인지 확인합니다.싱크의 메뉴 () 를 클릭하고 싱크 세부정보 보기를 선택합니다. 제외 필터가
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 버킷에서 Observability Analytics 사용 설정
데이터 인사이트 스캔 로그에서 SQL 쿼리를 실행하고 커스텀 Observability Analytics 대시보드를 지원하려면 프로젝트의 _Default 로그 버킷을 Observability Analytics를 사용하도록 업그레이드하세요.
_Default 로그 버킷에서 Observability Analytics를 사용 설정하기 전에 다음 고려사항을 검토하세요.
- 버킷을 Observability Analytics로 업그레이드하는 작업은 되돌릴 수 없으며 추가 비용이 발생하지 않습니다.
- 연결된 BigQuery 데이터 세트를 만들 필요가 없습니다.
Observability Analytics SQL 쿼리는 업그레이드가 완료된 후에 도착하는 로그만 반환합니다. 이전 로그는 로그 탐색기에서 계속 사용할 수 있지만 SQL 쿼리 결과에는 표시되지 않습니다. 버킷을 업그레이드한 후 대시보드에 표시할 데이터가 있도록 데이터 인사이트 스캔을 하나 이상 실행합니다.
콘솔
Google Cloud 콘솔에서 Logging > 로그 스토리지 페이지로 이동합니다.
_Default버킷 행을 찾고 Observability Analytics 사용 가능 열을 확인합니다.- 열에 열기 가 표시되면 Observability Analytics가 이미 사용 설정되어 있습니다.
- 열에 업그레이드가 표시되면 업그레이드를 클릭하고 업그레이드를 확인합니다.
열 상태가 열기 로 변경될 때까지 몇 분 정도 기다립니다.
gcloud
_Default로그 버킷을 업그레이드하여 Observability Analytics를 사용 설정합니다.gcloud logging buckets update _Default \ --location=global --enable-analytics --project=PROJECT_IDPROJECT_ID를 Google Cloud 프로젝트 ID로 바꿉니다.
몇 분 후 업그레이드가 완료되었는지 확인합니다.
gcloud logging buckets describe _Default \ --location=global --project=PROJECT_ID출력에
analyticsEnabled: true가 포함되어 있는지 확인합니다.
로그 탐색기에서 작업별 토큰 사용량 보기
개별 데이터 인사이트 스캔 작업의 토큰 소비를 검사하려면 로그 탐색기 또는 Google Cloud CLI를 사용하세요. 프로젝트 전반의 시간별 또는 일별 집계를 위해 Observability Analytics를 사용하여 대시보드를 만들 수 있습니다.
콘솔
콘솔 Google Cloud 에서 Logging > 로그 탐색기 페이지로 이동합니다.
쿼리 편집기가 표시되지 않으면 쿼리 표시 를 사용 설정합니다.
쿼리 편집기에 다음 쿼리를 입력합니다.
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입니다.
기간 (예: 지난 24시간)을 선택한 후 쿼리 실행 을 클릭합니다.
로그 항목을 펼치고
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임을 나타냅니다.
이러한 필드를 측정항목으로 전환하려면
토큰 사용량 로깅 작동 방식의 수식을 사용하세요.
Observability Analytics를 사용하여 토큰 사용량 쿼리
콘솔의 Google Cloud 로그 애널리틱스 페이지에서 위젯 SQL 쿼리를 직접 실행하거나 맞춤설정할 수도 있습니다.
일별 및 시간별 차트는 스캔 작업당 하나의 행을 반환하는 동일한 차트 쿼리를 공유합니다. 각 차트 위젯은 일별(timeBinSize: 86400s) 또는 시간별 (timeBinSize: 3600s)로 행을 분류하고 합산합니다. 차트 쿼리를 수정하고 대시보드 위젯에 다시 붙여넣는 경우 열 별칭 timestamp, total_non_cached_input_tokens, total_cached_input_tokens, total_output_tokens를 유지합니다.
단일 스캔으로 쿼리를 필터링하려면 다음 조건을 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로 바꿉니다.
Observability Analytics를 사용하여 대시보드 만들기
시간 경과에 따른 모델 토큰 소비를 시각화하고 추적하려면 Observability Analytics를 사용하여 커스텀 Monitoring 대시보드를 만들면 됩니다.
이 접근 방식은 _Default 로그 버킷의 데이터 인사이트 스캔 로그에 대해 SQL 쿼리를 직접 실행합니다. 이를 통해 제공되는 몇 가지 이점은 다음과 같습니다.
- 정확성: 쿼리는 집계된 측정항목 추정치가 아닌 로그 항목 JSON 페이로드에서 정확한 토큰 수를 직접 계산합니다.
- 세분화된 작업 기록: 집계된 차트 외에도 테이블 형식 뷰에서 개별 스캔 작업을 검사할 수 있습니다.
- 추가 비용 없음:
_Default로그 버킷을 Observability Analytics로 업그레이드해도 추가 비용이 발생하지 않습니다.
이 옵션은 로그에서 SQL 쿼리를 실행하는 세 개의 위젯이 있는 Monitoring 대시보드를 만듭니다.
- 일일 토큰 사용량 (누적 막대 그래프)
- 시간별 토큰 사용량 (선 차트)
- 스캔 작업당 토큰 사용량 (최근 작업 500개를 보여주는 테이블)
다음 대시보드 JSON 구성은 대시보드를 여는 프로젝트를 자동으로 쿼리하는 기본 제공 @__project_id
변수 (@__project_id.global._Default._Default)를 사용합니다. JSON을 가져오기 전에 JSON에서 프로젝트 자리표시자를 수정할 필요가 없습니다.
콘솔
Google Cloud 콘솔에서 Monitoring > 대시보드 페이지로 이동합니다.
대시보드 만들기 를 클릭합니다.
툴바에서 설정을 클릭하고 JSON을 선택한 후 JSON 편집기를 선택합니다.
편집기의 기존 콘텐츠를 다음 섹션에 제공된 대시보드 JSON 정의로 바꿉니다.
변경사항 적용 을 클릭합니다. 자동 저장이 사용 설정된 경우 Monitoring은 대시보드를
Data Insights - Token Usage로 저장합니다.대시보드를 처음 열면 각 위젯에서 프로젝트의 BigQuery 엔진에서 SQL 쿼리를 실행할지 확인하라는 메시지가 표시됩니다. 프롬프트에 프로젝트가 나열되어 있는지 확인한 후 각 위젯에서 실행 계속 을 클릭합니다.
대시보드 툴바에서 기간을 선택합니다 (예: 지난 7일).
gcloud
- 대시보드 JSON 정의를
라는 로컬 파일에 저장합니다.
dashboard.json Monitoring에서 대시보드를 만듭니다.
gcloud monitoring dashboards create \ --project=PROJECT_ID \ --config-from-file=dashboard.jsonPROJECT_ID를 Google Cloud 프로젝트 ID로 바꿉니다.
콘솔 Google Cloud 에서 대시보드 페이지를 열고 통계 스캔 - 토큰 사용량을 선택한 후 각 위젯에서 실행 계속을 클릭하여 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버킷에서 Observability Analytics가 사용 설정되기 전에 작성된 로그 항목을 반환하지 않습니다. - 작업별 테이블 위젯은 선택한 기간 내에서 가장 최근 작업 500개까지만 표시합니다. 이전 작업을 검사하려면 로그 탐색기를 쿼리하세요.
다음 단계
- 구조화된 데이터의 데이터 인사이트에 대해 자세히 알아보세요.
- 구조화된 데이터에 데이터 인사이트를 사용하는 방법을 알아보세요 .
- Knowledge Catalog 로그를 모니터링하는 방법을 알아보세요 .
- Knowledge Catalog 측정항목을 모니터링하는 방법을 알아보세요.