Skip to content

Instantly share code, notes, and snippets.

@bindiego
Last active May 30, 2022 23:45
Show Gist options
  • Save bindiego/be188c422af272c3fe65ce0af8d0dffa to your computer and use it in GitHub Desktop.
Save bindiego/be188c422af272c3fe65ce0af8d0dffa to your computer and use it in GitHub Desktop.
GCP Billing export to BigQuery and Datastudio Visualization
SELECT
timestamp AS Date,
resource.labels.project_id AS ProjectId,
protopayload_auditlog.serviceName AS ServiceName,
protopayload_auditlog.methodName AS MethodName,
protopayload_auditlog.status.code AS StatusCode,
protopayload_auditlog.status.message AS StatusMessage,
protopayload_auditlog.authenticationInfo.principalEmail AS UserId,
protopayload_auditlog.servicedata_v1_bigquery.jobCompletedEvent.job.jobName.jobId AS JobId,
protopayload_auditlog.servicedata_v1_bigquery.jobCompletedEvent.job.jobConfiguration.query.query AS Query,
protopayload_auditlog.servicedata_v1_bigquery.jobCompletedEvent.job.jobConfiguration.query.destinationTable.projectId AS DestinationTableProjectId,
protopayload_auditlog.servicedata_v1_bigquery.jobCompletedEvent.job.jobConfiguration.query.destinationTable.datasetId AS DestinationTableDatasetId,
protopayload_auditlog.servicedata_v1_bigquery.jobCompletedEvent.job.jobConfiguration.query.destinationTable.tableId AS DestinationTableId,
protopayload_auditlog.servicedata_v1_bigquery.jobCompletedEvent.job.jobConfiguration.query.createDisposition AS CreateDisposition,
protopayload_auditlog.servicedata_v1_bigquery.jobCompletedEvent.job.jobConfiguration.query.writeDisposition AS WriteDisposition,
protopayload_auditlog.servicedata_v1_bigquery.jobCompletedEvent.job.jobConfiguration.dryRun AS DryRun,
protopayload_auditlog.servicedata_v1_bigquery.jobCompletedEvent.job.jobStatus.state AS JobState,
protopayload_auditlog.servicedata_v1_bigquery.jobCompletedEvent.job.jobStatus.error.code AS JobErrorCode,
protopayload_auditlog.servicedata_v1_bigquery.jobCompletedEvent.job.jobStatus.error.message AS JobErrorMessage,
protopayload_auditlog.servicedata_v1_bigquery.jobCompletedEvent.job.jobStatistics.createTime AS JobCreateTime,
protopayload_auditlog.servicedata_v1_bigquery.jobCompletedEvent.job.jobStatistics.startTime AS JobStartTime,
protopayload_auditlog.servicedata_v1_bigquery.jobCompletedEvent.job.jobStatistics.endTime AS JobEndTime,
protopayload_auditlog.servicedata_v1_bigquery.jobCompletedEvent.job.jobStatistics.billingTier AS BillingTier,
protopayload_auditlog.servicedata_v1_bigquery.jobCompletedEvent.job.jobStatistics.totalBilledBytes AS TotalBilledBytes,
protopayload_auditlog.servicedata_v1_bigquery.jobCompletedEvent.job.jobStatistics.totalProcessedBytes AS TotalProcessedBytes,
protopayload_auditlog.servicedata_v1_bigquery.jobCompletedEvent.job.jobStatistics.totalBilledBytes / 1000000000 AS TotalBilledGigabytes,
(protopayload_auditlog.servicedata_v1_bigquery.jobCompletedEvent.job.jobStatistics.totalBilledBytes / 1000000000) / 1000 AS TotalBilledTerabytes,
((protopayload_auditlog.servicedata_v1_bigquery.jobCompletedEvent.job.jobStatistics.totalBilledBytes / 1000000000) / 1000) * 5 AS TotalCost,
1 AS Queries
-- FROM (TABLE_QUERY([google.com:bin-wus-learning-center:bqlogging],'table_id CONTAINS "cloudaudit_googleapis_com_data_access"'))
FROM `google.com:bin-wus-learning-center.bqlogging.cloudaudit_googleapis_com_data_access*`
WHERE
protopayload_auditlog.serviceName = 'bigquery.googleapis.com'
AND protopayload_auditlog.methodName = 'jobservice.jobcompleted'
AND protopayload_auditlog.servicedata_v1_bigquery.jobCompletedEvent.eventName = 'query_job_completed'
SELECT
month,
balance,
future_balance
FROM
(SELECT
FORMAT_TIMESTAMP('%Y%m', usage_end_time) as month,
SUM(cost) + SUM((SELECT SUM(amount) FROM UNNEST(credits))) as balance,
null as future_balance
FROM `google.com:bin-wus-learning-center.billing.gcp_billing_export_v1_019673_59DCE1_43A0E8`
WHERE FORMAT_TIMESTAMP('%Y%m', usage_end_time) >= FORMAT_DATE('%Y%m', DATE_ADD(CURRENT_DATE(), INTERVAL -3 MONTH))
AND FORMAT_TIMESTAMP('%Y%m', usage_end_time) != FORMAT_TIMESTAMP('%Y%m', CURRENT_TIMESTAMP())
GROUP BY month
ORDER BY month)
UNION ALL
(SELECT
FORMAT_TIMESTAMP('%Y%m', CURRENT_TIMESTAMP()) as month,
null as balance,
SLOPE * (EXTRACT(YEAR FROM CURRENT_TIMESTAMP()) * 12 + EXTRACT(MONTH FROM CURRENT_TIMESTAMP())) + INTERCEPT as future_balance
FROM
(SELECT SLOPE,
(SUM_OF_Y - SLOPE * SUM_OF_X) / N AS INTERCEPT,
CORRELATION
FROM (
SELECT N,
SUM_OF_X,
SUM_OF_Y,
CORRELATION * STDDEV_OF_Y / STDDEV_OF_X AS SLOPE,
CORRELATION
FROM (
SELECT COUNT(*) AS N,
SUM(X) AS SUM_OF_X,
SUM(Y) AS SUM_OF_Y,
STDDEV_POP(X) AS STDDEV_OF_X,
STDDEV_POP(Y) AS STDDEV_OF_Y,
CORR(X,Y) AS CORRELATION
FROM (
SELECT
EXTRACT(YEAR FROM usage_end_time) * 12 + EXTRACT(MONTH FROM usage_end_time) as X,
SUM(cost) + SUM((SELECT SUM(amount) FROM UNNEST(credits))) as Y
FROM `google.com:bin-wus-learning-center.billing.gcp_billing_export_v1_019673_59DCE1_43A0E8`
WHERE FORMAT_TIMESTAMP('%Y%m', usage_end_time) >= FORMAT_DATE('%Y%m', DATE_ADD(CURRENT_DATE(), INTERVAL -3 MONTH))
GROUP BY X
ORDER BY X
)
WHERE X IS NOT NULL AND
Y IS NOT NULL))
)
)
UNION ALL
(SELECT
FORMAT_DATE('%Y%m', DATE_ADD(CURRENT_DATE(), INTERVAL 1 MONTH)) as month,
null as balance,
SLOPE * (EXTRACT(YEAR FROM DATE_ADD(CURRENT_DATE(), INTERVAL 1 MONTH)) * 12 + EXTRACT(MONTH FROM DATE_ADD(CURRENT_DATE(), INTERVAL 1 MONTH))) + INTERCEPT as future_balance
FROM
(SELECT SLOPE,
(SUM_OF_Y - SLOPE * SUM_OF_X) / N AS INTERCEPT,
CORRELATION
FROM (
SELECT N,
SUM_OF_X,
SUM_OF_Y,
CORRELATION * STDDEV_OF_Y / STDDEV_OF_X AS SLOPE,
CORRELATION
FROM (
SELECT COUNT(*) AS N,
SUM(X) AS SUM_OF_X,
SUM(Y) AS SUM_OF_Y,
STDDEV_POP(X) AS STDDEV_OF_X,
STDDEV_POP(Y) AS STDDEV_OF_Y,
CORR(X,Y) AS CORRELATION
FROM (
SELECT
EXTRACT(YEAR FROM usage_end_time) * 12 + EXTRACT(MONTH FROM usage_end_time) as X,
SUM(cost) + SUM((SELECT SUM(amount) FROM UNNEST(credits))) as Y
FROM `google.com:bin-wus-learning-center.billing.gcp_billing_export_v1_019673_59DCE1_43A0E8`
WHERE FORMAT_TIMESTAMP('%Y%m', usage_end_time) >= FORMAT_DATE('%Y%m', DATE_ADD(CURRENT_DATE(), INTERVAL -3 MONTH))
GROUP BY X
ORDER BY X
)
WHERE X IS NOT NULL AND
Y IS NOT NULL))
)
)
ORDER BY month
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment