From 665fda22af4aa72639efdfd62a4fe2e440cfad7b Mon Sep 17 00:00:00 2001 From: zabbasi Date: Tue, 30 Apr 2019 21:04:57 -0700 Subject: [PATCH] Report for test flakiness (#356) * added draft flakiness report * updated the report * updated the report * fixed typos * fixed typos * removed extra file * added build consistency plot * updated the report * added states per test type * added test flakiness metrics * added junit test and workflow flakiness metrics and validated the results --- scripts/Flakiness_report.ipynb | 3811 ++++++++++++++++++++++++++++++++ 1 file changed, 3811 insertions(+) create mode 100644 scripts/Flakiness_report.ipynb diff --git a/scripts/Flakiness_report.ipynb b/scripts/Flakiness_report.ipynb new file mode 100644 index 000000000..10b386d48 --- /dev/null +++ b/scripts/Flakiness_report.ipynb @@ -0,0 +1,3811 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Kubeflow test flakiness report\n", + "This notebook reports kubeflow test flakiness. We leverqe [kettle](https://github.com/kubernetes/test-infra/tree/master/kettle) which uploads test metadata into bigquery upon publishing in GCS buckets via [Prow](https://github.com/kubernetes/test-infra/tree/master/prow). We also customize flakiness queries used in k8s infra-test [metrics](https://github.com/kubernetes/test-infra/tree/master/metrics) to compute daily flakiness metrics for kubeflow test jobs, junit tests and workflow resr. \n", + "\n", + "We aim to use this report to evaluate kubeflow flakiness and as clues to debug the flakiness in kubeflow test pipeline. At this stage, we conclude that kubeflow test metadata are not sufficient to provide clues for debugging flakiness. Also, we currently generate the rport for the kubeflow prs which trigger presubmit tests. Later we will expand it for all types of kubeflow tests.\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Flakines metrics for kubeflow test jobs\n", + "- __job__: name of the test e.g., pr:kubeflow-presubmit (if a test is triggered by a pr, kettle adds \"pr:\" to the beginning of the job name.)\n", + "- __start_date__: test start date\n", + "- __runs__: total number of test runs during the day of the start date \n", + "- __flakes__: if different runs of a given commit report different result (some failed and some (one) passed), we say that flake happens for that commit. __flakes__ metric points to the number of flakes for all commits of the job during the day (start date) \n", + "- __passed__: total number of times that the job runs successfully. \n", + "- __failed__: total number of distinct commits which do not have not any successful run \n", + "- __flake_rate__: the ratio of number of flakes over the number of distinct commits\n", + "- __commit_consistency__: one minus __flake_rate__\n", + "- __build_consistency__: the ratio of useful runs over the total runs. If a job flakes then the last successful run is a useful run, otherwise all runs are useful. \n", + "- __flaky_runs__: __runs__ - __passed__ - __failed__\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "__Caveat__: flakiness metrics are correct for commits for which a conclusion is made i.e., either it is passed or failed and is reflected in the logs. If a commit failed and future runs reveal that the failure was a flake, it won't be reflected in the current flakiness metrics. Therefore, we should look at flakiness report for a relatively long time (e.g., a week). " + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The google.cloud.bigquery extension is already loaded. To reload it, use:\n", + " %reload_ext google.cloud.bigquery\n" + ] + } + ], + "source": [ + "%load_ext google.cloud.bigquery" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Compute daily flakiness of kubeflow presubmit tests" + ] + }, + { + "cell_type": "code", + "execution_count": 76, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
jobstart_datebuild_consistencycommit_consistencyflake_rateflakesrunspassedflaky_runsfailed
0pr:kubeflow-presubmit2019-04-190.6140.5910.409944171710
1pr:kubeflow-presubmit2019-04-230.7060.6670.33363417107
2pr:kubeflow-presubmit2019-04-030.8570.7500.2503211830
3pr:kubeflow-presubmit2019-04-050.9000.8500.1503302235
4pr:kubeflow-tf-operator-presubmit2019-04-230.5000.3330.667210352
5pr:kubeflow-katib-presubmit2019-04-260.6670.5000.50026420
6pr:kubeflow-presubmit2019-04-060.6670.6670.33329531
7pr:kubeflow-presubmit2019-04-100.8420.8460.1542194312
8pr:kubeflow-presubmit2019-04-260.9500.9350.06524019219
9pr:kubeflow-katib-presubmit2019-04-020.5000.0001.00012110
10pr:kubeflow-katib-presubmit2019-04-220.5000.0001.00012110
11pr:kubeflow-katib-presubmit2019-04-090.5000.0001.00012110
12pr:kubeflow-presubmit2019-04-070.5000.0001.00012110
13pr:kubeflow-tf-operator-presubmit2019-04-260.5000.0001.00012110
14pr:kubeflow-tf-operator-presubmit2019-04-290.6670.0001.00013210
15pr:kubeflow-katib-presubmit2019-04-190.6670.5000.50013210
16pr:kubeflow-presubmit2019-04-080.8130.9090.091116439
17pr:kubeflow-presubmit2019-04-090.8330.6670.33316510
18pr:kubeflow-presubmit2019-04-120.8570.9000.100114725
19pr:kubeflow-presubmit2019-04-180.8890.9090.091118729
20pr:kubeflow-presubmit2019-04-290.8950.9230.077119928
21pr:kubeflow-katib-presubmit2019-04-250.9000.8750.125110811
22pr:kubeflow-presubmit2019-04-160.9000.8750.125110613
23pr:kubeflow-presubmit2019-04-210.9230.9170.0831131111
24pr:kubeflow-presubmit2019-04-220.9410.9290.0711171214
25pr:kubeflow-presubmit2019-04-240.9470.9170.0831191117
26pr:kubeflow-arena-presubmit2019-04-171.0001.0000.00002200
27pr:kubeflow-arena-presubmit2019-04-111.0001.0000.00002200
28pr:kubeflow-arena-presubmit2019-04-141.0001.0000.00001100
29pr:kubeflow-arena-presubmit2019-04-121.0001.0000.00003300
.................................
109pr:kubeflow-testing-presubmit2019-04-041.0001.0000.00001100
110pr:kubeflow-testing-presubmit2019-04-101.0001.0000.00001100
111pr:kubeflow-tf-operator-presubmit2019-04-251.0001.0000.00002200
112pr:kubeflow-tf-operator-presubmit2019-04-151.0001.0000.00001100
113pr:kubeflow-tf-operator-presubmit2019-04-131.0001.0000.00001001
114pr:kubeflow-tf-operator-presubmit2019-04-091.0001.0000.00001100
115pr:kubeflow-tf-operator-presubmit2019-04-191.0001.0000.00001100
116pr:kubeflow-tf-operator-presubmit2019-04-221.0001.0000.00002101
117pr:kubeflow-website-presubmit2019-04-281.0001.0000.00001100
118pr:kubeflow-website-presubmit2019-04-031.0001.0000.00004400
119pr:kubeflow-website-presubmit2019-04-131.0001.0000.00001100
120pr:kubeflow-website-presubmit2019-04-161.0001.0000.0000101000
121pr:kubeflow-website-presubmit2019-04-261.0001.0000.0000131300
122pr:kubeflow-website-presubmit2019-04-251.0001.0000.00005500
123pr:kubeflow-website-presubmit2019-04-101.0001.0000.00005500
124pr:kubeflow-website-presubmit2019-04-081.0001.0000.0000121200
125pr:kubeflow-website-presubmit2019-04-121.0001.0000.00004400
126pr:kubeflow-website-presubmit2019-04-141.0001.0000.00002200
127pr:kubeflow-website-presubmit2019-04-271.0001.0000.00002200
128pr:kubeflow-website-presubmit2019-04-181.0001.0000.00007700
129pr:kubeflow-website-presubmit2019-04-231.0001.0000.0000101000
130pr:kubeflow-website-presubmit2019-04-091.0001.0000.00008800
131pr:kubeflow-website-presubmit2019-04-041.0001.0000.0000181800
132pr:kubeflow-website-presubmit2019-04-061.0001.0000.00005500
133pr:kubeflow-website-presubmit2019-04-051.0001.0000.00009900
134pr:kubeflow-website-presubmit2019-04-021.0001.0000.00006600
135pr:kubeflow-website-presubmit2019-04-071.0001.0000.00002200
136pr:kubeflow-website-presubmit2019-04-171.0001.0000.00005500
137pr:kubeflow-website-presubmit2019-04-191.0001.0000.00002200
138pr:kubeflow-website-presubmit2019-04-151.0001.0000.00002200
\n", + "

139 rows × 10 columns

\n", + "
" + ], + "text/plain": [ + " job start_date build_consistency \\\n", + "0 pr:kubeflow-presubmit 2019-04-19 0.614 \n", + "1 pr:kubeflow-presubmit 2019-04-23 0.706 \n", + "2 pr:kubeflow-presubmit 2019-04-03 0.857 \n", + "3 pr:kubeflow-presubmit 2019-04-05 0.900 \n", + "4 pr:kubeflow-tf-operator-presubmit 2019-04-23 0.500 \n", + "5 pr:kubeflow-katib-presubmit 2019-04-26 0.667 \n", + "6 pr:kubeflow-presubmit 2019-04-06 0.667 \n", + "7 pr:kubeflow-presubmit 2019-04-10 0.842 \n", + "8 pr:kubeflow-presubmit 2019-04-26 0.950 \n", + "9 pr:kubeflow-katib-presubmit 2019-04-02 0.500 \n", + "10 pr:kubeflow-katib-presubmit 2019-04-22 0.500 \n", + "11 pr:kubeflow-katib-presubmit 2019-04-09 0.500 \n", + "12 pr:kubeflow-presubmit 2019-04-07 0.500 \n", + "13 pr:kubeflow-tf-operator-presubmit 2019-04-26 0.500 \n", + "14 pr:kubeflow-tf-operator-presubmit 2019-04-29 0.667 \n", + "15 pr:kubeflow-katib-presubmit 2019-04-19 0.667 \n", + "16 pr:kubeflow-presubmit 2019-04-08 0.813 \n", + "17 pr:kubeflow-presubmit 2019-04-09 0.833 \n", + "18 pr:kubeflow-presubmit 2019-04-12 0.857 \n", + "19 pr:kubeflow-presubmit 2019-04-18 0.889 \n", + "20 pr:kubeflow-presubmit 2019-04-29 0.895 \n", + "21 pr:kubeflow-katib-presubmit 2019-04-25 0.900 \n", + "22 pr:kubeflow-presubmit 2019-04-16 0.900 \n", + "23 pr:kubeflow-presubmit 2019-04-21 0.923 \n", + "24 pr:kubeflow-presubmit 2019-04-22 0.941 \n", + "25 pr:kubeflow-presubmit 2019-04-24 0.947 \n", + "26 pr:kubeflow-arena-presubmit 2019-04-17 1.000 \n", + "27 pr:kubeflow-arena-presubmit 2019-04-11 1.000 \n", + "28 pr:kubeflow-arena-presubmit 2019-04-14 1.000 \n", + "29 pr:kubeflow-arena-presubmit 2019-04-12 1.000 \n", + ".. ... ... ... \n", + "109 pr:kubeflow-testing-presubmit 2019-04-04 1.000 \n", + "110 pr:kubeflow-testing-presubmit 2019-04-10 1.000 \n", + "111 pr:kubeflow-tf-operator-presubmit 2019-04-25 1.000 \n", + "112 pr:kubeflow-tf-operator-presubmit 2019-04-15 1.000 \n", + "113 pr:kubeflow-tf-operator-presubmit 2019-04-13 1.000 \n", + "114 pr:kubeflow-tf-operator-presubmit 2019-04-09 1.000 \n", + "115 pr:kubeflow-tf-operator-presubmit 2019-04-19 1.000 \n", + "116 pr:kubeflow-tf-operator-presubmit 2019-04-22 1.000 \n", + "117 pr:kubeflow-website-presubmit 2019-04-28 1.000 \n", + "118 pr:kubeflow-website-presubmit 2019-04-03 1.000 \n", + "119 pr:kubeflow-website-presubmit 2019-04-13 1.000 \n", + "120 pr:kubeflow-website-presubmit 2019-04-16 1.000 \n", + "121 pr:kubeflow-website-presubmit 2019-04-26 1.000 \n", + "122 pr:kubeflow-website-presubmit 2019-04-25 1.000 \n", + "123 pr:kubeflow-website-presubmit 2019-04-10 1.000 \n", + "124 pr:kubeflow-website-presubmit 2019-04-08 1.000 \n", + "125 pr:kubeflow-website-presubmit 2019-04-12 1.000 \n", + "126 pr:kubeflow-website-presubmit 2019-04-14 1.000 \n", + "127 pr:kubeflow-website-presubmit 2019-04-27 1.000 \n", + "128 pr:kubeflow-website-presubmit 2019-04-18 1.000 \n", + "129 pr:kubeflow-website-presubmit 2019-04-23 1.000 \n", + "130 pr:kubeflow-website-presubmit 2019-04-09 1.000 \n", + "131 pr:kubeflow-website-presubmit 2019-04-04 1.000 \n", + "132 pr:kubeflow-website-presubmit 2019-04-06 1.000 \n", + "133 pr:kubeflow-website-presubmit 2019-04-05 1.000 \n", + "134 pr:kubeflow-website-presubmit 2019-04-02 1.000 \n", + "135 pr:kubeflow-website-presubmit 2019-04-07 1.000 \n", + "136 pr:kubeflow-website-presubmit 2019-04-17 1.000 \n", + "137 pr:kubeflow-website-presubmit 2019-04-19 1.000 \n", + "138 pr:kubeflow-website-presubmit 2019-04-15 1.000 \n", + "\n", + " commit_consistency flake_rate flakes runs passed flaky_runs failed \n", + "0 0.591 0.409 9 44 17 17 10 \n", + "1 0.667 0.333 6 34 17 10 7 \n", + "2 0.750 0.250 3 21 18 3 0 \n", + "3 0.850 0.150 3 30 22 3 5 \n", + "4 0.333 0.667 2 10 3 5 2 \n", + "5 0.500 0.500 2 6 4 2 0 \n", + "6 0.667 0.333 2 9 5 3 1 \n", + "7 0.846 0.154 2 19 4 3 12 \n", + "8 0.935 0.065 2 40 19 2 19 \n", + "9 0.000 1.000 1 2 1 1 0 \n", + "10 0.000 1.000 1 2 1 1 0 \n", + "11 0.000 1.000 1 2 1 1 0 \n", + "12 0.000 1.000 1 2 1 1 0 \n", + "13 0.000 1.000 1 2 1 1 0 \n", + "14 0.000 1.000 1 3 2 1 0 \n", + "15 0.500 0.500 1 3 2 1 0 \n", + "16 0.909 0.091 1 16 4 3 9 \n", + "17 0.667 0.333 1 6 5 1 0 \n", + "18 0.900 0.100 1 14 7 2 5 \n", + "19 0.909 0.091 1 18 7 2 9 \n", + "20 0.923 0.077 1 19 9 2 8 \n", + "21 0.875 0.125 1 10 8 1 1 \n", + "22 0.875 0.125 1 10 6 1 3 \n", + "23 0.917 0.083 1 13 11 1 1 \n", + "24 0.929 0.071 1 17 12 1 4 \n", + "25 0.917 0.083 1 19 11 1 7 \n", + "26 1.000 0.000 0 2 2 0 0 \n", + "27 1.000 0.000 0 2 2 0 0 \n", + "28 1.000 0.000 0 1 1 0 0 \n", + "29 1.000 0.000 0 3 3 0 0 \n", + ".. ... ... .. .. .. .. .. \n", + "109 1.000 0.000 0 1 1 0 0 \n", + "110 1.000 0.000 0 1 1 0 0 \n", + "111 1.000 0.000 0 2 2 0 0 \n", + "112 1.000 0.000 0 1 1 0 0 \n", + "113 1.000 0.000 0 1 0 0 1 \n", + "114 1.000 0.000 0 1 1 0 0 \n", + "115 1.000 0.000 0 1 1 0 0 \n", + "116 1.000 0.000 0 2 1 0 1 \n", + "117 1.000 0.000 0 1 1 0 0 \n", + "118 1.000 0.000 0 4 4 0 0 \n", + "119 1.000 0.000 0 1 1 0 0 \n", + "120 1.000 0.000 0 10 10 0 0 \n", + "121 1.000 0.000 0 13 13 0 0 \n", + "122 1.000 0.000 0 5 5 0 0 \n", + "123 1.000 0.000 0 5 5 0 0 \n", + "124 1.000 0.000 0 12 12 0 0 \n", + "125 1.000 0.000 0 4 4 0 0 \n", + "126 1.000 0.000 0 2 2 0 0 \n", + "127 1.000 0.000 0 2 2 0 0 \n", + "128 1.000 0.000 0 7 7 0 0 \n", + "129 1.000 0.000 0 10 10 0 0 \n", + "130 1.000 0.000 0 8 8 0 0 \n", + "131 1.000 0.000 0 18 18 0 0 \n", + "132 1.000 0.000 0 5 5 0 0 \n", + "133 1.000 0.000 0 9 9 0 0 \n", + "134 1.000 0.000 0 6 6 0 0 \n", + "135 1.000 0.000 0 2 2 0 0 \n", + "136 1.000 0.000 0 5 5 0 0 \n", + "137 1.000 0.000 0 2 2 0 0 \n", + "138 1.000 0.000 0 2 2 0 0 \n", + "\n", + "[139 rows x 10 columns]" + ] + }, + "execution_count": 76, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "%%bigquery daily_flakiness\n", + "select \n", + " job,\n", + " start_date,\n", + " round(sum(if(flaked=1,passed,runs))/sum(runs),3) build_consistency,\n", + " round(1-sum(flaked)/count(distinct commit),3) commit_consistency,\n", + " round (sum(flaked)/count(distinct commit),3) flake_rate,\n", + " sum(flaked) flakes,\n", + " sum(runs) runs,\n", + " sum(passed) passed,\n", + " sum(flaky_runs) flaky_runs,\n", + " sum(failed) failed\n", + " \n", + " from ( /* Determine whether a (job, pr-num, commit) flaked */\n", + " select\n", + " job,\n", + " start_date,\n", + " num,\n", + " commit,\n", + " if(passed = runs or passed = 0, 0, 1) flaked,\n", + " if(passed = runs or passed = 0, 0, runs-passed) flaky_runs, \n", + " if(passed = 0, runs, 0) failed, \n", + " passed,\n", + " CAST(runs as INT64) runs\n", + " from (\n", + " select /* Count the runs and passes for each (job, pr-num, commit) */\n", + " max(start_date) start_date,\n", + " num,\n", + " commit,\n", + " sum(if(result='SUCCESS',1,0)) passed,\n", + " count(result) runs,\n", + " job\n", + " from (\n", + " SELECT /* all runs of any job for the past week, noting the commit and whether it passed */\n", + " job,\n", + " regexp_extract(path, r'/(\\d+)\\/') as num, /* pr number */\n", + " regexp_extract(m.value, r'[^,]+,\\d+:([a-f0-9]+)\"') commit, /* extract the first commit id from the repo flag */\n", + " EXTRACT(DATE FROM started) start_date, \n", + " result\n", + " FROM `k8s-gubernator.build.all` , UNNEST(metadata) as m\n", + " where\n", + " started > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 672 HOUR)\n", + " and (m.key = \"repos\") and STRPOS(job,'kubeflow') > 0 and STRPOS(job,'pr:') > 0\n", + " )\n", + " group by job, num, commit\n", + " )\n", + " )\n", + " group by job, start_date\n", + " order by\n", + " flakes desc,\n", + " build_consistency,\n", + " commit_consistency,\n", + " job" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Daily flake rate of all presubmit tests over time" + ] + }, + { + "cell_type": "code", + "execution_count": 78, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import pandas as pd\n", + "overal_flakes = pd.DataFrame(daily_flakiness).groupby(\"start_date\",as_index=False).agg(\n", + "{ 'flake_rate':'mean',\n", + " 'flakes' :'sum',\n", + " 'runs' : 'sum'\n", + "})\n", + "import numpy as np\n", + "import matplotlib\n", + "import matplotlib.pyplot as plt\n", + "from datetime import datetime\n", + "matplotlib.rc('font', size=16)\n", + "ax=overal_flakes.flake_rate.plot(xticks=overal_flakes.index,figsize=(14,8), rot=45)\n", + "plt.title('Daily flake rate')\n", + "plt.xlabel('time')\n", + "plt.ylabel('flake_rate')\n", + "ax.set_xticklabels(overal_flakes['start_date'])\n", + "plt.ylim([0,1])\n", + "\n", + " \n", + "\n", + "plt.show()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Daily build and commit consistency of all presubmit tests\n", + "As illustreated by the plot, build_consistency and commit_consistency are expectedly corrolated. \n", + "Note that build_consistency is computed with respect to the total number of runs whereas commit_consistency is computed with respect to distinct number of commits. This means that if number of flaky runs increases (i.e., runing retest) then build_consistency becomes lower than commit_consistency. " + ] + }, + { + "cell_type": "code", + "execution_count": 79, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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SiPRnbpHgU3AAmPMYGPMIGAB8DkwM7KQMaaVMSbHGDPBN+184AHgNeAtY8xxvlvUZ84UERERERFJBgkdfmmt/cEYczIwDXgaMMA/gOuttd/7FjVANfJ3Ok/1pp/q3fyWAL3iVGwREREREZEKK9G/qcNa+xlwdinLbMJ14PzTRgIj41UuERERERGRyqgyX9JARERERESkylOnTkREREREpBJTp05ERERERKQSU6dORERERESkElOnTkREREREpBJTp05ERERERKQSU6dORERERESkElOnTkREREREpBJTp05ERERERKQSU6dORERERESkElOnTkREREREpBJTp05ERERERKQSU6dORERERESkElOnTkREREREpBJTp05ERERERKQSU6dORERERESkElOnTkREREREpBJTp05ERERERKQSSy3vAlQ0u3btYseOHezfv7+8iyKSlKpXr06DBg2oU6dOeRdFREREJCmoU+fz008/sXXrVlq0aEHNmjUxxpR3kUSSirWWH3/8kS+++IIaNWqQnp5e3kUSERERqfQ0/NJn+/btNGzYkIyMDHXoROLAGENGRgYNGjRg+/bt5V0cERERkaSgTp3PTz/9RGZmZnkXQyTpZWVl8dNPP5V3MURERESSgjp1Pjk5OaSmakSqSLylpqaSk5NT3sUQERERSQrq1BWgYZci8afPmYiIiEh41KkTERERERGpxNSpS2ITJ07EGBPaMDdjDBMnTiz0/KVZvHgxxhgWL14cSjnKy8iRI2ndunVUj5k4cSJvvfVWfAokIiIiIoI6dRKFlStXMmrUqPIuRrkZP3488+fPj+oxkyZNUqdOREREROJKZwWRwI477rjyLkK5atu2bXkXQURERESkEB2pqwLWrVtH7969ycjIoGnTpkyYMIHc3FwAnnrqKYwxbNq0Kd9jihpaWXD4ZVG2b9/OhRdeSO3atTnooIMYPnw43333XZnKvWTJEvr160edOnWoVasWXbp04fHHH8+b//PPPzNu3Dhat25N9erVad26NePGjePnn3/OW2bTpk0YY5g5cyYTJkygadOmHHTQQQwcOJAvvvgiX97cuXM5+uijyczMpHbt2nTu3JmZM2fmzS84/DInJ4fx48fTtm1b0tPTadCgAT179mTZsmV56wvgrrvuwhhTaP0tWbKEPn36kJWVRa1atTjllFNYs2ZNvjL16tWLnj178uabb9K1a1cyMjLo1KlTkUcMP/jgA4YMGUL9+vWpWbMmHTp0YPLkyQCMHj2axo0b51s3AHv27CErK4tbb701yEsiIiIiIhWQOnVVwJlnnknfvn158cUXufDCC7nzzju544474pJ11lln8fLLL3P33Xczb948UlNTGT16dNTPs2DBAvr06cP+/fuZOXMmCxYs4JJLLmHz5s15y4wYMYLf//73DB8+nJdffpmRI0dyzz33MGLEiELPN3nyZD755BOeeOIJpk+fzsqVKxk2bFje/GXLljFs2DCys7N58cUX+ctf/sJll11WYof0nnvuYdq0aVx77bW8/vrrPPnkk/Tp04dvv/0WcMNVwXUGV65cmW/46iuvvEKfPn3IzMxkzpw5zJ07lz179nDiiSfy+eef58vZsGED1113HTfeeCMvvPACTZs25ZxzzuGTTz7JW+btt9+mR48ebNiwgWnTpvHKK69w44035nVcr7zySrZt21aoMzh37lx++OEHrrjiikCvi4iIiIhUPBp+WYpJf/uQtV/tLtcydGxWm9sHHlHmx1922WV5R2L69+/P7t27mTp1Ktdff31YRQRg4cKFLFu2jGeffZbzzz8fgFNOOYXTTjut0FGxklhrue666zjqqKNYtGgRKSlu30Pfvn3zllmzZg3PPvsst99+e97Rr/79+5Oamsr48eO59dZbOfLII/OWb926NXPnzs27v337dm6++Wa++uormjVrxqpVqzjooIN44IEH8pbp379/ieVcuXIl/fv357rrrsubNnDgwLz/I8NVmzdvXmjo6nXXXUd2djYLFizIm9a7d28OOeQQpk6dmq8cO3bsYOnSpbRv3x6Arl270rRpU/785z9z2223AfCb3/yG+vXrs2rVKjIyMgA4+eST856jY8eOZGdnM3PmTM4999y86TNnzqR///60adOmxLqKiIiISMWlI3VVgL8RD3D++efz/fffFxrqF6uVK1dSrVo1zj777EJ50fjoo4/YvHkzo0aNyuvQFbR06VKAfEfb/PeXLFmSb/qAAQPy3e/cuTMAn332GQDdu3dn586dDBs2jJdffjnQkNHu3bvz6quvMnbsWJYtW8b+/fsD1A7Wr1/Phg0bGDp0KDk5OXm3jIwMevTokVe3iPbt2+d16AAaNWpEo0aN8sq+d+9eli9fztChQ/M6dEW56qqrWLRoEevXrwfgnXfe4f3339dROhEREZFKTkfqShHLEbKKonHjxkXe//LLL0PN+frrr6lbty5paWkl5pfmm2++AaBFixbFLhMZ4ti0adN805s0aZJvfkS9evXy3a9RowYAP/30EwDZ2dk8//zzPPTQQwwZMiRv2v3335/viJ/fbbfdRnp6OnPmzOHuu+8mMzOTX/3qV0yZMoUGDRoUW/Zt27YBcOmll3LppZcWmn/wwQeXWPZI+SNl37lzJ7m5uSWuL4AhQ4bQpEkTZs6cyX333ccf//hHmjVrlu/oooiIiIhUPjpSVwVs3bq1yPvNmzcnPT0doNBRpkjHKhpNmzZl586dhU7GUTC/NJEOUUmdzkhHZ8uWLfmmR+4X1REqza9+9SuWLFnCzp07mT9/Pl9//TWnnnpq3kllCkpLS2PMmDH897//5euvv2batGn89a9/5eqrry4xp379+oD7nd8777xT6Pa3v/0tqnLXrVuXlJSUUjvpaWlpjBo1iqeeeopt27bx3HPPcemll5Kaqn07IiIiIpWZOnVVwJ///Od895977jkyMzPp3LkzrVq1Asg3FDMnJ4c33ngj6pwePXrwyy+/8Ne//rVQXjQOPfRQWrduzWOPPYa1tshlTjrppCKf+5lnngHcWSPLKjMzkzPOOIMrrriCr7/+OlAHt0mTJowaNYq+ffvmW5fVq1fnxx9/zLdshw4daN26NR9++CHdunUrdCvuyGBxMjIy6NmzJ3PmzCmUVdAVV1zBd999xznnnMO+ffu47LLLosoSERERkYpHu+irgEcffZTc3Fy6d+/O66+/zmOPPcbEiROpU6cO3bt3p23bttx8883k5uZSo0YNHnnkEfbt2xd1Tr9+/ejZsydXXHEFO3bsoH379sybNy/q3+4ZY3jggQc466yzOPnkk/n1r39Nw4YNWbduHdu2bWPSpEl06tSJCy64gIkTJ5KTk8Pxxx/PypUrufPOO7ngggvyfjMX1IQJE9i6dSu9e/emWbNmfPHFFzz44IMcddRRNGzYsMjHDB48mC5dutC1a1fq1q3L+++/z2uvvZbvN2odO3bklVde4dRTT6Vu3bo0a9aMZs2aMWPGDAYPHsz+/fs599xzadCgAVu3bmXFihUcfPDB3HjjjVGV/7777iM7O5sePXpw00030aJFCzZu3Mjq1at56KGH8pZr3rw5gwYNYv78+QwcOJCWLVtGlSMiIiIiFY+O1FUBCxYsYOHChQwaNIg5c+Ywbtw4xo8fD0BqaioLFiygZcuWjBw5kquvvpp+/foxcuTIMmW98MILDBgwgN/+9recd9555OTk8PDDD0f9PIMHD2bhwoWA++3ZoEGDmDVrVr7rxD311FOMGTOGJ554ggEDBvD4448zZswYZs+eHXXesccey6ZNm7jhhhvo168fY8aMITs7m1deeaXYx5x00km88cYbXHrppZx66qn84Q9/4JZbbuHee+/NW+bhhx+mVq1aDBw4kO7duzNr1izAnbhl6dKl/PDDD4waNYpTTjmFW265hS1bttCjR4+oy9+9e3eWL19Oy5YtGT16NAMGDGDKlClF/s7unHPOAdAJUkRERESShClueFsy6tatm3333XeLnb9u3ToOP/zwBJZIJPGGDh3K8uXL2bhxY7FnF00Efd5ERESkIjLGvGet7Vbe5YiGhl+KVBGrVq1i9erVzJs3j/vvv79cO3QiIiIiEh516iShrLX88ssvJS6jszHGR48ePcjMzGTEiBFcddVV5V0cEREREQmJWs+SULNnz+biiy8ucZmqNCQ4kbReRURERJKTOnWSUAMHDuSdd94p72KIiIiIiCQNdeokoerXr5938W0REREREYmdzpQgIiIiIiJSialTJyIiIiIiUompUyciIiIiIlKJqVMnIiIiIiJSialTJyIiIiIiUompUyciIiIiIlKJqVMnIiIiIiJSialTJxVer1696NWrV9791atXM3HiRL799tvyK1SIWrduzciRIwMvv2nTJiZOnMjGjRvjVygRERERqTR08XGp8B555JF891evXs2kSZMYNmwY9erVK6dShdGDGLQAACAASURBVGf+/PnUrl078PKbNm1i0qRJ9OzZk0MOOSSOJRMRERGRykCdOqnwOnbsWN5FiKujjz66vIsgIiIiIpWYhl9WAR988AFDhgyhfv361KxZkw4dOjB58mQArLVMmzaNDh06UL16dZo2bco111zD7t278z2HMYZx48YxdepUWrVqRUZGBqeffjrbtm1j27ZtnHvuudSpU4eWLVtyzz335HvsU089hTGGFStWcO6555KVlUXjxo3zyvDaa69x9NFHU6tWLbp37857772X7/H+4ZdPPfUUF198MQDt27fHGIMxhk2bNgVeH48++ihdu3alZs2a1K1bl+zsbFasWJE3/+uvv2b48OE0aNCAGjVqcOSRRzJnzpwi67Rq1SqGDh1K7dq1adasGddeey0//fRT3nI5OTmMHz+etm3bkp6eToMGDejZsyfLli3LW6bg8MstW7YwYsQImjVrRo0aNWjatClnnHEG27ZtY/HixfTu3RuAfv365dV/8eLFeY+fNWsWXbp0ycu79NJLCw1VjbyeDz74IG3atCErK4vs7Gw+/PDDQutr/vz5nHDCCWRmZlK7dm2OOeYYXnrpJQA6d+7MkCFDCj1m8eLFGGN47bXXArwiIiIiIhILHakrzd9vhS3/Ld8yNOkMp/2+TA99++236dWrF+3atWPatGm0aNGC9evX85///AeAsWPHMnnyZK6++moGDhzI2rVrGT9+PB988AFLliwhJeVAv//pp5+mU6dOPPLII2zdupXrr7+e4cOHs2fPHk477TQuv/xynn/+eW699VY6d+7MgAED8pVlxIgRDB8+PG+52267je+++45XX32VsWPHkpmZyS233MKZZ57Jhg0bqF69eqH6nH766YwbN47f/e53PP/887Ro0QKApk2bBlofv/nNb5g6dSqXXnopkyZNIiUlhVWrVvHZZ59x/PHH88MPP5Cdnc3OnTu5++67admyJXPmzOGiiy5i7969XH755fme76KLLuKCCy7ghRdeYOXKlUycOJG6desyadIkAO655x6mTZvGXXfdxVFHHcXu3bt59913S/w94EUXXcTmzZuZMmUKLVu2ZOvWrfzjH/9g7969dO3alRkzZnD11Vfz4IMP0r17d+DA0cxbb72VqVOncu211zJlyhS+/PJLxo0bx5o1a1ixYgXVqlXLy5kzZw4dOnRg+vTp7N+/n5tvvpnBgwfzv//9j9RUt2l46KGHuPbaaznzzDOZPXs2mZmZ/Pvf/87rRF955ZVcd911fPXVVzRr1izvuWfOnEmbNm045ZRTAr0uIiIiIhIDa22Vuf3f//2fLcnatWsLT3x1jLVPDCjf26tjSix3SU488UTbokUL+8MPPxSa980339jq1avbESNG5Jv+9NNPW8AuWLAgbxpg27dvb3/++ee8aTfccIMF7J133pk37eeff7YNGza0I0eOzJv25JNPWsBOmjSp0HKpqal248aNedMXLFhgAbt48eK8adnZ2TY7O7vQ861fvz6qdbF+/XqbkpJib7jhhmKXeeihhyxgFy1alG96nz59bMOGDW1OTk6+MkyYMCHfcqeffrpt3759vvtDhgwpsVytWrXK9xrUqlXLTp8+vdjlFy1aZAG7cOHCfNM//fRTm5KSkm89W2vtsmXLLGDnz5+fNw2w7dq1s/v378+b9vzzz1vALl++3Fpr7a5du2xmZmaJ5d+9e7fNysqyd9xxR960bdu22erVq9vJkyeXWO8iP28iIiIi5Qx411aAvks0Nx2pK00Zj5BVBHv37mX58uXcfPPNZGRkFJq/atUq9u/fz7Bhw/JNP//887n44otZsmQJgwYNypver1+/vCM4AIcddhhAvqMxqamptGvXjs8//7xQ3mmnnVZouV27dtGmTZtCz1nU42P15ptvkpubW+hom9/SpUtp3rx5vrNtAgwbNoyLL76YtWvX0rlz57zpp59+er7lOnfuzJtvvpl3v3v37kyePJmxY8dy2mmnccwxxxR5BNKve/fuTJkyBWstJ598Mp06dcIYU2r9Fi5cSG5uLkOHDiUnJydv+rHHHktWVhZLly7lzDPPzJver18/0tLS8pUdyDtquWLFCr7//vsS11dWVhbDhg3jscceY+zYsaSkpPDUU09hreWSSy4ptcwiIiIiEjv9pi6J7dy5k9zc3LwhigVFhgAWHLqYmppK/fr1Cw0RrFu3br77kc5JUdP9vysr6fHFPWdRj4/VN998A1Ds+gC3TooaytmkSZO8+X4Fz75Zo0YN9u3bl3f/tttuY9KkSbz00kuceOKJ1K9fn4svvpgdO3YUW4Z58+YxaNAg7r33Xo488kiaN2/OHXfcQW5ubon127ZtGwDt2rUjLS0t323Pnj159S+p7HBg3QdZXwBXXXUVn332Ga+++irWWmbNmsWQIUNo1KhRiY8TERERkXDoSF0Sq1u3LikpKXz55ZdFzo806rds2cIRRxyRNz0nJ4dvvvkmKS4X4NegQQMAvvzySzp06FDkMvXq1eOjjz4qNH3Lli1586ORlpbGmDFjGDNmDFu2bOHll1/mxhtvZO/evcybN6/IxzRq1IgZM2YwY8YMPvroI2bPns3tt99Ow4YNufLKK4vNql+/PgBvvPFGoc6yf35Q/vXVqVOnYpfr1KkTJ554IjNnziQ9PZ1PPvmEmTNnRpUlIiIiImWnI3VJLCMjg549ezJnzhx+/PHHQvOPO+44qlevznPPPZdv+rx588jJySk0BLGiiBxRKqpOJenbty8pKSnMmjWr2GWys7P54osvWL58eb7pc+fOpVGjRjFdXqFJkyaMGjWKvn37smbNmkCP6dChA3fffTd169bNe0xx9e/Xrx8pKSl89tlndOvWrdDNP8w1iOOPP57MzMwS11fEVVddxd///ncmTpzIoYceysknnxxVloiIiIiUnY7UJbn77ruP7OxsevTowU033USLFi3YuHEjq1ev5qGHHuKmm25i8uTJ1KpViwEDBrBu3TrGjRtHz549C/1erKKIdKxmzJjBiBEjSEtL48gjjyz1t2pt27blhhtu4P7772fPnj0MGjSIatWq8fbbb3PYYYdx3nnnMXLkSKZPn85ZZ53FXXfdRYsWLXjmmWdYuHAhM2fOzHf2yCAGDx5Mly5d6Nq1K3Xr1uX999/ntdde44orrihy+V27dtG3b1+GDh3KYYcdRlpaGgsWLGDnzp30798fgEMPPZTU1FSeeOIJ6tWrR40aNejQoQNt27ZlzJgxXHPNNXz00UdkZ2eTnp7O559/zsKFCxk1alTe5RCCyMrKYvLkyYwePZqzzz6boUOHkpWVxerVq0lPT2f06NF5y5599tlcf/31LF++nKlTp0a1jkREREQkNurUJbnu3buzfPlyJkyYwOjRo9m3bx+tWrXKu9bbXXfdRcOGDfnjH//II488Qv369Rk+fDiTJ0/OdzmDiqRLly5MnDiRWbNm8eijj5Kbm8unn35K69atS33sfffdR7t27XjkkUeYPXs2tWrV4sgjj8zrMNWqVYslS5Zwyy23cOutt7Jnzx46dOjA008/XeiEMkGcdNJJPP/888yYMYO9e/dy8MEHc8sttzB27Ngil09PT6dr1648+uijbN68mZSUFDp06MAzzzzD4MGDATeM8uGHH+aee+4hOzubX375hUWLFtGrVy/uvvtuDj/88Lzhm8YYWrZsSZ8+fWjfvn3U5b/mmmto0qQJU6ZMYejQoaSlpXH44Yczfvz4fMulpaUxePBg/vSnPzFixIioc0RERESk7Iw7a2fV0K1bN/vuu+8WO3/dunUcfvjhCSyRSHLIycmhXbt2nHjiiTz99NOBHqPPm4iIiFRExpj3rLXdyrsc0dCROhEps927d7NmzRrmzp3L559/zk033VTeRRIRERGpctSpk6SQm5tb4in/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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import pandas as pd\n", + "overal_consistency = pd.DataFrame(daily_flakiness).groupby(\"start_date\",as_index=False).agg(\n", + "{ 'build_consistency':'mean',\n", + " 'commit_consistency' :'mean'\n", + "})\n", + "import numpy as np\n", + "import matplotlib\n", + "import matplotlib.pyplot as plt\n", + "from datetime import datetime\n", + "matplotlib.rc('font', size=16)\n", + "ax1=overal_consistency.build_consistency.plot(xticks=overal_consistency.index,figsize=(14,8), rot=45)\n", + "ax2=overal_consistency.commit_consistency.plot(xticks=overal_consistency.index,figsize=(14,8), rot=45)\n", + "\n", + "plt.title('Daily build and commit consistency')\n", + "plt.xlabel('time')\n", + "plt.ylabel('percentage of consistency')\n", + "ax1.set_xticklabels(overal_consistency['start_date'])\n", + "plt.legend()\n", + "plt.ylim([0,1])\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Flakiness per job" + ] + }, + { + "cell_type": "code", + "execution_count": 80, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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nUrv3r256KKLKtuOPfbYyr/nzp3LyJEjGTZsGFdeeWVl+9577023bt2YMGEC/fv3Z/Lkyfzxj39k7NixnHzyyQD06dOHo48+mtdffz3jf5niM1xJkqSS0nlM56KNPWPgjKKNLa1x0kknrfX75JNP5q677mLmzJl069aN8ePHc+ONNzJr1iwWL15c2W/WrFmVf3ft2pWRI0eSUuLwww/ngAMOWOtlul27dmXEiBFcfvnlHH300Xzxi1+kSZMmlccnT57M6tWrOfXUU1m5cmVl+5e+9CW23357nnnmGfr378/UqVPZZpttOPHEE9epeeLEiZn9m2wpXHMlSZIklZBdd921xt9vvPEGEyZM4Otf/zqdOnXiV7/6FX/5y194/vnnKS8vZ/ny5ZXnjBs3jn79+nHDDTfwX//1X7Rt25arrrqqcu3WZZddxvDhw3nsscf4yle+ws4778ygQYN47733ACrXZu21116UlZWt9fnwww95//33AXjrrbdo1aoVZWVl672HhsKZK0mSJKmEvPPOO3To0GGt3wBt27bl9ttvZ6+99mL06NGVx1esWLHOJhOtW7fm1ltv5dZbb2XWrFmMGTOGYcOGUV5ezne/+13Kysq45JJLuOSSS3j77bf5zW9+w/e//32WLl3KuHHj2HnnnQH4/e9/T6tWrdapcc3xNm3asGjRIlasWLFWwFpTc0PjzJUkSZJUQsaPH7/W7/vvv58WLVrQuXNnli5dSuPGa8+f3HvvvaxatarW6+2zzz5ce+21tGrVipkzZ65zfLfdduOss86iV69elcePPPJIGjVqxPz58+nSpcs6nz333BOAQw45hFWrVvHQQw+tU3ND5MyVJEmSVELuvPNOVq9eTdeuXZk0aRJ33XUXFRUV7LDDDhx11FH8+te/ZvDgwRxzzDFMnz6dm2++mR133LHy/MWLF9OrVy9OPfVU9t13X8rKynj00UdZtGgRvXv3BuC4447jwAMP5POf/zytWrXib3/7GxMnTuScc84BoGPHjlxyySWcf/75zJo1i+7du9OsWTNee+01Jk+ezFlnnUXPnj058sgj6datG+eccw7vvfde5W6BNYW4hsBwJUmSpK3G3Ov6FruEzfboo49ywQUXcPXVV7PDDjtwxRVXMHToUCC3k+Brr73G3XffzahRo+jatSsTJkzg+OOPrzy/WbNmfP7zn+fOO+9k3rx5NGrUiH322Ydf/vKXHHfccQAcdthhPPDAA9x6660sXbqUdu3a8cMf/pDLL7+88jrXXnstnTp1qny8MCLYY489OOKII/jc5z5X2e/hhx/mwgsv5NJLL2WbbbahX79+3HLLLfTv37+e/sXqT6SUil1DUXXp0iVNnz692GVIkqQCuVugCvHyyy/TqVOnYpeRqYqKCoYPH86KFSvWefRPm2dD/71ExAsppS4buo5rriRJkiQpA4YrSZIkScqA4UqSJEkqARUVFaSUfCRwC2a4kiRJkqQMGK4kSZIkKQOGK0mSJEnKgOFKkiRJkjJguJIkSZKkDBiuJEmSJCkDhitJkiRJyoCb5EuSJGnrUbFDkcdfvMmn3n333YwYMYJ58+bRvHlzPvjgg4LOiwiGDRtGRUVFroSKCoYPH05KaZNrqWr06NEMGjSIOXPm0L59+0yuWaoMV5IkSdIW7s033+Tss8/m1FNP5Z577qFZs2YFnzt16lQ+85nP1GF1WsNwJUmSJG3hZs+ezapVqxg4cCDdunXbqHMPPvjgOqpK1bnmSpIkSdqCnX766fTo0QOAI444gojg9NNP5/777+fwww+nvLycFi1a8N///d+MGTNmnfMjovKRwNqsXLmSESNGsO+++9K0aVN23313Lr74YpYvX75Wv1dffZW+ffvSvHlzysvLueiii/jkk0+yutWS58yVJEmStAUbOnQoX/jCF7jwwgu59dZb+fznP095eTnjxo1jwIABDBkyhEaNGvHMM89w1llnsWzZMr7zne9s1Bjf/OY3mTBhApdccglf/vKXefnllxk6dChz587loYceAuDTTz/lyCOPZNmyZdx66620bt2aUaNG8fDDD9fFbZckw5UkSZK0BevYsSOdOnUCYL/99qt8zO+yyy6r7LN69Wp69OjBW2+9xe23375R4erZZ59l3LhxjBkzhm9961sA9OrVi5122olvfvOb/P3vf+eggw5izJgxvPrqq0ydOrWyhqOPPprOnTtndaslz8cCJUmSpBI0e/ZsvvGNb9C2bVvKysooKyvjrrvuYtasWRt1nYkTJ9KkSRMGDBjAypUrKz+9e/cG4JlnngFyG2Pssccea63hatSoESeddFJ2N1XinLmSJEmSSsxHH33EkUceSfPmzbnuuuvo2LEjTZo04fbbb+fuu+/eqGu9++67fPrpp2y33XY1Hn///fcBeOutt9h1113XOV5T29bKcCVJkiSVmKlTpzJv3jyeffbZtXYPXLly5UZfa+edd6ZZs2Y8++yzNR7ffffdAWjTpg0vvfTSOsffeeedjR6zofKxQEmSJKnELF26FICysrLKtkWLFvHoo49u9LWOOuooli9fzuLFi+nSpcs6nzXh6pBDDuG1115j2rRpleeuXr2a8ePHb+bdNBxFD1cRMTEiUkT8qFp7q4i4KyLei4iPI+KJiFhntVxENIuIkRHxVkQsi4ipEXFY/d2BJEmSVL++/OUv07JlS8477zwef/xxxo8fT/fu3dlll102+lo9evTgG9/4BgMGDODqq69m0qRJTJ48mTvvvJPjjz+ef/3rXwAMHDiQDh06cMIJJzB69Gh++9vf0r9/f5YsWZL17ZWsoj4WGBHfAA6soT2ACUB74AJgEXAp8FREHJRSer1K958DfYEfAK8C5wGTIuKQlNLf6/YOJEmSVFIqFhe7gkyUl5fzyCOPcPHFFzNgwAB23313LrroIhYuXMjw4cM3+nr33XcfN998M3fffTfXXHMNTZs2pX379vTp06dyTVWTJk2YPHky559/Pueeey7bbbcdp5xyCn379t3ord8bqkgpFWfgiFbAy8Bg4FfANSmlK/LHjgN+DRyeUnoq37YDMAe4L6V0Yb7tQODvwBkppXvybY2Bl4BZKaV+G6qjS5cuafr06VnfniRJqiOdxxRv2+cZA2cUbWxtnJdffrly+3JpQzb030tEvJBS6rKh6xTzscDrgZkppbE1HOsHvLkmWAGklBaTm806rlq/FcC4Kv1WAvcDfSKiaV0ULkmSJEnVFSVcRUQ34FvkHuGryf7AzBraXwLaRUSLKv3mpJSW1tCvCbBXBuVKkiRJ0gbVe7iKiCbAKOB/U0q1veFsJ3LrrKpbmP9uVWC/nTa1TkmSJEnaGMWYufohsC1wTRHGBiAizo6I6RExfcGCBcUqQ5IkSVIDUq/hKiLaAZcDQ4GmEbFjROyYP7zm9zbkZqNa1XCJNTNRi6p8r6/fwhqOkVK6I6XUJaXUpby8fFNuRZIkSZLWUt8zVx2AZsB95ILRmg/A/+T/7kxuzdT+NZy/HzA/pfRR/vdLwJ4R0byGfp8C/860ekmSJEmqRX2Hq78DPWv4QC5w9SQXiB4D2kZE9zUnRkRL4Nj8sTUmAGXA16r0awx8Hfh9SumTOrsTSZIkSaqiXl8inFL6AHi6envuncHMSyk9nf/9GDAVuC8ifsB/XiIcwA1Vrve3iBgH/CQiysi9B+u7wJ7AqXV5L5IkSZJUVTHfc1WrlNJq4BhgMnAb8AiwCuiZUnqtWvdBwD3Aj4DHgT2Ao1JKf62/iiVJkiRt7ep15qo2KaWooW0hcEb+s75zlwHfz38kSZIkqSi2iHAlSZIk1YfOYzoXdfwZA2ds8rl33303I0aMYN68eTRv3pwdd9yRHj16MHr06I26TkVFBcOHD2fFihU0bmwcyNIW+VigJEmSpP948803Ofvss/nyl7/Mk08+yRNPPFHsklQDo6okSZK0hZs9ezarVq1i4MCBdOvWrdjlbJZPPvmEpk2bFruMOuHMlSRJkrQFO/300+nRowcARxxxBBHB6aefvk6/BQsWcM4557D33nvTvHlz9thjD0455RTeeOONDY4xceJEWrRowfnnn88nn3xCeXk5gwcPXqff6NGjiQheeeWVgmqvqKggIpg5cyZ9+vShRYsWnHTSSQC0b9++xvuICCoqKta5xuzZs+nbty8tWrTgs5/9LFdddRWrV6+u7PfRRx9xwQUX0K5dO5o2bUrr1q3p1atXwbVmwXAlSZIkbcGGDh3Kz372MwBuvfVWpk6dytChQ9fpt3DhQpo1a8aIESOYOHEiI0eOZPbs2Rx66KEsX7681uv/4he/oF+/fgwZMoRbbrmFpk2bMmjQIH7xi1+sc96oUaPo3r07++6770bdw3HHHUf37t157LHHagxthTj++OM5/PDD+fWvf03//v0ZNmwYY8aMqTw+ePBgxo8fz7Bhw5g8eTKjRo3ioIMO4oMPPtik8TaFjwVKkiRJW7COHTvSqVMnAPbbbz8OPvjgGvvts88+/PSnP638vWrVKg499FDatWvH7373O44//vh1zrnhhhu4/PLLuf322znrrLMq27/zne9w44038sADD3DaaacB8I9//INp06YxduzYjb6HCy+8kIsuumijz6vq4osvZtCgQQD06tWLJ598krFjx1a2TZ06lVNPPZUzzzyz8pya7rkuOXMlSZIkNRC33347Bx54IC1atKBx48a0a9cOgFmzZq3Td/DgwQwbNowHH3xwrWAF0KFDB/r06cOoUaMq20aNGkV5eTknnHDCRteVRcjp27fvWr8POOAA5s+f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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import pandas as pd\n", + "import matplotlib\n", + "import matplotlib.pyplot as plt\n", + "\n", + "job_flakiness=pd.DataFrame(daily_flakiness).groupby(\"job\",as_index=False).agg(\n", + "{ 'passed':'sum',\n", + " 'failed' :'sum',\n", + " 'flaky_runs' : 'sum'\n", + "})\n", + "matplotlib.rc('font', size=16)\n", + "ax=job_flakiness[['passed','failed','flaky_runs']].plot(kind='bar', stacked=True, xticks=job_flakiness.index, figsize=(14,8), rot=90)\n", + "ax.set_xticklabels(job_flakiness['job'])\n", + "plt.title('job flakines')\n", + "plt.xlabel('job')\n", + "plt.ylabel('number of runs')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Overal failure rate per test type\n", + "\n", + "Below we computer failure rate per junit tests as well as workflow tests.\n", + "Kettle stores Junit mtadata in the column \"test\".\n", + "Workflow tests results are stored in the column \"metadata\" whcih is a map. if key ends with \"-phase\", the key contains workflow test name and the value indicates whether it is succeeded or failed. \n", + "\n", + "* Caveat: For kubeflow-presubmit jobs, the test columns sometimes have the information of workflow tests which looks like a bug. For the folllowing results, such data are filtered out. \n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Overal failure rate per Junit tests" + ] + }, + { + "cell_type": "code", + "execution_count": 200, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
testnamerunsfailuresfilurepercentage
0deploy-kubeflow-deploy_model-inceptionGpu11100.00
1deploy-kubeflow-deploy_model-inceptionCpu11100.00
2deploy-kubeflow-deploy_model-gpu11100.00
3github.com/kubeflow/kubeflow/bootstrap/v2/pkg/...11100.00
4deploy-kubeflow-deploy_sparkjob-spark-job11872.73
5deploy-kubeflow-deploy_pytorchjob-inception-cpu3266.67
6test_katib7457.14
7deploy-kubeflow-deploy_pytorchjob-inception-gpu2150.00
8test-jsonnet-format4125.00
9deploy_model-mnist-gpu17423.53
10kfctl-beta-deploy_argo-test-argo-deploy23417.39
11simple-tfjob6379314.60
12test_build_kfctl_go78010513.46
13kfctl-deploy_argo-test-argo-deploy2803612.86
14deploy-kubeflow-deploy_model1802212.22
15test_jsonnet_formatting322434710.76
16deploy-kubeflow-setup_tf_serving1691710.06
17test_kf_is_ready518499.46
18simple-tfjob-gke14711167.89
19e2e-minikube-deploy_pytorchjob-pytorch-job8766.90
20deploy-kubeflow-setup675456.67
21deploy-kubeflow-deploy_model-inception-gpu1415755.30
22simple-tfjob-minikube1461724.93
23test-jsonnet721334.58
24test_jsonnet51272274.43
25test_jupyter878364.10
26tf-serving-image318123.77
27deploy-kubeflow-deploy_model-mnist-gpu1139393.42
28tfserving-deploy_model-mnist-gpu407133.19
29tf-serving-image-inception-gpu1334423.15
...............
46test_tf_job_simple2115150.71
47deploy-kubeflow-deploy_pytorchjob-pytorch-job2915170.58
48kfctl-deploy_pytorchjob-pytorch-job72510.14
49deploy-kubeflow-get_gke_credentials45600.00
50github.com/kubeflow/kubeflow/bootstrap/cmd/boo...5400.00
51teardown12100.00
52tfserving-mnist-gpu39400.00
53github.com/kubeflow/kubeflow/bootstrap/cmd/boo...5400.00
54github.com/kubeflow/kubeflow/bootstrap/cmd/boo...5400.00
55github.com/kubeflow/kubeflow/bootstrap/cmd/boo...5400.00
56e2e-minikube-deploy_minikube9800.00
57test_kfctl_delete40500.00
58github.com/kubeflow/kubeflow/bootstrap/pkg/uti...5400.00
59deploy_argo-test-argo-deploy100.00
60kfctl-beta-test_katib-test-katib4400.00
61deploy_pytorchjob-pytorch-job100.00
62github.com/kubeflow/kubeflow/bootstrap/cmd/boo...5400.00
63kfctl_go_test200.00
64deploy-kubeflow-teardown_minikube194600.00
65deploy-kubeflow-deploy_model-cpu100.00
66deploy-kubeflow-teardown337200.00
67deploy-kubeflow10400.00
68tfserving-teardown40900.00
69test_katib-test-katib100.00
70github.com/kubeflow/kubeflow/bootstrap/cmd/boo...5400.00
71github.com/kubeflow/kubeflow/bootstrap/cmd/boo...5400.00
72e2e-minikube-teardown_minikube9800.00
73tfserving-mnist-cpu39900.00
74deploy_model-mnist-cpu1700.00
75test_build100.00
\n", + "

76 rows × 4 columns

\n", + "
" + ], + "text/plain": [ + " testname runs failures \\\n", + "0 deploy-kubeflow-deploy_model-inceptionGpu 1 1 \n", + "1 deploy-kubeflow-deploy_model-inceptionCpu 1 1 \n", + "2 deploy-kubeflow-deploy_model-gpu 1 1 \n", + "3 github.com/kubeflow/kubeflow/bootstrap/v2/pkg/... 1 1 \n", + "4 deploy-kubeflow-deploy_sparkjob-spark-job 11 8 \n", + "5 deploy-kubeflow-deploy_pytorchjob-inception-cpu 3 2 \n", + "6 test_katib 7 4 \n", + "7 deploy-kubeflow-deploy_pytorchjob-inception-gpu 2 1 \n", + "8 test-jsonnet-format 4 1 \n", + "9 deploy_model-mnist-gpu 17 4 \n", + "10 kfctl-beta-deploy_argo-test-argo-deploy 23 4 \n", + "11 simple-tfjob 637 93 \n", + "12 test_build_kfctl_go 780 105 \n", + "13 kfctl-deploy_argo-test-argo-deploy 280 36 \n", + "14 deploy-kubeflow-deploy_model 180 22 \n", + "15 test_jsonnet_formatting 3224 347 \n", + "16 deploy-kubeflow-setup_tf_serving 169 17 \n", + "17 test_kf_is_ready 518 49 \n", + "18 simple-tfjob-gke 1471 116 \n", + "19 e2e-minikube-deploy_pytorchjob-pytorch-job 87 6 \n", + "20 deploy-kubeflow-setup 675 45 \n", + "21 deploy-kubeflow-deploy_model-inception-gpu 1415 75 \n", + "22 simple-tfjob-minikube 1461 72 \n", + "23 test-jsonnet 721 33 \n", + "24 test_jsonnet 5127 227 \n", + "25 test_jupyter 878 36 \n", + "26 tf-serving-image 318 12 \n", + "27 deploy-kubeflow-deploy_model-mnist-gpu 1139 39 \n", + "28 tfserving-deploy_model-mnist-gpu 407 13 \n", + "29 tf-serving-image-inception-gpu 1334 42 \n", + ".. ... ... ... \n", + "46 test_tf_job_simple 2115 15 \n", + "47 deploy-kubeflow-deploy_pytorchjob-pytorch-job 2915 17 \n", + "48 kfctl-deploy_pytorchjob-pytorch-job 725 1 \n", + "49 deploy-kubeflow-get_gke_credentials 456 0 \n", + "50 github.com/kubeflow/kubeflow/bootstrap/cmd/boo... 54 0 \n", + "51 teardown 121 0 \n", + "52 tfserving-mnist-gpu 394 0 \n", + "53 github.com/kubeflow/kubeflow/bootstrap/cmd/boo... 54 0 \n", + "54 github.com/kubeflow/kubeflow/bootstrap/cmd/boo... 54 0 \n", + "55 github.com/kubeflow/kubeflow/bootstrap/cmd/boo... 54 0 \n", + "56 e2e-minikube-deploy_minikube 98 0 \n", + "57 test_kfctl_delete 405 0 \n", + "58 github.com/kubeflow/kubeflow/bootstrap/pkg/uti... 54 0 \n", + "59 deploy_argo-test-argo-deploy 1 0 \n", + "60 kfctl-beta-test_katib-test-katib 44 0 \n", + "61 deploy_pytorchjob-pytorch-job 1 0 \n", + "62 github.com/kubeflow/kubeflow/bootstrap/cmd/boo... 54 0 \n", + "63 kfctl_go_test 2 0 \n", + "64 deploy-kubeflow-teardown_minikube 1946 0 \n", + "65 deploy-kubeflow-deploy_model-cpu 1 0 \n", + "66 deploy-kubeflow-teardown 3372 0 \n", + "67 deploy-kubeflow 104 0 \n", + "68 tfserving-teardown 409 0 \n", + "69 test_katib-test-katib 1 0 \n", + "70 github.com/kubeflow/kubeflow/bootstrap/cmd/boo... 54 0 \n", + "71 github.com/kubeflow/kubeflow/bootstrap/cmd/boo... 54 0 \n", + "72 e2e-minikube-teardown_minikube 98 0 \n", + "73 tfserving-mnist-cpu 399 0 \n", + "74 deploy_model-mnist-cpu 17 0 \n", + "75 test_build 1 0 \n", + "\n", + " filurepercentage \n", + "0 100.00 \n", + "1 100.00 \n", + "2 100.00 \n", + "3 100.00 \n", + "4 72.73 \n", + "5 66.67 \n", + "6 57.14 \n", + "7 50.00 \n", + "8 25.00 \n", + "9 23.53 \n", + "10 17.39 \n", + "11 14.60 \n", + "12 13.46 \n", + "13 12.86 \n", + "14 12.22 \n", + "15 10.76 \n", + "16 10.06 \n", + "17 9.46 \n", + "18 7.89 \n", + "19 6.90 \n", + "20 6.67 \n", + "21 5.30 \n", + "22 4.93 \n", + "23 4.58 \n", + "24 4.43 \n", + "25 4.10 \n", + "26 3.77 \n", + "27 3.42 \n", + "28 3.19 \n", + "29 3.15 \n", + ".. ... \n", + "46 0.71 \n", + "47 0.58 \n", + "48 0.14 \n", + "49 0.00 \n", + "50 0.00 \n", + "51 0.00 \n", + "52 0.00 \n", + "53 0.00 \n", + "54 0.00 \n", + "55 0.00 \n", + "56 0.00 \n", + "57 0.00 \n", + "58 0.00 \n", + "59 0.00 \n", + "60 0.00 \n", + "61 0.00 \n", + "62 0.00 \n", + "63 0.00 \n", + "64 0.00 \n", + "65 0.00 \n", + "66 0.00 \n", + "67 0.00 \n", + "68 0.00 \n", + "69 0.00 \n", + "70 0.00 \n", + "71 0.00 \n", + "72 0.00 \n", + "73 0.00 \n", + "74 0.00 \n", + "75 0.00 \n", + "\n", + "[76 rows x 4 columns]" + ] + }, + "execution_count": 200, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "%%bigquery teststats\n", + "CREATE TEMP FUNCTION removeFirstChar(x STRING)\n", + "RETURNS STRING\n", + "LANGUAGE js AS \"\"\"\n", + " if (x.charAt(0) == '-') {\n", + " x=x.substr(1);\n", + " }\n", + " return x;\n", + "\"\"\";\n", + "SELECT testname,runs,failures,filurepercentage\n", + "FROM(\n", + "SELECT\n", + " removeFirstChar(t.name) testname,\n", + " SUM(CASE WHEN t.failed=TRUE THEN 1 ELSE 0 END) failures,\n", + " COUNT(*) runs,\n", + " ROUND(SUM(CASE WHEN t.failed=TRUE THEN 1 ELSE 0 END)/COUNT(*)*100, 2) filurepercentage\n", + "FROM\n", + " `k8s-gubernator.build.all`, UNNEST(test) as t\n", + "WHERE\n", + " job LIKE '%kubeflow-presubmit%'\n", + "GROUP BY\n", + " testname\n", + ") WHERE testname not LIKE '%kubeflow-presubmit%'\n", + "order by filurepercentage DESC\n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Overal failure rate per workflow phase tests" + ] + }, + { + "cell_type": "code", + "execution_count": 201, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
testnamefailuresrunsfilurepercentage
0kubeflow-presubmit-jupyter-web-app-release22100.00
1kubeflow-presubmit-deployapp333886.84
2kubeflow-presubmit-kfctl-go21840154.36
3kubeflow-presubmit-kfctl-go-basic-auth10823246.55
4kubeflow-presubmit-kfctl-go-iap-istio419145.05
5kubeflow-presubmit-kfctl-beta12432937.69
6kubeflow-presubmit-kubeflow-gke-deploy13137035.41
7kubeflow-presubmit-tf-notebook-release16245835.37
8kubeflow-presubmit-kfctl1096312935.03
9kubeflow-presubmit-kfctl-go-iap12838133.60
10kubeflow-presubmit-kubeflow-e2e-minikube700237629.46
11kubeflow-presubmit-kubeflow-e2e-gke546191128.57
12kubeflow-presubmit-tf-serving-image482220221.89
13kubeflow-presubmit-dashboard-release7240018.00
14kubeflow-presubmit-jupyterui-release158617.44
15kubeflow-presubmit-kubeflow-e2e2318312.57
16kubeflow-presubmit-tf-serving133129910.24
17kubeflow-presubmit-unittests34041078.28
\n", + "
" + ], + "text/plain": [ + " testname failures runs \\\n", + "0 kubeflow-presubmit-jupyter-web-app-release 2 2 \n", + "1 kubeflow-presubmit-deployapp 33 38 \n", + "2 kubeflow-presubmit-kfctl-go 218 401 \n", + "3 kubeflow-presubmit-kfctl-go-basic-auth 108 232 \n", + "4 kubeflow-presubmit-kfctl-go-iap-istio 41 91 \n", + "5 kubeflow-presubmit-kfctl-beta 124 329 \n", + "6 kubeflow-presubmit-kubeflow-gke-deploy 131 370 \n", + "7 kubeflow-presubmit-tf-notebook-release 162 458 \n", + "8 kubeflow-presubmit-kfctl 1096 3129 \n", + "9 kubeflow-presubmit-kfctl-go-iap 128 381 \n", + "10 kubeflow-presubmit-kubeflow-e2e-minikube 700 2376 \n", + "11 kubeflow-presubmit-kubeflow-e2e-gke 546 1911 \n", + "12 kubeflow-presubmit-tf-serving-image 482 2202 \n", + "13 kubeflow-presubmit-dashboard-release 72 400 \n", + "14 kubeflow-presubmit-jupyterui-release 15 86 \n", + "15 kubeflow-presubmit-kubeflow-e2e 23 183 \n", + "16 kubeflow-presubmit-tf-serving 133 1299 \n", + "17 kubeflow-presubmit-unittests 340 4107 \n", + "\n", + " filurepercentage \n", + "0 100.00 \n", + "1 86.84 \n", + "2 54.36 \n", + "3 46.55 \n", + "4 45.05 \n", + "5 37.69 \n", + "6 35.41 \n", + "7 35.37 \n", + "8 35.03 \n", + "9 33.60 \n", + "10 29.46 \n", + "11 28.57 \n", + "12 21.89 \n", + "13 18.00 \n", + "14 17.44 \n", + "15 12.57 \n", + "16 10.24 \n", + "17 8.28 " + ] + }, + "execution_count": 201, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "%%bigquery teststats\n", + "CREATE TEMP FUNCTION getWorkflowTestName(x STRING)\n", + "RETURNS STRING\n", + "LANGUAGE js AS \"\"\"\n", + " var r=/\\\\d/;\n", + " var y=x.replace(\"-e2e\",\"-endtoend\");\n", + " var fd=r.exec(y);\n", + " y=y.substring(0, y.indexOf(fd) - 1);\n", + " y=y.replace(\"-endtoend\",\"-e2e\");\n", + " return y;\n", + "\"\"\";\n", + "Select \n", + " testname,\n", + " SUM(CASE WHEN mvalue =\"Succeeded\" THEN 0 ELSE 1 END) failures,\n", + " COUNT(*) runs,\n", + " ROUND(SUM(CASE WHEN mvalue =\"Succeeded\" THEN 0 ELSE 1 END)/COUNT(*)*100, 2) filurepercentage\n", + "From(\n", + " Select getWorkflowTestName(mkey) testname,mvalue\n", + " FROM(\n", + " SELECT m.key mkey, m.value mvalue\n", + " FROM\n", + " `k8s-gubernator.build.all`,UNNEST(metadata) as m\n", + " WHERE\n", + " job LIKE '%kubeflow-presubmit%' and ENDS_WITH(m.key, \"-phase\")\n", + " )\n", + ")\n", + "GROUP BY testname\n", + "ORDER BY filurepercentage DESC" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Flakiness per junit tests" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "following are list of daily flakiness metrics used for jubit tests\n", + "- testname: junit test name\n", + "- flakes: number of commits whcih has flakes\n", + "- runs: total number of runs\n", + "- failed: total number of times that test failed\n", + "- passed: total number of times that the test passed\n", + "- flake_failures: number of flake failures, i.e, test passed in the same commit\n", + "- actual_failures: number of actual failures (test nerver passed in the same commit)\n", + "- flake_rate: the ratio of flake_failures over runs\n", + "- failure_rate: the ratio of sum of flake_failures and actual_failures over runs \n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Flakiness per JUnit test\n", + "Here we first compute junit results along with kubeflow test job result per commit and filter out commits whcih has flakes. A commit is said to flake if some of runs pass and some fail. Here are the columns:\n", + "\n", + "- testname: junit test name\n", + "- job: kubeflow jib name\n", + "- num, pr number\n", + "- path, jerkins path which has all test artifacts\n", + "- commit, commit id (used for debugging)\n", + "- runs: total runs of the job\n", + "- job_passed, total number of times kubeflow job is passed\n", + "- job_failed, total number of times kubeflow job is failed\n", + "- test_passed, total number of times junit test is passed\n", + "- test_failed, total number of times junit test is failed \n", + "- test_elapsed_time: array of junit test duration times for all runs\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 91, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
testnamejobrunstest_failedtest_passedjob_passedjob_failednumpathcommittest_elapsed_time
0test_jupyterpr:kubeflow-presubmit312213054[gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3054/kubeflow-presubmit/1119350159717699584, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3054/kubeflow-presubmit/1119373185905594368, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3054/kubeflow-presubmit/1119365009265135616]9c30c55af3953949786b105dc528037187e5f33a[499.999101877, 144.438695431, 137.151001215]
1smoke-tfjob-gkepr:kubeflow-presubmit413223076[gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3076/kubeflow-presubmit/1120474461988982790, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3076/kubeflow-presubmit/1120450807234301952, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3076/kubeflow-presubmit/1120487425504710656, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3076/kubeflow-presubmit/1120526684731215872]6eb179fd242e89273251ba48d59c7543e6853194[155.927994013, 236.323633909, 342.449174881, 262.728005171]
2test_kf_is_readypr:kubeflow-presubmit211113084[gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3084/kubeflow-presubmit/1120775430350049280, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3084/kubeflow-presubmit/1120757562539511808]043c94a4436dbd2b8111d5e171b3bf144b6d8532[13.9820113182, 145.926799297]
3smoke-tfjob-gkepr:kubeflow-presubmit413223033[gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3033/kubeflow-presubmit/1119352046579879941, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3033/kubeflow-presubmit/1119330151297978369, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3033/kubeflow-presubmit/1119360729003069440, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3033/kubeflow-presubmit/1119304989001388032]ea5aefd3ece74b9db6888b74a364a2c1cf19fd8e[275.168391943, 244.398232937, 230.675370932, 289.99135685]
4test_kf_is_readypr:kubeflow-presubmit615243050[gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3050/kubeflow-presubmit/1119020108560207872, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3050/kubeflow-presubmit/1119020108560207872, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3050/kubeflow-presubmit/1118981355057713152, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3050/kubeflow-presubmit/1118981355057713152, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3050/kubeflow-presubmit/1119111461247913989, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3050/kubeflow-presubmit/1119111461247913989]6fdb981200859a9a57e3cf91e8eb2ec14fae4cda[4.24729561806, 14.1647980213, 4.01061105728, 125.965969324, 4.02977609634, 54.4593570232]
5test_jupyterpr:kubeflow-presubmit312123028[gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3028/kubeflow-presubmit/1119330151297978368, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3028/kubeflow-presubmit/1119305117774909440, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3028/kubeflow-presubmit/1119295048870006784]0468fa449ffd6d5198643f55a9e699ba6f2b4102[144.703732967, 170.251648426, 499.997436762]
6kfctl-deploy_argo-test-argo-deploypr:kubeflow-presubmit312212556[gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/2556/kubeflow-presubmit/1116048391722242048, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/2556/kubeflow-presubmit/1113869527126380547, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/2556/kubeflow-presubmit/1113869275094847488]ebfe07ab1eaf2163286961552528a063c9e1bf29[24.2773940563, 21.4013600349, 24.7913579941]
7smoke-tfjob-gkepr:kubeflow-presubmit312123028[gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3028/kubeflow-presubmit/1119330151297978368, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3028/kubeflow-presubmit/1119305117774909440, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3028/kubeflow-presubmit/1119295048870006784]0468fa449ffd6d5198643f55a9e699ba6f2b4102[275.064223051, 351.073024988, 419.975913048]
8test_kf_is_readypr:kubeflow-presubmit817443002[gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3002/kubeflow-presubmit/1119006898276798464, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3002/kubeflow-presubmit/1119006898276798464, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3002/kubeflow-presubmit/1119160790037827584, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3002/kubeflow-presubmit/1119160790037827584, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3002/kubeflow-presubmit/1119121530660327428, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3002/kubeflow-presubmit/1119121530660327428, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3002/kubeflow-presubmit/1119243454010888192, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3002/kubeflow-presubmit/1119243454010888192]d1468c15f40cc65932ca38d56b21617808e28bef[4.94188642502, 4.24612402916, 4.46007418633, 126.058175802, 4.78942751884, 84.9105548859, 4.0927464962, 95.1295106411]
9smoke-tfjob-gkepr:kubeflow-presubmit211113066[gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3066/kubeflow-presubmit/1120074453217185792, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3066/kubeflow-presubmit/1120052808737886208]e3097a17e9189d5a799e264260b5229e7b158342[328.292748928, 393.276281118]
10test_build_kfctl_gopr:kubeflow-presubmit615333069[gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3069/kubeflow-presubmit/1120195750576263168, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3069/kubeflow-presubmit/1120195750576263168, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3069/kubeflow-presubmit/1120195750576263168, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3069/kubeflow-presubmit/1120176121636196352, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3069/kubeflow-presubmit/1120176121636196352, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3069/kubeflow-presubmit/1120176121636196352]b3c8779e61a9327755125769f6a9afef53141382[1757.93426561, 1080.85015035, 1826.23394561, 1285.40969586, 1018.37596416, 1248.09989595]
11smoke-tfjob-gkepr:kubeflow-presubmit312123043[gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3043/kubeflow-presubmit/1118674873225318400, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3043/kubeflow-presubmit/1118908659284316160, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3043/kubeflow-presubmit/1118955182093242368]804f4192a048cca43a32ee342194b846cdd727fb[257.796480894, 235.972403049, 257.022068977]
12test_kf_is_readypr:kubeflow-presubmit413312923[gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/2923/kubeflow-presubmit/1113309205739081728, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/2923/kubeflow-presubmit/1113269693138866176, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/2923/kubeflow-presubmit/1113511763069898752, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/2923/kubeflow-presubmit/1113520318158213120]927cba0a02121f297a54b128baedb245d8597053[74.4074509144, 126.210915804, 4.38435387611, 4.21732807159]
\n", + "
" + ], + "text/plain": [ + " testname job runs \\\n", + "0 test_jupyter pr:kubeflow-presubmit 3 \n", + "1 smoke-tfjob-gke pr:kubeflow-presubmit 4 \n", + "2 test_kf_is_ready pr:kubeflow-presubmit 2 \n", + "3 smoke-tfjob-gke pr:kubeflow-presubmit 4 \n", + "4 test_kf_is_ready pr:kubeflow-presubmit 6 \n", + "5 test_jupyter pr:kubeflow-presubmit 3 \n", + "6 kfctl-deploy_argo-test-argo-deploy pr:kubeflow-presubmit 3 \n", + "7 smoke-tfjob-gke pr:kubeflow-presubmit 3 \n", + "8 test_kf_is_ready pr:kubeflow-presubmit 8 \n", + "9 smoke-tfjob-gke pr:kubeflow-presubmit 2 \n", + "10 test_build_kfctl_go pr:kubeflow-presubmit 6 \n", + "11 smoke-tfjob-gke pr:kubeflow-presubmit 3 \n", + "12 test_kf_is_ready pr:kubeflow-presubmit 4 \n", + "\n", + " test_failed test_passed job_passed job_failed num \\\n", + "0 1 2 2 1 3054 \n", + "1 1 3 2 2 3076 \n", + "2 1 1 1 1 3084 \n", + "3 1 3 2 2 3033 \n", + "4 1 5 2 4 3050 \n", + "5 1 2 1 2 3028 \n", + "6 1 2 2 1 2556 \n", + "7 1 2 1 2 3028 \n", + "8 1 7 4 4 3002 \n", + "9 1 1 1 1 3066 \n", + "10 1 5 3 3 3069 \n", + "11 1 2 1 2 3043 \n", + "12 1 3 3 1 2923 \n", + "\n", + " path \\\n", + "0 [gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3054/kubeflow-presubmit/1119350159717699584, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3054/kubeflow-presubmit/1119373185905594368, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3054/kubeflow-presubmit/1119365009265135616] \n", + "1 [gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3076/kubeflow-presubmit/1120474461988982790, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3076/kubeflow-presubmit/1120450807234301952, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3076/kubeflow-presubmit/1120487425504710656, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3076/kubeflow-presubmit/1120526684731215872] \n", + "2 [gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3084/kubeflow-presubmit/1120775430350049280, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3084/kubeflow-presubmit/1120757562539511808] \n", + "3 [gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3033/kubeflow-presubmit/1119352046579879941, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3033/kubeflow-presubmit/1119330151297978369, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3033/kubeflow-presubmit/1119360729003069440, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3033/kubeflow-presubmit/1119304989001388032] \n", + "4 [gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3050/kubeflow-presubmit/1119020108560207872, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3050/kubeflow-presubmit/1119020108560207872, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3050/kubeflow-presubmit/1118981355057713152, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3050/kubeflow-presubmit/1118981355057713152, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3050/kubeflow-presubmit/1119111461247913989, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3050/kubeflow-presubmit/1119111461247913989] \n", + "5 [gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3028/kubeflow-presubmit/1119330151297978368, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3028/kubeflow-presubmit/1119305117774909440, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3028/kubeflow-presubmit/1119295048870006784] \n", + "6 [gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/2556/kubeflow-presubmit/1116048391722242048, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/2556/kubeflow-presubmit/1113869527126380547, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/2556/kubeflow-presubmit/1113869275094847488] \n", + "7 [gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3028/kubeflow-presubmit/1119330151297978368, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3028/kubeflow-presubmit/1119305117774909440, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3028/kubeflow-presubmit/1119295048870006784] \n", + "8 [gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3002/kubeflow-presubmit/1119006898276798464, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3002/kubeflow-presubmit/1119006898276798464, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3002/kubeflow-presubmit/1119160790037827584, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3002/kubeflow-presubmit/1119160790037827584, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3002/kubeflow-presubmit/1119121530660327428, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3002/kubeflow-presubmit/1119121530660327428, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3002/kubeflow-presubmit/1119243454010888192, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3002/kubeflow-presubmit/1119243454010888192] \n", + "9 [gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3066/kubeflow-presubmit/1120074453217185792, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3066/kubeflow-presubmit/1120052808737886208] \n", + "10 [gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3069/kubeflow-presubmit/1120195750576263168, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3069/kubeflow-presubmit/1120195750576263168, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3069/kubeflow-presubmit/1120195750576263168, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3069/kubeflow-presubmit/1120176121636196352, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3069/kubeflow-presubmit/1120176121636196352, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3069/kubeflow-presubmit/1120176121636196352] \n", + "11 [gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3043/kubeflow-presubmit/1118674873225318400, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3043/kubeflow-presubmit/1118908659284316160, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3043/kubeflow-presubmit/1118955182093242368] \n", + "12 [gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/2923/kubeflow-presubmit/1113309205739081728, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/2923/kubeflow-presubmit/1113269693138866176, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/2923/kubeflow-presubmit/1113511763069898752, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/2923/kubeflow-presubmit/1113520318158213120] \n", + "\n", + " commit \\\n", + "0 9c30c55af3953949786b105dc528037187e5f33a \n", + "1 6eb179fd242e89273251ba48d59c7543e6853194 \n", + "2 043c94a4436dbd2b8111d5e171b3bf144b6d8532 \n", + "3 ea5aefd3ece74b9db6888b74a364a2c1cf19fd8e \n", + "4 6fdb981200859a9a57e3cf91e8eb2ec14fae4cda \n", + "5 0468fa449ffd6d5198643f55a9e699ba6f2b4102 \n", + "6 ebfe07ab1eaf2163286961552528a063c9e1bf29 \n", + "7 0468fa449ffd6d5198643f55a9e699ba6f2b4102 \n", + "8 d1468c15f40cc65932ca38d56b21617808e28bef \n", + "9 e3097a17e9189d5a799e264260b5229e7b158342 \n", + "10 b3c8779e61a9327755125769f6a9afef53141382 \n", + "11 804f4192a048cca43a32ee342194b846cdd727fb \n", + "12 927cba0a02121f297a54b128baedb245d8597053 \n", + "\n", + " test_elapsed_time \n", + "0 [499.999101877, 144.438695431, 137.151001215] \n", + "1 [155.927994013, 236.323633909, 342.449174881, 262.728005171] \n", + "2 [13.9820113182, 145.926799297] \n", + "3 [275.168391943, 244.398232937, 230.675370932, 289.99135685] \n", + "4 [4.24729561806, 14.1647980213, 4.01061105728, 125.965969324, 4.02977609634, 54.4593570232] \n", + "5 [144.703732967, 170.251648426, 499.997436762] \n", + "6 [24.2773940563, 21.4013600349, 24.7913579941] \n", + "7 [275.064223051, 351.073024988, 419.975913048] \n", + "8 [4.94188642502, 4.24612402916, 4.46007418633, 126.058175802, 4.78942751884, 84.9105548859, 4.0927464962, 95.1295106411] \n", + "9 [328.292748928, 393.276281118] \n", + "10 [1757.93426561, 1080.85015035, 1826.23394561, 1285.40969586, 1018.37596416, 1248.09989595] \n", + "11 [257.796480894, 235.972403049, 257.022068977] \n", + "12 [74.4074509144, 126.210915804, 4.38435387611, 4.21732807159] " + ] + }, + "execution_count": 91, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "%%bigquery testkfisready\n", + "CREATE TEMP FUNCTION removeFirstChar(x STRING)\n", + "RETURNS STRING\n", + "LANGUAGE js AS \"\"\"\n", + " if (x.charAt(0) == '-') {\n", + " x=x.substr(1);\n", + " }\n", + " return x;\n", + "\"\"\";\n", + "SELECT\n", + "testname,\n", + "job,\n", + "runs,\n", + "test_failed,\n", + "test_passed,\n", + "job_passed,\n", + "job_failed,\n", + "num,\n", + "path,\n", + "commit,\n", + "test_elapsed_time\n", + "FROM(\n", + "SELECT\n", + " testname,\n", + " count(*) runs,\n", + " sum(job_passed) job_passed,\n", + " count(*) - sum(job_passed) job_failed,\n", + " max(start_date) start_date,\n", + " sum(test_failed) test_failed,\n", + " sum(test_passed) test_passed,\n", + " num,\n", + " array_agg(path) path,\n", + " commit,\n", + " job,\n", + " array_agg(test_elapsed_time) test_elapsed_time\n", + " FROM(\n", + " SELECT /* collect stats per (commit, testname)*/ \n", + " t.name testname,\n", + " CASE WHEN t.failed=TRUE THEN 1 ELSE 0 END test_failed,\n", + " CASE WHEN t.failed=TRUE THEN 0 ELSE 1 END test_passed,\n", + " job_passed,\n", + " t.time test_elapsed_time,\n", + " num,\n", + " path path,\n", + " job,\n", + " start_date start_date, \n", + " regexp_extract(commit, r'[^,]+,\\d+:([a-f0-9]+)\"') commit /* extract the first commit id from the repo flag */ \n", + " FROM( /* collect kubeflow commit rows */ \n", + " SELECT\n", + " path,\n", + " m.value commit,\n", + " test,\n", + " job,\n", + " EXTRACT(DATE FROM started) start_date,\n", + " regexp_extract(path, r'/(\\d+)\\/') as num, /* pr number */\n", + " CASE WHEN result='SUCCESS' THEN 1 ELSE 0 END job_passed\n", + " FROM\n", + " `k8s-gubernator.build.all`, UNNEST(metadata) as m\n", + " WHERE\n", + " job LIKE '%kubeflow-presubmit%'\n", + " and started > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 700 HOUR)\n", + " and (m.key = \"repos\") and STRPOS(job,'kubeflow') > 0 and STRPOS(job,'pr:') > 0\n", + " ), UNNEST(test) as t\n", + " where t.name not LIKE '%kubeflow-presubmit%' \n", + " ) \n", + " GROUP BY testname,commit,num,job\n", + ") where job_passed>0 and job_failed>0 and test_failed>0\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
testnamerunstest_failurestest_passesjobpassedResultjobfailednumpathcommitjobttime
0smoke-tfjob-gke211113066[gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3066/kubeflow-presubmit/1120074453217185792, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3066/kubeflow-presubmit/1120052808737886208]e3097a17e9189d5a799e264260b5229e7b158342pr:kubeflow-presubmit[328.292748928, 393.276281118]
1test_build_kfctl_go615333069[gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3069/kubeflow-presubmit/1120195750576263168, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3069/kubeflow-presubmit/1120195750576263168, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3069/kubeflow-presubmit/1120195750576263168, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3069/kubeflow-presubmit/1120176121636196352, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3069/kubeflow-presubmit/1120176121636196352, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3069/kubeflow-presubmit/1120176121636196352]b3c8779e61a9327755125769f6a9afef53141382pr:kubeflow-presubmit[1757.93426561, 1080.85015035, 1826.23394561, 1285.40969586, 1018.37596416, 1248.09989595]
2smoke-tfjob-gke413223076[gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3076/kubeflow-presubmit/1120474461988982790, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3076/kubeflow-presubmit/1120450807234301952, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3076/kubeflow-presubmit/1120487425504710656, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3076/kubeflow-presubmit/1120526684731215872]6eb179fd242e89273251ba48d59c7543e6853194pr:kubeflow-presubmit[155.927994013, 236.323633909, 342.449174881, 262.728005171]
3test_kf_is_ready211113084[gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3084/kubeflow-presubmit/1120775430350049280, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3084/kubeflow-presubmit/1120757562539511808]043c94a4436dbd2b8111d5e171b3bf144b6d8532pr:kubeflow-presubmit[13.9820113182, 145.926799297]
\n", + "
" + ], + "text/plain": [ + " testname runs test_failures test_passes jobpassedResult \\\n", + "0 smoke-tfjob-gke 2 1 1 1 \n", + "1 test_build_kfctl_go 6 1 5 3 \n", + "2 smoke-tfjob-gke 4 1 3 2 \n", + "3 test_kf_is_ready 2 1 1 1 \n", + "\n", + " jobfailed num \\\n", + "0 1 3066 \n", + "1 3 3069 \n", + "2 2 3076 \n", + "3 1 3084 \n", + "\n", + " path \\\n", + "0 [gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3066/kubeflow-presubmit/1120074453217185792, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3066/kubeflow-presubmit/1120052808737886208] \n", + "1 [gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3069/kubeflow-presubmit/1120195750576263168, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3069/kubeflow-presubmit/1120195750576263168, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3069/kubeflow-presubmit/1120195750576263168, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3069/kubeflow-presubmit/1120176121636196352, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3069/kubeflow-presubmit/1120176121636196352, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3069/kubeflow-presubmit/1120176121636196352] \n", + "2 [gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3076/kubeflow-presubmit/1120474461988982790, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3076/kubeflow-presubmit/1120450807234301952, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3076/kubeflow-presubmit/1120487425504710656, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3076/kubeflow-presubmit/1120526684731215872] \n", + "3 [gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3084/kubeflow-presubmit/1120775430350049280, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3084/kubeflow-presubmit/1120757562539511808] \n", + "\n", + " commit job \\\n", + "0 e3097a17e9189d5a799e264260b5229e7b158342 pr:kubeflow-presubmit \n", + "1 b3c8779e61a9327755125769f6a9afef53141382 pr:kubeflow-presubmit \n", + "2 6eb179fd242e89273251ba48d59c7543e6853194 pr:kubeflow-presubmit \n", + "3 043c94a4436dbd2b8111d5e171b3bf144b6d8532 pr:kubeflow-presubmit \n", + "\n", + " ttime \n", + "0 [328.292748928, 393.276281118] \n", + "1 [1757.93426561, 1080.85015035, 1826.23394561, 1285.40969586, 1018.37596416, 1248.09989595] \n", + "2 [155.927994013, 236.323633909, 342.449174881, 262.728005171] \n", + "3 [13.9820113182, 145.926799297] " + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pandas as pd\n", + "pd.set_option('display.max_colwidth', -1)\n", + "pd.DataFrame(testkfisready)\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 82, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
testnamerunswf_passedwf_failedpassedfailedstart_datenumjobcommitpathwf_flakeflake
0kubeflow-presubmit-kfctl211112019-04-263107pr:kubeflow-presubmitd08d5dfbc33e14473fe23d1046bcab5f39b1661c[gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3107/kubeflow-presubmit/1121394824797229056, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3107/kubeflow-presubmit/1121643928618012672]11
1kubeflow-presubmit-kfctl-go-basic-auth211112019-04-233078pr:kubeflow-presubmitf710b2ed53da93c0b4979f0892c0f3eaa56571b7[gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3078/kubeflow-presubmit/1120464020181094400, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3078/kubeflow-presubmit/1120487297196756993]11
2kubeflow-presubmit-kfctl-go-iap-istio422222019-04-233076pr:kubeflow-presubmit6eb179fd242e89273251ba48d59c7543e6853194[gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3076/kubeflow-presubmit/1120474461988982790, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3076/kubeflow-presubmit/1120450807234301952, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3076/kubeflow-presubmit/1120487425504710656, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3076/kubeflow-presubmit/1120526684731215872]11
3kubeflow-presubmit-kfctl-go-iap-istio211112019-04-243070pr:kubeflow-presubmit7d9ae60a0e9dfdf0a7a90ee42f68d1f9ebabbe7a[gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3070/kubeflow-presubmit/1120872574964731904, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3070/kubeflow-presubmit/1120888931932442624]11
4kubeflow-presubmit-jupyterui-release211112019-04-263107pr:kubeflow-presubmitd08d5dfbc33e14473fe23d1046bcab5f39b1661c[gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3107/kubeflow-presubmit/1121394824797229056, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3107/kubeflow-presubmit/1121643928618012672]11
5kubeflow-presubmit-tf-notebook-release211112019-04-263107pr:kubeflow-presubmitd08d5dfbc33e14473fe23d1046bcab5f39b1661c[gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3107/kubeflow-presubmit/1121394824797229056, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3107/kubeflow-presubmit/1121643928618012672]11
6kubeflow-presubmit-tf-notebook-release321212019-04-263117pr:kubeflow-presubmitd4f03826496f95333f96287443c0e03592cf6d77[gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3117/kubeflow-presubmit/1121658781114044416, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3117/kubeflow-presubmit/1121848907471523840, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3117/kubeflow-presubmit/1121897968744534017]11
7kubeflow-presubmit-kfctl-go-basic-auth312122019-04-293124pr:kubeflow-presubmit5274cdf78d029867688257716bcb46342e7ef7ee[gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3124/kubeflow-presubmit/1121918100388712448, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3124/kubeflow-presubmit/1122855513919328262, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3124/kubeflow-presubmit/1122877286677221376]11
8kubeflow-presubmit-kfctl-beta321122019-04-293124pr:kubeflow-presubmit5274cdf78d029867688257716bcb46342e7ef7ee[gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3124/kubeflow-presubmit/1121918100388712448, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3124/kubeflow-presubmit/1122855513919328262, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3124/kubeflow-presubmit/1122877286677221376]11
9kubeflow-presubmit-unittests321122019-04-293124pr:kubeflow-presubmit5274cdf78d029867688257716bcb46342e7ef7ee[gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3124/kubeflow-presubmit/1121918100388712448, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3124/kubeflow-presubmit/1122855513919328262, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3124/kubeflow-presubmit/1122877286677221376]11
10kubeflow-presubmit-kfctl-go-iap211112019-04-233084pr:kubeflow-presubmit043c94a4436dbd2b8111d5e171b3bf144b6d8532[gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3084/kubeflow-presubmit/1120775430350049280, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3084/kubeflow-presubmit/1120757562539511808]11
11kubeflow-presubmit-kfctl-go-iap312122019-04-293124pr:kubeflow-presubmit5274cdf78d029867688257716bcb46342e7ef7ee[gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3124/kubeflow-presubmit/1121918100388712448, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3124/kubeflow-presubmit/1122855513919328262, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3124/kubeflow-presubmit/1122877286677221376]11
12kubeflow-presubmit-kfctl-go-iap-istio321122019-04-233083pr:kubeflow-presubmit2c9dfab8699d009cc0710c6de71c0b3ff9ec8772[gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3083/kubeflow-presubmit/1120487798894235650, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3083/kubeflow-presubmit/1120526554397413383, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3083/kubeflow-presubmit/1120735919805042688]11
13kubeflow-presubmit-kfctl-go-iap-istio321122019-04-233069pr:kubeflow-presubmitc08cd6b5256f6acd6404ebfddf16380f11ad33e6[gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3069/kubeflow-presubmit/1120464272699166720, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3069/kubeflow-presubmit/1120475214648446976, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3069/kubeflow-presubmit/1120492965039443968]11
14kubeflow-presubmit-kfctl-go-iap321122019-04-233069pr:kubeflow-presubmitc08cd6b5256f6acd6404ebfddf16380f11ad33e6[gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3069/kubeflow-presubmit/1120464272699166720, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3069/kubeflow-presubmit/1120475214648446976, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3069/kubeflow-presubmit/1120492965039443968]11
15kubeflow-presubmit-kfctl-go-iap431222019-04-233076pr:kubeflow-presubmit6eb179fd242e89273251ba48d59c7543e6853194[gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3076/kubeflow-presubmit/1120474461988982790, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3076/kubeflow-presubmit/1120450807234301952, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3076/kubeflow-presubmit/1120487425504710656, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3076/kubeflow-presubmit/1120526684731215872]11
16kubeflow-presubmit-dashboard-release321122019-04-293124pr:kubeflow-presubmit5274cdf78d029867688257716bcb46342e7ef7ee[gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3124/kubeflow-presubmit/1121918100388712448, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3124/kubeflow-presubmit/1122855513919328262, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3124/kubeflow-presubmit/1122877286677221376]11
17kubeflow-presubmit-kfctl-go-iap211112019-04-263107pr:kubeflow-presubmitd08d5dfbc33e14473fe23d1046bcab5f39b1661c[gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3107/kubeflow-presubmit/1121394824797229056, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3107/kubeflow-presubmit/1121643928618012672]11
18kubeflow-presubmit-kfctl321122019-04-293124pr:kubeflow-presubmit5274cdf78d029867688257716bcb46342e7ef7ee[gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3124/kubeflow-presubmit/1121918100388712448, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3124/kubeflow-presubmit/1122855513919328262, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3124/kubeflow-presubmit/1122877286677221376]11
19kubeflow-presubmit-jupyterui-release321122019-04-293124pr:kubeflow-presubmit5274cdf78d029867688257716bcb46342e7ef7ee[gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3124/kubeflow-presubmit/1121918100388712448, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3124/kubeflow-presubmit/1122855513919328262, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3124/kubeflow-presubmit/1122877286677221376]11
20kubeflow-presubmit-kfctl-go-iap-istio532322019-04-233077pr:kubeflow-presubmit1561f72f6d9e21b423825b4bd3b21f3d2fa1024b[gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3077/kubeflow-presubmit/1120464394585640970, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3077/kubeflow-presubmit/1120487297196756994, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3077/kubeflow-presubmit/1120455839899979776, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3077/kubeflow-presubmit/1120526554397413382, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3077/kubeflow-presubmit/1120536378287853568]11
21kubeflow-presubmit-dashboard-release211112019-04-263107pr:kubeflow-presubmitd08d5dfbc33e14473fe23d1046bcab5f39b1661c[gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3107/kubeflow-presubmit/1121394824797229056, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3107/kubeflow-presubmit/1121643928618012672]11
22kubeflow-presubmit-kfctl-go-iap312122019-04-233083pr:kubeflow-presubmit2c9dfab8699d009cc0710c6de71c0b3ff9ec8772[gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3083/kubeflow-presubmit/1120487798894235650, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3083/kubeflow-presubmit/1120526554397413383, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3083/kubeflow-presubmit/1120735919805042688]11
23kubeflow-presubmit-tf-notebook-release321122019-04-293124pr:kubeflow-presubmit5274cdf78d029867688257716bcb46342e7ef7ee[gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3124/kubeflow-presubmit/1121918100388712448, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3124/kubeflow-presubmit/1122855513919328262, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3124/kubeflow-presubmit/1122877286677221376]11
24kubeflow-presubmit-unittests211112019-04-263107pr:kubeflow-presubmitd08d5dfbc33e14473fe23d1046bcab5f39b1661c[gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3107/kubeflow-presubmit/1121394824797229056, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3107/kubeflow-presubmit/1121643928618012672]11
25kubeflow-presubmit-tf-serving321122019-04-293124pr:kubeflow-presubmit5274cdf78d029867688257716bcb46342e7ef7ee[gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3124/kubeflow-presubmit/1121918100388712448, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3124/kubeflow-presubmit/1122855513919328262, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3124/kubeflow-presubmit/1122877286677221376]11
26kubeflow-presubmit-kfctl-go-basic-auth211112019-04-263107pr:kubeflow-presubmitd08d5dfbc33e14473fe23d1046bcab5f39b1661c[gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3107/kubeflow-presubmit/1121394824797229056, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3107/kubeflow-presubmit/1121643928618012672]11
27kubeflow-presubmit-tf-serving211112019-04-263107pr:kubeflow-presubmitd08d5dfbc33e14473fe23d1046bcab5f39b1661c[gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3107/kubeflow-presubmit/1121394824797229056, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3107/kubeflow-presubmit/1121643928618012672]11
\n", + "
" + ], + "text/plain": [ + " testname runs wf_passed wf_failed \\\n", + "0 kubeflow-presubmit-kfctl 2 1 1 \n", + "1 kubeflow-presubmit-kfctl-go-basic-auth 2 1 1 \n", + "2 kubeflow-presubmit-kfctl-go-iap-istio 4 2 2 \n", + "3 kubeflow-presubmit-kfctl-go-iap-istio 2 1 1 \n", + "4 kubeflow-presubmit-jupyterui-release 2 1 1 \n", + "5 kubeflow-presubmit-tf-notebook-release 2 1 1 \n", + "6 kubeflow-presubmit-tf-notebook-release 3 2 1 \n", + "7 kubeflow-presubmit-kfctl-go-basic-auth 3 1 2 \n", + "8 kubeflow-presubmit-kfctl-beta 3 2 1 \n", + "9 kubeflow-presubmit-unittests 3 2 1 \n", + "10 kubeflow-presubmit-kfctl-go-iap 2 1 1 \n", + "11 kubeflow-presubmit-kfctl-go-iap 3 1 2 \n", + "12 kubeflow-presubmit-kfctl-go-iap-istio 3 2 1 \n", + "13 kubeflow-presubmit-kfctl-go-iap-istio 3 2 1 \n", + "14 kubeflow-presubmit-kfctl-go-iap 3 2 1 \n", + "15 kubeflow-presubmit-kfctl-go-iap 4 3 1 \n", + "16 kubeflow-presubmit-dashboard-release 3 2 1 \n", + "17 kubeflow-presubmit-kfctl-go-iap 2 1 1 \n", + "18 kubeflow-presubmit-kfctl 3 2 1 \n", + "19 kubeflow-presubmit-jupyterui-release 3 2 1 \n", + "20 kubeflow-presubmit-kfctl-go-iap-istio 5 3 2 \n", + "21 kubeflow-presubmit-dashboard-release 2 1 1 \n", + "22 kubeflow-presubmit-kfctl-go-iap 3 1 2 \n", + "23 kubeflow-presubmit-tf-notebook-release 3 2 1 \n", + "24 kubeflow-presubmit-unittests 2 1 1 \n", + "25 kubeflow-presubmit-tf-serving 3 2 1 \n", + "26 kubeflow-presubmit-kfctl-go-basic-auth 2 1 1 \n", + "27 kubeflow-presubmit-tf-serving 2 1 1 \n", + "\n", + " passed failed start_date num job \\\n", + "0 1 1 2019-04-26 3107 pr:kubeflow-presubmit \n", + "1 1 1 2019-04-23 3078 pr:kubeflow-presubmit \n", + "2 2 2 2019-04-23 3076 pr:kubeflow-presubmit \n", + "3 1 1 2019-04-24 3070 pr:kubeflow-presubmit \n", + "4 1 1 2019-04-26 3107 pr:kubeflow-presubmit \n", + "5 1 1 2019-04-26 3107 pr:kubeflow-presubmit \n", + "6 2 1 2019-04-26 3117 pr:kubeflow-presubmit \n", + "7 1 2 2019-04-29 3124 pr:kubeflow-presubmit \n", + "8 1 2 2019-04-29 3124 pr:kubeflow-presubmit \n", + "9 1 2 2019-04-29 3124 pr:kubeflow-presubmit \n", + "10 1 1 2019-04-23 3084 pr:kubeflow-presubmit \n", + "11 1 2 2019-04-29 3124 pr:kubeflow-presubmit \n", + "12 1 2 2019-04-23 3083 pr:kubeflow-presubmit \n", + "13 1 2 2019-04-23 3069 pr:kubeflow-presubmit \n", + "14 1 2 2019-04-23 3069 pr:kubeflow-presubmit \n", + "15 2 2 2019-04-23 3076 pr:kubeflow-presubmit \n", + "16 1 2 2019-04-29 3124 pr:kubeflow-presubmit \n", + "17 1 1 2019-04-26 3107 pr:kubeflow-presubmit \n", + "18 1 2 2019-04-29 3124 pr:kubeflow-presubmit \n", + "19 1 2 2019-04-29 3124 pr:kubeflow-presubmit \n", + "20 3 2 2019-04-23 3077 pr:kubeflow-presubmit \n", + "21 1 1 2019-04-26 3107 pr:kubeflow-presubmit \n", + "22 1 2 2019-04-23 3083 pr:kubeflow-presubmit \n", + "23 1 2 2019-04-29 3124 pr:kubeflow-presubmit \n", + "24 1 1 2019-04-26 3107 pr:kubeflow-presubmit \n", + "25 1 2 2019-04-29 3124 pr:kubeflow-presubmit \n", + "26 1 1 2019-04-26 3107 pr:kubeflow-presubmit \n", + "27 1 1 2019-04-26 3107 pr:kubeflow-presubmit \n", + "\n", + " commit \\\n", + "0 d08d5dfbc33e14473fe23d1046bcab5f39b1661c \n", + "1 f710b2ed53da93c0b4979f0892c0f3eaa56571b7 \n", + "2 6eb179fd242e89273251ba48d59c7543e6853194 \n", + "3 7d9ae60a0e9dfdf0a7a90ee42f68d1f9ebabbe7a \n", + "4 d08d5dfbc33e14473fe23d1046bcab5f39b1661c \n", + "5 d08d5dfbc33e14473fe23d1046bcab5f39b1661c \n", + "6 d4f03826496f95333f96287443c0e03592cf6d77 \n", + "7 5274cdf78d029867688257716bcb46342e7ef7ee \n", + "8 5274cdf78d029867688257716bcb46342e7ef7ee \n", + "9 5274cdf78d029867688257716bcb46342e7ef7ee \n", + "10 043c94a4436dbd2b8111d5e171b3bf144b6d8532 \n", + "11 5274cdf78d029867688257716bcb46342e7ef7ee \n", + "12 2c9dfab8699d009cc0710c6de71c0b3ff9ec8772 \n", + "13 c08cd6b5256f6acd6404ebfddf16380f11ad33e6 \n", + "14 c08cd6b5256f6acd6404ebfddf16380f11ad33e6 \n", + "15 6eb179fd242e89273251ba48d59c7543e6853194 \n", + "16 5274cdf78d029867688257716bcb46342e7ef7ee \n", + "17 d08d5dfbc33e14473fe23d1046bcab5f39b1661c \n", + "18 5274cdf78d029867688257716bcb46342e7ef7ee \n", + "19 5274cdf78d029867688257716bcb46342e7ef7ee \n", + "20 1561f72f6d9e21b423825b4bd3b21f3d2fa1024b \n", + "21 d08d5dfbc33e14473fe23d1046bcab5f39b1661c \n", + "22 2c9dfab8699d009cc0710c6de71c0b3ff9ec8772 \n", + "23 5274cdf78d029867688257716bcb46342e7ef7ee \n", + "24 d08d5dfbc33e14473fe23d1046bcab5f39b1661c \n", + "25 5274cdf78d029867688257716bcb46342e7ef7ee \n", + "26 d08d5dfbc33e14473fe23d1046bcab5f39b1661c \n", + "27 d08d5dfbc33e14473fe23d1046bcab5f39b1661c \n", + "\n", + " path \\\n", + "0 [gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3107/kubeflow-presubmit/1121394824797229056, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3107/kubeflow-presubmit/1121643928618012672] \n", + "1 [gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3078/kubeflow-presubmit/1120464020181094400, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3078/kubeflow-presubmit/1120487297196756993] \n", + "2 [gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3076/kubeflow-presubmit/1120474461988982790, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3076/kubeflow-presubmit/1120450807234301952, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3076/kubeflow-presubmit/1120487425504710656, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3076/kubeflow-presubmit/1120526684731215872] \n", + "3 [gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3070/kubeflow-presubmit/1120872574964731904, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3070/kubeflow-presubmit/1120888931932442624] \n", + "4 [gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3107/kubeflow-presubmit/1121394824797229056, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3107/kubeflow-presubmit/1121643928618012672] \n", + "5 [gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3107/kubeflow-presubmit/1121394824797229056, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3107/kubeflow-presubmit/1121643928618012672] \n", + "6 [gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3117/kubeflow-presubmit/1121658781114044416, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3117/kubeflow-presubmit/1121848907471523840, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3117/kubeflow-presubmit/1121897968744534017] \n", + "7 [gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3124/kubeflow-presubmit/1121918100388712448, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3124/kubeflow-presubmit/1122855513919328262, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3124/kubeflow-presubmit/1122877286677221376] \n", + "8 [gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3124/kubeflow-presubmit/1121918100388712448, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3124/kubeflow-presubmit/1122855513919328262, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3124/kubeflow-presubmit/1122877286677221376] \n", + "9 [gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3124/kubeflow-presubmit/1121918100388712448, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3124/kubeflow-presubmit/1122855513919328262, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3124/kubeflow-presubmit/1122877286677221376] \n", + "10 [gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3084/kubeflow-presubmit/1120775430350049280, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3084/kubeflow-presubmit/1120757562539511808] \n", + "11 [gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3124/kubeflow-presubmit/1121918100388712448, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3124/kubeflow-presubmit/1122855513919328262, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3124/kubeflow-presubmit/1122877286677221376] \n", + "12 [gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3083/kubeflow-presubmit/1120487798894235650, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3083/kubeflow-presubmit/1120526554397413383, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3083/kubeflow-presubmit/1120735919805042688] \n", + "13 [gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3069/kubeflow-presubmit/1120464272699166720, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3069/kubeflow-presubmit/1120475214648446976, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3069/kubeflow-presubmit/1120492965039443968] \n", + "14 [gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3069/kubeflow-presubmit/1120464272699166720, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3069/kubeflow-presubmit/1120475214648446976, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3069/kubeflow-presubmit/1120492965039443968] \n", + "15 [gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3076/kubeflow-presubmit/1120474461988982790, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3076/kubeflow-presubmit/1120450807234301952, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3076/kubeflow-presubmit/1120487425504710656, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3076/kubeflow-presubmit/1120526684731215872] \n", + "16 [gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3124/kubeflow-presubmit/1121918100388712448, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3124/kubeflow-presubmit/1122855513919328262, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3124/kubeflow-presubmit/1122877286677221376] \n", + "17 [gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3107/kubeflow-presubmit/1121394824797229056, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3107/kubeflow-presubmit/1121643928618012672] \n", + "18 [gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3124/kubeflow-presubmit/1121918100388712448, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3124/kubeflow-presubmit/1122855513919328262, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3124/kubeflow-presubmit/1122877286677221376] \n", + "19 [gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3124/kubeflow-presubmit/1121918100388712448, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3124/kubeflow-presubmit/1122855513919328262, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3124/kubeflow-presubmit/1122877286677221376] \n", + "20 [gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3077/kubeflow-presubmit/1120464394585640970, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3077/kubeflow-presubmit/1120487297196756994, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3077/kubeflow-presubmit/1120455839899979776, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3077/kubeflow-presubmit/1120526554397413382, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3077/kubeflow-presubmit/1120536378287853568] \n", + "21 [gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3107/kubeflow-presubmit/1121394824797229056, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3107/kubeflow-presubmit/1121643928618012672] \n", + "22 [gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3083/kubeflow-presubmit/1120487798894235650, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3083/kubeflow-presubmit/1120526554397413383, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3083/kubeflow-presubmit/1120735919805042688] \n", + "23 [gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3124/kubeflow-presubmit/1121918100388712448, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3124/kubeflow-presubmit/1122855513919328262, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3124/kubeflow-presubmit/1122877286677221376] \n", + "24 [gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3107/kubeflow-presubmit/1121394824797229056, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3107/kubeflow-presubmit/1121643928618012672] \n", + "25 [gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3124/kubeflow-presubmit/1121918100388712448, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3124/kubeflow-presubmit/1122855513919328262, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3124/kubeflow-presubmit/1122877286677221376] \n", + "26 [gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3107/kubeflow-presubmit/1121394824797229056, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3107/kubeflow-presubmit/1121643928618012672] \n", + "27 [gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3107/kubeflow-presubmit/1121394824797229056, gs://kubernetes-jenkins/pr-logs/pull/kubeflow_kubeflow/3107/kubeflow-presubmit/1121643928618012672] \n", + "\n", + " wf_flake flake \n", + "0 1 1 \n", + "1 1 1 \n", + "2 1 1 \n", + "3 1 1 \n", + "4 1 1 \n", + "5 1 1 \n", + "6 1 1 \n", + "7 1 1 \n", + "8 1 1 \n", + "9 1 1 \n", + "10 1 1 \n", + "11 1 1 \n", + "12 1 1 \n", + "13 1 1 \n", + "14 1 1 \n", + "15 1 1 \n", + "16 1 1 \n", + "17 1 1 \n", + "18 1 1 \n", + "19 1 1 \n", + "20 1 1 \n", + "21 1 1 \n", + "22 1 1 \n", + "23 1 1 \n", + "24 1 1 \n", + "25 1 1 \n", + "26 1 1 \n", + "27 1 1 " + ] + }, + "execution_count": 82, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "%%bigquery testkfisready\n", + "CREATE TEMP FUNCTION getWorkflowTestName(x STRING)\n", + "RETURNS STRING\n", + "LANGUAGE js AS \"\"\"\n", + " var r=/\\\\d/;\n", + " var y=x.replace(\"-e2e\",\"-endtoend\");\n", + " var fd=r.exec(y);\n", + " y=y.substring(0, y.indexOf(fd) - 1);\n", + " y=y.replace(\"-endtoend\",\"-e2e\");\n", + " return y;\n", + "\"\"\";\n", + "SELECT \n", + " testname,\n", + " runs,\n", + " wf_passed,\n", + " wf_failed,\n", + " passed,\n", + " failed,\n", + " start_date,\n", + " num,\n", + " job,\n", + " commit,\n", + " path,\n", + " IF(failed>0 and passed>0 and wf_failed>0, 1,0) wf_flake,\n", + " if(failed>0 and passed> 0, 1,0) flake\n", + "FROM(\n", + " SELECT \n", + " testname,\n", + " count(*) runs,\n", + " sum(wf_passed) wf_passed,\n", + " sum(wf_failed) wf_failed,\n", + " sum(passed) passed,\n", + " sum(failed) failed,\n", + " max(start_date) start_date,\n", + " num,\n", + " array_agg(path) path,\n", + " job,\n", + " commit\n", + " FROM(\n", + " SELECT \n", + " getWorkflowTestName(m.key) testname,\n", + " IF(m.value=\"Succeeded\", 1, 0) wf_passed,\n", + " IF(m.value=\"Succeeded\", 0, 1) wf_failed,\n", + " regexp_extract(commit, r'[^,]+,\\d+:([a-f0-9]+)\"') commit,\n", + " job,\n", + " path,\n", + " start_date,\n", + " num,\n", + " passed,\n", + " failed\n", + " FROM(\n", + " SELECT\n", + " path,\n", + " test,\n", + " job,\n", + " metadata,\n", + " EXTRACT(DATE FROM started) start_date,\n", + " regexp_extract(path, r'/(\\d+)\\/') as num, /* pr number */\n", + " CASE WHEN result='SUCCESS' THEN 1 ELSE 0 END passed,\n", + " CASE WHEN result='SUCCESS' THEN 0 ELSE 1 END failed,\n", + " (SELECT m.value From UNNEST(metadata) as m where m.key = \"repos\") as commit\n", + " FROM\n", + " `k8s-gubernator.build.all`\n", + " WHERE\n", + " job LIKE '%kubeflow-presubmit%'\n", + " and started > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 168 HOUR)\n", + " and STRPOS(job,'kubeflow') > 0 and STRPOS(job,'pr:') > 0\n", + " ), UNNEST(metadata) as m\n", + " where\n", + " job LIKE '%kubeflow-presubmit%' and ENDS_WITH(m.key, \"-phase\")\n", + " )\n", + " group by testname,job,commit,num\n", + ")WHERE failed>0 and passed>0 and wf_failed>0\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
testnamerunspassedfailedwf_passedwf_failedwf_flakesflakes
0kubeflow-presubmit-kfctl-go-iap65293635302222
1kubeflow-presubmit-tf-notebook-release34142021131111
2kubeflow-presubmit-kfctl30131720101010
3kubeflow-presubmit-unittests27121517101010
4kubeflow-presubmit-kfctl-go-basic-auth251015121399
5kubeflow-presubmit-kfctl-go-iap-istio20101012866
6kubeflow-presubmit-tf-serving10466444
7kubeflow-presubmit-dashboard-release8355333
8kubeflow-presubmit-jupyterui-release6244222
\n", + "
" + ], + "text/plain": [ + " testname runs passed failed wf_passed \\\n", + "0 kubeflow-presubmit-kfctl-go-iap 65 29 36 35 \n", + "1 kubeflow-presubmit-tf-notebook-release 34 14 20 21 \n", + "2 kubeflow-presubmit-kfctl 30 13 17 20 \n", + "3 kubeflow-presubmit-unittests 27 12 15 17 \n", + "4 kubeflow-presubmit-kfctl-go-basic-auth 25 10 15 12 \n", + "5 kubeflow-presubmit-kfctl-go-iap-istio 20 10 10 12 \n", + "6 kubeflow-presubmit-tf-serving 10 4 6 6 \n", + "7 kubeflow-presubmit-dashboard-release 8 3 5 5 \n", + "8 kubeflow-presubmit-jupyterui-release 6 2 4 4 \n", + "\n", + " wf_failed wf_flakes flakes \n", + "0 30 22 22 \n", + "1 13 11 11 \n", + "2 10 10 10 \n", + "3 10 10 10 \n", + "4 13 9 9 \n", + "5 8 6 6 \n", + "6 4 4 4 \n", + "7 3 3 3 \n", + "8 2 2 2 " + ] + }, + "execution_count": 71, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "%%bigquery testkfisready\n", + "CREATE TEMP FUNCTION getWorkflowTestName(x STRING)\n", + "RETURNS STRING\n", + "LANGUAGE js AS \"\"\"\n", + " var r=/\\\\d/;\n", + " var y=x.replace(\"-e2e\",\"-endtoend\");\n", + " var fd=r.exec(y);\n", + " y=y.substring(0, y.indexOf(fd) - 1);\n", + " y=y.replace(\"-endtoend\",\"-e2e\");\n", + " return y;\n", + "\"\"\";\n", + "SELECT\n", + "testname,\n", + "sum(runs) runs,\n", + "sum(passed) passed,\n", + "sum(failed) failed,\n", + "sum(wf_passed) wf_passed,\n", + "sum(wf_failed) wf_failed,\n", + "sum(if(wf_failed>0 and flake>0,1,0)) wf_flakes,\n", + "sum(flake) flakes\n", + "FROM(\n", + " SELECT \n", + " testname,\n", + " runs,\n", + " wf_passed,\n", + " wf_failed,\n", + " passed,\n", + " failed,\n", + " start_date,\n", + " num,\n", + " job,\n", + " commit,\n", + " path,\n", + " if(failed>0 and passed> 0, 1,0) flake\n", + " FROM(\n", + " SELECT \n", + " testname,\n", + " count(*) runs,\n", + " sum(wf_passed) wf_passed,\n", + " sum(wf_failed) wf_failed,\n", + " sum(passed) passed,\n", + " sum(failed) failed,\n", + " max(start_date) start_date,\n", + " num,\n", + " array_agg(path) path,\n", + " job,\n", + " commit\n", + " FROM(\n", + " SELECT \n", + " getWorkflowTestName(m.key) testname,\n", + " IF(m.value=\"Succeeded\", 1, 0) wf_passed,\n", + " IF(m.value=\"Succeeded\", 0, 1) wf_failed,\n", + " regexp_extract(commit, r'[^,]+,\\d+:([a-f0-9]+)\"') commit,\n", + " job,\n", + " path,\n", + " start_date,\n", + " num,\n", + " passed,\n", + " failed\n", + " FROM(\n", + " SELECT\n", + " path,\n", + " test,\n", + " job,\n", + " metadata,\n", + " EXTRACT(DATE FROM started) start_date,\n", + " regexp_extract(path, r'/(\\d+)\\/') as num, /* pr number */\n", + " CASE WHEN result='SUCCESS' THEN 1 ELSE 0 END passed,\n", + " CASE WHEN result='SUCCESS' THEN 0 ELSE 1 END failed,\n", + " (SELECT m.value From UNNEST(metadata) as m where m.key = \"repos\") as commit\n", + " FROM\n", + " `k8s-gubernator.build.all`\n", + " WHERE\n", + " job LIKE '%kubeflow-presubmit%'\n", + " and started > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 600 HOUR)\n", + " and STRPOS(job,'kubeflow') > 0 and STRPOS(job,'pr:') > 0\n", + " and regexp_extract(path, r'/(\\d+)\\/') is not null\n", + " ), UNNEST(metadata) as m\n", + " where\n", + " job LIKE '%kubeflow-presubmit%' and ENDS_WITH(m.key, \"-phase\")\n", + " )\n", + " group by testname,job,commit,num\n", + " )WHERE failed>0 and passed>0 and wf_failed>0\n", + ") group by testname\n", + "order by wf_flakes DESC" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%%bigquery testkfisready\n", + "CREATE TEMP FUNCTION getWorkflowTestName(x STRING)\n", + "RETURNS STRING\n", + "LANGUAGE js AS \"\"\"\n", + " var r=/\\\\d/;\n", + " var y=x.replace(\"-e2e\",\"-endtoend\");\n", + " var fd=r.exec(y);\n", + " y=y.substring(0, y.indexOf(fd) - 1);\n", + " y=y.replace(\"-endtoend\",\"-e2e\");\n", + " return y;\n", + "\"\"\";\n", + "SELECT\n", + "testname,\n", + "sum(runs) runs,\n", + "sum(passed) passed,\n", + "sum(failed) failed,\n", + "sum(wf_passed) wf_passed,\n", + "sum(wf_failed) wf_failed,\n", + "sum(if(wf_failed>0 and flake>0,1,0)) wf_flakes,\n", + "sum(flake) flakes,\n", + "array_agg(num) num,\n", + "array_agg(commit) co\n", + "FROM(\n", + " SELECT \n", + " testname,\n", + " runs,\n", + " wf_passed,\n", + " wf_failed,\n", + " passed,\n", + " failed,\n", + " start_date,\n", + " num,\n", + " job,\n", + " commit,\n", + " path,\n", + " if(failed>0 and passed> 0, 1,0) flake\n", + " FROM(\n", + " SELECT \n", + " testname,\n", + " count(*) runs,\n", + " sum(wf_passed) wf_passed,\n", + " sum(wf_failed) wf_failed,\n", + " sum(passed) passed,\n", + " sum(failed) failed,\n", + " max(start_date) start_date,\n", + " num,\n", + " array_agg(path) path,\n", + " job,\n", + " commit\n", + " FROM(\n", + " SELECT \n", + " getWorkflowTestName(m.key) testname,\n", + " IF(m.value=\"Succeeded\", 1, 0) wf_passed,\n", + " IF(m.value=\"Succeeded\", 0, 1) wf_failed,\n", + " regexp_extract(commit, r'[^,]+,\\d+:([a-f0-9]+)\"') commit,\n", + " job,\n", + " path,\n", + " start_date,\n", + " num,\n", + " passed,\n", + " failed\n", + " FROM(\n", + " SELECT\n", + " path,\n", + " test,\n", + " job,\n", + " metadata,\n", + " EXTRACT(DATE FROM started) start_date,\n", + " regexp_extract(path, r'/(\\d+)\\/') as num, /* pr number */\n", + " CASE WHEN result='SUCCESS' THEN 1 ELSE 0 END passed,\n", + " CASE WHEN result='SUCCESS' THEN 0 ELSE 1 END failed,\n", + " (SELECT m.value From UNNEST(metadata) as m where m.key = \"repos\") as commit\n", + " FROM\n", + " `k8s-gubernator.build.all`\n", + " WHERE\n", + " job LIKE '%kubeflow-presubmit%'\n", + " and started > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 600 HOUR)\n", + " and STRPOS(job,'kubeflow') > 0 and STRPOS(job,'pr:') > 0\n", + " and regexp_extract(path, r'/(\\d+)\\/') is not null\n", + " ), UNNEST(metadata) as m\n", + " where\n", + " job LIKE '%kubeflow-presubmit%' and ENDS_WITH(m.key, \"-phase\")\n", + " )\n", + " group by testname,job,commit,num\n", + " )WHERE failed>0 and passed>0 and wf_failed>0 and commit is not null and num is not null\n", + ") group by testname\n", + "order by wf_flakes DESC" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.15" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}