/
slots_by_minute_general.sql
72 lines (69 loc) · 3.72 KB
/
slots_by_minute_general.sql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
-- This query returns how many slots were used on a per minute basis
-- Change this value to change how far in the past the query will search
DECLARE interval_in_days INT64 DEFAULT 7;
WITH src AS (
SELECT
protopayload_auditlog.authenticationInfo.principalEmail AS user_email,
CASE protopayload_auditlog.servicedata_v1_bigquery.jobCompletedEvent.eventName
WHEN 'query_job_completed' THEN 'QUERY'
WHEN 'load_job_completed' THEN 'LOAD'
WHEN 'extract_job_completed' THEN 'EXTRACT'
WHEN 'table_copy_job_completed' THEN 'TABLE COPY'
END AS eventType,
protopayload_auditlog.servicedata_v1_bigquery.jobCompletedEvent.job.jobConfiguration.query,
protopayload_auditlog.servicedata_v1_bigquery.jobCompletedEvent.job.jobConfiguration.load,
protopayload_auditlog.servicedata_v1_bigquery.jobCompletedEvent.job.jobConfiguration.extract,
protopayload_auditlog.servicedata_v1_bigquery.jobCompletedEvent.job.jobConfiguration.tableCopy,
timestamp,
protopayload_auditlog.servicedata_v1_bigquery.jobCompletedEvent.job.jobName.jobId,
protopayload_auditlog.servicedata_v1_bigquery.jobCompletedEvent.job.jobName.location,
protopayload_auditlog.servicedata_v1_bigquery.jobCompletedEvent.job.jobName.projectId AS billingProjectId,
protopayload_auditlog.servicedata_v1_bigquery.jobCompletedEvent.job.jobStatistics.startTime,
protopayload_auditlog.servicedata_v1_bigquery.jobCompletedEvent.job.jobStatistics.endTime,
protopayload_auditlog.servicedata_v1_bigquery.jobCompletedEvent.job.jobStatistics.totalBilledBytes,
protopayload_auditlog.servicedata_v1_bigquery.jobCompletedEvent.job.jobStatistics.totalSlotMs,
SAFE_DIVIDE(protopayload_auditlog.servicedata_v1_bigquery.jobCompletedEvent.job.jobStatistics.totalSlotMs,
TIMESTAMP_DIFF(protopayload_auditlog.servicedata_v1_bigquery.jobCompletedEvent.job.jobStatistics.endTime,
protopayload_auditlog.servicedata_v1_bigquery.jobCompletedEvent.job.jobStatistics.startTime,
MILLISECOND)) AS slotCount,
ROW_NUMBER() OVER(PARTITION BY protopayload_auditlog.servicedata_v1_bigquery.jobCompletedEvent.job.jobName.jobId ORDER BY timestamp DESC) AS _rnk
FROM
`<project>.<dataset>.cloudaudit_googleapis_com_data_access`
WHERE
protopayload_auditlog.servicedata_v1_bigquery.jobCompletedEvent.job.jobName.jobId IS NOT NULL
AND protopayload_auditlog.servicedata_v1_bigquery.jobCompletedEvent.job.jobName.jobId NOT LIKE 'script_job_%' -- filter BQ script child jobs
AND protopayload_auditlog.servicedata_v1_bigquery.jobCompletedEvent.eventName LIKE '%_job_completed'
AND protopayload_auditlog.authenticationInfo.principalEmail IS NOT NULL
AND protopayload_auditlog.authenticationInfo.principalEmail != ""
AND DATE(protopayload_auditlog.servicedata_v1_bigquery.jobCompletedEvent.job.jobStatistics.startTime) >= DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY)
AND protopayload_auditlog.servicedata_v1_bigquery.jobCompletedEvent.job.jobConfiguration.dryRun IS NULL
AND protopayload_auditlog.servicedata_v1_bigquery.jobCompletedEvent.job.jobName.projectId IS NOT NULL
AND DATE(timestamp) >= DATE_SUB(CURRENT_DATE(), INTERVAL interval_in_days DAY)
),
jobsDeduplicated AS (
SELECT
* EXCEPT(_rnk)
FROM
src
WHERE
_rnk = 1),
differences AS (
SELECT
*,
GENERATE_TIMESTAMP_ARRAY(startTime, endTime, INTERVAL 1 MINUTE) AS int
FROM
jobsDeduplicated),
byMinutes AS (
SELECT
* EXCEPT(int)
FROM
differences,
UNNEST(int) AS minute)
SELECT
minute,
eventType,
SUM(slotCount) AS slotCount
FROM byMinutes
WHERE slotCount IS NOT NULL
GROUP BY minute, eventType
ORDER BY minute ASC