#!/usr/bin/perl

#
## 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.

use strict;
use warnings;
#use Data::Dumper;

sub addStat($$$)
{
    my ($stats, $key, $value) = @_;
    #print "$key $value\n";
    $stats->{$key}->{total} = 0 if (!defined $stats->{$key}->{total});
    $stats->{$key}->{count} = 0 if (!defined $stats->{$key}->{count});
    return if (!($value =~ m|^-?\d+\.?\d*$|));
    #print "$key\n";
    $stats->{$key}->{total} += $value if $value >= 0;
    $stats->{$key}->{count}++ if $value >= 0;
    push(@{$stats->{$key}->{values}}, $value) if $value >= 0;
}

sub displayStat($)
{
    my ($stats) = @_;

    printf("%25s %10s %10s %10s %10s %10s %10s %10s %10s\n",
        'key', 'total', 'count', 'mean', 'median', '95th', '99th', 'min', 'max');
    foreach my $key (
        'tls_handshake', 'ua_begin', 'ua_first_read', 'ua_read_header_done', 'cache_open_read_begin',
        'cache_open_read_end', 'cache_open_write_begin', 'cache_open_write_end', 'dns_lookup_begin',
        'dns_lookup_end', 'server_connect', 'server_connect_end',  'server_first_read',
        'server_read_header_done', 'server_close', 'ua_close', 'sm_finish', 'plugin_active', 'plugin_total'
      )
    {

        my $count = $stats->{$key}->{count};
        my $total = $stats->{$key}->{total};
        if (!defined $stats->{$key}->{values}) {
            next;
            #print "$key\n";
            #die $key;
        }
        my @sorted = sort {$a <=> $b} @{$stats->{$key}->{values}};
        my $median = $sorted[int($count / 2)];
        my $p95th  = $sorted[int($count * .95)];
        my $p99th  = $sorted[int($count * .99)];
        my $min    = $sorted[0];
        my $max    = $sorted[$count - 1];
        my $mean   = 0;
        $mean = $total / $count if $count > 0;

        printf("%25s %10.4f %10.4f %10.4f %10.4f %10.4f %10.4f %10.4f %10.4f\n",
            $key, $total, $count, $mean, $median, $p95th, $p99th, $min, $max);
    }
    print "NOTE: Times are in seconds\n";
}

{
    my %stats;

    while (<>) {
        chomp;
        s/unique id/unique_id/;
        s/server state/server_state/;
        s/client state/client_state/;
        if (m|Slow Request: .+ (tls_handshake: .+)|) {
            my %data = split(/: | /, $1);
            foreach my $key (keys %data) {
                next if (!defined $data{$key});
                #print "$key $data{$key}\n";
                addStat(\%stats, $key, $data{$key});
            }
        }
    }

    displayStat(\%stats);
}
