master
go 746 lines 55.5 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package vernemq
4
5 import (
6 "context"
7 "net/http"
8 "net/http/httptest"
9 "os"
10 "testing"
11
12 "github.com/netdata/netdata/go/plugins/pkg/web"
13 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/collecttest"
14
15 "github.com/stretchr/testify/assert"
16 "github.com/stretchr/testify/require"
17 )
18
19 var (
20 dataConfigJSON, _ = os.ReadFile("testdata/config.json")
21 dataConfigYAML, _ = os.ReadFile("testdata/config.yaml")
22
23 dataVer1101Metrics, _ = os.ReadFile("testdata/v1.10.1/metrics.txt")
24 dataVer201Metrics, _ = os.ReadFile("testdata/v2.0.1/metrics.txt")
25 )
26
27 func Test_testDataIsValid(t *testing.T) {
28 for name, data := range map[string][]byte{
29 "dataConfigJSON": dataConfigJSON,
30 "dataConfigYAML": dataConfigYAML,
31 "dataVer1101Metrics": dataVer1101Metrics,
32 "dataVer201Metrics": dataVer201Metrics,
33 } {
34 require.NotNil(t, data, name)
35 }
36 }
37
38 func TestCollector_ConfigurationSerialize(t *testing.T) {
39 collecttest.TestConfigurationSerialize(t, &Collector{}, dataConfigJSON, dataConfigYAML)
40 }
41
42 func TestCollector_Init(t *testing.T) {
43 tests := map[string]struct {
44 wantFail bool
45 config Config
46 }{
47 "success with default": {
48 wantFail: false,
49 config: New().Config,
50 },
51 "fail when URL not set": {
52 wantFail: true,
53 config: Config{
54 HTTPConfig: web.HTTPConfig{
55 RequestConfig: web.RequestConfig{URL: ""},
56 },
57 },
58 },
59 }
60
61 for name, test := range tests {
62 t.Run(name, func(t *testing.T) {
63 collr := New()
64 collr.Config = test.config
65
66 if test.wantFail {
67 assert.Error(t, collr.Init(context.Background()))
68 } else {
69 assert.NoError(t, collr.Init(context.Background()))
70 }
71 })
72 }
73 }
74
75 func TestCollector_Charts(t *testing.T) {
76 assert.NotNil(t, New().Charts())
77 }
78
79 func TestCollector_Cleanup(t *testing.T) {
80 assert.NotPanics(t, func() { New().Cleanup(context.Background()) })
81 }
82
83 func TestCollector_Check(t *testing.T) {
84 tests := map[string]struct {
85 wantFail bool
86 prepare func(t *testing.T) (collr *Collector, cleanup func())
87 }{
88 "success on valid response v1.10.1": {
89 wantFail: false,
90 prepare: caseOkVer1101,
91 },
92 "success on valid response v2.0.1": {
93 wantFail: false,
94 prepare: caseOkVer201,
95 },
96 "fail on unexpected Prometheus": {
97 wantFail: true,
98 prepare: caseUnexpectedPrometheusMetrics,
99 },
100 "fail on invalid data response": {
101 wantFail: true,
102 prepare: caseInvalidDataResponse,
103 },
104 "fail on connection refused": {
105 wantFail: true,
106 prepare: caseConnectionRefused,
107 },
108 "fail on 404 response": {
109 wantFail: true,
110 prepare: case404,
111 },
112 }
113
114 for name, test := range tests {
115 t.Run(name, func(t *testing.T) {
116 collr, cleanup := test.prepare(t)
117 defer cleanup()
118
119 if test.wantFail {
120 assert.Error(t, collr.Check(context.Background()))
121 } else {
122 assert.NoError(t, collr.Check(context.Background()))
123 }
124 })
125 }
126 }
127
128 func TestCollector_Collect(t *testing.T) {
129 tests := map[string]struct {
130 prepare func(t *testing.T) (collr *Collector, cleanup func())
131 wantNumOfCharts int
132 wantMetrics map[string]int64
133 }{
134 "success on valid response ver 1.10.1": {
135 prepare: caseOkVer1101,
136 wantNumOfCharts: len(nodeChartsTmpl) + len(nodeMqtt4ChartsTmpl) + len(nodeMqtt5ChartsTmpl),
137 wantMetrics: map[string]int64{
138 "node_VerneMQ@172.17.0.2_bytes_received": 36796908,
139 "node_VerneMQ@172.17.0.2_bytes_sent": 23361693,
140 "node_VerneMQ@172.17.0.2_client_expired": 0,
141 "node_VerneMQ@172.17.0.2_cluster_bytes_dropped": 0,
142 "node_VerneMQ@172.17.0.2_cluster_bytes_received": 0,
143 "node_VerneMQ@172.17.0.2_cluster_bytes_sent": 0,
144 "node_VerneMQ@172.17.0.2_mqtt4_client_keepalive_expired": 1,
145 "node_VerneMQ@172.17.0.2_mqtt4_mqtt_connack_accepted_sent": 0,
146 "node_VerneMQ@172.17.0.2_mqtt4_mqtt_connack_bad_credentials_sent": 0,
147 "node_VerneMQ@172.17.0.2_mqtt4_mqtt_connack_identifier_rejected_sent": 0,
148 "node_VerneMQ@172.17.0.2_mqtt4_mqtt_connack_not_authorized_sent": 0,
149 "node_VerneMQ@172.17.0.2_mqtt4_mqtt_connack_sent": 338956,
150 "node_VerneMQ@172.17.0.2_mqtt4_mqtt_connack_sent_return_code_bad_username_or_password": 4,
151 "node_VerneMQ@172.17.0.2_mqtt4_mqtt_connack_sent_return_code_client_identifier_not_valid": 0,
152 "node_VerneMQ@172.17.0.2_mqtt4_mqtt_connack_sent_return_code_not_authorized": 4,
153 "node_VerneMQ@172.17.0.2_mqtt4_mqtt_connack_sent_return_code_server_unavailable": 0,
154 "node_VerneMQ@172.17.0.2_mqtt4_mqtt_connack_sent_return_code_success": 338948,
155 "node_VerneMQ@172.17.0.2_mqtt4_mqtt_connack_sent_return_code_unsupported_protocol_version": 0,
156 "node_VerneMQ@172.17.0.2_mqtt4_mqtt_connack_server_unavailable_sent": 0,
157 "node_VerneMQ@172.17.0.2_mqtt4_mqtt_connack_unacceptable_protocol_sent": 0,
158 "node_VerneMQ@172.17.0.2_mqtt4_mqtt_connect_received": 338956,
159 "node_VerneMQ@172.17.0.2_mqtt4_mqtt_disconnect_received": 107,
160 "node_VerneMQ@172.17.0.2_mqtt4_mqtt_invalid_msg_size_error": 0,
161 "node_VerneMQ@172.17.0.2_mqtt4_mqtt_pingreq_received": 205,
162 "node_VerneMQ@172.17.0.2_mqtt4_mqtt_pingresp_sent": 205,
163 "node_VerneMQ@172.17.0.2_mqtt4_mqtt_puback_invalid_error": 0,
164 "node_VerneMQ@172.17.0.2_mqtt4_mqtt_puback_received": 525694,
165 "node_VerneMQ@172.17.0.2_mqtt4_mqtt_puback_sent": 537068,
166 "node_VerneMQ@172.17.0.2_mqtt4_mqtt_pubcomp_invalid_error": 0,
167 "node_VerneMQ@172.17.0.2_mqtt4_mqtt_pubcomp_received": 0,
168 "node_VerneMQ@172.17.0.2_mqtt4_mqtt_pubcomp_sent": 0,
169 "node_VerneMQ@172.17.0.2_mqtt4_mqtt_publish_auth_error": 0,
170 "node_VerneMQ@172.17.0.2_mqtt4_mqtt_publish_error": 0,
171 "node_VerneMQ@172.17.0.2_mqtt4_mqtt_publish_received": 537088,
172 "node_VerneMQ@172.17.0.2_mqtt4_mqtt_publish_sent": 525721,
173 "node_VerneMQ@172.17.0.2_mqtt4_mqtt_pubrec_invalid_error": 0,
174 "node_VerneMQ@172.17.0.2_mqtt4_mqtt_pubrec_received": 0,
175 "node_VerneMQ@172.17.0.2_mqtt4_mqtt_pubrec_sent": 0,
176 "node_VerneMQ@172.17.0.2_mqtt4_mqtt_pubrel_received": 0,
177 "node_VerneMQ@172.17.0.2_mqtt4_mqtt_pubrel_sent": 0,
178 "node_VerneMQ@172.17.0.2_mqtt4_mqtt_suback_sent": 122,
179 "node_VerneMQ@172.17.0.2_mqtt4_mqtt_subscribe_auth_error": 0,
180 "node_VerneMQ@172.17.0.2_mqtt4_mqtt_subscribe_error": 0,
181 "node_VerneMQ@172.17.0.2_mqtt4_mqtt_subscribe_received": 122,
182 "node_VerneMQ@172.17.0.2_mqtt4_mqtt_unsuback_sent": 108,
183 "node_VerneMQ@172.17.0.2_mqtt4_mqtt_unsubscribe_error": 0,
184 "node_VerneMQ@172.17.0.2_mqtt4_mqtt_unsubscribe_received": 108,
185 "node_VerneMQ@172.17.0.2_mqtt5_client_keepalive_expired": 0,
186 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_auth_received": 0,
187 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_auth_received_reason_code_continue_authentication": 0,
188 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_auth_received_reason_code_reauthenticate": 0,
189 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_auth_received_reason_code_success": 0,
190 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_auth_sent": 0,
191 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_auth_sent_reason_code_continue_authentication": 0,
192 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_auth_sent_reason_code_reauthenticate": 0,
193 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_auth_sent_reason_code_success": 0,
194 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_connack_sent": 0,
195 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_connack_sent_reason_code_bad_authentication_method": 0,
196 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_connack_sent_reason_code_bad_username_or_password": 0,
197 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_connack_sent_reason_code_banned": 0,
198 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_connack_sent_reason_code_client_identifier_not_valid": 0,
199 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_connack_sent_reason_code_connection_rate_exceeded": 0,
200 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_connack_sent_reason_code_impl_specific_error": 0,
201 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_connack_sent_reason_code_malformed_packet": 0,
202 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_connack_sent_reason_code_not_authorized": 0,
203 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_connack_sent_reason_code_packet_too_large": 0,
204 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_connack_sent_reason_code_payload_format_invalid": 0,
205 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_connack_sent_reason_code_protocol_error": 0,
206 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_connack_sent_reason_code_qos_not_supported": 0,
207 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_connack_sent_reason_code_quota_exceeded": 0,
208 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_connack_sent_reason_code_retain_not_supported": 0,
209 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_connack_sent_reason_code_server_busy": 0,
210 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_connack_sent_reason_code_server_moved": 0,
211 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_connack_sent_reason_code_server_unavailable": 0,
212 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_connack_sent_reason_code_success": 0,
213 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_connack_sent_reason_code_topic_name_invalid": 0,
214 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_connack_sent_reason_code_unspecified_error": 0,
215 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_connack_sent_reason_code_unsupported_protocol_version": 0,
216 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_connack_sent_reason_code_use_another_server": 0,
217 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_connect_received": 0,
218 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_received": 0,
219 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_received_reason_code_administrative_action": 0,
220 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_received_reason_code_disconnect_with_will_msg": 0,
221 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_received_reason_code_impl_specific_error": 0,
222 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_received_reason_code_malformed_packet": 0,
223 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_received_reason_code_message_rate_too_high": 0,
224 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_received_reason_code_normal_disconnect": 0,
225 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_received_reason_code_packet_too_large": 0,
226 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_received_reason_code_payload_format_invalid": 0,
227 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_received_reason_code_protocol_error": 0,
228 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_received_reason_code_quota_exceeded": 0,
229 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_received_reason_code_receive_max_exceeded": 0,
230 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_received_reason_code_topic_alias_invalid": 0,
231 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_received_reason_code_topic_name_invalid": 0,
232 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_received_reason_code_unspecified_error": 0,
233 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_sent": 0,
234 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_sent_reason_code_administrative_action": 0,
235 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_sent_reason_code_connection_rate_exceeded": 0,
236 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_sent_reason_code_impl_specific_error": 0,
237 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_sent_reason_code_keep_alive_timeout": 0,
238 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_sent_reason_code_malformed_packet": 0,
239 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_sent_reason_code_max_connect_time": 0,
240 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_sent_reason_code_message_rate_too_high": 0,
241 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_sent_reason_code_normal_disconnect": 0,
242 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_sent_reason_code_not_authorized": 0,
243 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_sent_reason_code_packet_too_large": 0,
244 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_sent_reason_code_payload_format_invalid": 0,
245 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_sent_reason_code_protocol_error": 0,
246 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_sent_reason_code_qos_not_supported": 0,
247 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_sent_reason_code_quota_exceeded": 0,
248 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_sent_reason_code_receive_max_exceeded": 0,
249 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_sent_reason_code_retain_not_supported": 0,
250 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_sent_reason_code_server_busy": 0,
251 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_sent_reason_code_server_moved": 0,
252 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_sent_reason_code_server_shutting_down": 0,
253 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_sent_reason_code_session_taken_over": 0,
254 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_sent_reason_code_shared_subs_not_supported": 0,
255 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_sent_reason_code_subscription_ids_not_supported": 0,
256 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_sent_reason_code_topic_alias_invalid": 0,
257 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_sent_reason_code_topic_filter_invalid": 0,
258 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_sent_reason_code_topic_name_invalid": 0,
259 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_sent_reason_code_unspecified_error": 0,
260 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_sent_reason_code_use_another_server": 0,
261 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_sent_reason_code_wildcard_subs_not_supported": 0,
262 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_invalid_msg_size_error": 0,
263 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pingreq_received": 0,
264 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pingresp_sent": 0,
265 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_puback_invalid_error": 0,
266 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_puback_received": 0,
267 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_puback_received_reason_code_impl_specific_error": 0,
268 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_puback_received_reason_code_no_matching_subscribers": 0,
269 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_puback_received_reason_code_not_authorized": 0,
270 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_puback_received_reason_code_packet_id_in_use": 0,
271 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_puback_received_reason_code_payload_format_invalid": 0,
272 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_puback_received_reason_code_quota_exceeded": 0,
273 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_puback_received_reason_code_success": 0,
274 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_puback_received_reason_code_topic_name_invalid": 0,
275 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_puback_received_reason_code_unspecified_error": 0,
276 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_puback_sent": 0,
277 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_puback_sent_reason_code_impl_specific_error": 0,
278 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_puback_sent_reason_code_no_matching_subscribers": 0,
279 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_puback_sent_reason_code_not_authorized": 0,
280 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_puback_sent_reason_code_packet_id_in_use": 0,
281 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_puback_sent_reason_code_payload_format_invalid": 0,
282 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_puback_sent_reason_code_quota_exceeded": 0,
283 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_puback_sent_reason_code_success": 0,
284 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_puback_sent_reason_code_topic_name_invalid": 0,
285 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_puback_sent_reason_code_unspecified_error": 0,
286 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pubcomp_invalid_error": 0,
287 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pubcomp_received": 0,
288 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pubcomp_received_reason_code_packet_id_not_found": 0,
289 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pubcomp_received_reason_code_success": 0,
290 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pubcomp_sent": 0,
291 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pubcomp_sent_reason_code_packet_id_not_found": 0,
292 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pubcomp_sent_reason_code_success": 0,
293 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_publish_auth_error": 0,
294 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_publish_error": 0,
295 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_publish_received": 0,
296 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_publish_sent": 0,
297 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pubrec_received": 0,
298 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pubrec_received_reason_code_impl_specific_error": 0,
299 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pubrec_received_reason_code_no_matching_subscribers": 0,
300 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pubrec_received_reason_code_not_authorized": 0,
301 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pubrec_received_reason_code_packet_id_in_use": 0,
302 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pubrec_received_reason_code_payload_format_invalid": 0,
303 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pubrec_received_reason_code_quota_exceeded": 0,
304 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pubrec_received_reason_code_success": 0,
305 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pubrec_received_reason_code_topic_name_invalid": 0,
306 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pubrec_received_reason_code_unspecified_error": 0,
307 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pubrec_sent": 0,
308 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pubrec_sent_reason_code_impl_specific_error": 0,
309 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pubrec_sent_reason_code_no_matching_subscribers": 0,
310 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pubrec_sent_reason_code_not_authorized": 0,
311 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pubrec_sent_reason_code_packet_id_in_use": 0,
312 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pubrec_sent_reason_code_payload_format_invalid": 0,
313 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pubrec_sent_reason_code_quota_exceeded": 0,
314 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pubrec_sent_reason_code_success": 0,
315 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pubrec_sent_reason_code_topic_name_invalid": 0,
316 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pubrec_sent_reason_code_unspecified_error": 0,
317 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pubrel_received": 0,
318 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pubrel_received_reason_code_packet_id_not_found": 0,
319 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pubrel_received_reason_code_success": 0,
320 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pubrel_sent": 0,
321 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pubrel_sent_reason_code_packet_id_not_found": 0,
322 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pubrel_sent_reason_code_success": 0,
323 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_suback_sent": 0,
324 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_subscribe_auth_error": 0,
325 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_subscribe_error": 0,
326 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_subscribe_received": 0,
327 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_unsuback_sent": 0,
328 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_unsubscribe_error": 0,
329 "node_VerneMQ@172.17.0.2_mqtt5_mqtt_unsubscribe_received": 0,
330 "node_VerneMQ@172.17.0.2_netsplit_detected": 0,
331 "node_VerneMQ@172.17.0.2_netsplit_resolved": 0,
332 "node_VerneMQ@172.17.0.2_netsplit_unresolved": 0,
333 "node_VerneMQ@172.17.0.2_open_sockets": 0,
334 "node_VerneMQ@172.17.0.2_queue_initialized_from_storage": 0,
335 "node_VerneMQ@172.17.0.2_queue_message_drop": 0,
336 "node_VerneMQ@172.17.0.2_queue_message_expired": 0,
337 "node_VerneMQ@172.17.0.2_queue_message_in": 525722,
338 "node_VerneMQ@172.17.0.2_queue_message_out": 525721,
339 "node_VerneMQ@172.17.0.2_queue_message_unhandled": 1,
340 "node_VerneMQ@172.17.0.2_queue_processes": 0,
341 "node_VerneMQ@172.17.0.2_queue_setup": 338948,
342 "node_VerneMQ@172.17.0.2_queue_teardown": 338948,
343 "node_VerneMQ@172.17.0.2_queued_messages": 0,
344 "node_VerneMQ@172.17.0.2_retain_memory": 11344,
345 "node_VerneMQ@172.17.0.2_retain_messages": 0,
346 "node_VerneMQ@172.17.0.2_router_matches_local": 525722,
347 "node_VerneMQ@172.17.0.2_router_matches_remote": 0,
348 "node_VerneMQ@172.17.0.2_router_memory": 12752,
349 "node_VerneMQ@172.17.0.2_router_subscriptions": 0,
350 "node_VerneMQ@172.17.0.2_socket_close": 338956,
351 "node_VerneMQ@172.17.0.2_socket_close_timeout": 0,
352 "node_VerneMQ@172.17.0.2_socket_error": 0,
353 "node_VerneMQ@172.17.0.2_socket_open": 338956,
354 "node_VerneMQ@172.17.0.2_system_context_switches": 39088198,
355 "node_VerneMQ@172.17.0.2_system_exact_reductions": 3854024620,
356 "node_VerneMQ@172.17.0.2_system_gc_count": 12189976,
357 "node_VerneMQ@172.17.0.2_system_io_in": 68998296,
358 "node_VerneMQ@172.17.0.2_system_io_out": 961001488,
359 "node_VerneMQ@172.17.0.2_system_process_count": 329,
360 "node_VerneMQ@172.17.0.2_system_reductions": 3857458067,
361 "node_VerneMQ@172.17.0.2_system_run_queue": 0,
362 "node_VerneMQ@172.17.0.2_system_runtime": 1775355,
363 "node_VerneMQ@172.17.0.2_system_utilization": 9,
364 "node_VerneMQ@172.17.0.2_system_wallclock": 163457858,
365 "node_VerneMQ@172.17.0.2_system_words_reclaimed_by_gc": 7158470019,
366 "node_VerneMQ@172.17.0.2_vm_memory_atom": 768953,
367 "node_VerneMQ@172.17.0.2_vm_memory_atom_used": 755998,
368 "node_VerneMQ@172.17.0.2_vm_memory_binary": 1293672,
369 "node_VerneMQ@172.17.0.2_vm_memory_code": 11372082,
370 "node_VerneMQ@172.17.0.2_vm_memory_ets": 6065944,
371 "node_VerneMQ@172.17.0.2_vm_memory_processes": 8673288,
372 "node_VerneMQ@172.17.0.2_vm_memory_processes_used": 8671232,
373 "node_VerneMQ@172.17.0.2_vm_memory_system": 27051848,
374 "node_VerneMQ@172.17.0.2_vm_memory_total": 35725136,
375 },
376 },
377 "success on valid response ver 2.0.1": {
378 prepare: caseOkVer201,
379 wantNumOfCharts: len(nodeChartsTmpl) + len(nodeMqtt4ChartsTmpl) + len(nodeMqtt5ChartsTmpl),
380 wantMetrics: map[string]int64{
381 "node_VerneMQ@10.10.10.20_active_mqtt_connections": 0,
382 "node_VerneMQ@10.10.10.20_active_mqttws_connections": 0,
383 "node_VerneMQ@10.10.10.20_bytes_received": 0,
384 "node_VerneMQ@10.10.10.20_bytes_sent": 0,
385 "node_VerneMQ@10.10.10.20_client_expired": 0,
386 "node_VerneMQ@10.10.10.20_cluster_bytes_dropped": 0,
387 "node_VerneMQ@10.10.10.20_cluster_bytes_received": 0,
388 "node_VerneMQ@10.10.10.20_cluster_bytes_sent": 0,
389 "node_VerneMQ@10.10.10.20_mqtt4_client_keepalive_expired": 0,
390 "node_VerneMQ@10.10.10.20_mqtt4_mqtt_connack_accepted_sent": 0,
391 "node_VerneMQ@10.10.10.20_mqtt4_mqtt_connack_bad_credentials_sent": 0,
392 "node_VerneMQ@10.10.10.20_mqtt4_mqtt_connack_identifier_rejected_sent": 0,
393 "node_VerneMQ@10.10.10.20_mqtt4_mqtt_connack_not_authorized_sent": 0,
394 "node_VerneMQ@10.10.10.20_mqtt4_mqtt_connack_sent": 0,
395 "node_VerneMQ@10.10.10.20_mqtt4_mqtt_connack_sent_return_code_bad_username_or_password": 0,
396 "node_VerneMQ@10.10.10.20_mqtt4_mqtt_connack_sent_return_code_client_identifier_not_valid": 0,
397 "node_VerneMQ@10.10.10.20_mqtt4_mqtt_connack_sent_return_code_not_authorized": 0,
398 "node_VerneMQ@10.10.10.20_mqtt4_mqtt_connack_sent_return_code_server_unavailable": 0,
399 "node_VerneMQ@10.10.10.20_mqtt4_mqtt_connack_sent_return_code_success": 0,
400 "node_VerneMQ@10.10.10.20_mqtt4_mqtt_connack_sent_return_code_unsupported_protocol_version": 0,
401 "node_VerneMQ@10.10.10.20_mqtt4_mqtt_connack_server_unavailable_sent": 0,
402 "node_VerneMQ@10.10.10.20_mqtt4_mqtt_connack_unacceptable_protocol_sent": 0,
403 "node_VerneMQ@10.10.10.20_mqtt4_mqtt_connect_received": 0,
404 "node_VerneMQ@10.10.10.20_mqtt4_mqtt_disconnect_received": 0,
405 "node_VerneMQ@10.10.10.20_mqtt4_mqtt_invalid_msg_size_error": 0,
406 "node_VerneMQ@10.10.10.20_mqtt4_mqtt_pingreq_received": 0,
407 "node_VerneMQ@10.10.10.20_mqtt4_mqtt_pingresp_sent": 0,
408 "node_VerneMQ@10.10.10.20_mqtt4_mqtt_puback_invalid_error": 0,
409 "node_VerneMQ@10.10.10.20_mqtt4_mqtt_puback_received": 0,
410 "node_VerneMQ@10.10.10.20_mqtt4_mqtt_puback_sent": 0,
411 "node_VerneMQ@10.10.10.20_mqtt4_mqtt_pubcomp_invalid_error": 0,
412 "node_VerneMQ@10.10.10.20_mqtt4_mqtt_pubcomp_received": 0,
413 "node_VerneMQ@10.10.10.20_mqtt4_mqtt_pubcomp_sent": 0,
414 "node_VerneMQ@10.10.10.20_mqtt4_mqtt_publish_auth_error": 0,
415 "node_VerneMQ@10.10.10.20_mqtt4_mqtt_publish_error": 0,
416 "node_VerneMQ@10.10.10.20_mqtt4_mqtt_publish_received": 0,
417 "node_VerneMQ@10.10.10.20_mqtt4_mqtt_publish_sent": 0,
418 "node_VerneMQ@10.10.10.20_mqtt4_mqtt_pubrec_invalid_error": 0,
419 "node_VerneMQ@10.10.10.20_mqtt4_mqtt_pubrec_received": 0,
420 "node_VerneMQ@10.10.10.20_mqtt4_mqtt_pubrec_sent": 0,
421 "node_VerneMQ@10.10.10.20_mqtt4_mqtt_pubrel_received": 0,
422 "node_VerneMQ@10.10.10.20_mqtt4_mqtt_pubrel_sent": 0,
423 "node_VerneMQ@10.10.10.20_mqtt4_mqtt_suback_sent": 0,
424 "node_VerneMQ@10.10.10.20_mqtt4_mqtt_subscribe_auth_error": 0,
425 "node_VerneMQ@10.10.10.20_mqtt4_mqtt_subscribe_error": 0,
426 "node_VerneMQ@10.10.10.20_mqtt4_mqtt_subscribe_received": 0,
427 "node_VerneMQ@10.10.10.20_mqtt4_mqtt_unsuback_sent": 0,
428 "node_VerneMQ@10.10.10.20_mqtt4_mqtt_unsubscribe_error": 0,
429 "node_VerneMQ@10.10.10.20_mqtt4_mqtt_unsubscribe_received": 0,
430 "node_VerneMQ@10.10.10.20_mqtt5_client_keepalive_expired": 0,
431 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_auth_received": 0,
432 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_auth_received_reason_code_continue_authentication": 0,
433 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_auth_received_reason_code_reauthenticate": 0,
434 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_auth_received_reason_code_success": 0,
435 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_auth_sent": 0,
436 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_auth_sent_reason_code_continue_authentication": 0,
437 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_auth_sent_reason_code_reauthenticate": 0,
438 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_auth_sent_reason_code_success": 0,
439 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_connack_sent": 0,
440 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_connack_sent_reason_code_bad_authentication_method": 0,
441 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_connack_sent_reason_code_bad_username_or_password": 0,
442 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_connack_sent_reason_code_banned": 0,
443 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_connack_sent_reason_code_client_identifier_not_valid": 0,
444 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_connack_sent_reason_code_connection_rate_exceeded": 0,
445 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_connack_sent_reason_code_impl_specific_error": 0,
446 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_connack_sent_reason_code_malformed_packet": 0,
447 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_connack_sent_reason_code_not_authorized": 0,
448 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_connack_sent_reason_code_packet_too_large": 0,
449 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_connack_sent_reason_code_payload_format_invalid": 0,
450 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_connack_sent_reason_code_protocol_error": 0,
451 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_connack_sent_reason_code_qos_not_supported": 0,
452 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_connack_sent_reason_code_quota_exceeded": 0,
453 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_connack_sent_reason_code_retain_not_supported": 0,
454 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_connack_sent_reason_code_server_busy": 0,
455 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_connack_sent_reason_code_server_moved": 0,
456 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_connack_sent_reason_code_server_unavailable": 0,
457 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_connack_sent_reason_code_success": 0,
458 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_connack_sent_reason_code_topic_name_invalid": 0,
459 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_connack_sent_reason_code_unspecified_error": 0,
460 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_connack_sent_reason_code_unsupported_protocol_version": 0,
461 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_connack_sent_reason_code_use_another_server": 0,
462 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_connect_received": 0,
463 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_received": 0,
464 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_received_reason_code_administrative_action": 0,
465 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_received_reason_code_disconnect_with_will_msg": 0,
466 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_received_reason_code_impl_specific_error": 0,
467 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_received_reason_code_malformed_packet": 0,
468 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_received_reason_code_message_rate_too_high": 0,
469 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_received_reason_code_normal_disconnect": 0,
470 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_received_reason_code_packet_too_large": 0,
471 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_received_reason_code_payload_format_invalid": 0,
472 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_received_reason_code_protocol_error": 0,
473 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_received_reason_code_quota_exceeded": 0,
474 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_received_reason_code_receive_max_exceeded": 0,
475 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_received_reason_code_topic_alias_invalid": 0,
476 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_received_reason_code_topic_name_invalid": 0,
477 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_received_reason_code_unspecified_error": 0,
478 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_sent": 0,
479 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_sent_reason_code_administrative_action": 0,
480 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_sent_reason_code_connection_rate_exceeded": 0,
481 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_sent_reason_code_impl_specific_error": 0,
482 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_sent_reason_code_keep_alive_timeout": 0,
483 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_sent_reason_code_malformed_packet": 0,
484 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_sent_reason_code_max_connect_time": 0,
485 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_sent_reason_code_message_rate_too_high": 0,
486 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_sent_reason_code_normal_disconnect": 0,
487 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_sent_reason_code_not_authorized": 0,
488 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_sent_reason_code_packet_too_large": 0,
489 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_sent_reason_code_payload_format_invalid": 0,
490 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_sent_reason_code_protocol_error": 0,
491 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_sent_reason_code_qos_not_supported": 0,
492 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_sent_reason_code_quota_exceeded": 0,
493 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_sent_reason_code_receive_max_exceeded": 0,
494 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_sent_reason_code_retain_not_supported": 0,
495 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_sent_reason_code_server_busy": 0,
496 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_sent_reason_code_server_moved": 0,
497 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_sent_reason_code_server_shutting_down": 0,
498 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_sent_reason_code_session_taken_over": 0,
499 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_sent_reason_code_shared_subs_not_supported": 0,
500 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_sent_reason_code_subscription_ids_not_supported": 0,
501 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_sent_reason_code_topic_alias_invalid": 0,
502 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_sent_reason_code_topic_filter_invalid": 0,
503 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_sent_reason_code_topic_name_invalid": 0,
504 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_sent_reason_code_unspecified_error": 0,
505 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_sent_reason_code_use_another_server": 0,
506 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_sent_reason_code_wildcard_subs_not_supported": 0,
507 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_invalid_msg_size_error": 0,
508 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pingreq_received": 0,
509 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pingresp_sent": 0,
510 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_puback_invalid_error": 0,
511 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_puback_received": 0,
512 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_puback_received_reason_code_impl_specific_error": 0,
513 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_puback_received_reason_code_no_matching_subscribers": 0,
514 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_puback_received_reason_code_not_authorized": 0,
515 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_puback_received_reason_code_packet_id_in_use": 0,
516 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_puback_received_reason_code_payload_format_invalid": 0,
517 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_puback_received_reason_code_quota_exceeded": 0,
518 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_puback_received_reason_code_success": 0,
519 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_puback_received_reason_code_topic_name_invalid": 0,
520 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_puback_received_reason_code_unspecified_error": 0,
521 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_puback_sent": 0,
522 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_puback_sent_reason_code_impl_specific_error": 0,
523 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_puback_sent_reason_code_no_matching_subscribers": 0,
524 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_puback_sent_reason_code_not_authorized": 0,
525 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_puback_sent_reason_code_packet_id_in_use": 0,
526 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_puback_sent_reason_code_payload_format_invalid": 0,
527 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_puback_sent_reason_code_quota_exceeded": 0,
528 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_puback_sent_reason_code_success": 0,
529 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_puback_sent_reason_code_topic_name_invalid": 0,
530 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_puback_sent_reason_code_unspecified_error": 0,
531 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pubcomp_invalid_error": 0,
532 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pubcomp_received": 0,
533 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pubcomp_received_reason_code_packet_id_not_found": 0,
534 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pubcomp_received_reason_code_success": 0,
535 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pubcomp_sent": 0,
536 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pubcomp_sent_reason_code_packet_id_not_found": 0,
537 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pubcomp_sent_reason_code_success": 0,
538 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_publish_auth_error": 0,
539 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_publish_error": 0,
540 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_publish_received": 0,
541 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_publish_sent": 0,
542 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pubrec_received": 0,
543 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pubrec_received_reason_code_impl_specific_error": 0,
544 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pubrec_received_reason_code_no_matching_subscribers": 0,
545 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pubrec_received_reason_code_not_authorized": 0,
546 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pubrec_received_reason_code_packet_id_in_use": 0,
547 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pubrec_received_reason_code_payload_format_invalid": 0,
548 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pubrec_received_reason_code_quota_exceeded": 0,
549 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pubrec_received_reason_code_success": 0,
550 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pubrec_received_reason_code_topic_name_invalid": 0,
551 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pubrec_received_reason_code_unspecified_error": 0,
552 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pubrec_sent": 0,
553 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pubrec_sent_reason_code_impl_specific_error": 0,
554 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pubrec_sent_reason_code_no_matching_subscribers": 0,
555 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pubrec_sent_reason_code_not_authorized": 0,
556 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pubrec_sent_reason_code_packet_id_in_use": 0,
557 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pubrec_sent_reason_code_payload_format_invalid": 0,
558 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pubrec_sent_reason_code_quota_exceeded": 0,
559 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pubrec_sent_reason_code_success": 0,
560 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pubrec_sent_reason_code_topic_name_invalid": 0,
561 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pubrec_sent_reason_code_unspecified_error": 0,
562 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pubrel_received": 0,
563 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pubrel_received_reason_code_packet_id_not_found": 0,
564 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pubrel_received_reason_code_success": 0,
565 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pubrel_sent": 0,
566 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pubrel_sent_reason_code_packet_id_not_found": 0,
567 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pubrel_sent_reason_code_success": 0,
568 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_suback_sent": 0,
569 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_subscribe_auth_error": 0,
570 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_subscribe_error": 0,
571 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_subscribe_received": 0,
572 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_unsuback_sent": 0,
573 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_unsubscribe_error": 0,
574 "node_VerneMQ@10.10.10.20_mqtt5_mqtt_unsubscribe_received": 0,
575 "node_VerneMQ@10.10.10.20_netsplit_detected": 0,
576 "node_VerneMQ@10.10.10.20_netsplit_resolved": 0,
577 "node_VerneMQ@10.10.10.20_netsplit_unresolved": 0,
578 "node_VerneMQ@10.10.10.20_open_sockets": 0,
579 "node_VerneMQ@10.10.10.20_queue_initialized_from_storage": 0,
580 "node_VerneMQ@10.10.10.20_queue_message_drop": 0,
581 "node_VerneMQ@10.10.10.20_queue_message_expired": 0,
582 "node_VerneMQ@10.10.10.20_queue_message_in": 0,
583 "node_VerneMQ@10.10.10.20_queue_message_out": 0,
584 "node_VerneMQ@10.10.10.20_queue_message_unhandled": 0,
585 "node_VerneMQ@10.10.10.20_queue_processes": 0,
586 "node_VerneMQ@10.10.10.20_queue_setup": 0,
587 "node_VerneMQ@10.10.10.20_queue_teardown": 0,
588 "node_VerneMQ@10.10.10.20_queued_messages": 0,
589 "node_VerneMQ@10.10.10.20_retain_memory": 15792,
590 "node_VerneMQ@10.10.10.20_retain_messages": 0,
591 "node_VerneMQ@10.10.10.20_router_matches_local": 0,
592 "node_VerneMQ@10.10.10.20_router_matches_remote": 0,
593 "node_VerneMQ@10.10.10.20_router_memory": 20224,
594 "node_VerneMQ@10.10.10.20_router_subscriptions": 0,
595 "node_VerneMQ@10.10.10.20_socket_close": 0,
596 "node_VerneMQ@10.10.10.20_socket_close_timeout": 0,
597 "node_VerneMQ@10.10.10.20_socket_error": 0,
598 "node_VerneMQ@10.10.10.20_socket_open": 0,
599 "node_VerneMQ@10.10.10.20_system_context_switches": 3902972,
600 "node_VerneMQ@10.10.10.20_system_exact_reductions": 340307987,
601 "node_VerneMQ@10.10.10.20_system_gc_count": 355236,
602 "node_VerneMQ@10.10.10.20_system_io_in": 30616669,
603 "node_VerneMQ@10.10.10.20_system_io_out": 1702500,
604 "node_VerneMQ@10.10.10.20_system_process_count": 465,
605 "node_VerneMQ@10.10.10.20_system_reductions": 340640218,
606 "node_VerneMQ@10.10.10.20_system_run_queue": 0,
607 "node_VerneMQ@10.10.10.20_system_runtime": 54249,
608 "node_VerneMQ@10.10.10.20_system_utilization": 5,
609 "node_VerneMQ@10.10.10.20_system_wallclock": 51082602,
610 "node_VerneMQ@10.10.10.20_system_words_reclaimed_by_gc": 661531058,
611 "node_VerneMQ@10.10.10.20_total_active_connections": 0,
612 "node_VerneMQ@10.10.10.20_vm_memory_atom": 639193,
613 "node_VerneMQ@10.10.10.20_vm_memory_atom_used": 634383,
614 "node_VerneMQ@10.10.10.20_vm_memory_binary": 729792,
615 "node_VerneMQ@10.10.10.20_vm_memory_code": 13546686,
616 "node_VerneMQ@10.10.10.20_vm_memory_ets": 6665000,
617 "node_VerneMQ@10.10.10.20_vm_memory_processes": 13754320,
618 "node_VerneMQ@10.10.10.20_vm_memory_processes_used": 13751224,
619 "node_VerneMQ@10.10.10.20_vm_memory_system": 44839192,
620 "node_VerneMQ@10.10.10.20_vm_memory_total": 58593512,
621 },
622 },
623 "fails on unexpected Prometheus response": {
624 prepare: caseUnexpectedPrometheusMetrics,
625 wantMetrics: nil,
626 },
627 "fails on invalid data response": {
628 prepare: caseInvalidDataResponse,
629 wantMetrics: nil,
630 },
631 "fails on connection refused": {
632 prepare: caseConnectionRefused,
633 wantMetrics: nil,
634 },
635 "fails on 404 response": {
636 prepare: case404,
637 wantMetrics: nil,
638 },
639 }
640
641 for name, test := range tests {
642 t.Run(name, func(t *testing.T) {
643 collr, cleanup := test.prepare(t)
644 defer cleanup()
645
646 mx := collr.Collect(context.Background())
647
648 require.Equal(t, test.wantMetrics, mx)
649
650 if len(test.wantMetrics) > 0 {
651 assert.Equal(t, test.wantNumOfCharts, len(*collr.Charts()), "want charts")
652
653 collecttest.TestMetricsHasAllChartsDims(t, collr.Charts(), mx)
654 }
655 })
656 }
657 }
658
659 func caseOkVer201(t *testing.T) (*Collector, func()) {
660 t.Helper()
661 srv := httptest.NewServer(http.HandlerFunc(
662 func(w http.ResponseWriter, r *http.Request) {
663 _, _ = w.Write(dataVer201Metrics)
664 }))
665
666 collr := New()
667 collr.URL = srv.URL
668 require.NoError(t, collr.Init(context.Background()))
669
670 return collr, srv.Close
671 }
672
673 func caseOkVer1101(t *testing.T) (*Collector, func()) {
674 t.Helper()
675 srv := httptest.NewServer(http.HandlerFunc(
676 func(w http.ResponseWriter, r *http.Request) {
677 _, _ = w.Write(dataVer1101Metrics)
678 }))
679
680 collr := New()
681 collr.URL = srv.URL
682 require.NoError(t, collr.Init(context.Background()))
683
684 return collr, srv.Close
685 }
686
687 func caseUnexpectedPrometheusMetrics(t *testing.T) (*Collector, func()) {
688 data := `
689 # HELP wmi_os_process_memory_limix_bytes OperatingSystem.MaxProcessMemorySize
690 # TYPE wmi_os_process_memory_limix_bytes gauge
691 wmi_os_process_memory_limix_bytes 1.40737488224256e+14
692 # HELP wmi_os_processes OperatingSystem.NumberOfProcesses
693 # TYPE wmi_os_processes gauge
694 wmi_os_processes 124
695 # HELP wmi_os_processes_limit OperatingSystem.MaxNumberOfProcesses
696 # TYPE wmi_os_processes_limit gauge
697 wmi_os_processes_limit 4.294967295e+09
698 `
699 t.Helper()
700 srv := httptest.NewServer(http.HandlerFunc(
701 func(w http.ResponseWriter, r *http.Request) {
702 _, _ = w.Write([]byte(data))
703 }))
704
705 collr := New()
706 collr.URL = srv.URL
707 require.NoError(t, collr.Init(context.Background()))
708
709 return collr, srv.Close
710 }
711
712 func caseInvalidDataResponse(t *testing.T) (*Collector, func()) {
713 t.Helper()
714 srv := httptest.NewServer(http.HandlerFunc(
715 func(w http.ResponseWriter, r *http.Request) {
716 _, _ = w.Write([]byte("hello and\n goodbye"))
717 }))
718 collr := New()
719 collr.URL = srv.URL
720 require.NoError(t, collr.Init(context.Background()))
721
722 return collr, srv.Close
723 }
724
725 func caseConnectionRefused(t *testing.T) (*Collector, func()) {
726 t.Helper()
727 collr := New()
728 collr.URL = "http://127.0.0.1:65001"
729 require.NoError(t, collr.Init(context.Background()))
730
731 return collr, func() {}
732 }
733
734 func case404(t *testing.T) (*Collector, func()) {
735 t.Helper()
736 srv := httptest.NewServer(http.HandlerFunc(
737 func(w http.ResponseWriter, r *http.Request) {
738 w.WriteHeader(http.StatusNotFound)
739 }))
740
741 collr := New()
742 collr.URL = srv.URL
743 require.NoError(t, collr.Init(context.Background()))
744
745 return collr, srv.Close
746 }