-
Notifications
You must be signed in to change notification settings - Fork 343
/
client.go
91 lines (78 loc) · 1.93 KB
/
client.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
package httptest
import (
"io"
"strconv"
"time"
vegeta "github.com/tsenart/vegeta/lib"
)
type VegetaAttacker struct {
attacker *vegeta.Attacker
metrics *vegeta.Metrics
rate *vegeta.Rate
targeter vegeta.Targeter
}
func NewVegetaAttacker(url string, freq int, per time.Duration, timeout time.Duration) *VegetaAttacker {
atk := vegeta.NewAttacker(
vegeta.Connections(10),
vegeta.H2C(false),
vegeta.HTTP2(false),
vegeta.KeepAlive(true),
vegeta.MaxWorkers(10),
vegeta.Redirects(0),
vegeta.Timeout(timeout),
vegeta.Workers(5),
)
tr := vegeta.NewStaticTargeter(vegeta.Target{Method: "GET", URL: url})
rate := vegeta.Rate{Freq: freq, Per: per}
m := vegeta.Metrics{
Histogram: &vegeta.Histogram{
Buckets: []time.Duration{
0,
10 * time.Microsecond,
50 * time.Microsecond,
100 * time.Microsecond,
500 * time.Microsecond,
1 * time.Millisecond,
5 * time.Millisecond,
10 * time.Millisecond,
25 * time.Millisecond,
50 * time.Millisecond,
100 * time.Millisecond,
1000 * time.Millisecond,
},
},
}
return &VegetaAttacker{
attacker: atk,
metrics: &m,
rate: &rate,
targeter: tr,
}
}
func (atk *VegetaAttacker) Attack(w io.Writer, d time.Duration, name string) {
for res := range atk.attacker.Attack(atk.targeter, atk.rate, d, name) {
if res == nil {
continue
}
atk.metrics.Add(res)
}
atk.metrics.Close()
reporter := vegeta.NewTextReporter(atk.metrics)
reporter.Report(w)
}
func (atk *VegetaAttacker) Metrics() *vegeta.Metrics {
return atk.metrics
}
func (atk *VegetaAttacker) Success() float64 {
return atk.metrics.Success
}
func (atk *VegetaAttacker) TotalRequests() uint64 {
return atk.metrics.Requests
}
func (atk *VegetaAttacker) TotalSuccess() float64 {
return atk.metrics.Success * float64(atk.metrics.Requests)
}
func (atk *VegetaAttacker) CountStatus(code int) (int, bool) {
cnt, ok := atk.metrics.StatusCodes[strconv.Itoa(code)]
return cnt, ok
}