1
0
Fork 0
llvm-premerge-checks/scripts/buildkite/analyze_jobs.ipynb

1596 lines
98 KiB
Text
Raw Normal View History

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## License\n",
"\n",
"Copyright 2020 Google LLC\n",
"\n",
"Licensed under the the Apache License v2.0 with LLVM Exceptions (the \"License\");\n",
"you may not use this file except in compliance with the License.\n",
"You may obtain a copy of the License at\n",
"\n",
"https://llvm.org/LICENSE.txt\n",
"\n",
"Unless required by applicable law or agreed to in writing, software\n",
"distributed under the License is distributed on an \"AS IS\" BASIS,\n",
"WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n",
"See the License for the specific language governing permissions and\n",
"limitations under the License."
]
},
{
"cell_type": "code",
"execution_count": 115,
"metadata": {},
"outputs": [],
"source": [
"import requests\n",
"import os\n",
"import logging\n",
"import argparse\n",
"import json\n",
"import pandas as pd\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"cache_file = \"cache.json\"\n",
"token = f'Bearer {os.getenv(\"BUILDKITE_API_TOKEN\")}'\n",
"builds = []"
]
},
{
"cell_type": "code",
"execution_count": 79,
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"loaded 9926 entries\n"
]
}
],
"source": [
"if os.path.exists(cache_file):\n",
" with open(cache_file) as f:\n",
" builds = json.load(f)\n",
" print(f'loaded {len(builds)} entries') "
]
},
{
"cell_type": "code",
"execution_count": 96,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"loading page 1\n",
"https://buildkite.com/llvm-project/premerge-checks/builds/4056 is running skipping\n",
"https://buildkite.com/llvm-project/diff-checks/builds/4771 is running skipping\n",
"https://buildkite.com/llvm-project/llvm-master-build/builds/313 is running skipping\n",
"loading page 2\n",
"loading page 3\n",
"loading page 4\n",
"loading page 5\n",
"loading page 6\n",
"loading page 7\n",
"loading page 8\n",
"loading page 9\n",
"loading page 10\n",
"loading page 11\n",
"loading page 12\n",
"loading page 13\n",
"loading page 14\n",
"loading page 15\n",
"loading page 16\n",
"loading page 17\n",
"loading page 18\n",
"loading page 19\n",
"loading page 20\n",
"loading page 21\n",
"loading page 22\n",
"loading page 23\n",
"loading page 24\n",
"loading page 25\n",
"loading page 26\n",
"loading page 27\n",
"loading page 28\n",
"loading page 29\n",
"loading page 30\n",
"loading page 31\n",
"loading page 32\n",
"loading page 33\n",
"loading page 34\n",
"loading page 35\n",
"loading page 36\n",
"loading page 37\n",
"loading page 38\n",
"loading page 39\n",
"loading page 40\n",
"loading page 41\n",
"loading page 42\n",
"loading page 43\n",
"loading page 44\n",
"loading page 45\n",
"loading page 46\n",
"loading page 47\n",
"loading page 48\n",
"loading page 49\n",
"loading page 50\n",
"loading page 51\n",
"loading page 52\n",
"loading page 53\n",
"loading page 54\n",
"loading page 55\n",
"loading page 56\n",
"loading page 57\n",
"loading page 58\n",
"loading page 59\n",
"loading page 60\n",
"loading page 61\n",
"loading page 62\n",
"loading page 63\n",
"loading page 64\n",
"loading page 65\n",
"loading page 66\n",
"loading page 67\n",
"loading page 68\n",
"loading page 69\n",
"loading page 70\n",
"loading page 71\n",
"loading page 72\n",
"loading page 73\n",
"loading page 74\n",
"loading page 75\n",
"loading page 76\n",
"loading page 77\n",
"loading page 78\n",
"loading page 79\n",
"loading page 80\n",
"loading page 81\n",
"loading page 82\n",
"loading page 83\n",
"loading page 84\n",
"loading page 85\n",
"loading page 86\n",
"loading page 87\n",
"loading page 88\n",
"loading page 89\n",
"loading page 90\n",
"loading page 91\n",
"loading page 92\n",
"loading page 93\n",
"loading page 94\n",
"loading page 95\n",
"loading page 96\n",
"loading page 97\n",
"loading page 98\n",
"loading page 99\n",
"loading page 100\n",
"loading page 101\n",
"loading page 102\n",
"loading page 103\n",
"loading page 104\n",
"loading page 105\n",
"loading page 106\n",
"loading page 107\n",
"loading page 108\n",
"loading page 109\n",
"loading page 110\n",
"loading page 111\n",
"loading page 112\n",
"loading page 113\n",
"loading page 114\n",
"loading page 115\n",
"loading page 116\n",
"loading page 117\n",
"loading page 118\n",
"loading page 119\n",
"loading page 120\n",
"loading page 121\n",
"loading page 122\n",
"loading page 123\n",
"loading page 124\n",
"loading page 125\n",
"loading page 126\n",
"loading page 127\n",
"loading page 128\n",
"loading page 129\n",
"loading page 130\n",
"loading page 131\n",
"loading page 132\n",
"loading page 133\n",
"loading page 134\n",
"loading page 135\n",
"loading page 136\n",
"loading page 137\n",
"loading page 138\n",
"loading page 139\n",
"loading page 140\n",
"loading page 141\n",
"loading page 142\n",
"loading page 143\n",
"loading page 144\n",
"loading page 145\n",
"loading page 146\n",
"loading page 147\n",
"loading page 148\n",
"loading page 149\n",
"loading page 150\n",
"loading page 151\n",
"loading page 152\n",
"loading page 153\n",
"loading page 154\n",
"loading page 155\n",
"loading page 156\n",
"loading page 157\n",
"loading page 158\n",
"loading page 159\n",
"loading page 160\n",
"loading page 161\n",
"loading page 162\n",
"loading page 163\n",
"loading page 164\n",
"loading page 165\n",
"loading page 166\n",
"loading page 167\n",
"loading page 168\n",
"loading page 169\n",
"loading page 170\n",
"loading page 171\n",
"loading page 172\n",
"loading page 173\n",
"loading page 174\n",
"loading page 175\n",
"loading page 176\n",
"loading page 177\n",
"loading page 178\n",
"loading page 179\n",
"loading page 180\n",
"loading page 181\n",
"loading page 182\n",
"loading page 183\n",
"loading page 184\n",
"loading page 185\n",
"loading page 186\n",
"loading page 187\n",
"loading page 188\n",
"loading page 189\n",
"loading page 190\n",
"loading page 191\n",
"loading page 192\n",
"loading page 193\n",
"loading page 194\n",
"loading page 195\n",
"loading page 196\n",
"loading page 197\n",
"loading page 198\n",
"loading page 199\n",
"loading page 200\n",
"loading page 201\n",
"loading page 202\n",
"loading page 203\n",
"loading page 204\n",
"loading page 205\n",
"loading page 206\n",
"loading page 207\n",
"loading page 208\n",
"loading page 209\n",
"loading page 210\n",
"loading page 211\n",
"loading page 212\n",
"loading page 213\n",
"loading page 214\n",
"loading page 215\n",
"loading page 216\n",
"loading page 217\n",
"loading page 218\n",
"loading page 219\n",
"loading page 220\n",
"loading page 221\n",
"loading page 222\n",
"loading page 223\n",
"loading page 224\n",
"loading page 225\n",
"loading page 226\n",
"loading page 227\n",
"loading page 228\n",
"loading page 229\n",
"loading page 230\n",
"loading page 231\n",
"loading page 232\n",
"loading page 233\n",
"loading page 234\n",
"loading page 235\n",
"loading page 236\n",
"loading page 237\n",
"loading page 238\n",
"loading page 239\n",
"loading page 240\n",
"loading page 241\n",
"loading page 242\n",
"loading page 243\n",
"loading page 244\n",
"loading page 245\n",
"loading page 246\n",
"loading page 247\n",
"loading page 248\n",
"loading page 249\n",
"loading page 250\n",
"loading page 251\n",
"loading page 252\n",
"loading page 253\n",
"loading page 254\n",
"loading page 255\n",
"loading page 256\n",
"loading page 257\n",
"loading page 258\n",
"loading page 259\n",
"loading page 260\n",
"loading page 261\n",
"loading page 262\n",
"loading page 263\n",
"loading page 264\n",
"loading page 265\n",
"loading page 266\n",
"loading page 267\n",
"loading page 268\n",
"loading page 269\n",
"loading page 270\n",
"loading page 271\n",
"loading page 272\n",
"loading page 273\n",
"loading page 274\n",
"loading page 275\n",
"loading page 276\n",
"loading page 277\n",
"loading page 278\n",
"loading page 279\n",
"loading page 280\n",
"loading page 281\n",
"loading page 282\n",
"loading page 283\n",
"loading page 284\n",
"loading page 285\n",
"loading page 286\n",
"loading page 287\n",
"loading page 288\n",
"loading page 289\n",
"loading page 290\n",
"loading page 291\n",
"loading page 292\n",
"loading page 293\n",
"loading page 294\n",
"loading page 295\n",
"loading page 296\n",
"loading page 297\n",
"loading page 298\n",
"loading page 299\n",
"loading page 300\n",
"loading page 301\n",
"loading page 302\n",
"loading page 303\n",
"loading page 304\n",
"loading page 305\n",
"loading page 306\n",
"loading page 307\n",
"loading page 308\n",
"loading page 309\n",
"loading page 310\n",
"loading page 311\n",
"loading page 312\n",
"loading page 313\n",
"loading page 314\n",
"loading page 315\n",
"loading page 316\n",
"loading page 317\n",
"loading page 318\n",
"loading page 319\n",
"loading page 320\n",
"loading page 321\n",
"loading page 322\n",
"loading page 323\n",
"loading page 324\n",
"loading page 325\n",
"loading page 326\n",
"loading page 327\n",
"loading page 328\n",
"loading page 329\n",
"loading page 330\n",
"loading page 331\n",
"loading page 332\n",
"loading page 333\n",
"empty response\n",
"9938 jobs in total\n",
"saved 9938 entries\n"
]
}
],
"source": [
"# load new jobs from Buildkite API\n",
"if True:\n",
" existing = set()\n",
" for j in builds:\n",
" existing.add(j['id'])\n",
"\n",
" # uncomment to reset\n",
" builds = []\n",
" existing = set()\n",
" page = 1\n",
" stop = False\n",
" while not stop:\n",
" print('loading page', page)\n",
" re = requests.get('https://api.buildkite.com/v2/organizations/llvm-project/builds',\n",
" params={'page': page},\n",
" headers={'Authorization': token})\n",
" if re.status_code != 200:\n",
" print('response status', re.status_code, re)\n",
" break\n",
" x = re.json()\n",
" if x == []:\n",
" print('empty response')\n",
" break\n",
" for j in x:\n",
" if j['id'] in existing:\n",
" print('found existing job', j['id'])\n",
" stop = True\n",
" break\n",
" # TODO: skip running jobs \n",
" if (j['state'] == 'running') or (j['state'] == 'scheduled'):\n",
" print(j['web_url'], 'is', j['state'], 'skipping')\n",
" continue\n",
" builds.append(j)\n",
" page += 1\n",
" print(len(builds), 'jobs in total') \n",
" with open(cache_file, 'w') as f:\n",
" json.dump(builds, f)\n",
" print(f'saved {len(builds)} entries')"
]
},
{
"cell_type": "code",
"execution_count": 92,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'id': 'a2711b08-9b6a-42d5-b4b6-6c59c1552de5',\n",
" 'url': 'https://api.buildkite.com/v2/organizations/llvm-project/pipelines/premerge-checks/builds/939',\n",
" 'web_url': 'https://buildkite.com/llvm-project/premerge-checks/builds/939',\n",
" 'number': 939,\n",
" 'state': 'passed',\n",
" 'blocked': False,\n",
" 'message': ':rocket: build and test',\n",
" 'commit': 'ea6b09b8619acacb33fcd203f221478008ecaf3a',\n",
" 'branch': 'phab-diff-271774',\n",
" 'tag': None,\n",
" 'env': {'ph_build_id': '73722',\n",
" 'ph_target_phid': 'PHID-HMBT-4acp7qthh3xglytj6u5m',\n",
" 'scripts_branch': 'master',\n",
" 'ph_buildable_diff': '271774',\n",
" 'ph_initiator_phid': 'PHID-HRUL-pvs6c7dbp4vlzqcixysi',\n",
" 'ph_scripts_branch': 'master',\n",
" 'ph_buildable_revision': '82048'},\n",
" 'source': 'trigger_job',\n",
" 'creator': {'id': '2dd32c51-ad7e-4624-a8a0-4131b3677b92',\n",
" 'name': 'premerge bot',\n",
" 'email': 'llvm.premerge.tests@gmail.com',\n",
" 'avatar_url': 'https://www.gravatar.com/avatar/43ac7ccfca24b7e2132c9afa165a9f30',\n",
" 'created_at': '2020-05-14T10:32:08.557Z'},\n",
" 'created_at': '2020-06-18T17:55:24.440Z',\n",
" 'scheduled_at': '2020-06-18T17:55:24.422Z',\n",
" 'started_at': '2020-06-18T17:55:39.000Z',\n",
" 'finished_at': '2020-06-18T18:13:04.000Z',\n",
" 'meta_data': {'buildkite:git:commit': 'commit ea6b09b8619acacb33fcd203f221478008ecaf3a\\nAuthor: myusername <myemail@example.com>\\nAuthorDate: Thu Jun 18 17:55:19 2020 +0000\\nCommit: myusername <myemail@example.com>\\nCommitDate: Thu Jun 18 17:55:19 2020 +0000\\n\\n applying Diff 271774'},\n",
" 'pull_request': None,\n",
" 'rebuilt_from': None,\n",
" 'pipeline': {'id': 'f8ab115f-a384-49e8-a048-0f71ab03c5d0',\n",
" 'url': 'https://api.buildkite.com/v2/organizations/llvm-project/pipelines/premerge-checks',\n",
" 'web_url': 'https://buildkite.com/llvm-project/premerge-checks',\n",
" 'name': 'premerge checks',\n",
" 'description': 'builds branch from https://github.com/llvm-premerge-tests/llvm-project',\n",
" 'slug': 'premerge-checks',\n",
" 'repository': 'https://github.com/llvm-premerge-tests/llvm-project.git',\n",
" 'cluster_id': None,\n",
" 'branch_configuration': None,\n",
" 'default_branch': None,\n",
" 'skip_queued_branch_builds': False,\n",
" 'skip_queued_branch_builds_filter': None,\n",
" 'cancel_running_branch_builds': False,\n",
" 'cancel_running_branch_builds_filter': None,\n",
" 'provider': {'id': 'github',\n",
" 'settings': {'trigger_mode': 'none',\n",
" 'build_pull_requests': True,\n",
" 'pull_request_branch_filter_enabled': False,\n",
" 'skip_builds_for_existing_commits': False,\n",
" 'skip_pull_request_builds_for_existing_commits': True,\n",
" 'build_pull_request_forks': False,\n",
" 'build_pull_request_ready_for_review': False,\n",
" 'prefix_pull_request_fork_branch_names': True,\n",
" 'build_tags': False,\n",
" 'publish_commit_status': False,\n",
" 'publish_commit_status_per_step': False,\n",
" 'separate_pull_request_statuses': False,\n",
" 'publish_blocked_as_pending': False,\n",
" 'filter_enabled': False,\n",
" 'repository': 'llvm-premerge-tests/llvm-project',\n",
" 'commit_status_error': '404'},\n",
" 'webhook_url': 'https://webhook.buildkite.com/deliver/1da5c96d5d0d13c86f088b9003508dcc1152caa6a0943ecb8e'},\n",
" 'builds_url': 'https://api.buildkite.com/v2/organizations/llvm-project/pipelines/premerge-checks/builds',\n",
" 'badge_url': 'https://badge.buildkite.com/e1c6f1032968e2137789f152d46d803db28599ea05bb0f2cb7.svg',\n",
" 'created_at': '2020-05-13T13:28:54.906Z',\n",
" 'env': {'PHABRICATOR_HOST': 'https://reviews.llvm.org',\n",
" 'scripts_branch': 'master'},\n",
" 'scheduled_builds_count': 0,\n",
" 'running_builds_count': 3,\n",
" 'scheduled_jobs_count': 0,\n",
" 'running_jobs_count': 5,\n",
" 'waiting_jobs_count': 3,\n",
" 'visibility': 'public',\n",
" 'steps': [{'type': 'script',\n",
" 'name': ':seedling: setup',\n",
" 'command': 'export SRC=${BUILDKITE_BUILD_PATH}/llvm-premerge-checks\\r\\nrm -rf ${SRC}\\r\\ngit clone --depth 1 --branch ${scripts_branch:-master} https://github.com/google/llvm-premerge-checks.git ${SRC}\\r\\nexport SCRIPT_DIR=${SRC}/scripts\\r\\n${SCRIPT_DIR}/buildkite/build_branch_pipeline.py | tee /dev/tty | buildkite-agent pipeline upload',\n",
" 'artifact_paths': '',\n",
" 'branch_configuration': '',\n",
" 'env': {},\n",
" 'timeout_in_minutes': None,\n",
" 'agent_query_rules': ['queue=linux'],\n",
" 'concurrency': None,\n",
" 'parallelism': None}]},\n",
" 'jobs': [{'id': '0b167b1c-8fcd-4454-a81e-bc31f008c17c',\n",
" 'type': 'script',\n",
" 'name': ':seedling: setup',\n",
" 'step_key': None,\n",
" 'agent_query_rules': ['queue=linux'],\n",
" 'state': 'passed',\n",
" 'build_url': 'https://api.buildkite.com/v2/organizations/llvm-project/pipelines/premerge-checks/builds/939',\n",
" 'web_url': 'https://buildkite.com/llvm-project/premerge-checks/builds/939#0b167b1c-8fcd-4454-a81e-bc31f008c17c',\n",
" 'log_url': 'https://api.buildkite.com/v2/organizations/llvm-project/pipelines/premerge-checks/builds/939/jobs/0b167b1c-8fcd-4454-a81e-bc31f008c17c/log',\n",
" 'raw_log_url': 'https://api.buildkite.com/v2/organizations/llvm-project/pipelines/premerge-checks/builds/939/jobs/0b167b1c-8fcd-4454-a81e-bc31f008c17c/log.txt',\n",
" 'artifacts_url': 'https://api.buildkite.com/v2/organizations/llvm-project/pipelines/premerge-checks/builds/939/jobs/0b167b1c-8fcd-4454-a81e-bc31f008c17c/artifacts',\n",
" 'command': 'export SRC=${BUILDKITE_BUILD_PATH}/llvm-premerge-checks\\nrm -rf ${SRC}\\ngit clone --depth 1 --branch ${scripts_branch} https://github.com/google/llvm-premerge-checks.git ${SRC}\\nexport SCRIPT_DIR=${SRC}/scripts\\n${SCRIPT_DIR}/buildkite/build_branch_pipeline.py | tee /dev/tty | buildkite-agent pipeline upload',\n",
" 'soft_failed': False,\n",
" 'exit_status': 0,\n",
" 'artifact_paths': '',\n",
" 'agent': {'id': 'ea83f219-5446-4baa-ae1d-3a6fb4560d8c',\n",
" 'url': 'https://api.buildkite.com/v2/organizations/llvm-project/agents/ea83f219-5446-4baa-ae1d-3a6fb4560d8c',\n",
" 'web_url': 'https://buildkite.com/organizations/llvm-project/agents/ea83f219-5446-4baa-ae1d-3a6fb4560d8c',\n",
" 'name': 'premerge-debian-79cddc6ddb-tctnh-1',\n",
" 'connection_state': 'lost',\n",
" 'ip_address': '35.222.74.159',\n",
" 'hostname': 'premerge-debian-79cddc6ddb-tctnh',\n",
" 'user_agent': 'buildkite-agent/3.22.1.x (linux; amd64)',\n",
" 'version': '3.22.1',\n",
" 'creator': None,\n",
" 'created_at': '2020-06-18T14:16:59.263Z',\n",
" 'job': None,\n",
" 'last_job_finished_at': '2020-06-18T20:08:44.000Z',\n",
" 'priority': 0,\n",
" 'meta_data': ['queue=linux']},\n",
" 'created_at': '2020-06-18T17:55:24.446Z',\n",
" 'scheduled_at': '2020-06-18T17:55:24.446Z',\n",
" 'runnable_at': '2020-06-18T17:55:24.000Z',\n",
" 'started_at': '2020-06-18T17:55:39.693Z',\n",
" 'finished_at': '2020-06-18T17:55:44.016Z',\n",
" 'retried': False,\n",
" 'retried_in_job_id': None,\n",
" 'retries_count': None,\n",
" 'parallel_group_index': None,\n",
" 'parallel_group_total': None},\n",
" {'id': '83b8e803-3b7d-4b66-a269-d594838617db',\n",
" 'type': 'script',\n",
" 'name': ':linux: build and test linux',\n",
" 'step_key': 'linux',\n",
" 'agent_query_rules': ['queue=linux'],\n",
" 'state': 'passed',\n",
" 'build_url': 'https://api.buildkite.com/v2/organizations/llvm-project/pipelines/premerge-checks/builds/939',\n",
" 'web_url': 'https://buildkite.com/llvm-project/premerge-checks/builds/939#83b8e803-3b7d-4b66-a269-d594838617db',\n",
" 'log_url': 'https://api.buildkite.com/v2/organizations/llvm-project/pipelines/premerge-checks/builds/939/jobs/83b8e803-3b7d-4b66-a269-d594838617db/log',\n",
" 'raw_log_url': 'https://api.buildkite.com/v2/organizations/llvm-project/pipelines/premerge-checks/builds/939/jobs/83b8e803-3b7d-4b66-a269-d594838617db/log.txt',\n",
" 'artifacts_url': 'https://api.buildkite.com/v2/organizations/llvm-project/pipelines/premerge-checks/builds/939/jobs/83b8e803-3b7d-4b66-a269-d594838617db/artifacts',\n",
" 'command': 'mkdir -p artifacts\\ndpkg -l >> artifacts/packages.txt\\nexport SRC=/mnt/disks/ssd0/agent/llvm-premerge-checks\\nrm -rf /mnt/disks/ssd0/agent/llvm-premerge-checks\\ngit clone --depth 1 --branch master https://github.com/google/llvm-premerge-checks.git /mnt/disks/ssd0/agent/llvm-premerge-checks\\n/mnt/disks/ssd0/agent/llvm-premerge-checks/scripts/phabtalk/add_url_artifact.py --phid=\"PHID-HMBT-4acp7qthh3xglytj6u5m\" --url=\"https://buildkite.com/llvm-project/premerge-checks/builds/939\" --name=\"Buildkite build\"\\n/mnt/disks/ssd0/agent/llvm-premerge-checks/scripts/premerge_checks.py --check-clang-format --check-clang-tidy',\n",
" 'soft_failed': False,\n",
" 'exit_status': 0,\n",
" 'artifact_paths': 'artifacts/**/*;*_result.json',\n",
" 'agent': {'id': 'ea83f219-5446-4baa-ae1d-3a6fb4560d8c',\n",
" 'url': 'https://api.buildkite.com/v2/organizations/llvm-project/agents/ea83f219-5446-4baa-ae1d-3a6fb4560d8c',\n",
" 'web_url': 'https://buildkite.com/organizations/llvm-project/agents/ea83f219-5446-4baa-ae1d-3a6fb4560d8c',\n",
" 'name': 'premerge-debian-79cddc6ddb-tctnh-1',\n",
" 'connection_state': 'lost',\n",
" 'ip_address': '35.222.74.159',\n",
" 'hostname': 'premerge-debian-79cddc6ddb-tctnh',\n",
" 'user_agent': 'buildkite-agent/3.22.1.x (linux; amd64)',\n",
" 'version': '3.22.1',\n",
" 'creator': None,\n",
" 'created_at': '2020-06-18T14:16:59.263Z',\n",
" 'job': None,\n",
" 'last_job_finished_at': '2020-06-18T20:08:44.000Z',\n",
" 'priority': 0,\n",
" 'meta_data': ['queue=linux']},\n",
" 'created_at': '2020-06-18T17:55:43.698Z',\n",
" 'scheduled_at': '2020-06-18T17:55:24.446Z',\n",
" 'runnable_at': '2020-06-18T17:55:44.000Z',\n",
" 'started_at': '2020-06-18T17:55:49.798Z',\n",
" 'finished_at': '2020-06-18T17:59:35.715Z',\n",
" 'retried': False,\n",
" 'retried_in_job_id': None,\n",
" 'retries_count': None,\n",
" 'parallel_group_index': None,\n",
" 'parallel_group_total': None},\n",
" {'id': 'b614bdd2-e73b-4365-94ec-d5f63f3bda47',\n",
" 'type': 'script',\n",
" 'name': ':windows: build and test windows',\n",
" 'step_key': 'windows',\n",
" 'agent_query_rules': ['queue=windows'],\n",
" 'state': 'passed',\n",
" 'build_url': 'https://api.buildkite.com/v2/organizations/llvm-project/pipelines/premerge-checks/builds/939',\n",
" 'web_url': 'https://buildkite.com/llvm-project/premerge-checks/builds/939#b614bdd2-e73b-4365-94ec-d5f63f3bda47',\n",
" 'log_url': 'https://api.buildkite.com/v2/organizations/llvm-project/pipelines/premerge-checks/builds/939/jobs/b614bdd2-e73b-4365-94ec-d5f63f3bda47/log',\n",
" 'raw_log_url': 'https://api.buildkite.com/v2/organizations/llvm-project/pipelines/premerge-checks/builds/939/jobs/b614bdd2-e73b-4365-94ec-d5f63f3bda47/log.txt',\n",
" 'artifacts_url': 'https://api.buildkite.com/v2/organizations/llvm-project/pipelines/premerge-checks/builds/939/jobs/b614bdd2-e73b-4365-94ec-d5f63f3bda47/artifacts',\n",
" 'command': 'sccache --zero-stats\\nset SRC=%BUILDKITE_BUILD_PATH%/llvm-premerge-checks\\nrm -rf %SRC%\\ngit clone --depth 1 --branch %scripts_branch% https://github.com/google/llvm-premerge-checks.git %SRC%\\npowershell -command \"%SRC%/scripts/premerge_checks.py; $exit=$?;sccache --show-stats;if ($exit) { echo \"success\"; exit 0; } else { echo \"failure\"; exit 1;}',\n",
" 'soft_failed': False,\n",
" 'exit_status': 0,\n",
" 'artifact_paths': 'artifacts/**/*;*_result.json',\n",
" 'agent': {'id': '283e8832-4e87-49c6-93ce-5d7d7e521344',\n",
" 'url': 'https://api.buildkite.com/v2/organizations/llvm-project/agents/283e8832-4e87-49c6-93ce-5d7d7e521344',\n",
" 'web_url': 'https://buildkite.com/organizations/llvm-project/agents/283e8832-4e87-49c6-93ce-5d7d7e521344',\n",
" 'name': 'w5',\n",
" 'connection_state': 'stopped',\n",
" 'ip_address': '104.198.242.71',\n",
" 'hostname': 'a38dd42bb01e',\n",
" 'user_agent': 'buildkite-agent/3.22.0.x (windows; amd64)',\n",
" 'version': '3.22.0',\n",
" 'creator': None,\n",
" 'created_at': '2020-06-17T07:40:25.447Z',\n",
" 'job': None,\n",
" 'last_job_finished_at': '2020-07-08T12:05:08.000Z',\n",
" 'priority': 0,\n",
" 'meta_data': ['queue=windows']},\n",
" 'created_at': '2020-06-18T17:55:43.698Z',\n",
" 'scheduled_at': '2020-06-18T17:55:24.446Z',\n",
" 'runnable_at': '2020-06-18T17:55:44.000Z',\n",
" 'started_at': '2020-06-18T17:55:47.785Z',\n",
" 'finished_at': '2020-06-18T18:12:57.015Z',\n",
" 'retried': False,\n",
" 'retried_in_job_id': None,\n",
" 'retries_count': None,\n",
" 'parallel_group_index': None,\n",
" 'parallel_group_total': None},\n",
" {'id': 'e29e615e-76a0-4ad3-912d-ef18b1cfd5f8',\n",
" 'type': 'script',\n",
" 'name': ':spiral_note_pad: report',\n",
" 'step_key': None,\n",
" 'agent_query_rules': ['queue=linux'],\n",
" 'state': 'passed',\n",
" 'build_url': 'https://api.buildkite.com/v2/organizations/llvm-project/pipelines/premerge-checks/builds/939',\n",
" 'web_url': 'https://buildkite.com/llvm-project/premerge-checks/builds/939#e29e615e-76a0-4ad3-912d-ef18b1cfd5f8',\n",
" 'log_url': 'https://api.buildkite.com/v2/organizations/llvm-project/pipelines/premerge-checks/builds/939/jobs/e29e615e-76a0-4ad3-912d-ef18b1cfd5f8/log',\n",
" 'raw_log_url': 'https://api.buildkite.com/v2/organizations/llvm-project/pipelines/premerge-checks/builds/939/jobs/e29e615e-76a0-4ad3-912d-ef18b1cfd5f8/log.txt',\n",
" 'artifacts_url': 'https://api.buildkite.com/v2/organizations/llvm-project/pipelines/premerge-checks/builds/939/jobs/e29e615e-76a0-4ad3-912d-ef18b1cfd5f8/artifacts',\n",
" 'command': 'mkdir -p artifacts\\nbuildkite-agent artifact download \"*_result.json\" .\\nexport SRC=/mnt/disks/ssd0/agent/llvm-premerge-checks\\nrm -rf /mnt/disks/ssd0/agent/llvm-premerge-checks\\ngit clone --depth 1 --branch master https://github.com/google/llvm-premerge-checks.git /mnt/disks/ssd0/agent/llvm-premerge-checks\\n/mnt/disks/ssd0/agent/llvm-premerge-checks/scripts/buildkite/summary.py',\n",
" 'soft_failed': False,\n",
" 'exit_status': 0,\n",
" 'artifact_paths': 'artifacts/**/*',\n",
" 'agent': {'id': '14036082-a941-423b-945d-6442e9af3dde',\n",
" 'url': 'https://api.buildkite.com/v2/organizations/llvm-project/agents/14036082-a941-423b-945d-6442e9af3dde',\n",
" 'web_url': 'https://buildkite.com/organizations/llvm-project/agents/14036082-a941-423b-945d-6442e9af3dde',\n",
" 'name': 'premerge-debian-79cddc6ddb-snd9j-1',\n",
" 'connection_state': 'lost',\n",
" 'ip_address': '104.154.164.190',\n",
" 'hostname': 'premerge-debian-79cddc6ddb-snd9j',\n",
" 'user_agent': 'buildkite-agent/3.22.1.x (linux; amd64)',\n",
" 'version': '3.22.1',\n",
" 'creator': None,\n",
" 'created_at': '2020-06-18T14:19:09.078Z',\n",
" 'job': None,\n",
" 'last_job_finished_at': '2020-06-18T18:38:42.000Z',\n",
" 'priority': 0,\n",
" 'meta_data': ['queue=linux']},\n",
" 'created_at': '2020-06-18T17:55:43.698Z',\n",
" 'scheduled_at': '2020-06-18T17:55:24.446Z',\n",
" 'runnable_at': '2020-06-18T18:12:57.000Z',\n",
" 'started_at': '2020-06-18T18:12:59.559Z',\n",
" 'finished_at': '2020-06-18T18:13:03.893Z',\n",
" 'retried': False,\n",
" 'retried_in_job_id': None,\n",
" 'retries_count': None,\n",
" 'parallel_group_index': None,\n",
" 'parallel_group_total': None}]}"
]
},
"execution_count": 92,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"builds[7007]"
]
},
{
"cell_type": "code",
"execution_count": 107,
"metadata": {},
"outputs": [],
"source": [
"d = {\n",
" 'id': [],\n",
" 'number': [],\n",
" 'pipeline': [],\n",
"}\n",
"\n",
"jobs = {\n",
" 'pipeline': [],\n",
" 'name': [],\n",
" 'step_key': [],\n",
" 'state': [],\n",
" 'exit_status': [],\n",
" 'agent_id': [],\n",
" 'agent_name': [],\n",
" 'runnable_at': [],\n",
" 'started_at': [],\n",
" 'wait_duration': [],\n",
" 'finished_at': [],\n",
" 'run_duration': [],\n",
"}\n",
"\n",
"sec = np.timedelta64(1, 's')\n",
"for b in builds:\n",
" d['id'].append(b['id'])\n",
" d['number'].append(b['number'])\n",
" d['pipeline'].append(b['pipeline']['slug'])\n",
" for x in b['jobs']:\n",
" if x['state'] in ['waiting_failed', 'canceled', 'skipped', 'broken']:\n",
" continue\n",
" try:\n",
" jobs['pipeline'].append(b['pipeline']['slug'])\n",
" jobs['name'].append(x['name'])\n",
" jobs['step_key'].append(x['step_key'] if 'step_key' in x else '')\n",
" jobs['state'].append(x['state'] )\n",
" jobs['exit_status'].append(x['exit_status'] if 'exit_status' in x else -1)\n",
" jobs['agent_id'].append(x['agent']['id'] if 'agent' in x else '')\n",
" jobs['agent_name'].append(x['agent']['name'] if 'agent' in x else '')\n",
" runnable = np.datetime64(x['runnable_at'].replace('Z', ''))\n",
" started = np.datetime64(x['started_at'].replace('Z', ''))\n",
" finished = np.datetime64(x['finished_at'].replace('Z', ''))\n",
" jobs['runnable_at'].append(runnable)\n",
" jobs['started_at'].append(started)\n",
" jobs['wait_duration'].append((started - runnable) / sec)\n",
" jobs['finished_at'].append(finished)\n",
" jobs['run_duration'].append((finished - started) / sec)\n",
" except Exception as e:\n",
" print(x)\n",
" raise e \n",
"jobs = pd.DataFrame(jobs)"
]
},
{
"cell_type": "code",
"execution_count": 122,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array(['premerge-checks', 'diff-checks', 'llvm-master-build',\n",
" 'cleanup-branches', 'llvm-releases'], dtype=object)"
]
},
"execution_count": 122,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"jobs.pipeline.unique()"
]
},
{
"cell_type": "code",
"execution_count": 108,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>pipeline</th>\n",
" <th>name</th>\n",
" <th>step_key</th>\n",
" <th>state</th>\n",
" <th>exit_status</th>\n",
" <th>agent_id</th>\n",
" <th>agent_name</th>\n",
" <th>runnable_at</th>\n",
" <th>started_at</th>\n",
" <th>wait_duration</th>\n",
" <th>finished_at</th>\n",
" <th>run_duration</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>premerge-checks</td>\n",
" <td>:seedling: setup</td>\n",
" <td>None</td>\n",
" <td>passed</td>\n",
" <td>0</td>\n",
" <td>5725b783-8dbd-4f2a-868b-43672fda1517</td>\n",
" <td>premerge-debian-79cddc6ddb-xcdj8-2</td>\n",
" <td>2020-07-16 12:50:04</td>\n",
" <td>2020-07-16 12:50:08.673</td>\n",
" <td>4.673</td>\n",
" <td>2020-07-16 12:50:25.259</td>\n",
" <td>16.586</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>premerge-checks</td>\n",
" <td>:linux: build and test linux</td>\n",
" <td>linux</td>\n",
" <td>failed</td>\n",
" <td>-1</td>\n",
" <td>5725b783-8dbd-4f2a-868b-43672fda1517</td>\n",
" <td>premerge-debian-79cddc6ddb-xcdj8-2</td>\n",
" <td>2020-07-16 12:50:25</td>\n",
" <td>2020-07-16 12:50:28.668</td>\n",
" <td>3.668</td>\n",
" <td>2020-07-16 12:59:19.455</td>\n",
" <td>530.787</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>premerge-checks</td>\n",
" <td>:windows: build and test windows</td>\n",
" <td>windows</td>\n",
" <td>passed</td>\n",
" <td>0</td>\n",
" <td>f4f2789e-50aa-4dfb-88e9-267df8227508</td>\n",
" <td>w64</td>\n",
" <td>2020-07-16 12:50:25</td>\n",
" <td>2020-07-16 12:50:29.645</td>\n",
" <td>4.645</td>\n",
" <td>2020-07-16 13:04:03.301</td>\n",
" <td>813.656</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>premerge-checks</td>\n",
" <td>:spiral_note_pad: report</td>\n",
" <td>None</td>\n",
" <td>passed</td>\n",
" <td>0</td>\n",
" <td>152a7c38-8e6c-438b-8123-fafb92ff2afd</td>\n",
" <td>premerge-debian-79cddc6ddb-snd9j-2</td>\n",
" <td>2020-07-16 13:04:03</td>\n",
" <td>2020-07-16 13:04:12.266</td>\n",
" <td>9.266</td>\n",
" <td>2020-07-16 13:04:23.550</td>\n",
" <td>11.284</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>diff-checks</td>\n",
" <td>:seedling: setup</td>\n",
" <td>None</td>\n",
" <td>passed</td>\n",
" <td>0</td>\n",
" <td>5725b783-8dbd-4f2a-868b-43672fda1517</td>\n",
" <td>premerge-debian-79cddc6ddb-xcdj8-2</td>\n",
" <td>2020-07-16 12:49:18</td>\n",
" <td>2020-07-16 12:49:18.663</td>\n",
" <td>0.663</td>\n",
" <td>2020-07-16 12:49:20.104</td>\n",
" <td>1.441</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>31143</th>\n",
" <td>llvm-releases</td>\n",
" <td>ninja all</td>\n",
" <td>None</td>\n",
" <td>failed</td>\n",
" <td>1</td>\n",
" <td>1346c13a-6aca-49cb-b76f-9c248c2e53eb</td>\n",
" <td>2b3f2bb62dfe-1</td>\n",
" <td>2019-11-07 17:04:11</td>\n",
" <td>2019-11-07 17:04:18.898</td>\n",
" <td>7.898</td>\n",
" <td>2019-11-07 17:04:23.296</td>\n",
" <td>4.398</td>\n",
" </tr>\n",
" <tr>\n",
" <th>31144</th>\n",
" <td>llvm-releases</td>\n",
" <td></td>\n",
" <td>None</td>\n",
" <td>failed</td>\n",
" <td>9009</td>\n",
" <td>1346c13a-6aca-49cb-b76f-9c248c2e53eb</td>\n",
" <td>2b3f2bb62dfe-1</td>\n",
" <td>2019-11-07 16:59:15</td>\n",
" <td>2019-11-07 16:59:16.770</td>\n",
" <td>1.770</td>\n",
" <td>2019-11-07 17:02:41.360</td>\n",
" <td>204.590</td>\n",
" </tr>\n",
" <tr>\n",
" <th>31145</th>\n",
" <td>llvm-releases</td>\n",
" <td></td>\n",
" <td>None</td>\n",
" <td>failed</td>\n",
" <td>9009</td>\n",
" <td>1346c13a-6aca-49cb-b76f-9c248c2e53eb</td>\n",
" <td>2b3f2bb62dfe-1</td>\n",
" <td>2019-11-07 16:59:15</td>\n",
" <td>2019-11-07 17:02:41.760</td>\n",
" <td>206.760</td>\n",
" <td>2019-11-07 17:02:46.147</td>\n",
" <td>4.387</td>\n",
" </tr>\n",
" <tr>\n",
" <th>31146</th>\n",
" <td>llvm-releases</td>\n",
" <td></td>\n",
" <td>None</td>\n",
" <td>failed</td>\n",
" <td>1</td>\n",
" <td>1346c13a-6aca-49cb-b76f-9c248c2e53eb</td>\n",
" <td>2b3f2bb62dfe-1</td>\n",
" <td>2019-11-07 16:00:46</td>\n",
" <td>2019-11-07 16:57:53.596</td>\n",
" <td>3427.596</td>\n",
" <td>2019-11-07 16:58:07.712</td>\n",
" <td>14.116</td>\n",
" </tr>\n",
" <tr>\n",
" <th>31147</th>\n",
" <td>llvm-releases</td>\n",
" <td></td>\n",
" <td>None</td>\n",
" <td>failed</td>\n",
" <td>1</td>\n",
" <td>1346c13a-6aca-49cb-b76f-9c248c2e53eb</td>\n",
" <td>2b3f2bb62dfe-1</td>\n",
" <td>2019-11-07 16:00:46</td>\n",
" <td>2019-11-07 16:58:08.338</td>\n",
" <td>3442.338</td>\n",
" <td>2019-11-07 16:58:16.789</td>\n",
" <td>8.451</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>31148 rows × 12 columns</p>\n",
"</div>"
],
"text/plain": [
" pipeline name step_key state \\\n",
"0 premerge-checks :seedling: setup None passed \n",
"1 premerge-checks :linux: build and test linux linux failed \n",
"2 premerge-checks :windows: build and test windows windows passed \n",
"3 premerge-checks :spiral_note_pad: report None passed \n",
"4 diff-checks :seedling: setup None passed \n",
"... ... ... ... ... \n",
"31143 llvm-releases ninja all None failed \n",
"31144 llvm-releases None failed \n",
"31145 llvm-releases None failed \n",
"31146 llvm-releases None failed \n",
"31147 llvm-releases None failed \n",
"\n",
" exit_status agent_id \\\n",
"0 0 5725b783-8dbd-4f2a-868b-43672fda1517 \n",
"1 -1 5725b783-8dbd-4f2a-868b-43672fda1517 \n",
"2 0 f4f2789e-50aa-4dfb-88e9-267df8227508 \n",
"3 0 152a7c38-8e6c-438b-8123-fafb92ff2afd \n",
"4 0 5725b783-8dbd-4f2a-868b-43672fda1517 \n",
"... ... ... \n",
"31143 1 1346c13a-6aca-49cb-b76f-9c248c2e53eb \n",
"31144 9009 1346c13a-6aca-49cb-b76f-9c248c2e53eb \n",
"31145 9009 1346c13a-6aca-49cb-b76f-9c248c2e53eb \n",
"31146 1 1346c13a-6aca-49cb-b76f-9c248c2e53eb \n",
"31147 1 1346c13a-6aca-49cb-b76f-9c248c2e53eb \n",
"\n",
" agent_name runnable_at \\\n",
"0 premerge-debian-79cddc6ddb-xcdj8-2 2020-07-16 12:50:04 \n",
"1 premerge-debian-79cddc6ddb-xcdj8-2 2020-07-16 12:50:25 \n",
"2 w64 2020-07-16 12:50:25 \n",
"3 premerge-debian-79cddc6ddb-snd9j-2 2020-07-16 13:04:03 \n",
"4 premerge-debian-79cddc6ddb-xcdj8-2 2020-07-16 12:49:18 \n",
"... ... ... \n",
"31143 2b3f2bb62dfe-1 2019-11-07 17:04:11 \n",
"31144 2b3f2bb62dfe-1 2019-11-07 16:59:15 \n",
"31145 2b3f2bb62dfe-1 2019-11-07 16:59:15 \n",
"31146 2b3f2bb62dfe-1 2019-11-07 16:00:46 \n",
"31147 2b3f2bb62dfe-1 2019-11-07 16:00:46 \n",
"\n",
" started_at wait_duration finished_at \\\n",
"0 2020-07-16 12:50:08.673 4.673 2020-07-16 12:50:25.259 \n",
"1 2020-07-16 12:50:28.668 3.668 2020-07-16 12:59:19.455 \n",
"2 2020-07-16 12:50:29.645 4.645 2020-07-16 13:04:03.301 \n",
"3 2020-07-16 13:04:12.266 9.266 2020-07-16 13:04:23.550 \n",
"4 2020-07-16 12:49:18.663 0.663 2020-07-16 12:49:20.104 \n",
"... ... ... ... \n",
"31143 2019-11-07 17:04:18.898 7.898 2019-11-07 17:04:23.296 \n",
"31144 2019-11-07 16:59:16.770 1.770 2019-11-07 17:02:41.360 \n",
"31145 2019-11-07 17:02:41.760 206.760 2019-11-07 17:02:46.147 \n",
"31146 2019-11-07 16:57:53.596 3427.596 2019-11-07 16:58:07.712 \n",
"31147 2019-11-07 16:58:08.338 3442.338 2019-11-07 16:58:16.789 \n",
"\n",
" run_duration \n",
"0 16.586 \n",
"1 530.787 \n",
"2 813.656 \n",
"3 11.284 \n",
"4 1.441 \n",
"... ... \n",
"31143 4.398 \n",
"31144 204.590 \n",
"31145 4.387 \n",
"31146 14.116 \n",
"31147 8.451 \n",
"\n",
"[31148 rows x 12 columns]"
]
},
"execution_count": 108,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"jobs"
]
},
{
"cell_type": "code",
"execution_count": 142,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/usr/local/google/home/goncharov/etc/merge-checks/venv/lib/python3.7/site-packages/ipykernel_launcher.py:1: UserWarning: Boolean Series key will be reindexed to match DataFrame index.\n",
" \"\"\"Entry point for launching an IPython kernel.\n"
]
}
],
"source": [
"ds = jobs[jobs['pipeline'] == 'llvm-master-build'][jobs['step_key'] == 'windows'][jobs['state']=='passed'][~jobs['agent_name'].str.startswith('buildkite-')]"
]
},
{
"cell_type": "code",
"execution_count": 146,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>pipeline</th>\n",
" <th>name</th>\n",
" <th>step_key</th>\n",
" <th>state</th>\n",
" <th>exit_status</th>\n",
" <th>agent_id</th>\n",
" <th>agent_name</th>\n",
" <th>runnable_at</th>\n",
" <th>started_at</th>\n",
" <th>wait_duration</th>\n",
" <th>finished_at</th>\n",
" <th>run_duration</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>181</th>\n",
" <td>llvm-master-build</td>\n",
" <td>:windows: build and test windows</td>\n",
" <td>windows</td>\n",
" <td>passed</td>\n",
" <td>0</td>\n",
" <td>5c0f2d87-607b-4ae7-a44c-7a382a0e7705</td>\n",
" <td>w1</td>\n",
" <td>2020-07-16 08:01:15</td>\n",
" <td>2020-07-16 08:11:48.930</td>\n",
" <td>633.930</td>\n",
" <td>2020-07-16 08:50:32.852</td>\n",
" <td>2323.922</td>\n",
" </tr>\n",
" <tr>\n",
" <th>267</th>\n",
" <td>llvm-master-build</td>\n",
" <td>:windows: build and test windows</td>\n",
" <td>windows</td>\n",
" <td>passed</td>\n",
" <td>0</td>\n",
" <td>5c0f2d87-607b-4ae7-a44c-7a382a0e7705</td>\n",
" <td>w1</td>\n",
" <td>2020-07-16 04:01:16</td>\n",
" <td>2020-07-16 06:50:58.490</td>\n",
" <td>10182.490</td>\n",
" <td>2020-07-16 08:11:43.778</td>\n",
" <td>4845.288</td>\n",
" </tr>\n",
" <tr>\n",
" <th>440</th>\n",
" <td>llvm-master-build</td>\n",
" <td>:windows: build and test windows</td>\n",
" <td>windows</td>\n",
" <td>passed</td>\n",
" <td>0</td>\n",
" <td>e503ea2c-8fff-40d9-bc64-299869ccccff</td>\n",
" <td>w-no-ssd</td>\n",
" <td>2020-07-16 00:01:46</td>\n",
" <td>2020-07-16 00:01:51.426</td>\n",
" <td>5.426</td>\n",
" <td>2020-07-16 01:22:54.629</td>\n",
" <td>4863.203</td>\n",
" </tr>\n",
" <tr>\n",
" <th>625</th>\n",
" <td>llvm-master-build</td>\n",
" <td>:windows: build and test windows</td>\n",
" <td>windows</td>\n",
" <td>passed</td>\n",
" <td>0</td>\n",
" <td>17eda84a-51c1-44f1-950f-a1304ac55456</td>\n",
" <td>w1</td>\n",
" <td>2020-07-15 20:02:07</td>\n",
" <td>2020-07-15 20:02:09.353</td>\n",
" <td>2.353</td>\n",
" <td>2020-07-15 21:00:32.799</td>\n",
" <td>3503.446</td>\n",
" </tr>\n",
" <tr>\n",
" <th>863</th>\n",
" <td>llvm-master-build</td>\n",
" <td>:windows: build and test windows</td>\n",
" <td>windows</td>\n",
" <td>passed</td>\n",
" <td>0</td>\n",
" <td>a2f3c85b-378e-4223-858a-ce7a494ff640</td>\n",
" <td>w5</td>\n",
" <td>2020-07-15 16:01:03</td>\n",
" <td>2020-07-15 16:01:12.283</td>\n",
" <td>9.283</td>\n",
" <td>2020-07-15 16:55:52.946</td>\n",
" <td>3280.663</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25093</th>\n",
" <td>llvm-master-build</td>\n",
" <td>:windows: build and test windows</td>\n",
" <td>windows</td>\n",
" <td>passed</td>\n",
" <td>0</td>\n",
" <td>283e8832-4e87-49c6-93ce-5d7d7e521344</td>\n",
" <td>w5</td>\n",
" <td>2020-06-17 12:01:24</td>\n",
" <td>2020-06-17 12:01:27.363</td>\n",
" <td>3.363</td>\n",
" <td>2020-06-17 13:29:18.491</td>\n",
" <td>5271.128</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25258</th>\n",
" <td>llvm-master-build</td>\n",
" <td>:windows: build and test windows</td>\n",
" <td>windows</td>\n",
" <td>passed</td>\n",
" <td>0</td>\n",
" <td>142ddc24-79ae-4f89-b5b3-30ce39c62fb0</td>\n",
" <td>w6</td>\n",
" <td>2020-06-17 08:02:07</td>\n",
" <td>2020-06-17 08:02:11.264</td>\n",
" <td>4.264</td>\n",
" <td>2020-06-17 09:24:04.261</td>\n",
" <td>4912.997</td>\n",
" </tr>\n",
" <tr>\n",
" <th>28534</th>\n",
" <td>llvm-master-build</td>\n",
" <td>:windows: build and test windows</td>\n",
" <td>windows</td>\n",
" <td>passed</td>\n",
" <td>0</td>\n",
" <td>62e608ec-76e4-430d-8f7d-be2d9b2ca729</td>\n",
" <td>windows-dev</td>\n",
" <td>2020-06-06 04:01:47</td>\n",
" <td>2020-06-06 04:01:52.303</td>\n",
" <td>5.303</td>\n",
" <td>2020-06-06 05:14:32.464</td>\n",
" <td>4360.161</td>\n",
" </tr>\n",
" <tr>\n",
" <th>28659</th>\n",
" <td>llvm-master-build</td>\n",
" <td>:windows: build and test windows</td>\n",
" <td>windows</td>\n",
" <td>passed</td>\n",
" <td>0</td>\n",
" <td>62e608ec-76e4-430d-8f7d-be2d9b2ca729</td>\n",
" <td>windows-dev</td>\n",
" <td>2020-06-05 20:01:37</td>\n",
" <td>2020-06-05 20:01:40.598</td>\n",
" <td>3.598</td>\n",
" <td>2020-06-05 20:54:39.448</td>\n",
" <td>3178.850</td>\n",
" </tr>\n",
" <tr>\n",
" <th>28736</th>\n",
" <td>llvm-master-build</td>\n",
" <td>:windows: build and test windows</td>\n",
" <td>windows</td>\n",
" <td>passed</td>\n",
" <td>0</td>\n",
" <td>62e608ec-76e4-430d-8f7d-be2d9b2ca729</td>\n",
" <td>windows-dev</td>\n",
" <td>2020-06-05 16:01:10</td>\n",
" <td>2020-06-05 16:01:14.700</td>\n",
" <td>4.700</td>\n",
" <td>2020-06-05 17:13:38.058</td>\n",
" <td>4343.358</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>136 rows × 12 columns</p>\n",
"</div>"
],
"text/plain": [
" pipeline name step_key state \\\n",
"181 llvm-master-build :windows: build and test windows windows passed \n",
"267 llvm-master-build :windows: build and test windows windows passed \n",
"440 llvm-master-build :windows: build and test windows windows passed \n",
"625 llvm-master-build :windows: build and test windows windows passed \n",
"863 llvm-master-build :windows: build and test windows windows passed \n",
"... ... ... ... ... \n",
"25093 llvm-master-build :windows: build and test windows windows passed \n",
"25258 llvm-master-build :windows: build and test windows windows passed \n",
"28534 llvm-master-build :windows: build and test windows windows passed \n",
"28659 llvm-master-build :windows: build and test windows windows passed \n",
"28736 llvm-master-build :windows: build and test windows windows passed \n",
"\n",
" exit_status agent_id agent_name \\\n",
"181 0 5c0f2d87-607b-4ae7-a44c-7a382a0e7705 w1 \n",
"267 0 5c0f2d87-607b-4ae7-a44c-7a382a0e7705 w1 \n",
"440 0 e503ea2c-8fff-40d9-bc64-299869ccccff w-no-ssd \n",
"625 0 17eda84a-51c1-44f1-950f-a1304ac55456 w1 \n",
"863 0 a2f3c85b-378e-4223-858a-ce7a494ff640 w5 \n",
"... ... ... ... \n",
"25093 0 283e8832-4e87-49c6-93ce-5d7d7e521344 w5 \n",
"25258 0 142ddc24-79ae-4f89-b5b3-30ce39c62fb0 w6 \n",
"28534 0 62e608ec-76e4-430d-8f7d-be2d9b2ca729 windows-dev \n",
"28659 0 62e608ec-76e4-430d-8f7d-be2d9b2ca729 windows-dev \n",
"28736 0 62e608ec-76e4-430d-8f7d-be2d9b2ca729 windows-dev \n",
"\n",
" runnable_at started_at wait_duration \\\n",
"181 2020-07-16 08:01:15 2020-07-16 08:11:48.930 633.930 \n",
"267 2020-07-16 04:01:16 2020-07-16 06:50:58.490 10182.490 \n",
"440 2020-07-16 00:01:46 2020-07-16 00:01:51.426 5.426 \n",
"625 2020-07-15 20:02:07 2020-07-15 20:02:09.353 2.353 \n",
"863 2020-07-15 16:01:03 2020-07-15 16:01:12.283 9.283 \n",
"... ... ... ... \n",
"25093 2020-06-17 12:01:24 2020-06-17 12:01:27.363 3.363 \n",
"25258 2020-06-17 08:02:07 2020-06-17 08:02:11.264 4.264 \n",
"28534 2020-06-06 04:01:47 2020-06-06 04:01:52.303 5.303 \n",
"28659 2020-06-05 20:01:37 2020-06-05 20:01:40.598 3.598 \n",
"28736 2020-06-05 16:01:10 2020-06-05 16:01:14.700 4.700 \n",
"\n",
" finished_at run_duration \n",
"181 2020-07-16 08:50:32.852 2323.922 \n",
"267 2020-07-16 08:11:43.778 4845.288 \n",
"440 2020-07-16 01:22:54.629 4863.203 \n",
"625 2020-07-15 21:00:32.799 3503.446 \n",
"863 2020-07-15 16:55:52.946 3280.663 \n",
"... ... ... \n",
"25093 2020-06-17 13:29:18.491 5271.128 \n",
"25258 2020-06-17 09:24:04.261 4912.997 \n",
"28534 2020-06-06 05:14:32.464 4360.161 \n",
"28659 2020-06-05 20:54:39.448 3178.850 \n",
"28736 2020-06-05 17:13:38.058 4343.358 \n",
"\n",
"[136 rows x 12 columns]"
]
},
"execution_count": 146,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ds"
]
},
{
"cell_type": "code",
"execution_count": 144,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x7f8d86fdae50>"
]
},
"execution_count": 144,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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EvfRQo7cndzLxR9bzcyIwxbt1noILQNpSKfVKoNM2CqHcFsRc624rKOIbhTTG9Uxc1FMsMWjLT/3Rx/nS49+40lf58iRI2P12Txt6RLe8pLvfdKv+2T1s4yTg37ZI5kMWKnmXdZ7JNOE02k6mqvZT2frkWzHbTqdslcybsd0Oh3idps4jonjmCiKRvXZeiSf8YxnKETKWSlIzsDdUzP7MvA64DPAncDLgGcC9+xg00S21fz8PD/0Qz+008244NTnRlbbkwF7co5kmqajcF3dAmezeZLV3MgkScbmSPb7fU6srvLQ2hprJ9dY7a+RJMkZ22pAdzjvsRdF5TzJuM18VM6NrOqFuM1C3BnOlTzzHMmnLe3fks9xLU35449/gqfEc8z1Fs96/la97qRpcyRPDgacGKxxspormQzD4qDPIJthjuT+y7h6OD+ymidZ3Z6oKtX8yKp0Oh0FPznvFCRndxS4GXg9cBfwTuC4b/dkJxG54FQ3yt4NN8mur9qul/r9HauV2ydPnuTUyZN88+RJTj76MKtra5tedy6KWGh3yqAZx2Mh8+qFRZ516eXMR216w0U85ZB8a8fnmrs7g7xctV2t2K5Wba8k/drcxgEn08EwOM6wavvaK7muum3QlFXbS0tLWrUte5KC5OyOAm8B7nD302bWHx7DzN4O/D2ga2Z/Afy6u/+rHWupiMiMwjAcrQ4+V1mWbbiP5GT9xBNPcOrkSf7yxAlOPnzqjKvEAzO6cTwaau/U5oVWc0WjMCAOWuW80uFioPp9JM3KBU4z3UcyK+8f2c8z+lnGapqwmibkE78lp67X7bK0uMTSZfu4duLekVVIrO4rOT8/rx5CueCZOtR2xvLysh87dmynmyEicl5Vv9mm+q02Van/ZpuVlRXW1tZYXV1lbXVt7DfbDAYDkuGvRjwX1W+2iaIWnU65qrnT6Yz9Zpv5+Xm63e5oKLkK2IuLiywtLbGwsEA0w22GRC5EZnbc3TfcmkA9kiIict7Eccxll13GZZdd9qSuU80hrS/UqhZSVb9n28xotVr6Xdsi20hBUkRE9pwgCIjjeKebIXLR0+QNEREREWlEQVJEREREGlGQFBEREZFGFCRFREREpBEFSRERERFpREFSRERERBpRkBQRERGRRhQkRURERKQRBUkRERERaURBUkREREQaUZAUERERkUYUJEVERESkEQVJEREREWlEQVJEREREGlGQFBEREZFGFCRFREREpBEFSRERERFpREFSRERERBpRkBQRERGRRhQkRURERKQRBUkRERERaURBUkREREQaUZAUERERkUYUJEVERESkEQVJEREREWlEQVJEREREGlGQFBEREZFGFCRFREREpBEFSRERERFpREFSRERERBpRkBQRERGRRhQkRURERKQRBUkRERERaURBUkREREQaUZAUERERkUYUJEVERESkEQVJEREREWlEQVJEREREGmntdAMuJGZ2HfBRd3/ODjdFZNfK85wkSRgMBqRpSpIko5KmKWmakmUZWZaRpil5no/28zwnz3OKohgr7j6qpwmCADPDzAiCYFTCMBzVVWm1WqO6XqIoGtXTSqvVwszO86cpIrKzFCRFZCTPcwaDAf1+f0O92fZgMJh+fFj6g/JYkiQMkoQ8L3b6bW4bAywwzIaDPe4Ew4BaD7N
"text/plain": [
"<Figure size 720x720 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
" fig, ax = plt.subplots(figsize=(10,10)) # size of the plot (width, height)\n",
"\n",
" sns.violinplot(\n",
" ax=ax,\n",
" x='run_duration',\n",
" y='agent_name',\n",
" split=True,\n",
" data=ds)"
]
},
{
"cell_type": "code",
"execution_count": 145,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead tr th {\n",
" text-align: left;\n",
" }\n",
"\n",
" .dataframe thead tr:last-of-type th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr>\n",
" <th></th>\n",
" <th>median</th>\n",
" <th>mean</th>\n",
" <th>std</th>\n",
" </tr>\n",
" <tr>\n",
" <th></th>\n",
" <th>run_duration</th>\n",
" <th>run_duration</th>\n",
" <th>run_duration</th>\n",
" </tr>\n",
" <tr>\n",
" <th>agent_name</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>w-no-ssd</th>\n",
" <td>2850.9130</td>\n",
" <td>3247.563941</td>\n",
" <td>1282.447187</td>\n",
" </tr>\n",
" <tr>\n",
" <th>w1</th>\n",
" <td>4622.4640</td>\n",
" <td>4402.738182</td>\n",
" <td>845.100475</td>\n",
" </tr>\n",
" <tr>\n",
" <th>w2</th>\n",
" <td>3721.4650</td>\n",
" <td>3384.658500</td>\n",
" <td>1164.059499</td>\n",
" </tr>\n",
" <tr>\n",
" <th>w3</th>\n",
" <td>4361.7415</td>\n",
" <td>3924.218400</td>\n",
" <td>1015.238411</td>\n",
" </tr>\n",
" <tr>\n",
" <th>w4</th>\n",
" <td>3854.8910</td>\n",
" <td>3736.914565</td>\n",
" <td>923.383163</td>\n",
" </tr>\n",
" <tr>\n",
" <th>w5</th>\n",
" <td>4481.5830</td>\n",
" <td>3896.175667</td>\n",
" <td>1088.397638</td>\n",
" </tr>\n",
" <tr>\n",
" <th>w6</th>\n",
" <td>4018.8300</td>\n",
" <td>3459.808882</td>\n",
" <td>1101.520573</td>\n",
" </tr>\n",
" <tr>\n",
" <th>w64</th>\n",
" <td>2230.6670</td>\n",
" <td>2181.231625</td>\n",
" <td>217.800498</td>\n",
" </tr>\n",
" <tr>\n",
" <th>w7</th>\n",
" <td>3744.3995</td>\n",
" <td>3744.399500</td>\n",
" <td>1399.975967</td>\n",
" </tr>\n",
" <tr>\n",
" <th>windows-dev</th>\n",
" <td>4223.4625</td>\n",
" <td>3996.484000</td>\n",
" <td>557.546608</td>\n",
" </tr>\n",
" <tr>\n",
" <th>wr</th>\n",
" <td>3422.8020</td>\n",
" <td>3422.802000</td>\n",
" <td>2057.547797</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" median mean std\n",
" run_duration run_duration run_duration\n",
"agent_name \n",
"w-no-ssd 2850.9130 3247.563941 1282.447187\n",
"w1 4622.4640 4402.738182 845.100475\n",
"w2 3721.4650 3384.658500 1164.059499\n",
"w3 4361.7415 3924.218400 1015.238411\n",
"w4 3854.8910 3736.914565 923.383163\n",
"w5 4481.5830 3896.175667 1088.397638\n",
"w6 4018.8300 3459.808882 1101.520573\n",
"w64 2230.6670 2181.231625 217.800498\n",
"w7 3744.3995 3744.399500 1399.975967\n",
"windows-dev 4223.4625 3996.484000 557.546608\n",
"wr 3422.8020 3422.802000 2057.547797"
]
},
"execution_count": 145,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pd.pivot_table(ds, values=['run_duration'], index=['agent_name'],\n",
" aggfunc=[np.median, np.mean, np.std])"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.5rc1"
}
},
"nbformat": 4,
"nbformat_minor": 4
}