Skip to content

Commit 86d7fcc

Browse files
committed
Merge branch 'cc/codespeed'
"perf" test output can be sent to codespeed server. * cc/codespeed: perf/run: read GIT_PERF_REPO_NAME from perf.repoName perf/run: learn to send output to codespeed server perf/run: learn about perf.codespeedOutput perf/run: add conf_opts argument to get_var_from_env_or_config() perf/aggregate: implement codespeed JSON output perf/aggregate: refactor printing results perf/aggregate: fix checking ENV{GIT_PERF_SUBSECTION}
2 parents 59b43c0 + 19cf57a commit 86d7fcc

File tree

2 files changed

+137
-54
lines changed

2 files changed

+137
-54
lines changed

t/perf/aggregate.perl

Lines changed: 112 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
use lib '../../perl/blib/lib';
44
use strict;
55
use warnings;
6+
use JSON;
67
use Git;
78

89
sub get_times {
@@ -35,10 +36,15 @@ sub format_times {
3536
return $out;
3637
}
3738

38-
my (@dirs, %dirnames, %dirabbrevs, %prefixes, @tests);
39+
my (@dirs, %dirnames, %dirabbrevs, %prefixes, @tests, $codespeed);
3940
while (scalar @ARGV) {
4041
my $arg = $ARGV[0];
4142
my $dir;
43+
if ($arg eq "--codespeed") {
44+
$codespeed = 1;
45+
shift @ARGV;
46+
next;
47+
}
4248
last if -f $arg or $arg eq "--";
4349
if (! -d $arg) {
4450
my $rev = Git::command_oneline(qw(rev-parse --verify), $arg);
@@ -70,8 +76,10 @@ sub format_times {
7076
}
7177

7278
my $resultsdir = "test-results";
73-
if ($ENV{GIT_PERF_SUBSECTION} ne "") {
79+
my $results_section = "";
80+
if (exists $ENV{GIT_PERF_SUBSECTION} and $ENV{GIT_PERF_SUBSECTION} ne "") {
7481
$resultsdir .= "/" . $ENV{GIT_PERF_SUBSECTION};
82+
$results_section = $ENV{GIT_PERF_SUBSECTION};
7583
}
7684

7785
my @subtests;
@@ -100,13 +108,6 @@ sub read_descr {
100108
return $line;
101109
}
102110

103-
my %descrs;
104-
my $descrlen = 4; # "Test"
105-
for my $t (@subtests) {
106-
$descrs{$t} = $shorttests{$t}.": ".read_descr("$resultsdir/$t.descr");
107-
$descrlen = length $descrs{$t} if length $descrs{$t}>$descrlen;
108-
}
109-
110111
sub have_duplicate {
111112
my %seen;
112113
for (@_) {
@@ -122,54 +123,117 @@ sub have_slash {
122123
return 0;
123124
}
124125

125-
my %newdirabbrevs = %dirabbrevs;
126-
while (!have_duplicate(values %newdirabbrevs)) {
127-
%dirabbrevs = %newdirabbrevs;
128-
last if !have_slash(values %dirabbrevs);
129-
%newdirabbrevs = %dirabbrevs;
130-
for (values %newdirabbrevs) {
131-
s{^[^/]*/}{};
126+
sub print_default_results {
127+
my %descrs;
128+
my $descrlen = 4; # "Test"
129+
for my $t (@subtests) {
130+
$descrs{$t} = $shorttests{$t}.": ".read_descr("$resultsdir/$t.descr");
131+
$descrlen = length $descrs{$t} if length $descrs{$t}>$descrlen;
132132
}
133-
}
134133

135-
my %times;
136-
my @colwidth = ((0)x@dirs);
137-
for my $i (0..$#dirs) {
138-
my $d = $dirs[$i];
139-
my $w = length (exists $dirabbrevs{$d} ? $dirabbrevs{$d} : $dirnames{$d});
140-
$colwidth[$i] = $w if $w > $colwidth[$i];
141-
}
142-
for my $t (@subtests) {
143-
my $firstr;
134+
my %newdirabbrevs = %dirabbrevs;
135+
while (!have_duplicate(values %newdirabbrevs)) {
136+
%dirabbrevs = %newdirabbrevs;
137+
last if !have_slash(values %dirabbrevs);
138+
%newdirabbrevs = %dirabbrevs;
139+
for (values %newdirabbrevs) {
140+
s{^[^/]*/}{};
141+
}
142+
}
143+
144+
my %times;
145+
my @colwidth = ((0)x@dirs);
144146
for my $i (0..$#dirs) {
145147
my $d = $dirs[$i];
146-
$times{$prefixes{$d}.$t} = [get_times("$resultsdir/$prefixes{$d}$t.times")];
147-
my ($r,$u,$s) = @{$times{$prefixes{$d}.$t}};
148-
my $w = length format_times($r,$u,$s,$firstr);
148+
my $w = length (exists $dirabbrevs{$d} ? $dirabbrevs{$d} : $dirnames{$d});
149149
$colwidth[$i] = $w if $w > $colwidth[$i];
150-
$firstr = $r unless defined $firstr;
151150
}
152-
}
153-
my $totalwidth = 3*@dirs+$descrlen;
154-
$totalwidth += $_ for (@colwidth);
155-
156-
binmode STDOUT, ":utf8" or die "PANIC on binmode: $!";
151+
for my $t (@subtests) {
152+
my $firstr;
153+
for my $i (0..$#dirs) {
154+
my $d = $dirs[$i];
155+
$times{$prefixes{$d}.$t} = [get_times("$resultsdir/$prefixes{$d}$t.times")];
156+
my ($r,$u,$s) = @{$times{$prefixes{$d}.$t}};
157+
my $w = length format_times($r,$u,$s,$firstr);
158+
$colwidth[$i] = $w if $w > $colwidth[$i];
159+
$firstr = $r unless defined $firstr;
160+
}
161+
}
162+
my $totalwidth = 3*@dirs+$descrlen;
163+
$totalwidth += $_ for (@colwidth);
157164

158-
printf "%-${descrlen}s", "Test";
159-
for my $i (0..$#dirs) {
160-
my $d = $dirs[$i];
161-
printf " %-$colwidth[$i]s", (exists $dirabbrevs{$d} ? $dirabbrevs{$d} : $dirnames{$d});
162-
}
163-
print "\n";
164-
print "-"x$totalwidth, "\n";
165-
for my $t (@subtests) {
166-
printf "%-${descrlen}s", $descrs{$t};
167-
my $firstr;
165+
printf "%-${descrlen}s", "Test";
168166
for my $i (0..$#dirs) {
169167
my $d = $dirs[$i];
170-
my ($r,$u,$s) = @{$times{$prefixes{$d}.$t}};
171-
printf " %-$colwidth[$i]s", format_times($r,$u,$s,$firstr);
172-
$firstr = $r unless defined $firstr;
168+
printf " %-$colwidth[$i]s", (exists $dirabbrevs{$d} ? $dirabbrevs{$d} : $dirnames{$d});
173169
}
174170
print "\n";
171+
print "-"x$totalwidth, "\n";
172+
for my $t (@subtests) {
173+
printf "%-${descrlen}s", $descrs{$t};
174+
my $firstr;
175+
for my $i (0..$#dirs) {
176+
my $d = $dirs[$i];
177+
my ($r,$u,$s) = @{$times{$prefixes{$d}.$t}};
178+
printf " %-$colwidth[$i]s", format_times($r,$u,$s,$firstr);
179+
$firstr = $r unless defined $firstr;
180+
}
181+
print "\n";
182+
}
183+
}
184+
185+
sub print_codespeed_results {
186+
my ($results_section) = @_;
187+
188+
my $project = "Git";
189+
190+
my $executable = `uname -s -m`;
191+
chomp $executable;
192+
193+
if ($results_section ne "") {
194+
$executable .= ", " . $results_section;
195+
}
196+
197+
my $environment;
198+
if (exists $ENV{GIT_PERF_REPO_NAME} and $ENV{GIT_PERF_REPO_NAME} ne "") {
199+
$environment = $ENV{GIT_PERF_REPO_NAME};
200+
} elsif (exists $ENV{GIT_TEST_INSTALLED} and $ENV{GIT_TEST_INSTALLED} ne "") {
201+
$environment = $ENV{GIT_TEST_INSTALLED};
202+
$environment =~ s|/bin-wrappers$||;
203+
} else {
204+
$environment = `uname -r`;
205+
chomp $environment;
206+
}
207+
208+
my @data;
209+
210+
for my $t (@subtests) {
211+
for my $d (@dirs) {
212+
my $commitid = $prefixes{$d};
213+
$commitid =~ s/^build_//;
214+
$commitid =~ s/\.$//;
215+
my ($result_value, $u, $s) = get_times("$resultsdir/$prefixes{$d}$t.times");
216+
217+
my %vals = (
218+
"commitid" => $commitid,
219+
"project" => $project,
220+
"branch" => $dirnames{$d},
221+
"executable" => $executable,
222+
"benchmark" => $shorttests{$t} . " " . read_descr("$resultsdir/$t.descr"),
223+
"environment" => $environment,
224+
"result_value" => $result_value,
225+
);
226+
push @data, \%vals;
227+
}
228+
}
229+
230+
print to_json(\@data, {utf8 => 1, pretty => 1}), "\n";
231+
}
232+
233+
binmode STDOUT, ":utf8" or die "PANIC on binmode: $!";
234+
235+
if ($codespeed) {
236+
print_codespeed_results($results_section);
237+
} else {
238+
print_default_results();
175239
}

t/perf/run

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,8 @@ get_var_from_env_or_config () {
105105
env_var="$1"
106106
conf_sec="$2"
107107
conf_var="$3"
108-
# $4 can be set to a default value
108+
conf_opts="$4" # optional
109+
# $5 can be set to a default value
109110

110111
# Do nothing if the env variable is already set
111112
eval "test -z \"\${$env_var+x}\"" || return
@@ -116,18 +117,18 @@ get_var_from_env_or_config () {
116117
if test -n "$GIT_PERF_SUBSECTION"
117118
then
118119
var="$conf_sec.$GIT_PERF_SUBSECTION.$conf_var"
119-
conf_value=$(git config -f "$GIT_PERF_CONFIG_FILE" "$var") &&
120+
conf_value=$(git config $conf_opts -f "$GIT_PERF_CONFIG_FILE" "$var") &&
120121
eval "$env_var=\"$conf_value\"" && return
121122
fi
122123
var="$conf_sec.$conf_var"
123-
conf_value=$(git config -f "$GIT_PERF_CONFIG_FILE" "$var") &&
124+
conf_value=$(git config $conf_opts -f "$GIT_PERF_CONFIG_FILE" "$var") &&
124125
eval "$env_var=\"$conf_value\"" && return
125126

126-
test -n "${4+x}" && eval "$env_var=\"$4\""
127+
test -n "${5+x}" && eval "$env_var=\"$5\""
127128
}
128129

129130
run_subsection () {
130-
get_var_from_env_or_config "GIT_PERF_REPEAT_COUNT" "perf" "repeatCount" 3
131+
get_var_from_env_or_config "GIT_PERF_REPEAT_COUNT" "perf" "repeatCount" "--int" 3
131132
export GIT_PERF_REPEAT_COUNT
132133

133134
get_var_from_env_or_config "GIT_PERF_DIRS_OR_REVS" "perf" "dirsOrRevs"
@@ -136,17 +137,35 @@ run_subsection () {
136137
get_var_from_env_or_config "GIT_PERF_MAKE_COMMAND" "perf" "makeCommand"
137138
get_var_from_env_or_config "GIT_PERF_MAKE_OPTS" "perf" "makeOpts"
138139

140+
get_var_from_env_or_config "GIT_PERF_REPO_NAME" "perf" "repoName"
141+
export GIT_PERF_REPO_NAME
142+
139143
GIT_PERF_AGGREGATING_LATER=t
140144
export GIT_PERF_AGGREGATING_LATER
141145

142146
if test $# = 0 -o "$1" = -- -o -f "$1"; then
143147
set -- . "$@"
144148
fi
145149

150+
codespeed_opt=
151+
test "$GIT_PERF_CODESPEED_OUTPUT" = "true" && codespeed_opt="--codespeed"
152+
146153
run_dirs "$@"
147-
./aggregate.perl "$@"
154+
155+
if test -z "$GIT_PERF_SEND_TO_CODESPEED"
156+
then
157+
./aggregate.perl $codespeed_opt "$@"
158+
else
159+
json_res_file="test-results/$GIT_PERF_SUBSECTION/aggregate.json"
160+
./aggregate.perl --codespeed "$@" | tee "$json_res_file"
161+
send_data_url="$GIT_PERF_SEND_TO_CODESPEED/result/add/json/"
162+
curl -v --request POST --data-urlencode "json=$(cat "$json_res_file")" "$send_data_url"
163+
fi
148164
}
149165

166+
get_var_from_env_or_config "GIT_PERF_CODESPEED_OUTPUT" "perf" "codespeedOutput" "--bool"
167+
get_var_from_env_or_config "GIT_PERF_SEND_TO_CODESPEED" "perf" "sendToCodespeed"
168+
150169
cd "$(dirname $0)"
151170
. ../../GIT-BUILD-OPTIONS
152171

0 commit comments

Comments
 (0)