dashboards/system_tables/sql/job_concurrency_comparison_slow.sql (174 lines of code) (raw):

/* * Copyright 2021 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* * It is assumed that the following query will be run in the administration * project where the reservations were created. If this is not the case, * prepend the project id to the table name as follows: * `{project_id}`.`region-{region_name}`.INFORMATION_SCHEMA.{table} */ /* * Job Comparison Report: Returns information about jobs to compare performance * and troubleshoot. */ WITH job_info AS ( SELECT creation_time, end_time, project_id, reservation_id FROM -- PUBLIC DASHBOARD USE ONLY -- Modify this to use your project's INFORMATION_SCHEMA table as follows: -- `region-{region_name}`.INFORMATION_SCHEMA.{table} `region-us`.INFORMATION_SCHEMA.JOBS_BY_ORGANIZATION WHERE -- Update `@job_param`, depending on if this is for the slow or fast job. -- When creating the side-by-side comparison view, you will need to duplicate -- this data source and update parameter to @job_param_2, or similar. job_id = @job_param), organization_capacity AS ( SELECT SUM(slot_capacity) AS org_capacity FROM ( SELECT slot_capacity AS slot_capacity, reservation_name, change_timestamp, action, -- Find the most recent reservation update grouped by reservation DENSE_RANK() OVER (PARTITION BY reservation_name ORDER BY change_timestamp DESC) AS rownum FROM -- PUBLIC DASHBOARD USE ONLY -- Modify this to use your project's INFORMATION_SCHEMA table as follows: -- `region-{region_name}`.INFORMATION_SCHEMA.{table} `region-us`.INFORMATION_SCHEMA.RESERVATION_CHANGES_BY_PROJECT WHERE change_timestamp <= ( SELECT creation_time FROM job_info) ) reservation_cap WHERE reservation_cap.rownum = 1 -- Remove deleted reservations, so that only active reservations are displayed AND action != "DELETE" ), reservation_capacity AS ( SELECT slot_capacity AS reservation_capacity, creation_time, end_time, job_info.project_id, job_info.reservation_id FROM ( SELECT slot_capacity, CONCAT(project_id, ":", "US", ".", reservation_name) AS reservation_id, DENSE_RANK() OVER (ORDER BY change_timestamp DESC) AS rownum FROM -- PUBLIC DASHBOARD USE ONLY -- Modify this to use your project's INFORMATION_SCHEMA table as follows: -- `region-{region_name}`.INFORMATION_SCHEMA.{table} `region-us`.INFORMATION_SCHEMA.RESERVATION_CHANGES_BY_PROJECT WHERE change_timestamp <= ( SELECT creation_time FROM job_info) AND CONCAT(project_id, ":", "US", ".", reservation_name) = ( SELECT reservation_id FROM job_info)) reservation_cap JOIN job_info ON reservation_cap.reservation_id = job_info.reservation_id WHERE reservation_cap.rownum = 1 ), joined_capacity AS (SELECT * FROM reservation_capacity CROSS JOIN organization_capacity ) SELECT DATETIME_TRUNC(DATETIME(period_start), MINUTE) period_start, COUNT(DISTINCT IF (state = 'RUNNING', timeline_view.project_id, NULL)) AS running_projects, timeline_view.reservation_id, job_type, "minute" AS unit, reservation_capacity, org_capacity, COUNT(DISTINCT IF (state = 'RUNNING' AND timeline_view.project_id = joined_capacity.project_id, timeline_view.job_id, NULL)) AS running_jobs, COUNT(DISTINCT IF (state = 'PENDING', timeline_view.project_id, NULL)) AS pending_projects, COUNT(DISTINCT IF (state = 'PENDING' AND timeline_view.project_id = joined_capacity.project_id, timeline_view.job_id, NULL)) AS pending_jobs, SUM(period_slot_ms) / (1000 * 60) AS reservation_slots_used, SUM( IF (timeline_view.project_id = joined_capacity.project_id, (period_slot_ms), 0)) / (1000 * 60) AS project_slots_used, SUM(period_slot_ms) / (1000 * 60) / reservation_capacity AS reservation_utilization, FROM -- PUBLIC DASHBOARD USE ONLY -- Modify this to use your project's INFORMATION_SCHEMA table as follows: -- `region-{region_name}`.INFORMATION_SCHEMA.{table} `region-us`.INFORMATION_SCHEMA.JOBS_TIMELINE_BY_ORGANIZATION timeline_view JOIN joined_capacity ON timeline_view.reservation_id = joined_capacity.reservation_id AND period_start BETWEEN joined_capacity.creation_time AND joined_capacity.end_time GROUP BY 1, 3, 4, 5, 6, 7 UNION ALL SELECT DATETIME_TRUNC(DATETIME(period_start), HOUR) period_start, COUNT(DISTINCT IF (state = 'RUNNING', timeline_view.project_id, NULL)) AS running_projects, timeline_view.reservation_id, job_type, "hour" AS unit, reservation_capacity, org_capacity, COUNT(DISTINCT IF (state = 'RUNNING' AND timeline_view.project_id = joined_capacity.project_id, timeline_view.job_id, NULL)) AS running_jobs, COUNT(DISTINCT IF (state = 'PENDING', timeline_view.project_id, NULL)) AS pending_projects, COUNT(DISTINCT IF (state = 'PENDING' AND timeline_view.project_id = joined_capacity.project_id, timeline_view.job_id, NULL)) AS pending_jobs, SUM(period_slot_ms) / (1000 * 60 * 60) AS reservation_slots_used, SUM( IF (timeline_view.project_id = joined_capacity.project_id, (period_slot_ms), 0)) / (1000 * 60 * 60) AS project_slots_used, SUM(period_slot_ms) / (1000 * 60 * 60) / reservation_capacity AS reservation_utilization, FROM -- PUBLIC DASHBOARD USE ONLY -- Modify this to use your project's INFORMATION_SCHEMA table as follows: -- `region-{region_name}`.INFORMATION_SCHEMA.{table} `region-us`.INFORMATION_SCHEMA.JOBS_TIMELINE_BY_ORGANIZATION timeline_view JOIN joined_capacity ON timeline_view.reservation_id = joined_capacity.reservation_id AND period_start BETWEEN joined_capacity.creation_time AND joined_capacity.end_time GROUP BY 1, 3, 4, 5, 6, 7