1
1
#!/usr/bin/env node
2
-
3
2
const { execSync } = require ( 'child_process' ) ;
4
3
const fs = require ( 'fs' ) ;
5
4
const path = require ( 'path' ) ;
@@ -16,6 +15,7 @@ function extractMetric(file, metric) {
16
15
}
17
16
18
17
function average ( values ) {
18
+ if ( values . length === 0 ) return 0 ;
19
19
const sum = values . reduce ( ( a , b ) => parseFloat ( a ) + parseFloat ( b ) , 0 ) ;
20
20
return sum / values . length ;
21
21
}
@@ -42,10 +42,12 @@ servers.forEach((server, idx) => {
42
42
const latencyVals = [ ] ;
43
43
for ( let j = 0 ; j < 3 ; j ++ ) {
44
44
const fileIdx = startIdx + j ;
45
- const reqSec = extractMetric ( resultFiles [ fileIdx ] , "Requests/sec" ) ;
46
- const latency = extractMetric ( resultFiles [ fileIdx ] , "Latency" ) ;
47
- if ( reqSec !== null ) reqSecVals . push ( reqSec ) ;
48
- if ( latency !== null ) latencyVals . push ( latency ) ;
45
+ if ( fileIdx < resultFiles . length ) {
46
+ const reqSec = extractMetric ( resultFiles [ fileIdx ] , "Requests/sec" ) ;
47
+ const latency = extractMetric ( resultFiles [ fileIdx ] , "Latency" ) ;
48
+ if ( reqSec !== null ) reqSecVals . push ( reqSec ) ;
49
+ if ( latency !== null ) latencyVals . push ( latency ) ;
50
+ }
49
51
}
50
52
avgReqSecs [ server ] = average ( reqSecVals ) ;
51
53
avgLatencies [ server ] = average ( latencyVals ) ;
@@ -54,25 +56,43 @@ servers.forEach((server, idx) => {
54
56
const reqSecData = "/tmp/reqSec.dat" ;
55
57
const latencyData = "/tmp/latency.dat" ;
56
58
57
- fs . writeFileSync ( reqSecData , "Server Value\n" + servers . map ( server => `${ server } ${ avgReqSecs [ server ] } ` ) . join ( '\n' ) ) ;
58
- fs . writeFileSync ( latencyData , "Server Value\n" + servers . map ( server => `${ server } ${ avgLatencies [ server ] } ` ) . join ( '\n' ) ) ;
59
+ try {
60
+ fs . writeFileSync ( reqSecData , "Server Value\n" + servers . map ( server => `${ server } ${ avgReqSecs [ server ] } ` ) . join ( '\n' ) ) ;
61
+ fs . writeFileSync ( latencyData , "Server Value\n" + servers . map ( server => `${ server } ${ avgLatencies [ server ] } ` ) . join ( '\n' ) ) ;
62
+ } catch ( error ) {
63
+ console . error ( `Error writing data files: ${ error . message } ` ) ;
64
+ }
59
65
60
66
let whichBench = 1 ;
61
- if ( resultFiles [ 0 ] . startsWith ( "bench2" ) ) {
62
- whichBench = 2 ;
63
- } else if ( resultFiles [ 0 ] . startsWith ( "bench3" ) ) {
64
- whichBench = 3 ;
67
+ if ( resultFiles . length > 0 ) {
68
+ if ( resultFiles [ 0 ] . startsWith ( "bench2" ) ) {
69
+ whichBench = 2 ;
70
+ } else if ( resultFiles [ 0 ] . startsWith ( "bench3" ) ) {
71
+ whichBench = 3 ;
72
+ }
65
73
}
66
74
67
75
const reqSecHistogramFile = `req_sec_histogram${ whichBench } .png` ;
68
76
const latencyHistogramFile = `latency_histogram${ whichBench } .png` ;
69
77
70
78
function getMaxValue ( data ) {
71
- return Math . max ( ...data . split ( '\n' ) . slice ( 1 ) . map ( line => parseFloat ( line . split ( ' ' ) [ 1 ] ) ) ) ;
79
+ try {
80
+ return Math . max ( ...data . split ( '\n' ) . slice ( 1 ) . map ( line => parseFloat ( line . split ( ' ' ) [ 1 ] ) ) ) ;
81
+ } catch ( error ) {
82
+ console . error ( `Error getting max value: ${ error . message } ` ) ;
83
+ return 0 ;
84
+ }
72
85
}
73
86
74
- const reqSecMax = getMaxValue ( fs . readFileSync ( reqSecData , 'utf-8' ) ) * 1.2 ;
75
- const latencyMax = getMaxValue ( fs . readFileSync ( latencyData , 'utf-8' ) ) * 1.2 ;
87
+ let reqSecMax , latencyMax ;
88
+ try {
89
+ reqSecMax = getMaxValue ( fs . readFileSync ( reqSecData , 'utf-8' ) ) * 1.2 ;
90
+ latencyMax = getMaxValue ( fs . readFileSync ( latencyData , 'utf-8' ) ) * 1.2 ;
91
+ } catch ( error ) {
92
+ console . error ( `Error reading data files: ${ error . message } ` ) ;
93
+ reqSecMax = 0 ;
94
+ latencyMax = 0 ;
95
+ }
76
96
77
97
const gnuplotScript = `
78
98
set term pngcairo size 1280,720 enhanced font 'Courier,12'
@@ -94,19 +114,26 @@ plot '${latencyData}' using 2:xtic(1) title 'Latency'
94
114
` ;
95
115
96
116
const gnuplotScriptFile = '/tmp/gnuplot_script.gp' ;
97
- fs . writeFileSync ( gnuplotScriptFile , gnuplotScript ) ;
117
+ try {
118
+ fs . writeFileSync ( gnuplotScriptFile , gnuplotScript ) ;
119
+ } catch ( error ) {
120
+ console . error ( `Error writing gnuplot script: ${ error . message } ` ) ;
121
+ }
98
122
99
123
try {
100
124
execSync ( `gnuplot ${ gnuplotScriptFile } ` , { stdio : 'inherit' } ) ;
101
125
console . log ( 'Gnuplot executed successfully' ) ;
102
126
} catch ( error ) {
103
127
console . error ( 'Error executing gnuplot:' , error . message ) ;
104
- process . exit ( 1 ) ;
105
128
}
106
129
107
130
const assetsDir = path . join ( __dirname , "assets" ) ;
108
131
if ( ! fs . existsSync ( assetsDir ) ) {
109
- fs . mkdirSync ( assetsDir ) ;
132
+ try {
133
+ fs . mkdirSync ( assetsDir ) ;
134
+ } catch ( error ) {
135
+ console . error ( `Error creating assets directory: ${ error . message } ` ) ;
136
+ }
110
137
}
111
138
112
139
function moveFile ( source , destination ) {
@@ -138,11 +165,15 @@ const lastServerReqSecs = avgReqSecs[lastServer];
138
165
139
166
const resultsFile = "results.md" ;
140
167
141
- if ( ! fs . existsSync ( resultsFile ) || fs . readFileSync ( resultsFile , 'utf8' ) . trim ( ) === '' ) {
142
- fs . writeFileSync ( resultsFile , `<!-- PERFORMANCE_RESULTS_START -->
168
+ try {
169
+ if ( ! fs . existsSync ( resultsFile ) || fs . readFileSync ( resultsFile , 'utf8' ) . trim ( ) === '' ) {
170
+ fs . writeFileSync ( resultsFile , `<!-- PERFORMANCE_RESULTS_START -->
143
171
144
172
| Query | Server | Requests/sec | Latency (ms) | Relative |
145
173
|-------:|--------:|--------------:|--------------:|---------:|` ) ;
174
+ }
175
+ } catch ( error ) {
176
+ console . error ( `Error initializing results file: ${ error . message } ` ) ;
146
177
}
147
178
148
179
let resultsTable = "" ;
@@ -169,30 +200,43 @@ sortedServers.forEach((server) => {
169
200
resultsTable += `\n|| [${ formattedServerNames [ server ] } ] | \`${ formattedReqSecs } \` | \`${ formattedLatencies } \` | \`${ relativePerformance } x\` |` ;
170
201
} ) ;
171
202
172
- fs . appendFileSync ( resultsFile , resultsTable ) ;
203
+ try {
204
+ fs . appendFileSync ( resultsFile , resultsTable ) ;
205
+ } catch ( error ) {
206
+ console . error ( `Error appending to results file: ${ error . message } ` ) ;
207
+ }
173
208
174
209
if ( whichBench === 3 ) {
175
- fs . appendFileSync ( resultsFile , "\n\n<!-- PERFORMANCE_RESULTS_END -->" ) ;
176
-
177
- const finalResults = fs
178
- . readFileSync ( resultsFile , "utf-8" )
179
- . replace ( / ( \r \n | \n | \r ) / gm, "\\n" ) ;
180
-
181
- const readmePath = "README.md" ;
182
- let readmeContent = fs . readFileSync ( readmePath , "utf-8" ) ;
183
- const performanceResultsRegex =
184
- / < ! - - P E R F O R M A N C E _ R E S U L T S _ S T A R T - - > [ \s \S ] * < ! - - P E R F O R M A N C E _ R E S U L T S _ E N D - - > / ;
185
- if ( performanceResultsRegex . test ( readmeContent ) ) {
186
- readmeContent = readmeContent . replace (
187
- performanceResultsRegex ,
188
- finalResults
189
- ) ;
190
- } else {
191
- readmeContent += `\n${ finalResults } ` ;
210
+ try {
211
+ fs . appendFileSync ( resultsFile , "\n\n<!-- PERFORMANCE_RESULTS_END -->" ) ;
212
+
213
+ const finalResults = fs
214
+ . readFileSync ( resultsFile , "utf-8" )
215
+ . replace ( / \\ / g, '' ) ; // Remove backslashes
216
+
217
+ const readmePath = "README.md" ;
218
+ let readmeContent = fs . readFileSync ( readmePath , "utf-8" ) ;
219
+ const performanceResultsRegex =
220
+ / < ! - - P E R F O R M A N C E _ R E S U L T S _ S T A R T - - > [ \s \S ] * < ! - - P E R F O R M A N C E _ R E S U L T S _ E N D - - > / ;
221
+ if ( performanceResultsRegex . test ( readmeContent ) ) {
222
+ readmeContent = readmeContent . replace (
223
+ performanceResultsRegex ,
224
+ finalResults
225
+ ) ;
226
+ } else {
227
+ readmeContent += `\n${ finalResults } ` ;
228
+ }
229
+ fs . writeFileSync ( readmePath , readmeContent ) ;
230
+ console . log ( "README.md updated successfully" ) ;
231
+ } catch ( error ) {
232
+ console . error ( `Error updating README: ${ error . message } ` ) ;
192
233
}
193
- fs . writeFileSync ( readmePath , readmeContent ) ;
194
234
}
195
235
196
236
resultFiles . forEach ( ( file ) => {
197
- fs . unlinkSync ( file ) ;
198
- } ) ;
237
+ try {
238
+ fs . unlinkSync ( file ) ;
239
+ } catch ( error ) {
240
+ console . error ( `Error deleting file ${ file } : ${ error . message } ` ) ;
241
+ }
242
+ } ) ;
0 commit comments