GCPの監査ログから、BigQueryジョブの実行元を確認する方法を残しておきます。
Log RouterからBigQuery向けのsinkが作成されていることを想定します。
監査ログの概要やsinkを作成する方法については、以下の公式ドキュメントを参考してください。
ログを受信する特定のデータセットをに対して、以下のクエリを実行します。
実行すると、BigQueryジョブ毎に、どこから実行されていたかが分かります。
WITH
base AS (
SELECT
resource.labels.project_id,
protopayload_auditlog.authenticationInfo.principalEmail AS email,
REGEXP_EXTRACT(protopayload_auditlog.resourceName, r'^projects/[\w-]+/jobs/([\w-]+)$') as job_id,
timestamp,
protopayload_auditlog.requestMetadata.callerSuppliedUserAgent AS user_agent,
protopayload_auditlog.metadataJson AS metadata_json
FROM
`<プロジェクトID>.<データセットID>.cloudaudit_googleapis_com_data_access_*`
WHERE
timestamp > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
AND operation.first = true
),
audit AS (
SELECT
CASE
WHEN starts_with(job_id, 'scheduled_query_')
THEN 'scheduled_query'
WHEN starts_with(job_id, 'script_job_')
THEN 'script_job'
WHEN starts_with(job_id, 'bquxjob_')
THEN 'bq user interface'
WHEN starts_with(job_id, 'job_') AND json_value(metadata_json, '$.jobInsertion.job.jobConfig.type') = 'EXPORT'
THEN 'BQ UI data export to Google Drive'
WHEN starts_with(job_id, 'sheets_dataconnector_')
THEN 'sheets_dataconnector'
WHEN starts_with(job_id, 'job_') AND json_value(metadata_json, '$.jobInsertion.job.jobConfig.labels.requestor') = 'looker_studio'
THEN 'looker_studio'
WHEN starts_with(job_id, 'job_') AND user_agent LIKE 'Tableau%'
THEN 'tableau'
WHEN starts_with(job_id, 'job_') AND user_agent IS NOT NULL
THEN user_agent
WHEN regexp_contains(job_id, '^[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}$')
THEN 'google-colab'
ELSE 'unknown'
END execution_source,
json_value(metadata_json, "$.jobInsertion.job.jobConfig.queryConfig.query") AS query,
*
FROM
base
),
sheets_info AS (
SELECT
job_id,
'https://docs.google.com/spreadsheets/d/' || json_value(metadata_json, '$.firstPartyAppMetadata.sheetsMetadata.docId') as sheet_url,
json_value(metadata_json, '$.jobInsertion.job.jobConfig.labels.sheets_trigger') AS sheets_trigger,
FROM
base
)
SELECT
project_id,
email,
timestamp,
execution_source,
query,
sheet_url,
sheets_trigger
FROM
audit a FULL OUTER JOIN sheets_info s
ON a.job_id = s.job_id
BigQueryのジョブIDは、その実行元のタイプによって決まりますので、IDからどの実行元に基づいたかを推測できます。
実行元のタイプがSpread Sheetだった場合、クエリを実行したシートの情報まで確認できます。
INFORMATION_SCHEMAからスロット消費量などを追加して、どこでスロットを消費しているのかも確認できますね
(Spread Sheet以外はurlを確認するのは難しいですが。。)
ジョブIDの分類は公式ではなく、経験に基づいていますが、もっとよい方法があったらコメントください。