记录所有 BigQuery 查询

Posted

技术标签:

【中文标题】记录所有 BigQuery 查询【英文标题】:logging all BigQuery queries 【发布时间】:2015-07-01 00:05:26 【问题描述】:

是否可以将所有 BigQuery 请求记录到 Cloud Storage 中的文件中(或者更好地记录到 BigQuery 表中)?似乎 bq 中可用的 --apilog 选项主要用于调试目的,但我想做的是跟踪所有查询,就像在 CloudStorage 中的特定文件上记录所有访问请求一样。

更具体地说,我不只是想记录我自己的查询,而是 (a) 同一项目中所有用户的查询,最好还 (b) 任何人 的查询我拥有的数据集中的表。

【问题讨论】:

【参考方案1】:

我知道它来晚了,但 GCP 在其最新版本中引入了审计日志的这一新功能。

参考这个 - Audit Logs BQ

【讨论】:

【参考方案2】:

在 CLI 中,您可以运行 bq ls -j -a 来检索项目中所有用户的作业。您可以将所有输出重定向到存储文件。

然后您可以为每个作业 id 运行 bq show -j <job_id>,为了获得更多详细信息,您将选择使用 json 响应:

bq show --format=prettyjson -j job_joQEqPwOiOoBlOhDBEgKxQAlKJQ

这将返回以下格式,其中包含您的查询、您的用户和字节处理等...


  "configuration": 
    "dryRun": false, 
    "query": 
      "createDisposition": "CREATE_IF_NEEDED", 
      "destinationTable": 
        "datasetId": "", 
        "projectId": "", 
        "tableId": ""
      , 
      "query": "", 
      "writeDisposition": "WRITE_TRUNCATE"
    
  , 
  "etag": "", 
  "id": "", 
  "jobReference": 
    "jobId": "", 
    "projectId": ""
  , 
  "kind": "bigquery#job", 
  "selfLink": "", 
  "statistics": 
    "creationTime": "1435006022346", 
    "endTime": "1435006144730", 
    "query": 
      "cacheHit": false, 
      "totalBytesProcessed": "105922683030"
    , 
    "startTime": "1435006023171", 
    "totalBytesProcessed": "105922683030"
  , 
  "status": 
    "state": "DONE"
  , 
  "user_email": ""

使用 API 您需要传递 allUsers 属性来列出来自所有用户 https://cloud.google.com/bigquery/docs/reference/v2/jobs/list#allUsers 的作业

【讨论】:

如果有一些示例代码用于定期运行该查询并将新结果附加到 BQ 表中,那将是非常棒的。写起来并不难,但我敢肯定有人已经做到了。 您可能需要添加行数 bq ls -j -a -n 1000 以显示超过最后 50 个查询。【参考方案3】:

BigQuery 具有 INFORMATION_SCHEMA.JOBS_BY_* 视图来检索有关 BigQuery 作业的实时元数据。此视图包含当前正在运行的作业,以及过去 180 天已完成作业的历史记录。

更多信息见Getting jobs metadata using INFORMATION_SCHEMA

【讨论】:

【参考方案4】:

现在使用 INFORMATION_SCHEMA 表有更好的方法。

以下是获取项目过去 90 天内所有查询的简单方法:

 SELECT
   job_id,
   start_time,
   user_email,
   total_bytes_processed,
   query
FROM `region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
WHERE creation_time BETWEEN TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 90 DAY) 
 AND CURRENT_TIMESTAMP()
 AND job_type = "QUERY"
 AND end_time BETWEEN TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 90 DAY) AND CURRENT_TIMESTAMP()
ORDER BY total_bytes_processed DESC

完整的文档可以在这里找到:https://cloud.google.com/bigquery/docs/information-schema-jobs

【讨论】:

以上是关于记录所有 BigQuery 查询的主要内容,如果未能解决你的问题,请参考以下文章

Bigquery 重复数据删除查询无法正常工作

Google BigQuery 选择记录中所有嵌套字段的总和

BigQuery 从查询中创建重复记录字段

BigQuery 中记录类型与展平表的查询性能

如果查询结果在 BigQuery 中没有记录,则显示默认值

标准 sql 中的 BigQuery 过滤记录