master
go 584 lines 34.5 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package nginxplus
4
5 import (
6 "context"
7 "fmt"
8 "net/http"
9 "net/http/httptest"
10 "os"
11 "testing"
12
13 "github.com/netdata/netdata/go/plugins/pkg/web"
14 "github.com/netdata/netdata/go/plugins/plugin/framework/collectorapi"
15 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/collecttest"
16
17 "github.com/stretchr/testify/assert"
18 "github.com/stretchr/testify/require"
19 )
20
21 var (
22 dataConfigJSON, _ = os.ReadFile("testdata/config.json")
23 dataConfigYAML, _ = os.ReadFile("testdata/config.yaml")
24
25 dataAPI8APIVersions, _ = os.ReadFile("testdata/api-8/api_versions.json")
26 dataAPI8Connections, _ = os.ReadFile("testdata/api-8/connections.json")
27 dataAPI8EndpointsHTTP, _ = os.ReadFile("testdata/api-8/endpoints_http.json")
28 dataAPI8EndpointsRoot, _ = os.ReadFile("testdata/api-8/endpoints_root.json")
29 dataAPI8EndpointsStream, _ = os.ReadFile("testdata/api-8/endpoints_stream.json")
30 dataAPI8HTTPCaches, _ = os.ReadFile("testdata/api-8/http_caches.json")
31 dataAPI8HTTPLocationZones, _ = os.ReadFile("testdata/api-8/http_location_zones.json")
32 dataAPI8HTTPRequests, _ = os.ReadFile("testdata/api-8/http_requests.json")
33 dataAPI8HTTPServerZones, _ = os.ReadFile("testdata/api-8/http_server_zones.json")
34 dataAPI8HTTPUpstreams, _ = os.ReadFile("testdata/api-8/http_upstreams.json")
35 dataAPI8SSL, _ = os.ReadFile("testdata/api-8/ssl.json")
36 dataAPI8StreamServerZones, _ = os.ReadFile("testdata/api-8/stream_server_zones.json")
37 dataAPI8StreamUpstreams, _ = os.ReadFile("testdata/api-8/stream_upstreams.json")
38 dataAPI8Resolvers, _ = os.ReadFile("testdata/api-8/resolvers.json")
39 data404, _ = os.ReadFile("testdata/404.json")
40 )
41
42 func Test_testDataIsValid(t *testing.T) {
43 for name, data := range map[string][]byte{
44 "dataConfigJSON": dataConfigJSON,
45 "dataConfigYAML": dataConfigYAML,
46 "dataAPI8APIVersions": dataAPI8APIVersions,
47 "dataAPI8Connections": dataAPI8Connections,
48 "dataAPI8EndpointsHTTP": dataAPI8EndpointsHTTP,
49 "dataAPI8EndpointsRoot": dataAPI8EndpointsRoot,
50 "dataAPI8EndpointsStream": dataAPI8EndpointsStream,
51 "dataAPI8HTTPCaches": dataAPI8HTTPCaches,
52 "dataAPI8HTTPLocationZones": dataAPI8HTTPLocationZones,
53 "dataAPI8HTTPRequests": dataAPI8HTTPRequests,
54 "dataAPI8HTTPServerZones": dataAPI8HTTPServerZones,
55 "dataAPI8HTTPUpstreams": dataAPI8HTTPUpstreams,
56 "dataAPI8SSL": dataAPI8SSL,
57 "dataAPI8StreamServerZones": dataAPI8StreamServerZones,
58 "dataAPI8StreamUpstreams": dataAPI8StreamUpstreams,
59 "dataAPI8Resolvers": dataAPI8Resolvers,
60 "data404": data404,
61 } {
62 require.NotNil(t, data, name)
63 }
64 }
65
66 func TestCollector_ConfigurationSerialize(t *testing.T) {
67 collecttest.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
68 }
69
70 func TestCollector_Init(t *testing.T) {
71 tests := map[string]struct {
72 wantFail bool
73 config Config
74 }{
75 "success with default": {
76 wantFail: false,
77 config: New().Config,
78 },
79 "fail when URL not set": {
80 wantFail: true,
81 config: Config{
82 HTTPConfig: web.HTTPConfig{
83 RequestConfig: web.RequestConfig{URL: ""},
84 },
85 },
86 },
87 }
88
89 for name, test := range tests {
90 t.Run(name, func(t *testing.T) {
91 collr := New()
92 collr.Config = test.config
93
94 if test.wantFail {
95 assert.Error(t, collr.Init(context.Background()))
96 } else {
97 assert.NoError(t, collr.Init(context.Background()))
98 }
99 })
100 }
101 }
102
103 func TestCollector_Check(t *testing.T) {
104 tests := map[string]struct {
105 wantFail bool
106 prepare func(t *testing.T) (collr *Collector, cleanup func())
107 }{
108 "success when all requests OK": {
109 wantFail: false,
110 prepare: caseAPI8AllRequestsOK,
111 },
112 "success when all requests except stream OK": {
113 wantFail: false,
114 prepare: caseAPI8AllRequestsExceptStreamOK,
115 },
116 "fail on invalid data response": {
117 wantFail: true,
118 prepare: caseInvalidDataResponse,
119 },
120 "fail on connection refused": {
121 wantFail: true,
122 prepare: caseConnectionRefused,
123 },
124 }
125
126 for name, test := range tests {
127 t.Run(name, func(t *testing.T) {
128 collr, cleanup := test.prepare(t)
129 defer cleanup()
130
131 if test.wantFail {
132 assert.Error(t, collr.Check(context.Background()))
133 } else {
134 assert.NoError(t, collr.Check(context.Background()))
135 }
136 })
137 }
138 }
139
140 func TestCollector_Collect(t *testing.T) {
141 tests := map[string]struct {
142 prepare func(t *testing.T) (collr *Collector, cleanup func())
143 wantNumOfCharts int
144 wantMetrics map[string]int64
145 }{
146 "success when all requests OK": {
147 prepare: caseAPI8AllRequestsOK,
148 wantNumOfCharts: len(baseCharts) +
149 len(httpCacheChartsTmpl) +
150 len(httpServerZoneChartsTmpl) +
151 len(httpLocationZoneChartsTmpl)*2 +
152 len(httpUpstreamChartsTmpl) +
153 len(httpUpstreamServerChartsTmpl)*2 +
154 len(streamServerZoneChartsTmpl) +
155 len(streamUpstreamChartsTmpl) +
156 len(streamUpstreamServerChartsTmpl)*2 +
157 len(resolverZoneChartsTmpl)*2,
158 wantMetrics: map[string]int64{
159 "connections_accepted": 6079,
160 "connections_active": 1,
161 "connections_dropped": 0,
162 "connections_idle": 8,
163 "http_cache_cache_backend_bypassed_bytes": 67035,
164 "http_cache_cache_backend_bypassed_responses": 109,
165 "http_cache_cache_backend_served_bytes": 0,
166 "http_cache_cache_backend_served_responses": 0,
167 "http_cache_cache_backend_size": 0,
168 "http_cache_cache_backend_state_cold": 0,
169 "http_cache_cache_backend_state_warm": 1,
170 "http_cache_cache_backend_written_bytes": 0,
171 "http_cache_cache_backend_written_responses": 0,
172 "http_location_zone_server_api_bytes_received": 1854427,
173 "http_location_zone_server_api_bytes_sent": 4668778,
174 "http_location_zone_server_api_requests": 9188,
175 "http_location_zone_server_api_requests_discarded": 0,
176 "http_location_zone_server_api_responses": 9188,
177 "http_location_zone_server_api_responses_1xx": 0,
178 "http_location_zone_server_api_responses_2xx": 9187,
179 "http_location_zone_server_api_responses_3xx": 0,
180 "http_location_zone_server_api_responses_4xx": 1,
181 "http_location_zone_server_api_responses_5xx": 0,
182 "http_location_zone_server_dashboard_bytes_received": 0,
183 "http_location_zone_server_dashboard_bytes_sent": 0,
184 "http_location_zone_server_dashboard_requests": 0,
185 "http_location_zone_server_dashboard_requests_discarded": 0,
186 "http_location_zone_server_dashboard_responses": 0,
187 "http_location_zone_server_dashboard_responses_1xx": 0,
188 "http_location_zone_server_dashboard_responses_2xx": 0,
189 "http_location_zone_server_dashboard_responses_3xx": 0,
190 "http_location_zone_server_dashboard_responses_4xx": 0,
191 "http_location_zone_server_dashboard_responses_5xx": 0,
192 "http_requests_current": 1,
193 "http_requests_total": 8363,
194 "http_server_zone_server_backend_bytes_received": 1773834,
195 "http_server_zone_server_backend_bytes_sent": 4585734,
196 "http_server_zone_server_backend_requests": 8962,
197 "http_server_zone_server_backend_requests_discarded": 0,
198 "http_server_zone_server_backend_requests_processing": 1,
199 "http_server_zone_server_backend_responses": 8961,
200 "http_server_zone_server_backend_responses_1xx": 0,
201 "http_server_zone_server_backend_responses_2xx": 8960,
202 "http_server_zone_server_backend_responses_3xx": 0,
203 "http_server_zone_server_backend_responses_4xx": 1,
204 "http_server_zone_server_backend_responses_5xx": 0,
205 "http_upstream_backend_server_127.0.0.1:81_zone_http_backend_active": 0,
206 "http_upstream_backend_server_127.0.0.1:81_zone_http_backend_bytes_received": 0,
207 "http_upstream_backend_server_127.0.0.1:81_zone_http_backend_bytes_sent": 0,
208 "http_upstream_backend_server_127.0.0.1:81_zone_http_backend_downtime": 1020,
209 "http_upstream_backend_server_127.0.0.1:81_zone_http_backend_header_time": 0,
210 "http_upstream_backend_server_127.0.0.1:81_zone_http_backend_requests": 26,
211 "http_upstream_backend_server_127.0.0.1:81_zone_http_backend_response_time": 0,
212 "http_upstream_backend_server_127.0.0.1:81_zone_http_backend_responses": 0,
213 "http_upstream_backend_server_127.0.0.1:81_zone_http_backend_responses_1xx": 0,
214 "http_upstream_backend_server_127.0.0.1:81_zone_http_backend_responses_2xx": 0,
215 "http_upstream_backend_server_127.0.0.1:81_zone_http_backend_responses_3xx": 0,
216 "http_upstream_backend_server_127.0.0.1:81_zone_http_backend_responses_4xx": 0,
217 "http_upstream_backend_server_127.0.0.1:81_zone_http_backend_responses_5xx": 0,
218 "http_upstream_backend_server_127.0.0.1:81_zone_http_backend_state_checking": 0,
219 "http_upstream_backend_server_127.0.0.1:81_zone_http_backend_state_down": 0,
220 "http_upstream_backend_server_127.0.0.1:81_zone_http_backend_state_draining": 0,
221 "http_upstream_backend_server_127.0.0.1:81_zone_http_backend_state_unavail": 1,
222 "http_upstream_backend_server_127.0.0.1:81_zone_http_backend_state_unhealthy": 0,
223 "http_upstream_backend_server_127.0.0.1:81_zone_http_backend_state_up": 0,
224 "http_upstream_backend_server_127.0.0.1:82_zone_http_backend_active": 0,
225 "http_upstream_backend_server_127.0.0.1:82_zone_http_backend_bytes_received": 86496,
226 "http_upstream_backend_server_127.0.0.1:82_zone_http_backend_bytes_sent": 9180,
227 "http_upstream_backend_server_127.0.0.1:82_zone_http_backend_downtime": 0,
228 "http_upstream_backend_server_127.0.0.1:82_zone_http_backend_header_time": 1,
229 "http_upstream_backend_server_127.0.0.1:82_zone_http_backend_requests": 102,
230 "http_upstream_backend_server_127.0.0.1:82_zone_http_backend_response_time": 1,
231 "http_upstream_backend_server_127.0.0.1:82_zone_http_backend_responses": 102,
232 "http_upstream_backend_server_127.0.0.1:82_zone_http_backend_responses_1xx": 0,
233 "http_upstream_backend_server_127.0.0.1:82_zone_http_backend_responses_2xx": 102,
234 "http_upstream_backend_server_127.0.0.1:82_zone_http_backend_responses_3xx": 0,
235 "http_upstream_backend_server_127.0.0.1:82_zone_http_backend_responses_4xx": 0,
236 "http_upstream_backend_server_127.0.0.1:82_zone_http_backend_responses_5xx": 0,
237 "http_upstream_backend_server_127.0.0.1:82_zone_http_backend_state_checking": 0,
238 "http_upstream_backend_server_127.0.0.1:82_zone_http_backend_state_down": 0,
239 "http_upstream_backend_server_127.0.0.1:82_zone_http_backend_state_draining": 0,
240 "http_upstream_backend_server_127.0.0.1:82_zone_http_backend_state_unavail": 0,
241 "http_upstream_backend_server_127.0.0.1:82_zone_http_backend_state_unhealthy": 0,
242 "http_upstream_backend_server_127.0.0.1:82_zone_http_backend_state_up": 1,
243 "http_upstream_backend_zone_http_backend_keepalive": 0,
244 "http_upstream_backend_zone_http_backend_peers": 2,
245 "http_upstream_backend_zone_http_backend_zombies": 0,
246 "resolver_zone_resolver-http_requests_addr": 0,
247 "resolver_zone_resolver-http_requests_name": 0,
248 "resolver_zone_resolver-http_requests_srv": 2939408,
249 "resolver_zone_resolver-http_responses_formerr": 0,
250 "resolver_zone_resolver-http_responses_noerror": 0,
251 "resolver_zone_resolver-http_responses_notimp": 0,
252 "resolver_zone_resolver-http_responses_nxdomain": 2939404,
253 "resolver_zone_resolver-http_responses_refused": 0,
254 "resolver_zone_resolver-http_responses_servfail": 0,
255 "resolver_zone_resolver-http_responses_timedout": 4,
256 "resolver_zone_resolver-http_responses_unknown": 0,
257 "resolver_zone_resolver-stream_requests_addr": 0,
258 "resolver_zone_resolver-stream_requests_name": 638797,
259 "resolver_zone_resolver-stream_requests_srv": 0,
260 "resolver_zone_resolver-stream_responses_formerr": 0,
261 "resolver_zone_resolver-stream_responses_noerror": 433136,
262 "resolver_zone_resolver-stream_responses_notimp": 0,
263 "resolver_zone_resolver-stream_responses_nxdomain": 40022,
264 "resolver_zone_resolver-stream_responses_refused": 165639,
265 "resolver_zone_resolver-stream_responses_servfail": 0,
266 "resolver_zone_resolver-stream_responses_timedout": 0,
267 "resolver_zone_resolver-stream_responses_unknown": 0,
268 "ssl_handshake_timeout": 4,
269 "ssl_handshakes": 15804607,
270 "ssl_handshakes_failed": 37862,
271 "ssl_no_common_cipher": 24,
272 "ssl_no_common_protocol": 16648,
273 "ssl_peer_rejected_cert": 0,
274 "ssl_session_reuses": 13096060,
275 "ssl_verify_failures_expired_cert": 0,
276 "ssl_verify_failures_hostname_mismatch": 0,
277 "ssl_verify_failures_other": 0,
278 "ssl_verify_failures_no_cert": 0,
279 "ssl_verify_failures_revoked_cert": 0,
280 "stream_server_zone_tcp_server_bytes_received": 0,
281 "stream_server_zone_tcp_server_bytes_sent": 0,
282 "stream_server_zone_tcp_server_connections": 0,
283 "stream_server_zone_tcp_server_connections_discarded": 0,
284 "stream_server_zone_tcp_server_connections_processing": 0,
285 "stream_server_zone_tcp_server_sessions": 0,
286 "stream_server_zone_tcp_server_sessions_2xx": 0,
287 "stream_server_zone_tcp_server_sessions_4xx": 0,
288 "stream_server_zone_tcp_server_sessions_5xx": 0,
289 "stream_upstream_stream_backend_server_127.0.0.1:12346_zone_tcp_servers_active": 0,
290 "stream_upstream_stream_backend_server_127.0.0.1:12346_zone_tcp_servers_bytes_received": 0,
291 "stream_upstream_stream_backend_server_127.0.0.1:12346_zone_tcp_servers_bytes_sent": 0,
292 "stream_upstream_stream_backend_server_127.0.0.1:12346_zone_tcp_servers_connections": 0,
293 "stream_upstream_stream_backend_server_127.0.0.1:12346_zone_tcp_servers_downtime": 0,
294 "stream_upstream_stream_backend_server_127.0.0.1:12346_zone_tcp_servers_state_checking": 0,
295 "stream_upstream_stream_backend_server_127.0.0.1:12346_zone_tcp_servers_state_down": 0,
296 "stream_upstream_stream_backend_server_127.0.0.1:12346_zone_tcp_servers_state_unavail": 0,
297 "stream_upstream_stream_backend_server_127.0.0.1:12346_zone_tcp_servers_state_unhealthy": 0,
298 "stream_upstream_stream_backend_server_127.0.0.1:12346_zone_tcp_servers_state_up": 1,
299 "stream_upstream_stream_backend_server_127.0.0.1:12347_zone_tcp_servers_active": 0,
300 "stream_upstream_stream_backend_server_127.0.0.1:12347_zone_tcp_servers_bytes_received": 0,
301 "stream_upstream_stream_backend_server_127.0.0.1:12347_zone_tcp_servers_bytes_sent": 0,
302 "stream_upstream_stream_backend_server_127.0.0.1:12347_zone_tcp_servers_connections": 0,
303 "stream_upstream_stream_backend_server_127.0.0.1:12347_zone_tcp_servers_downtime": 0,
304 "stream_upstream_stream_backend_server_127.0.0.1:12347_zone_tcp_servers_state_checking": 0,
305 "stream_upstream_stream_backend_server_127.0.0.1:12347_zone_tcp_servers_state_down": 0,
306 "stream_upstream_stream_backend_server_127.0.0.1:12347_zone_tcp_servers_state_unavail": 0,
307 "stream_upstream_stream_backend_server_127.0.0.1:12347_zone_tcp_servers_state_unhealthy": 0,
308 "stream_upstream_stream_backend_server_127.0.0.1:12347_zone_tcp_servers_state_up": 1,
309 "stream_upstream_stream_backend_zone_tcp_servers_peers": 2,
310 "stream_upstream_stream_backend_zone_tcp_servers_zombies": 0,
311 },
312 },
313 "success when all requests except stream OK": {
314 prepare: caseAPI8AllRequestsExceptStreamOK,
315 wantNumOfCharts: len(baseCharts) +
316 len(httpCacheChartsTmpl) +
317 len(httpServerZoneChartsTmpl) +
318 len(httpLocationZoneChartsTmpl)*2 +
319 len(httpUpstreamChartsTmpl) +
320 len(httpUpstreamServerChartsTmpl)*2 +
321 len(resolverZoneChartsTmpl)*2,
322 wantMetrics: map[string]int64{
323 "connections_accepted": 6079,
324 "connections_active": 1,
325 "connections_dropped": 0,
326 "connections_idle": 8,
327 "http_cache_cache_backend_bypassed_bytes": 67035,
328 "http_cache_cache_backend_bypassed_responses": 109,
329 "http_cache_cache_backend_served_bytes": 0,
330 "http_cache_cache_backend_served_responses": 0,
331 "http_cache_cache_backend_size": 0,
332 "http_cache_cache_backend_state_cold": 0,
333 "http_cache_cache_backend_state_warm": 1,
334 "http_cache_cache_backend_written_bytes": 0,
335 "http_cache_cache_backend_written_responses": 0,
336 "http_location_zone_server_api_bytes_received": 1854427,
337 "http_location_zone_server_api_bytes_sent": 4668778,
338 "http_location_zone_server_api_requests": 9188,
339 "http_location_zone_server_api_requests_discarded": 0,
340 "http_location_zone_server_api_responses": 9188,
341 "http_location_zone_server_api_responses_1xx": 0,
342 "http_location_zone_server_api_responses_2xx": 9187,
343 "http_location_zone_server_api_responses_3xx": 0,
344 "http_location_zone_server_api_responses_4xx": 1,
345 "http_location_zone_server_api_responses_5xx": 0,
346 "http_location_zone_server_dashboard_bytes_received": 0,
347 "http_location_zone_server_dashboard_bytes_sent": 0,
348 "http_location_zone_server_dashboard_requests": 0,
349 "http_location_zone_server_dashboard_requests_discarded": 0,
350 "http_location_zone_server_dashboard_responses": 0,
351 "http_location_zone_server_dashboard_responses_1xx": 0,
352 "http_location_zone_server_dashboard_responses_2xx": 0,
353 "http_location_zone_server_dashboard_responses_3xx": 0,
354 "http_location_zone_server_dashboard_responses_4xx": 0,
355 "http_location_zone_server_dashboard_responses_5xx": 0,
356 "http_requests_current": 1,
357 "http_requests_total": 8363,
358 "http_server_zone_server_backend_bytes_received": 1773834,
359 "http_server_zone_server_backend_bytes_sent": 4585734,
360 "http_server_zone_server_backend_requests": 8962,
361 "http_server_zone_server_backend_requests_discarded": 0,
362 "http_server_zone_server_backend_requests_processing": 1,
363 "http_server_zone_server_backend_responses": 8961,
364 "http_server_zone_server_backend_responses_1xx": 0,
365 "http_server_zone_server_backend_responses_2xx": 8960,
366 "http_server_zone_server_backend_responses_3xx": 0,
367 "http_server_zone_server_backend_responses_4xx": 1,
368 "http_server_zone_server_backend_responses_5xx": 0,
369 "http_upstream_backend_server_127.0.0.1:81_zone_http_backend_active": 0,
370 "http_upstream_backend_server_127.0.0.1:81_zone_http_backend_bytes_received": 0,
371 "http_upstream_backend_server_127.0.0.1:81_zone_http_backend_bytes_sent": 0,
372 "http_upstream_backend_server_127.0.0.1:81_zone_http_backend_downtime": 1020,
373 "http_upstream_backend_server_127.0.0.1:81_zone_http_backend_header_time": 0,
374 "http_upstream_backend_server_127.0.0.1:81_zone_http_backend_requests": 26,
375 "http_upstream_backend_server_127.0.0.1:81_zone_http_backend_response_time": 0,
376 "http_upstream_backend_server_127.0.0.1:81_zone_http_backend_responses": 0,
377 "http_upstream_backend_server_127.0.0.1:81_zone_http_backend_responses_1xx": 0,
378 "http_upstream_backend_server_127.0.0.1:81_zone_http_backend_responses_2xx": 0,
379 "http_upstream_backend_server_127.0.0.1:81_zone_http_backend_responses_3xx": 0,
380 "http_upstream_backend_server_127.0.0.1:81_zone_http_backend_responses_4xx": 0,
381 "http_upstream_backend_server_127.0.0.1:81_zone_http_backend_responses_5xx": 0,
382 "http_upstream_backend_server_127.0.0.1:81_zone_http_backend_state_checking": 0,
383 "http_upstream_backend_server_127.0.0.1:81_zone_http_backend_state_down": 0,
384 "http_upstream_backend_server_127.0.0.1:81_zone_http_backend_state_draining": 0,
385 "http_upstream_backend_server_127.0.0.1:81_zone_http_backend_state_unavail": 1,
386 "http_upstream_backend_server_127.0.0.1:81_zone_http_backend_state_unhealthy": 0,
387 "http_upstream_backend_server_127.0.0.1:81_zone_http_backend_state_up": 0,
388 "http_upstream_backend_server_127.0.0.1:82_zone_http_backend_active": 0,
389 "http_upstream_backend_server_127.0.0.1:82_zone_http_backend_bytes_received": 86496,
390 "http_upstream_backend_server_127.0.0.1:82_zone_http_backend_bytes_sent": 9180,
391 "http_upstream_backend_server_127.0.0.1:82_zone_http_backend_downtime": 0,
392 "http_upstream_backend_server_127.0.0.1:82_zone_http_backend_header_time": 1,
393 "http_upstream_backend_server_127.0.0.1:82_zone_http_backend_requests": 102,
394 "http_upstream_backend_server_127.0.0.1:82_zone_http_backend_response_time": 1,
395 "http_upstream_backend_server_127.0.0.1:82_zone_http_backend_responses": 102,
396 "http_upstream_backend_server_127.0.0.1:82_zone_http_backend_responses_1xx": 0,
397 "http_upstream_backend_server_127.0.0.1:82_zone_http_backend_responses_2xx": 102,
398 "http_upstream_backend_server_127.0.0.1:82_zone_http_backend_responses_3xx": 0,
399 "http_upstream_backend_server_127.0.0.1:82_zone_http_backend_responses_4xx": 0,
400 "http_upstream_backend_server_127.0.0.1:82_zone_http_backend_responses_5xx": 0,
401 "http_upstream_backend_server_127.0.0.1:82_zone_http_backend_state_checking": 0,
402 "http_upstream_backend_server_127.0.0.1:82_zone_http_backend_state_down": 0,
403 "http_upstream_backend_server_127.0.0.1:82_zone_http_backend_state_draining": 0,
404 "http_upstream_backend_server_127.0.0.1:82_zone_http_backend_state_unavail": 0,
405 "http_upstream_backend_server_127.0.0.1:82_zone_http_backend_state_unhealthy": 0,
406 "http_upstream_backend_server_127.0.0.1:82_zone_http_backend_state_up": 1,
407 "http_upstream_backend_zone_http_backend_keepalive": 0,
408 "http_upstream_backend_zone_http_backend_peers": 2,
409 "http_upstream_backend_zone_http_backend_zombies": 0,
410 "resolver_zone_resolver-http_requests_addr": 0,
411 "resolver_zone_resolver-http_requests_name": 0,
412 "resolver_zone_resolver-http_requests_srv": 2939408,
413 "resolver_zone_resolver-http_responses_formerr": 0,
414 "resolver_zone_resolver-http_responses_noerror": 0,
415 "resolver_zone_resolver-http_responses_notimp": 0,
416 "resolver_zone_resolver-http_responses_nxdomain": 2939404,
417 "resolver_zone_resolver-http_responses_refused": 0,
418 "resolver_zone_resolver-http_responses_servfail": 0,
419 "resolver_zone_resolver-http_responses_timedout": 4,
420 "resolver_zone_resolver-http_responses_unknown": 0,
421 "resolver_zone_resolver-stream_requests_addr": 0,
422 "resolver_zone_resolver-stream_requests_name": 638797,
423 "resolver_zone_resolver-stream_requests_srv": 0,
424 "resolver_zone_resolver-stream_responses_formerr": 0,
425 "resolver_zone_resolver-stream_responses_noerror": 433136,
426 "resolver_zone_resolver-stream_responses_notimp": 0,
427 "resolver_zone_resolver-stream_responses_nxdomain": 40022,
428 "resolver_zone_resolver-stream_responses_refused": 165639,
429 "resolver_zone_resolver-stream_responses_servfail": 0,
430 "resolver_zone_resolver-stream_responses_timedout": 0,
431 "resolver_zone_resolver-stream_responses_unknown": 0,
432 "ssl_handshake_timeout": 4,
433 "ssl_handshakes": 15804607,
434 "ssl_handshakes_failed": 37862,
435 "ssl_no_common_cipher": 24,
436 "ssl_no_common_protocol": 16648,
437 "ssl_peer_rejected_cert": 0,
438 "ssl_session_reuses": 13096060,
439 "ssl_verify_failures_expired_cert": 0,
440 "ssl_verify_failures_hostname_mismatch": 0,
441 "ssl_verify_failures_other": 0,
442 "ssl_verify_failures_no_cert": 0,
443 "ssl_verify_failures_revoked_cert": 0,
444 },
445 },
446 "fail on invalid data response": {
447 prepare: caseInvalidDataResponse,
448 wantNumOfCharts: 0,
449 wantMetrics: nil,
450 },
451 "fail on connection refused": {
452 prepare: caseConnectionRefused,
453 wantNumOfCharts: 0,
454 wantMetrics: nil,
455 },
456 }
457
458 for name, test := range tests {
459 t.Run(name, func(t *testing.T) {
460 collr, cleanup := test.prepare(t)
461 defer cleanup()
462
463 mx := collr.Collect(context.Background())
464
465 require.Equal(t, test.wantMetrics, mx)
466 if len(test.wantMetrics) > 0 {
467 assert.Equalf(t, test.wantNumOfCharts, len(*collr.Charts()), "number of charts")
468 collecttest.TestMetricsHasAllChartsDimsSkip(t, collr.Charts(), mx, func(chart *collectorapi.Chart, _ *collectorapi.Dim) bool {
469 return chart.ID == uptimeChart.ID
470 })
471 }
472 })
473 }
474 }
475
476 func caseAPI8AllRequestsOK(t *testing.T) (*Collector, func()) {
477 t.Helper()
478 srv := httptest.NewServer(http.HandlerFunc(
479 func(w http.ResponseWriter, r *http.Request) {
480 switch r.URL.Path {
481 case urlPathAPIVersions:
482 _, _ = w.Write(dataAPI8APIVersions)
483 case fmt.Sprintf(urlPathAPIEndpointsRoot, 8):
484 _, _ = w.Write(dataAPI8EndpointsRoot)
485 case fmt.Sprintf(urlPathAPIEndpointsHTTP, 8):
486 _, _ = w.Write(dataAPI8EndpointsHTTP)
487 case fmt.Sprintf(urlPathAPIEndpointsStream, 8):
488 _, _ = w.Write(dataAPI8EndpointsStream)
489 case fmt.Sprintf(urlPathAPIConnections, 8):
490 _, _ = w.Write(dataAPI8Connections)
491 case fmt.Sprintf(urlPathAPISSL, 8):
492 _, _ = w.Write(dataAPI8SSL)
493 case fmt.Sprintf(urlPathAPIHTTPRequests, 8):
494 _, _ = w.Write(dataAPI8HTTPRequests)
495 case fmt.Sprintf(urlPathAPIHTTPServerZones, 8):
496 _, _ = w.Write(dataAPI8HTTPServerZones)
497 case fmt.Sprintf(urlPathAPIHTTPLocationZones, 8):
498 _, _ = w.Write(dataAPI8HTTPLocationZones)
499 case fmt.Sprintf(urlPathAPIHTTPUpstreams, 8):
500 _, _ = w.Write(dataAPI8HTTPUpstreams)
501 case fmt.Sprintf(urlPathAPIHTTPCaches, 8):
502 _, _ = w.Write(dataAPI8HTTPCaches)
503 case fmt.Sprintf(urlPathAPIStreamServerZones, 8):
504 _, _ = w.Write(dataAPI8StreamServerZones)
505 case fmt.Sprintf(urlPathAPIStreamUpstreams, 8):
506 _, _ = w.Write(dataAPI8StreamUpstreams)
507 case fmt.Sprintf(urlPathAPIResolvers, 8):
508 _, _ = w.Write(dataAPI8Resolvers)
509 default:
510 w.WriteHeader(http.StatusNotFound)
511 _, _ = w.Write(data404)
512
513 }
514 }))
515 collr := New()
516 collr.URL = srv.URL
517 require.NoError(t, collr.Init(context.Background()))
518
519 return collr, srv.Close
520 }
521
522 func caseAPI8AllRequestsExceptStreamOK(t *testing.T) (*Collector, func()) {
523 t.Helper()
524 srv := httptest.NewServer(http.HandlerFunc(
525 func(w http.ResponseWriter, r *http.Request) {
526 switch r.URL.Path {
527 case urlPathAPIVersions:
528 _, _ = w.Write(dataAPI8APIVersions)
529 case fmt.Sprintf(urlPathAPIEndpointsRoot, 8):
530 _, _ = w.Write(dataAPI8EndpointsRoot)
531 case fmt.Sprintf(urlPathAPIEndpointsHTTP, 8):
532 _, _ = w.Write(dataAPI8EndpointsHTTP)
533 case fmt.Sprintf(urlPathAPIEndpointsStream, 8):
534 _, _ = w.Write(dataAPI8EndpointsStream)
535 case fmt.Sprintf(urlPathAPIConnections, 8):
536 _, _ = w.Write(dataAPI8Connections)
537 case fmt.Sprintf(urlPathAPISSL, 8):
538 _, _ = w.Write(dataAPI8SSL)
539 case fmt.Sprintf(urlPathAPIHTTPRequests, 8):
540 _, _ = w.Write(dataAPI8HTTPRequests)
541 case fmt.Sprintf(urlPathAPIHTTPServerZones, 8):
542 _, _ = w.Write(dataAPI8HTTPServerZones)
543 case fmt.Sprintf(urlPathAPIHTTPLocationZones, 8):
544 _, _ = w.Write(dataAPI8HTTPLocationZones)
545 case fmt.Sprintf(urlPathAPIHTTPUpstreams, 8):
546 _, _ = w.Write(dataAPI8HTTPUpstreams)
547 case fmt.Sprintf(urlPathAPIHTTPCaches, 8):
548 _, _ = w.Write(dataAPI8HTTPCaches)
549 case fmt.Sprintf(urlPathAPIResolvers, 8):
550 _, _ = w.Write(dataAPI8Resolvers)
551 default:
552 w.WriteHeader(http.StatusNotFound)
553 _, _ = w.Write(data404)
554
555 }
556 }))
557 collr := New()
558 collr.URL = srv.URL
559 require.NoError(t, collr.Init(context.Background()))
560
561 return collr, srv.Close
562 }
563
564 func caseInvalidDataResponse(t *testing.T) (*Collector, func()) {
565 t.Helper()
566 srv := httptest.NewServer(http.HandlerFunc(
567 func(w http.ResponseWriter, r *http.Request) {
568 _, _ = w.Write([]byte("hello and\n goodbye"))
569 }))
570 collr := New()
571 collr.URL = srv.URL
572 require.NoError(t, collr.Init(context.Background()))
573
574 return collr, srv.Close
575 }
576
577 func caseConnectionRefused(t *testing.T) (*Collector, func()) {
578 t.Helper()
579 collr := New()
580 collr.URL = "http://127.0.0.1:65001"
581 require.NoError(t, collr.Init(context.Background()))
582
583 return collr, func() {}
584 }