#!/usr/bin/python
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
#
# Converts glog output from wal_hiccup into a CSV of all test runs.
#
# The output looks like this:
#
# var1,var2,...,varN,throughput,p95,p99,p99.99,max
# 0,0,...,68.5702,29,8544,22263,29108
#
# Each variable represents a different facet of the test setup.
# The throughput is in MB/s and the latency figures are in us.

import re
import sys

def main():
    if len(sys.argv) != 2:
        print("Usage: %s <log output>" % (sys.argv[0],))
        return
    cols = list()
    cols_printed = False
    with open(sys.argv[1], "r") as f:
        vals = None
        for line in f:
            line = line.strip()

            # Beginning of a test result.
            if "Test results for setup" in line:
                vals = list()

            # End of a test result.
            elif "-------" in line and vals is not None:
                if not cols_printed:
                    print(",".join(cols))
                    cols_printed = True
                print(",".join(vals))
                vals = None

            # Entry in a test result.
            elif vals is not None:
                m = re.match(".*\] ([\w\.]+): ([\d\.]+)", line)
                if not m:
                    continue
                col = m.group(1)
                val = m.group(2)
                if cols_printed:
                    if col not in cols:
                        raise Exception("Unexpected column %s" % (col,))
                else:
                    cols.append(col)
                vals.append(val)

if __name__ == '__main__':
    main()
