From d9bc2107e5c69e8e2f47c3c5487aadaef42c0fb0 Mon Sep 17 00:00:00 2001
From: Craig Tiller <ctiller@google.com>
Date: Wed, 15 Feb 2017 08:24:55 -0800
Subject: [PATCH] Update microbenchmarking framework for new benchmark

---
 test/cpp/microbenchmarks/bm_fullstack.cc |  8 ++++----
 tools/profiling/microbenchmarks/bm2bq.py | 11 ++++++++++-
 tools/run_tests/run_microbenchmark.py    | 13 ++++++++++---
 3 files changed, 24 insertions(+), 8 deletions(-)

diff --git a/test/cpp/microbenchmarks/bm_fullstack.cc b/test/cpp/microbenchmarks/bm_fullstack.cc
index f83c3599616..9496a3ac737 100644
--- a/test/cpp/microbenchmarks/bm_fullstack.cc
+++ b/test/cpp/microbenchmarks/bm_fullstack.cc
@@ -312,18 +312,18 @@ class TrickledCHTTP2 : public EndpointPairFixture {
   void AddToLabel(std::ostream& out, benchmark::State& state) {
     out << " writes/iter:"
         << ((double)stats_.num_writes / (double)state.iterations())
-        << " cli-transport-stalls/iter:"
+        << " cli_transport_stalls/iter:"
         << ((double)
                 client_stats_.streams_stalled_due_to_transport_flow_control /
             (double)state.iterations())
-        << " cli-stream-stalls/iter:"
+        << " cli_stream_stalls/iter:"
         << ((double)client_stats_.streams_stalled_due_to_stream_flow_control /
             (double)state.iterations())
-        << " svr-transport-stalls/iter:"
+        << " svr_transport_stalls/iter:"
         << ((double)
                 server_stats_.streams_stalled_due_to_transport_flow_control /
             (double)state.iterations())
-        << " svr-stream-stalls/iter:"
+        << " svr_stream_stalls/iter:"
         << ((double)server_stats_.streams_stalled_due_to_stream_flow_control /
             (double)state.iterations());
   }
diff --git a/tools/profiling/microbenchmarks/bm2bq.py b/tools/profiling/microbenchmarks/bm2bq.py
index 124dbdfec52..fd6207f42bb 100755
--- a/tools/profiling/microbenchmarks/bm2bq.py
+++ b/tools/profiling/microbenchmarks/bm2bq.py
@@ -61,6 +61,11 @@ columns = [
   ('allocs_per_iteration', 'float'),
   ('locks_per_iteration', 'float'),
   ('writes_per_iteration', 'float'),
+  ('bandwidth_kilobits', 'integer'),
+  ('cli_transport_stalls_per_iteration', 'float'),
+  ('cli_stream_stalls_per_iteration', 'float'),
+  ('svr_transport_stalls_per_iteration', 'float'),
+  ('svr_stream_stalls_per_iteration', 'float'),
 ]
 
 if sys.argv[1] == '--schema':
@@ -92,7 +97,11 @@ bm_specs = {
   'BM_StreamingPingPongMsgs': {
     'tpl': ['fixture', 'client_mutator', 'server_mutator'],
     'dyn': ['request_size'],
-  }
+  },
+  'BM_PumpStreamServerToClient_Trickle': {
+    'tpl': [],
+    'dyn': ['request_size', 'bandwidth_kilobits'],
+  },
 }
 
 def numericalize(s):
diff --git a/tools/run_tests/run_microbenchmark.py b/tools/run_tests/run_microbenchmark.py
index 6bba29d74ba..3bb4a9547c8 100755
--- a/tools/run_tests/run_microbenchmark.py
+++ b/tools/run_tests/run_microbenchmark.py
@@ -149,9 +149,12 @@ def collect_summary(bm_name, args):
   subprocess.check_call(
       ['make', bm_name,
        'CONFIG=counters', '-j', '%d' % multiprocessing.cpu_count()])
-  text(subprocess.check_output(['bins/counters/%s' % bm_name,
-                                '--benchmark_out=out.json',
-                                '--benchmark_out_format=json']))
+  cmd = ['bins/counters/%s' % bm_name,
+         '--benchmark_out=out.json',
+         '--benchmark_out_format=json']
+  if args.summary_time is not None:
+    cmd += ['--benchmark_min_time=%d' % args.summary_time]
+  text(subprocess.check_output(cmd))
   if args.bigquery_upload:
     with open('out.csv', 'w') as f:
       f.write(subprocess.check_output(['tools/profiling/microbenchmarks/bm2bq.py', 'out.json']))
@@ -179,6 +182,10 @@ argp.add_argument('--bigquery_upload',
                   action='store_const',
                   const=True,
                   help='Upload results from summary collection to bigquery')
+argp.add_argument('--summary_time',
+                  default=None,
+                  type=int,
+                  help='Minimum time to run benchmarks for the summary collection')
 args = argp.parse_args()
 
 for bm_name in args.benchmarks: