xref: /aosp_15_r20/external/grpc-grpc/tools/distrib/update_flakes_query.py (revision cc02d7e222339f7a4f6ba5f422e6413f4bd931f2)
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