1
+ #! /bin/bash
2
+
3
+ # Install gnuplot
4
+ sudo apt-get update && sudo apt-get install -y gnuplot
5
+
6
+ function extractMetric() {
7
+ local file=" $1 "
8
+ local metric=" $2 "
9
+ grep " $metric " " $file " | awk ' {print $2}' | sed ' s/ms//'
10
+ }
11
+
12
+ function average() {
13
+ echo " $@ " | awk ' {for(i=1;i<=NF;i++) s+=$i; print s/NF}'
14
+ }
15
+
16
+ declare -A formattedServerNames
17
+ formattedServerNames=(
18
+ [" tailcall" ]=" Tailcall"
19
+ [" gqlgen" ]=" Gqlgen"
20
+ [" apollo" ]=" Apollo GraphQL"
21
+ [" netflixdgs" ]=" Netflix DGS"
22
+ [" caliban" ]=" Caliban"
23
+ [" async_graphql" ]=" async-graphql"
24
+ [" hasura" ]=" Hasura"
25
+ [" graphql_jit" ]=" GraphQL JIT"
26
+ )
27
+
28
+ servers=(" apollo" " caliban" " netflixdgs" " gqlgen" " tailcall" " async_graphql" " hasura" " graphql_jit" )
29
+ resultFiles=(" $@ " )
30
+ declare -A avgReqSecs
31
+ declare -A avgLatencies
32
+
33
+ # Extract metrics and calculate averages
34
+ for idx in " ${! servers[@]} " ; do
35
+ startIdx=$(( idx * 3 ))
36
+ reqSecVals=()
37
+ latencyVals=()
38
+ for j in 0 1 2; do
39
+ fileIdx=$(( startIdx + j))
40
+ reqSecVals+=($( extractMetric " ${resultFiles[$fileIdx]} " " Requests/sec" ) )
41
+ latencyVals+=($( extractMetric " ${resultFiles[$fileIdx]} " " Latency" ) )
42
+ done
43
+ avgReqSecs[${servers[$idx]} ]=$( average " ${reqSecVals[@]} " )
44
+ avgLatencies[${servers[$idx]} ]=$( average " ${latencyVals[@]} " )
45
+ done
46
+
47
+ # Generating data files for gnuplot
48
+ reqSecData=" /tmp/reqSec.dat"
49
+ latencyData=" /tmp/latency.dat"
50
+
51
+ echo " Server Value" > " $reqSecData "
52
+ for server in " ${servers[@]} " ; do
53
+ echo " $server ${avgReqSecs[$server]} " >> " $reqSecData "
54
+ done
55
+
56
+ echo " Server Value" > " $latencyData "
57
+ for server in " ${servers[@]} " ; do
58
+ echo " $server ${avgLatencies[$server]} " >> " $latencyData "
59
+ done
60
+
61
+ whichBench=1
62
+ if [[ $1 == bench2* ]]; then
63
+ whichBench=2
64
+ elif [[ $1 == bench3* ]]; then
65
+ whichBench=3
66
+ fi
67
+
68
+ reqSecHistogramFile=" req_sec_histogram${whichBench} .png"
69
+ latencyHistogramFile=" latency_histogram${whichBench} .png"
70
+
71
+ # Plotting using gnuplot
72
+ gnuplot << -EOF
73
+ set term pngcairo size 1280,720 enhanced font "Courier,12"
74
+ set output "$reqSecHistogramFile "
75
+ set style data histograms
76
+ set style histogram cluster gap 1
77
+ set style fill solid border -1
78
+ set xtics rotate by -45
79
+ set boxwidth 0.9
80
+ set title "Requests/Sec"
81
+ stats "$reqSecData " using 2 nooutput
82
+ set yrange [0:STATS_max*1.2]
83
+ set key outside right top
84
+ plot "$reqSecData " using 2:xtic(1) title "Req/Sec"
85
+
86
+ set output "$latencyHistogramFile "
87
+ set title "Latency (in ms)"
88
+ stats "$latencyData " using 2 nooutput
89
+ set yrange [0:STATS_max*1.2]
90
+ plot "$latencyData " using 2:xtic(1) title "Latency"
91
+ EOF
92
+
93
+ # Move PNGs to assets
94
+ mkdir -p assets
95
+ mv $reqSecHistogramFile assets/
96
+ mv $latencyHistogramFile assets/
97
+
98
+ # Declare an associative array for server RPS
99
+ declare -A serverRPS
100
+
101
+ # Populate the serverRPS array
102
+ for server in " ${servers[@]} " ; do
103
+ serverRPS[$server ]=${avgReqSecs[$server]}
104
+ done
105
+
106
+ # Get the servers sorted by RPS in descending order
107
+ IFS=$' \n ' sortedServers=($( for server in " ${! serverRPS[@]} " ; do echo " $server ${serverRPS[$server]} " ; done | sort -rn -k2 | cut -d' ' -f1) )
108
+
109
+ echo " Sorted servers: ${sortedServers[@]} "
110
+ lastServer=" ${sortedServers[-1]} "
111
+ lastServerReqSecs=${avgReqSecs[$lastServer]}
112
+
113
+ # Start building the resultsTable
114
+ if [[ $whichBench == 1 ]]; then
115
+ resultsTable=" <!-- PERFORMANCE_RESULTS_START -->\n\n| Query | Server | Requests/sec | Latency (ms) | Relative |\n|-------:|--------:|--------------:|--------------:|---------:|\n| $whichBench | \` { posts { id userId title user { id name email }}}\` |"
116
+ elif [[ $whichBench == 2 ]]; then
117
+ resultsTable=" | $whichBench | \` { posts { title }}\` |"
118
+ elif [[ $whichBench == 3 ]]; then
119
+ resultsTable=" | $whichBench | \` { greet }\` |"
120
+ fi
121
+
122
+ # Build the resultsTable with sorted servers and formatted numbers
123
+ for server in " ${sortedServers[@]} " ; do
124
+ formattedReqSecs=$( printf " %.2f" ${avgReqSecs[$server]} | perl -pe ' s/(?<=\d)(?=(\d{3})+(\.\d*)?$)/,/g' )
125
+ formattedLatencies=$( printf " %.2f" ${avgLatencies[$server]} | perl -pe ' s/(?<=\d)(?=(\d{3})+(\.\d*)?$)/,/g' )
126
+ # Calculate the relative performance
127
+ relativePerformance=$( echo " ${avgReqSecs[$server]} $lastServerReqSecs " | awk ' {printf "%.2f", $1 / $2}' )
128
+
129
+ resultsTable+=" \n|| [${formattedServerNames[$server]} ] | \` ${formattedReqSecs} \` | \` ${formattedLatencies} \` | \` ${relativePerformance} x\` |"
130
+ done
131
+
132
+ if [[ $whichBench == 3 ]]; then
133
+ resultsTable+=" \n\n<!-- PERFORMANCE_RESULTS_END -->"
134
+ fi
135
+
136
+ echo " resultsTable: $resultsTable "
137
+
138
+ # Print the results table in a new file
139
+ resultsFile=" results.md"
140
+ echo -e $resultsTable >> $resultsFile
141
+
142
+
143
+ if [[ $whichBench == 3 ]]; then
144
+ finalResults=$( printf ' %s\n' " $( cat $resultsFile ) " | sed ' s/$/\\n/' | tr -d ' \n' )
145
+ # Remove the last newline character
146
+ finalResults=${finalResults::- 2}
147
+
148
+ # Print the results as a table in the terminal
149
+ echo -e $finalResults | sed " s/<!-- PERFORMANCE_RESULTS_START-->//;s/<!-- PERFORMANCE_RESULTS_END-->//"
150
+ # Check if the markers are present
151
+ if grep -q " PERFORMANCE_RESULTS_START" README.md; then
152
+ # Replace the old results with the new results
153
+ sed -i " /PERFORMANCE_RESULTS_START/,/PERFORMANCE_RESULTS_END/c\\ $finalResults " README.md
154
+ else
155
+ # Append the results at the end of the README.md file
156
+ echo -e " \n$finalResults " >> README.md
157
+ fi
158
+ fi
159
+
160
+ # Move the generated images to the assets folder
161
+ mv $reqSecHistogramFile assets/
162
+ mv $latencyHistogramFile assets/
163
+
164
+ # Delete the result TXT files
165
+ for file in " ${resultFiles[@]} " ; do
166
+ rm " $file "
167
+ done
0 commit comments