1*cc02d7e2SAndroid Build Coastguard Worker#!/usr/bin/env python3 2*cc02d7e2SAndroid Build Coastguard Worker# 3*cc02d7e2SAndroid Build Coastguard Worker# Copyright 2017 gRPC authors. 4*cc02d7e2SAndroid Build Coastguard Worker# 5*cc02d7e2SAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 6*cc02d7e2SAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 7*cc02d7e2SAndroid Build Coastguard Worker# You may obtain a copy of the License at 8*cc02d7e2SAndroid Build Coastguard Worker# 9*cc02d7e2SAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 10*cc02d7e2SAndroid Build Coastguard Worker# 11*cc02d7e2SAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 12*cc02d7e2SAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 13*cc02d7e2SAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*cc02d7e2SAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 15*cc02d7e2SAndroid Build Coastguard Worker# limitations under the License. 16*cc02d7e2SAndroid Build Coastguard Worker 17*cc02d7e2SAndroid Build Coastguard Worker# Convert google-benchmark json output to something that can be uploaded to 18*cc02d7e2SAndroid Build Coastguard Worker# BigQuery 19*cc02d7e2SAndroid Build Coastguard Worker 20*cc02d7e2SAndroid Build Coastguard Workerimport csv 21*cc02d7e2SAndroid Build Coastguard Workerimport json 22*cc02d7e2SAndroid Build Coastguard Workerimport subprocess 23*cc02d7e2SAndroid Build Coastguard Workerimport sys 24*cc02d7e2SAndroid Build Coastguard Worker 25*cc02d7e2SAndroid Build Coastguard Workerimport bm_json 26*cc02d7e2SAndroid Build Coastguard Worker 27*cc02d7e2SAndroid Build Coastguard Workercolumns = [] 28*cc02d7e2SAndroid Build Coastguard Worker 29*cc02d7e2SAndroid Build Coastguard Workerfor row in json.loads( 30*cc02d7e2SAndroid Build Coastguard Worker # TODO(jtattermusch): make sure the dataset name is not hardcoded 31*cc02d7e2SAndroid Build Coastguard Worker subprocess.check_output( 32*cc02d7e2SAndroid Build Coastguard Worker ["bq", "--format=json", "show", "microbenchmarks.microbenchmarks"] 33*cc02d7e2SAndroid Build Coastguard Worker ) 34*cc02d7e2SAndroid Build Coastguard Worker)["schema"]["fields"]: 35*cc02d7e2SAndroid Build Coastguard Worker columns.append((row["name"], row["type"].lower())) 36*cc02d7e2SAndroid Build Coastguard Worker 37*cc02d7e2SAndroid Build Coastguard WorkerSANITIZE = { 38*cc02d7e2SAndroid Build Coastguard Worker "integer": int, 39*cc02d7e2SAndroid Build Coastguard Worker "float": float, 40*cc02d7e2SAndroid Build Coastguard Worker "boolean": bool, 41*cc02d7e2SAndroid Build Coastguard Worker "string": str, 42*cc02d7e2SAndroid Build Coastguard Worker "timestamp": str, 43*cc02d7e2SAndroid Build Coastguard Worker} 44*cc02d7e2SAndroid Build Coastguard Worker 45*cc02d7e2SAndroid Build Coastguard Worker# TODO(jtattermusch): add proper argparse argument, rather than trying 46*cc02d7e2SAndroid Build Coastguard Worker# to emulate with manual argv inspection. 47*cc02d7e2SAndroid Build Coastguard Workerif sys.argv[1] == "--schema": 48*cc02d7e2SAndroid Build Coastguard Worker print(",\n".join("%s:%s" % (k, t.upper()) for k, t in columns)) 49*cc02d7e2SAndroid Build Coastguard Worker sys.exit(0) 50*cc02d7e2SAndroid Build Coastguard Worker 51*cc02d7e2SAndroid Build Coastguard Workerwith open(sys.argv[1]) as f: 52*cc02d7e2SAndroid Build Coastguard Worker js = json.loads(f.read()) 53*cc02d7e2SAndroid Build Coastguard Worker 54*cc02d7e2SAndroid Build Coastguard Workerif len(sys.argv) > 2: 55*cc02d7e2SAndroid Build Coastguard Worker with open(sys.argv[2]) as f: 56*cc02d7e2SAndroid Build Coastguard Worker js2 = json.loads(f.read()) 57*cc02d7e2SAndroid Build Coastguard Workerelse: 58*cc02d7e2SAndroid Build Coastguard Worker js2 = None 59*cc02d7e2SAndroid Build Coastguard Worker 60*cc02d7e2SAndroid Build Coastguard Worker# TODO(jtattermusch): write directly to a file instead of stdout 61*cc02d7e2SAndroid Build Coastguard Workerwriter = csv.DictWriter(sys.stdout, [c for c, t in columns]) 62*cc02d7e2SAndroid Build Coastguard Worker 63*cc02d7e2SAndroid Build Coastguard Workerfor row in bm_json.expand_json(js, js2): 64*cc02d7e2SAndroid Build Coastguard Worker sane_row = {} 65*cc02d7e2SAndroid Build Coastguard Worker for name, sql_type in columns: 66*cc02d7e2SAndroid Build Coastguard Worker if name in row: 67*cc02d7e2SAndroid Build Coastguard Worker if row[name] == "": 68*cc02d7e2SAndroid Build Coastguard Worker continue 69*cc02d7e2SAndroid Build Coastguard Worker sane_row[name] = SANITIZE[sql_type](row[name]) 70*cc02d7e2SAndroid Build Coastguard Worker writer.writerow(sane_row) 71