-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathreport.go
116 lines (98 loc) · 2.36 KB
/
report.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
package main
import (
"fmt"
"sort"
"time"
)
type report struct {
query query
// captured results
results []result
// derived numbers
numberOfQueries int
failedQueries int
totalTime time.Duration
totalExecTime time.Duration
maxTime time.Duration
minTime time.Duration
avgTime time.Duration
medTime time.Duration
}
func newReport(q query) report {
r := report{}
r.results = []result{}
r.query = q
return r
}
type result struct {
st time.Time
et time.Time
statusCode int
err error
isError bool
}
func (r *report) Prepare() {
validResults := []result{}
r.numberOfQueries = len(r.results)
for _, res := range r.results {
if res.isError {
r.failedQueries++
} else {
validResults = append(validResults, res)
}
}
goodQueries := r.numberOfQueries - r.failedQueries
if goodQueries <= 0 {
return
}
minSt := validResults[0].st
maxEt := validResults[0].et
execTime := validResults[0].et.Sub(validResults[0].st)
r.minTime = execTime
r.maxTime = execTime
r.totalExecTime = execTime
// for median
execTimes := []time.Duration{}
execTimes = append(execTimes, execTime)
for i := 1; i < len(validResults); i++ {
if validResults[i].st.Before(minSt) {
minSt = validResults[i].st
}
if validResults[i].et.After(maxEt) {
maxEt = validResults[i].et
}
execTime := validResults[i].et.Sub(validResults[i].st)
if r.minTime > execTime {
r.minTime = execTime
}
if r.maxTime < execTime {
r.maxTime = execTime
}
r.totalExecTime += execTime // for avg
execTimes = append(execTimes, execTime) // for median
}
r.totalTime = maxEt.Sub(minSt)
r.avgTime = time.Duration(int64(r.totalExecTime) / int64(goodQueries))
sort.Slice(execTimes, func(i, j int) bool {
return int64(execTimes[i]) < int64(execTimes[j])
})
if len(execTimes)%2 == 0 {
r.medTime = (execTimes[(len(execTimes)/2)-1] + execTimes[len(execTimes)/2]) / 2
} else {
r.medTime = execTimes[len(execTimes)/2]
}
}
func (r *report) Print() {
r.Prepare()
fmt.Println("--------")
fmt.Println("query str:", r.query.queryStr)
fmt.Println("#queries:", r.numberOfQueries)
fmt.Println("#failed queries:", r.failedQueries)
fmt.Println("total time:", r.totalTime)
fmt.Println("min time:", r.minTime)
fmt.Println("max time:", r.maxTime)
fmt.Println("avg time:", r.avgTime)
fmt.Println("med time:", r.medTime)
fmt.Println("--------")
fmt.Println()
}