BigQuery账单字节统计与GCP成本仪表盘数值差异原因排查
BigQuery日志查询与成本仪表盘账单字节数差异排查
我希望导出BigQuery元数据以分析指定时段内查询的处理字节数,为此创建了GCP日志路由,使用以下过滤条件:
"protoPayload.metadata."@type"="type.googleapis.com/google.cloud.audit.BigQueryAuditMetadata"
我尝试通过以下SQL查询提取2023-03-01至2023-03-16期间的总账单字节数:
#standardSQL with base AS ( SELECT resource.labels.location, protopayload_auditlog.resourceName, resource.type, protopayload_auditlog.authenticationInfo.principalEmail , CAST(JSON_EXTRACT_SCALAR(protopayload_auditlog.metadataJson, "$.jobChange.job.jobStats.queryStats.cacheHit") AS BOOL) AS cacheHit, CAST(JSON_EXTRACT_SCALAR(protopayload_auditlog.metadataJson, "$.jobChange.job.jobStats.queryStats.totalBilledBytes") as INT64) AS totalBilledBytes, CAST(JSON_EXTRACT_SCALAR(protopayload_auditlog.metadataJson, "$.jobChange.job.jobStats.queryStats.totalProcessedBytes") as INT64) AS totalProcessedBytes, DATETIME(timestamp, "PST8PDT") as timestamp, FROM cloudaudit_googleapis_com_data_access ) SELECT ROUND(sum(totalbilledbytes)/POW(2,40),3) as totalbilledbytes, FROM base WHERE timestamp >= DATETIME(TIMESTAMP('2023-03-01 00:00:00','UTC'), "PST8PDT") AND timestamp <= DATETIME(TIMESTAMP('2023-03-16 23:59:59','UTC'), "PST8PDT") AND cacheHit is NULL AND type = 'bigquery_project' AND location = "EU"
查询结果显示该时段内消耗约2.061TiB账单字节,但GCP成本仪表盘显示的数值为1.99TiB,二者存在差异。我已尝试移除原始数据集重复项、更换时间范围、更换过滤条件等操作,但仍未解决问题,请问这种差异的原因是什么?
可能的差异原因
- 缓存命中过滤逻辑错误:当前用
cacheHit is NULL过滤,但实际缓存命中的查询cacheHit为true(不计费),非缓存命中的计费查询cacheHit为false。NULL的记录可能包含非查询类作业(如数据加载、导出作业),这些作业的totalBilledBytes被错误计入统计。正确过滤应为cacheHit = false,只统计实际产生计费的查询。 - 时间范围对齐偏差:SQL中把UTC时间转换为PST8PDT后过滤,但成本仪表盘的时间统计可能严格遵循UTC时区,导致两端统计的时间窗口不完全匹配。比如你设置的PST起始时间对应UTC的3月1日08:00,而成本仪表盘可能统计UTC3月1日00:00到3月16日23:59的流量,两者时间范围存在重叠或遗漏。
- 未过滤失败作业:日志中可能包含未成功完成的作业,这类作业的
totalBilledBytes有记录但实际不会被计费,而成本仪表盘仅统计成功完成的作业。需要从metadataJson中提取作业状态(如$.jobChange.job.status.state),添加state = 'DONE'的过滤条件。 - 资源类型过滤范围不当:你过滤了
type = 'bigquery_project',但部分计费查询可能属于bigquery_dataset等其他资源类型,这些被成本仪表盘统计但被SQL排除;或者bigquery_project类型中包含了非查询类的计费操作,导致日志统计多算了字节数。 - 计费精度与取整差异:BigQuery的计费字节数会按最小计费单位(如10MB)向上取整,日志中的
totalBilledBytes是原始统计值,而成本仪表盘是按取整后的实际计费值累加,两者计算精度差异会导致总和出现偏差。
内容的提问来源于stack exchange,提问作者Dominik Ludwig
相关产品推荐
相关产品推荐

