1*cc02d7e2SAndroid Build Coastguard Worker# Copyright 2022 gRPC authors. 2*cc02d7e2SAndroid Build Coastguard Worker# 3*cc02d7e2SAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 4*cc02d7e2SAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 5*cc02d7e2SAndroid Build Coastguard Worker# You may obtain a copy of the License at 6*cc02d7e2SAndroid Build Coastguard Worker# 7*cc02d7e2SAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 8*cc02d7e2SAndroid Build Coastguard Worker# 9*cc02d7e2SAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 10*cc02d7e2SAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 11*cc02d7e2SAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*cc02d7e2SAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 13*cc02d7e2SAndroid Build Coastguard Worker# limitations under the License. 14*cc02d7e2SAndroid Build Coastguard Worker 15*cc02d7e2SAndroid Build Coastguard WorkerQUERY = """ 16*cc02d7e2SAndroid Build Coastguard Worker#standardSQL 17*cc02d7e2SAndroid Build Coastguard Worker 18*cc02d7e2SAndroid Build Coastguard Worker-- See https://console.cloud.google.com/bigquery?sq=830293263384:5a8549832dfb48d9b2c04312a4ae3181 for the original query 19*cc02d7e2SAndroid Build Coastguard Worker 20*cc02d7e2SAndroid Build Coastguard WorkerWITH 21*cc02d7e2SAndroid Build Coastguard Worker 22*cc02d7e2SAndroid Build Coastguard Worker runs AS ( 23*cc02d7e2SAndroid Build Coastguard Worker SELECT 24*cc02d7e2SAndroid Build Coastguard Worker RTRIM(LTRIM(REGEXP_REPLACE(test_target, r'(@poller=.+)', ''))) AS test_binary, 25*cc02d7e2SAndroid Build Coastguard Worker REGEXP_EXTRACT(test_target, r'poller=(\w+)') AS poll_strategy, 26*cc02d7e2SAndroid Build Coastguard Worker job_name, 27*cc02d7e2SAndroid Build Coastguard Worker test_target, 28*cc02d7e2SAndroid Build Coastguard Worker test_class_name, 29*cc02d7e2SAndroid Build Coastguard Worker CASE 30*cc02d7e2SAndroid Build Coastguard Worker # in case of timeout / retry / segfault the "test_case" fields will contain weird stuff 31*cc02d7e2SAndroid Build Coastguard Worker # e.g. "test_shard2_run0_attempt0" or "shard_2/20" 32*cc02d7e2SAndroid Build Coastguard Worker # when aggregating, we want to display all of these as a single category of problems 33*cc02d7e2SAndroid Build Coastguard Worker WHEN test_case like 'test_shard_%_run%_attempt%' THEN 'CANNOT_DETERMINE' 34*cc02d7e2SAndroid Build Coastguard Worker WHEN test_case like '%shard_%/%' THEN 'CANNOT_DETERMINE' 35*cc02d7e2SAndroid Build Coastguard Worker # when test_case looks suspiciously like test_target 36*cc02d7e2SAndroid Build Coastguard Worker # its value is probably meaningless and it means that the entire target has failed 37*cc02d7e2SAndroid Build Coastguard Worker # e.g. test_target="//test/cpp/client:destroy_grpclb_channel_with_active_connect_stress_test" and test_case="test/cpp/client/destroy_grpclb_channel_with_active_connect_stress_test.exe" 38*cc02d7e2SAndroid Build Coastguard Worker WHEN STRPOS(test_case, REPLACE(SUBSTR(test_target, 3), ":", "/")) != 0 THEN 'CANNOT_DETERMINE' 39*cc02d7e2SAndroid Build Coastguard Worker ELSE test_case 40*cc02d7e2SAndroid Build Coastguard Worker END AS test_case, 41*cc02d7e2SAndroid Build Coastguard Worker result, 42*cc02d7e2SAndroid Build Coastguard Worker build_id, 43*cc02d7e2SAndroid Build Coastguard Worker timestamp 44*cc02d7e2SAndroid Build Coastguard Worker FROM 45*cc02d7e2SAndroid Build Coastguard Worker `grpc-testing.jenkins_test_results.rbe_test_results` 46*cc02d7e2SAndroid Build Coastguard Worker WHERE 47*cc02d7e2SAndroid Build Coastguard Worker DATETIME_DIFF(CURRENT_DATETIME(), 48*cc02d7e2SAndroid Build Coastguard Worker dateTIME(timestamp), 49*cc02d7e2SAndroid Build Coastguard Worker HOUR) < {lookback_hours} 50*cc02d7e2SAndroid Build Coastguard Worker ), 51*cc02d7e2SAndroid Build Coastguard Worker 52*cc02d7e2SAndroid Build Coastguard Worker results_counts_per_build AS ( 53*cc02d7e2SAndroid Build Coastguard Worker SELECT 54*cc02d7e2SAndroid Build Coastguard Worker test_binary, 55*cc02d7e2SAndroid Build Coastguard Worker #test_target, # aggregate data over all pollers 56*cc02d7e2SAndroid Build Coastguard Worker test_class_name, 57*cc02d7e2SAndroid Build Coastguard Worker test_case, 58*cc02d7e2SAndroid Build Coastguard Worker SUM(SAFE_CAST(result != 'PASSED' 59*cc02d7e2SAndroid Build Coastguard Worker AND result != 'SKIPPED' AS INT64)) AS runs_failed, 60*cc02d7e2SAndroid Build Coastguard Worker SUM(SAFE_CAST(result != 'SKIPPED' AS INT64)) AS runs_total, 61*cc02d7e2SAndroid Build Coastguard Worker job_name, 62*cc02d7e2SAndroid Build Coastguard Worker build_id 63*cc02d7e2SAndroid Build Coastguard Worker FROM 64*cc02d7e2SAndroid Build Coastguard Worker runs 65*cc02d7e2SAndroid Build Coastguard Worker GROUP BY 66*cc02d7e2SAndroid Build Coastguard Worker test_binary, 67*cc02d7e2SAndroid Build Coastguard Worker test_class_name, 68*cc02d7e2SAndroid Build Coastguard Worker test_case, 69*cc02d7e2SAndroid Build Coastguard Worker job_name, 70*cc02d7e2SAndroid Build Coastguard Worker build_id), 71*cc02d7e2SAndroid Build Coastguard Worker 72*cc02d7e2SAndroid Build Coastguard Worker builds_with_missing_cannot_determine_testcase_entry AS ( 73*cc02d7e2SAndroid Build Coastguard Worker SELECT 74*cc02d7e2SAndroid Build Coastguard Worker test_binary, 75*cc02d7e2SAndroid Build Coastguard Worker job_name, 76*cc02d7e2SAndroid Build Coastguard Worker build_id, 77*cc02d7e2SAndroid Build Coastguard Worker FROM 78*cc02d7e2SAndroid Build Coastguard Worker results_counts_per_build 79*cc02d7e2SAndroid Build Coastguard Worker GROUP BY 80*cc02d7e2SAndroid Build Coastguard Worker test_binary, 81*cc02d7e2SAndroid Build Coastguard Worker job_name, 82*cc02d7e2SAndroid Build Coastguard Worker build_id 83*cc02d7e2SAndroid Build Coastguard Worker HAVING COUNTIF(test_case = 'CANNOT_DETERMINE') = 0 84*cc02d7e2SAndroid Build Coastguard Worker ), 85*cc02d7e2SAndroid Build Coastguard Worker 86*cc02d7e2SAndroid Build Coastguard Worker # for each test target and build, generate a fake entry with "CANNOT_DETERMINE" test_case 87*cc02d7e2SAndroid Build Coastguard Worker # if not already present. 88*cc02d7e2SAndroid Build Coastguard Worker # this is because in many builds, there will be no "CANNOT_DETERMINE" entry 89*cc02d7e2SAndroid Build Coastguard Worker # and we want to avoid skewing the statistics 90*cc02d7e2SAndroid Build Coastguard Worker results_counts_per_build_with_fake_cannot_determine_test_case_entries AS ( 91*cc02d7e2SAndroid Build Coastguard Worker (SELECT * FROM results_counts_per_build) 92*cc02d7e2SAndroid Build Coastguard Worker UNION ALL 93*cc02d7e2SAndroid Build Coastguard Worker (SELECT 94*cc02d7e2SAndroid Build Coastguard Worker test_binary, 95*cc02d7e2SAndroid Build Coastguard Worker '' AS test_class_name, # when test_case is 'CANNOT_DETERMINE', test class is empty string 96*cc02d7e2SAndroid Build Coastguard Worker 'CANNOT_DETERMINE' AS test_case, # see table "runs" 97*cc02d7e2SAndroid Build Coastguard Worker 0 AS runs_failed, 98*cc02d7e2SAndroid Build Coastguard Worker 1 AS runs_total, 99*cc02d7e2SAndroid Build Coastguard Worker job_name, 100*cc02d7e2SAndroid Build Coastguard Worker build_id 101*cc02d7e2SAndroid Build Coastguard Worker FROM 102*cc02d7e2SAndroid Build Coastguard Worker builds_with_missing_cannot_determine_testcase_entry) 103*cc02d7e2SAndroid Build Coastguard Worker ), 104*cc02d7e2SAndroid Build Coastguard Worker 105*cc02d7e2SAndroid Build Coastguard Worker results_counts AS ( 106*cc02d7e2SAndroid Build Coastguard Worker SELECT 107*cc02d7e2SAndroid Build Coastguard Worker test_binary, 108*cc02d7e2SAndroid Build Coastguard Worker test_class_name, 109*cc02d7e2SAndroid Build Coastguard Worker test_case, 110*cc02d7e2SAndroid Build Coastguard Worker job_name, 111*cc02d7e2SAndroid Build Coastguard Worker SUM(runs_failed) AS runs_failed, 112*cc02d7e2SAndroid Build Coastguard Worker SUM(runs_total) AS runs_total, 113*cc02d7e2SAndroid Build Coastguard Worker SUM(SAFE_CAST(runs_failed > 0 AS INT64)) AS builds_failed, 114*cc02d7e2SAndroid Build Coastguard Worker COUNT(build_id) AS builds_total, 115*cc02d7e2SAndroid Build Coastguard Worker STRING_AGG(CASE 116*cc02d7e2SAndroid Build Coastguard Worker WHEN runs_failed > 0 THEN 'X' 117*cc02d7e2SAndroid Build Coastguard Worker ELSE '_' END, '' 118*cc02d7e2SAndroid Build Coastguard Worker ORDER BY 119*cc02d7e2SAndroid Build Coastguard Worker build_id ASC) AS build_failure_pattern, 120*cc02d7e2SAndroid Build Coastguard Worker FORMAT("%T", ARRAY_AGG(build_id 121*cc02d7e2SAndroid Build Coastguard Worker ORDER BY 122*cc02d7e2SAndroid Build Coastguard Worker build_id ASC)) AS builds 123*cc02d7e2SAndroid Build Coastguard Worker FROM 124*cc02d7e2SAndroid Build Coastguard Worker #results_counts_per_build 125*cc02d7e2SAndroid Build Coastguard Worker results_counts_per_build_with_fake_cannot_determine_test_case_entries 126*cc02d7e2SAndroid Build Coastguard Worker GROUP BY 127*cc02d7e2SAndroid Build Coastguard Worker test_binary, 128*cc02d7e2SAndroid Build Coastguard Worker test_class_name, 129*cc02d7e2SAndroid Build Coastguard Worker test_case, 130*cc02d7e2SAndroid Build Coastguard Worker job_name 131*cc02d7e2SAndroid Build Coastguard Worker HAVING 132*cc02d7e2SAndroid Build Coastguard Worker runs_failed > 0) 133*cc02d7e2SAndroid Build Coastguard Worker 134*cc02d7e2SAndroid Build Coastguard WorkerSELECT 135*cc02d7e2SAndroid Build Coastguard Worker ROUND(100*builds_failed / builds_total, 2) AS pct_builds_failed, 136*cc02d7e2SAndroid Build Coastguard Worker ROUND(100*runs_failed / runs_total, 2) AS pct_runs_failed, 137*cc02d7e2SAndroid Build Coastguard Worker test_binary, 138*cc02d7e2SAndroid Build Coastguard Worker test_class_name, 139*cc02d7e2SAndroid Build Coastguard Worker test_case, 140*cc02d7e2SAndroid Build Coastguard Worker job_name, 141*cc02d7e2SAndroid Build Coastguard Worker build_failure_pattern 142*cc02d7e2SAndroid Build Coastguard Worker 143*cc02d7e2SAndroid Build Coastguard WorkerFROM 144*cc02d7e2SAndroid Build Coastguard Worker results_counts 145*cc02d7e2SAndroid Build Coastguard WorkerORDER BY 146*cc02d7e2SAndroid Build Coastguard Worker pct_builds_failed DESC 147*cc02d7e2SAndroid Build Coastguard Worker""" 148