-
-
Notifications
You must be signed in to change notification settings - Fork 297
/
Copy pathmetrics_test.go
195 lines (176 loc) · 4.81 KB
/
metrics_test.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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
package frankenphp
import (
"strings"
"sync"
"testing"
"time"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/testutil"
"github.com/stretchr/testify/require"
)
func createPrometheusMetrics() *PrometheusMetrics {
return &PrometheusMetrics{
registry: prometheus.NewRegistry(),
totalThreads: prometheus.NewCounter(prometheus.CounterOpts{Name: "frankenphp_total_threads"}),
busyThreads: prometheus.NewGauge(prometheus.GaugeOpts{Name: "frankenphp_busy_threads"}),
queueDepth: prometheus.NewGauge(prometheus.GaugeOpts{Name: "frankenphp_queue_depth"}),
mu: sync.Mutex{},
}
}
func TestPrometheusMetrics_TotalWorkers(t *testing.T) {
m := createPrometheusMetrics()
require.Nil(t, m.totalWorkers)
require.Nil(t, m.busyWorkers)
require.Nil(t, m.readyWorkers)
require.Nil(t, m.workerCrashes)
require.Nil(t, m.workerRestarts)
require.Nil(t, m.workerRequestTime)
require.Nil(t, m.workerRequestCount)
m.TotalWorkers("test_worker", 2)
require.NotNil(t, m.totalWorkers)
require.NotNil(t, m.busyWorkers)
require.NotNil(t, m.readyWorkers)
require.NotNil(t, m.workerCrashes)
require.NotNil(t, m.workerRestarts)
require.NotNil(t, m.workerRequestTime)
require.NotNil(t, m.workerRequestCount)
}
func TestPrometheusMetrics_StopWorkerRequest(t *testing.T) {
m := createPrometheusMetrics()
m.TotalWorkers("test_worker", 2)
m.StopWorkerRequest("test_worker", 2*time.Second)
inputs := []struct {
name string
c prometheus.Collector
metadata string
expect string
}{
{
name: "Testing WorkerRequestCount",
c: m.workerRequestCount,
metadata: `
# HELP frankenphp_worker_request_count
# TYPE frankenphp_worker_request_count counter
`,
expect: `
frankenphp_worker_request_count{worker="test_worker"} 1
`,
},
{
name: "Testing BusyWorkers",
c: m.busyWorkers,
metadata: `
# HELP frankenphp_busy_workers Number of busy PHP workers for this worker
# TYPE frankenphp_busy_workers gauge
`,
expect: `
frankenphp_busy_workers{worker="test_worker"} -1
`,
},
{
name: "Testing WorkerRequestTime",
c: m.workerRequestTime,
metadata: `
# HELP frankenphp_worker_request_time
# TYPE frankenphp_worker_request_time counter
`,
expect: `
frankenphp_worker_request_time{worker="test_worker"} 2
`,
},
}
for _, input := range inputs {
t.Run(input.name, func(t *testing.T) {
require.NoError(t, testutil.CollectAndCompare(input.c, strings.NewReader(input.metadata+input.expect)))
})
}
}
func TestPrometheusMetrics_StartWorkerRequest(t *testing.T) {
m := createPrometheusMetrics()
m.TotalWorkers("test_worker", 2)
m.StartWorkerRequest("test_worker")
inputs := []struct {
name string
c prometheus.Collector
metadata string
expect string
}{
{
name: "Testing BusyWorkers",
c: m.busyWorkers,
metadata: `
# HELP frankenphp_busy_workers Number of busy PHP workers for this worker
# TYPE frankenphp_busy_workers gauge
`,
expect: `
frankenphp_busy_workers{worker="test_worker"} 1
`,
},
}
for _, input := range inputs {
t.Run(input.name, func(t *testing.T) {
require.NoError(t, testutil.CollectAndCompare(input.c, strings.NewReader(input.metadata+input.expect)))
})
}
}
func TestPrometheusMetrics_TestStopReasonCrash(t *testing.T) {
m := createPrometheusMetrics()
m.TotalWorkers("test_worker", 2)
m.StopWorker("test_worker", StopReasonCrash)
inputs := []struct {
name string
c prometheus.Collector
metadata string
expect string
}{
{
name: "Testing BusyThreads",
c: m.busyThreads,
metadata: `
# HELP frankenphp_busy_threads
# TYPE frankenphp_busy_threads gauge
`,
expect: `
frankenphp_busy_threads -1
`,
},
{
name: "Testing TotalWorkers",
c: m.totalWorkers,
metadata: `
# HELP frankenphp_total_workers Total number of PHP workers for this worker
# TYPE frankenphp_total_workers gauge
`,
expect: `
frankenphp_total_workers{worker="test_worker"} -1
`,
},
{
name: "Testing ReadyWorkers",
c: m.readyWorkers,
metadata: `
# HELP frankenphp_ready_workers Running workers that have successfully called frankenphp_handle_request at least once
# TYPE frankenphp_ready_workers gauge
`,
expect: `
frankenphp_ready_workers{worker="test_worker"} -1
`,
},
{
name: "Testing WorkerCrashes",
c: m.workerCrashes,
metadata: `
# HELP frankenphp_worker_crashes Number of PHP worker crashes for this worker
# TYPE frankenphp_worker_crashes counter
`,
expect: `
frankenphp_worker_crashes{worker="test_worker"} 1
`,
},
}
for _, input := range inputs {
t.Run(input.name, func(t *testing.T) {
require.NoError(t, testutil.CollectAndCompare(input.c, strings.NewReader(input.metadata+input.expect)))
})
}
}