可以通过使用Bigquery API发出警报来监视Bigquery查询槽数量和查询并发量。
以下是如何设置监视查询槽数量的示例代码:
import google.auth
from google.cloud import bigquery
def check_slots():
_, proj_id = google.auth.default()
client = bigquery.Client(project=proj_id)
query_job_config = bigquery.QueryJobConfig(dry_run=True, use_query_cache=False)
query_job_config.dry_run = True
query_job_config.use_query_cache = False
query = (
"SELECT CAST(IFNULL(sum(total_slot_ms), 0) / 1000 / 60 / 60 as INT64) AS used_hours "
"FROM `region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT "
"WHERE REGEXP_CONTAINS(project_id, r'^" + proj_id + "$') "
"AND creation_time BETWEEN "
" TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 3 DAY) "
" AND CURRENT_TIMESTAMP() "
" AND state = 'DONE';"
)
query_job = client.query(query, job_config=query_job_config)
results = query_job.result()
for row in results:
used_hours = row['used_hours']
if used_hours > 100:
send_alert('Slots usage is high. Used Hours: {}'.format(used_hours))
def send_alert(msg):
# send an alert
pass
以下是如何设置监视查询并发量的示例代码:
import google.auth
from google.cloud import monitoring_v3
def check_concurrency():
_, proj_id = google.auth.default()
client = monitoring_v3.MetricServiceClient()
end_time = time.time()
start_time = end_time - 3 * 60 * 60 # the past 3 hours
project_resource = client.project_path(proj_id)
duration = monitoring_v3.types.TimeInterval()
duration.end_time.FromSeconds(int(end_time))
duration.start_time.FromSeconds(int(start_time))
aggregation = monitoring_v3.types.Aggregation()
aggregation.alignment_period.seconds = 600 # 10 minutes
aggregation.per_series_aligner = (monitoring_v3.enums.Aggregation.Aligner.ALIGN_MEAN)
metric_type = 'bigquery.googleapis.com/query/count'
filter = (
'metric.type="{}" AND '
'resource.type="global" AND '
'resource.labels.project_id="{}"').format(
metric_type, proj_id)
response = client.list_time_series(
project_resource,
filter,
aggregation,
interval,
)
num_queries = 0
for ts in response:
for point in ts.points: