github.com/netdata/go.d.plugin@v0.58.1/modules/vernemq/vernemq_test.go (about) 1 // SPDX-License-Identifier: GPL-3.0-or-later 2 3 package vernemq 4 5 import ( 6 "net/http" 7 "net/http/httptest" 8 "os" 9 "testing" 10 11 "github.com/netdata/go.d.plugin/agent/module" 12 "github.com/stretchr/testify/assert" 13 "github.com/stretchr/testify/require" 14 ) 15 16 var ( 17 metricsV1101MQTTv5, _ = os.ReadFile("testdata/metrics-v1.10.1-mqtt5.txt") 18 invalidMetrics, _ = os.ReadFile("testdata/non_vernemq.txt") 19 ) 20 21 func Test_readTestData(t *testing.T) { 22 assert.NotNil(t, metricsV1101MQTTv5) 23 } 24 25 func TestNew(t *testing.T) { 26 assert.Implements(t, (*module.Module)(nil), New()) 27 } 28 29 func TestVerneMQ_Init(t *testing.T) { 30 verneMQ := prepareVerneMQ() 31 32 assert.True(t, verneMQ.Init()) 33 } 34 35 func TestVerneMQ_Init_ReturnsFalseIfURLIsNotSet(t *testing.T) { 36 verneMQ := prepareVerneMQ() 37 verneMQ.URL = "" 38 39 assert.False(t, verneMQ.Init()) 40 } 41 42 func TestVerneMQ_Init_ReturnsFalseIfClientWrongTLSCA(t *testing.T) { 43 verneMQ := prepareVerneMQ() 44 verneMQ.Client.TLSConfig.TLSCA = "testdata/tls" 45 46 assert.False(t, verneMQ.Init()) 47 } 48 49 func TestVerneMQ_Check(t *testing.T) { 50 verneMQ, srv := prepareClientServerV1101(t) 51 defer srv.Close() 52 53 assert.True(t, verneMQ.Check()) 54 } 55 56 func TestVerneMQ_Check_ReturnsFalseIfConnectionRefused(t *testing.T) { 57 verneMQ := prepareVerneMQ() 58 require.True(t, verneMQ.Init()) 59 60 assert.False(t, verneMQ.Check()) 61 } 62 63 func TestVerneMQ_Check_ReturnsFalseIfMetricsAreNotVerneMQ(t *testing.T) { 64 verneMQ, srv := prepareClientServerNotVerneMQ(t) 65 defer srv.Close() 66 require.True(t, verneMQ.Init()) 67 68 assert.False(t, verneMQ.Check()) 69 } 70 71 func TestVerneMQ_Charts(t *testing.T) { 72 assert.NotNil(t, New().Charts()) 73 } 74 75 func TestVerneMQ_Cleanup(t *testing.T) { 76 assert.NotPanics(t, New().Cleanup) 77 } 78 79 func TestVerneMQ_Collect(t *testing.T) { 80 verneMQ, srv := prepareClientServerV1101(t) 81 defer srv.Close() 82 83 collected := verneMQ.Collect() 84 assert.Equal(t, v1101ExpectedMetrics, collected) 85 testCharts(t, verneMQ, collected) 86 } 87 88 func TestVerneMQ_Collect_ReturnsNilIfConnectionRefused(t *testing.T) { 89 verneMQ := prepareVerneMQ() 90 require.True(t, verneMQ.Init()) 91 92 assert.Nil(t, verneMQ.Collect()) 93 } 94 95 func TestVerneMQ_Collect_ReturnsNilIfMetricsAreNotVerneMQ(t *testing.T) { 96 verneMQ, srv := prepareClientServerNotVerneMQ(t) 97 defer srv.Close() 98 99 assert.Nil(t, verneMQ.Collect()) 100 } 101 102 func TestVerneMQ_Collect_ReturnsNilIfReceiveInvalidResponse(t *testing.T) { 103 verneMQ, ts := prepareClientServerInvalid(t) 104 defer ts.Close() 105 106 assert.Nil(t, verneMQ.Collect()) 107 } 108 109 func TestVerneMQ_Collect_ReturnsNilIfReceiveResponse404(t *testing.T) { 110 verneMQ, ts := prepareClientServerResponse404(t) 111 defer ts.Close() 112 113 assert.Nil(t, verneMQ.Collect()) 114 } 115 116 func testCharts(t *testing.T, verneMQ *VerneMQ, collected map[string]int64) { 117 ensureCollectedHasAllChartsDimsVarsIDs(t, verneMQ, collected) 118 } 119 120 func ensureCollectedHasAllChartsDimsVarsIDs(t *testing.T, verneMQ *VerneMQ, collected map[string]int64) { 121 for _, chart := range *verneMQ.Charts() { 122 for _, dim := range chart.Dims { 123 _, ok := collected[dim.ID] 124 assert.Truef(t, ok, "collected metrics has no data for dim '%s' chart '%s'", dim.ID, chart.ID) 125 } 126 for _, v := range chart.Vars { 127 _, ok := collected[v.ID] 128 assert.Truef(t, ok, "collected metrics has no data for var '%s' chart '%s'", v.ID, chart.ID) 129 } 130 } 131 } 132 133 func prepareVerneMQ() *VerneMQ { 134 verneMQ := New() 135 verneMQ.URL = "http://127.0.0.1:38001/metrics" 136 return verneMQ 137 } 138 139 func prepareClientServerV1101(t *testing.T) (*VerneMQ, *httptest.Server) { 140 t.Helper() 141 ts := httptest.NewServer(http.HandlerFunc( 142 func(w http.ResponseWriter, r *http.Request) { 143 _, _ = w.Write(metricsV1101MQTTv5) 144 })) 145 146 verneMQ := New() 147 verneMQ.URL = ts.URL 148 require.True(t, verneMQ.Init()) 149 150 return verneMQ, ts 151 } 152 153 func prepareClientServerNotVerneMQ(t *testing.T) (*VerneMQ, *httptest.Server) { 154 t.Helper() 155 ts := httptest.NewServer(http.HandlerFunc( 156 func(w http.ResponseWriter, r *http.Request) { 157 _, _ = w.Write(invalidMetrics) 158 })) 159 160 verneMQ := New() 161 verneMQ.URL = ts.URL 162 require.True(t, verneMQ.Init()) 163 164 return verneMQ, ts 165 } 166 167 func prepareClientServerInvalid(t *testing.T) (*VerneMQ, *httptest.Server) { 168 t.Helper() 169 ts := httptest.NewServer(http.HandlerFunc( 170 func(w http.ResponseWriter, r *http.Request) { 171 _, _ = w.Write([]byte("hello and\n goodbye")) 172 })) 173 174 verneMQ := New() 175 verneMQ.URL = ts.URL 176 require.True(t, verneMQ.Init()) 177 178 return verneMQ, ts 179 } 180 181 func prepareClientServerResponse404(t *testing.T) (*VerneMQ, *httptest.Server) { 182 t.Helper() 183 ts := httptest.NewServer(http.HandlerFunc( 184 func(w http.ResponseWriter, r *http.Request) { 185 w.WriteHeader(http.StatusNotFound) 186 })) 187 188 verneMQ := New() 189 verneMQ.URL = ts.URL 190 require.True(t, verneMQ.Init()) 191 return verneMQ, ts 192 } 193 194 var v1101ExpectedMetrics = map[string]int64{ 195 "bytes_received": 36796908, 196 "bytes_sent": 23361693, 197 "client_keepalive_expired": 1, 198 "cluster_bytes_dropped": 0, 199 "cluster_bytes_received": 0, 200 "cluster_bytes_sent": 0, 201 "mqtt_auth_received": 0, 202 "mqtt_auth_received_continue_authentication": 0, 203 "mqtt_auth_received_reauthenticate": 0, 204 "mqtt_auth_received_success": 0, 205 "mqtt_auth_received_v_5": 0, 206 "mqtt_auth_received_v_5_continue_authentication": 0, 207 "mqtt_auth_received_v_5_reauthenticate": 0, 208 "mqtt_auth_received_v_5_success": 0, 209 "mqtt_auth_sent": 0, 210 "mqtt_auth_sent_continue_authentication": 0, 211 "mqtt_auth_sent_reauthenticate": 0, 212 "mqtt_auth_sent_success": 0, 213 "mqtt_auth_sent_v_5": 0, 214 "mqtt_auth_sent_v_5_continue_authentication": 0, 215 "mqtt_auth_sent_v_5_reauthenticate": 0, 216 "mqtt_auth_sent_v_5_success": 0, 217 "mqtt_connack_sent": 338956, 218 "mqtt_connack_sent_bad_authentication_method": 0, 219 "mqtt_connack_sent_bad_username_or_password": 4, 220 "mqtt_connack_sent_banned": 0, 221 "mqtt_connack_sent_client_identifier_not_valid": 0, 222 "mqtt_connack_sent_connection_rate_exceeded": 0, 223 "mqtt_connack_sent_impl_specific_error": 0, 224 "mqtt_connack_sent_malformed_packet": 0, 225 "mqtt_connack_sent_not_authorized": 4, 226 "mqtt_connack_sent_packet_too_large": 0, 227 "mqtt_connack_sent_payload_format_invalid": 0, 228 "mqtt_connack_sent_protocol_error": 0, 229 "mqtt_connack_sent_qos_not_supported": 0, 230 "mqtt_connack_sent_quota_exceeded": 0, 231 "mqtt_connack_sent_retain_not_supported": 0, 232 "mqtt_connack_sent_server_busy": 0, 233 "mqtt_connack_sent_server_moved": 0, 234 "mqtt_connack_sent_server_unavailable": 0, 235 "mqtt_connack_sent_success": 338948, 236 "mqtt_connack_sent_topic_name_invalid": 0, 237 "mqtt_connack_sent_unspecified_error": 0, 238 "mqtt_connack_sent_unsupported_protocol_version": 0, 239 "mqtt_connack_sent_use_another_server": 0, 240 "mqtt_connack_sent_v_4": 338956, 241 "mqtt_connack_sent_v_4_bad_username_or_password": 4, 242 "mqtt_connack_sent_v_4_client_identifier_not_valid": 0, 243 "mqtt_connack_sent_v_4_not_authorized": 4, 244 "mqtt_connack_sent_v_4_server_unavailable": 0, 245 "mqtt_connack_sent_v_4_success": 338948, 246 "mqtt_connack_sent_v_4_unsupported_protocol_version": 0, 247 "mqtt_connack_sent_v_5": 0, 248 "mqtt_connack_sent_v_5_bad_authentication_method": 0, 249 "mqtt_connack_sent_v_5_bad_username_or_password": 0, 250 "mqtt_connack_sent_v_5_banned": 0, 251 "mqtt_connack_sent_v_5_client_identifier_not_valid": 0, 252 "mqtt_connack_sent_v_5_connection_rate_exceeded": 0, 253 "mqtt_connack_sent_v_5_impl_specific_error": 0, 254 "mqtt_connack_sent_v_5_malformed_packet": 0, 255 "mqtt_connack_sent_v_5_not_authorized": 0, 256 "mqtt_connack_sent_v_5_packet_too_large": 0, 257 "mqtt_connack_sent_v_5_payload_format_invalid": 0, 258 "mqtt_connack_sent_v_5_protocol_error": 0, 259 "mqtt_connack_sent_v_5_qos_not_supported": 0, 260 "mqtt_connack_sent_v_5_quota_exceeded": 0, 261 "mqtt_connack_sent_v_5_retain_not_supported": 0, 262 "mqtt_connack_sent_v_5_server_busy": 0, 263 "mqtt_connack_sent_v_5_server_moved": 0, 264 "mqtt_connack_sent_v_5_server_unavailable": 0, 265 "mqtt_connack_sent_v_5_success": 0, 266 "mqtt_connack_sent_v_5_topic_name_invalid": 0, 267 "mqtt_connack_sent_v_5_unspecified_error": 0, 268 "mqtt_connack_sent_v_5_unsupported_protocol_version": 0, 269 "mqtt_connack_sent_v_5_use_another_server": 0, 270 "mqtt_connect_received": 338956, 271 "mqtt_connect_received_v_4": 338956, 272 "mqtt_connect_received_v_5": 0, 273 "mqtt_disconnect_received": 107, 274 "mqtt_disconnect_received_administrative_action": 0, 275 "mqtt_disconnect_received_disconnect_with_will_msg": 0, 276 "mqtt_disconnect_received_impl_specific_error": 0, 277 "mqtt_disconnect_received_malformed_packet": 0, 278 "mqtt_disconnect_received_message_rate_too_high": 0, 279 "mqtt_disconnect_received_normal_disconnect": 0, 280 "mqtt_disconnect_received_packet_too_large": 0, 281 "mqtt_disconnect_received_payload_format_invalid": 0, 282 "mqtt_disconnect_received_protocol_error": 0, 283 "mqtt_disconnect_received_quota_exceeded": 0, 284 "mqtt_disconnect_received_receive_max_exceeded": 0, 285 "mqtt_disconnect_received_topic_alias_invalid": 0, 286 "mqtt_disconnect_received_topic_name_invalid": 0, 287 "mqtt_disconnect_received_unspecified_error": 0, 288 "mqtt_disconnect_received_v_4": 107, 289 "mqtt_disconnect_received_v_5": 0, 290 "mqtt_disconnect_received_v_5_administrative_action": 0, 291 "mqtt_disconnect_received_v_5_disconnect_with_will_msg": 0, 292 "mqtt_disconnect_received_v_5_impl_specific_error": 0, 293 "mqtt_disconnect_received_v_5_malformed_packet": 0, 294 "mqtt_disconnect_received_v_5_message_rate_too_high": 0, 295 "mqtt_disconnect_received_v_5_normal_disconnect": 0, 296 "mqtt_disconnect_received_v_5_packet_too_large": 0, 297 "mqtt_disconnect_received_v_5_payload_format_invalid": 0, 298 "mqtt_disconnect_received_v_5_protocol_error": 0, 299 "mqtt_disconnect_received_v_5_quota_exceeded": 0, 300 "mqtt_disconnect_received_v_5_receive_max_exceeded": 0, 301 "mqtt_disconnect_received_v_5_topic_alias_invalid": 0, 302 "mqtt_disconnect_received_v_5_topic_name_invalid": 0, 303 "mqtt_disconnect_received_v_5_unspecified_error": 0, 304 "mqtt_disconnect_sent": 0, 305 "mqtt_disconnect_sent_administrative_action": 0, 306 "mqtt_disconnect_sent_connection_rate_exceeded": 0, 307 "mqtt_disconnect_sent_impl_specific_error": 0, 308 "mqtt_disconnect_sent_keep_alive_timeout": 0, 309 "mqtt_disconnect_sent_malformed_packet": 0, 310 "mqtt_disconnect_sent_max_connect_time": 0, 311 "mqtt_disconnect_sent_message_rate_too_high": 0, 312 "mqtt_disconnect_sent_normal_disconnect": 0, 313 "mqtt_disconnect_sent_not_authorized": 0, 314 "mqtt_disconnect_sent_packet_too_large": 0, 315 "mqtt_disconnect_sent_payload_format_invalid": 0, 316 "mqtt_disconnect_sent_protocol_error": 0, 317 "mqtt_disconnect_sent_qos_not_supported": 0, 318 "mqtt_disconnect_sent_quota_exceeded": 0, 319 "mqtt_disconnect_sent_receive_max_exceeded": 0, 320 "mqtt_disconnect_sent_retain_not_supported": 0, 321 "mqtt_disconnect_sent_server_busy": 0, 322 "mqtt_disconnect_sent_server_moved": 0, 323 "mqtt_disconnect_sent_server_shutting_down": 0, 324 "mqtt_disconnect_sent_session_taken_over": 0, 325 "mqtt_disconnect_sent_shared_subs_not_supported": 0, 326 "mqtt_disconnect_sent_subscription_ids_not_supported": 0, 327 "mqtt_disconnect_sent_topic_alias_invalid": 0, 328 "mqtt_disconnect_sent_topic_filter_invalid": 0, 329 "mqtt_disconnect_sent_topic_name_invalid": 0, 330 "mqtt_disconnect_sent_unspecified_error": 0, 331 "mqtt_disconnect_sent_use_another_server": 0, 332 "mqtt_disconnect_sent_v_5": 0, 333 "mqtt_disconnect_sent_v_5_administrative_action": 0, 334 "mqtt_disconnect_sent_v_5_connection_rate_exceeded": 0, 335 "mqtt_disconnect_sent_v_5_impl_specific_error": 0, 336 "mqtt_disconnect_sent_v_5_keep_alive_timeout": 0, 337 "mqtt_disconnect_sent_v_5_malformed_packet": 0, 338 "mqtt_disconnect_sent_v_5_max_connect_time": 0, 339 "mqtt_disconnect_sent_v_5_message_rate_too_high": 0, 340 "mqtt_disconnect_sent_v_5_normal_disconnect": 0, 341 "mqtt_disconnect_sent_v_5_not_authorized": 0, 342 "mqtt_disconnect_sent_v_5_packet_too_large": 0, 343 "mqtt_disconnect_sent_v_5_payload_format_invalid": 0, 344 "mqtt_disconnect_sent_v_5_protocol_error": 0, 345 "mqtt_disconnect_sent_v_5_qos_not_supported": 0, 346 "mqtt_disconnect_sent_v_5_quota_exceeded": 0, 347 "mqtt_disconnect_sent_v_5_receive_max_exceeded": 0, 348 "mqtt_disconnect_sent_v_5_retain_not_supported": 0, 349 "mqtt_disconnect_sent_v_5_server_busy": 0, 350 "mqtt_disconnect_sent_v_5_server_moved": 0, 351 "mqtt_disconnect_sent_v_5_server_shutting_down": 0, 352 "mqtt_disconnect_sent_v_5_session_taken_over": 0, 353 "mqtt_disconnect_sent_v_5_shared_subs_not_supported": 0, 354 "mqtt_disconnect_sent_v_5_subscription_ids_not_supported": 0, 355 "mqtt_disconnect_sent_v_5_topic_alias_invalid": 0, 356 "mqtt_disconnect_sent_v_5_topic_filter_invalid": 0, 357 "mqtt_disconnect_sent_v_5_topic_name_invalid": 0, 358 "mqtt_disconnect_sent_v_5_unspecified_error": 0, 359 "mqtt_disconnect_sent_v_5_use_another_server": 0, 360 "mqtt_disconnect_sent_v_5_wildcard_subs_not_supported": 0, 361 "mqtt_disconnect_sent_wildcard_subs_not_supported": 0, 362 "mqtt_invalid_msg_size_error": 0, 363 "mqtt_invalid_msg_size_error_v_4": 0, 364 "mqtt_invalid_msg_size_error_v_5": 0, 365 "mqtt_pingreq_received": 205, 366 "mqtt_pingreq_received_v_4": 205, 367 "mqtt_pingreq_received_v_5": 0, 368 "mqtt_pingresp_sent": 205, 369 "mqtt_pingresp_sent_v_4": 205, 370 "mqtt_pingresp_sent_v_5": 0, 371 "mqtt_puback_invalid_error": 0, 372 "mqtt_puback_invalid_error_v_4": 0, 373 "mqtt_puback_invalid_error_v_5": 0, 374 "mqtt_puback_received": 525694, 375 "mqtt_puback_received_impl_specific_error": 0, 376 "mqtt_puback_received_no_matching_subscribers": 0, 377 "mqtt_puback_received_not_authorized": 0, 378 "mqtt_puback_received_packet_id_in_use": 0, 379 "mqtt_puback_received_payload_format_invalid": 0, 380 "mqtt_puback_received_quota_exceeded": 0, 381 "mqtt_puback_received_success": 0, 382 "mqtt_puback_received_topic_name_invalid": 0, 383 "mqtt_puback_received_unspecified_error": 0, 384 "mqtt_puback_received_v_4": 525694, 385 "mqtt_puback_received_v_5": 0, 386 "mqtt_puback_received_v_5_impl_specific_error": 0, 387 "mqtt_puback_received_v_5_no_matching_subscribers": 0, 388 "mqtt_puback_received_v_5_not_authorized": 0, 389 "mqtt_puback_received_v_5_packet_id_in_use": 0, 390 "mqtt_puback_received_v_5_payload_format_invalid": 0, 391 "mqtt_puback_received_v_5_quota_exceeded": 0, 392 "mqtt_puback_received_v_5_success": 0, 393 "mqtt_puback_received_v_5_topic_name_invalid": 0, 394 "mqtt_puback_received_v_5_unspecified_error": 0, 395 "mqtt_puback_sent": 537068, 396 "mqtt_puback_sent_impl_specific_error": 0, 397 "mqtt_puback_sent_no_matching_subscribers": 0, 398 "mqtt_puback_sent_not_authorized": 0, 399 "mqtt_puback_sent_packet_id_in_use": 0, 400 "mqtt_puback_sent_payload_format_invalid": 0, 401 "mqtt_puback_sent_quota_exceeded": 0, 402 "mqtt_puback_sent_success": 0, 403 "mqtt_puback_sent_topic_name_invalid": 0, 404 "mqtt_puback_sent_unspecified_error": 0, 405 "mqtt_puback_sent_v_4": 537068, 406 "mqtt_puback_sent_v_5": 0, 407 "mqtt_puback_sent_v_5_impl_specific_error": 0, 408 "mqtt_puback_sent_v_5_no_matching_subscribers": 0, 409 "mqtt_puback_sent_v_5_not_authorized": 0, 410 "mqtt_puback_sent_v_5_packet_id_in_use": 0, 411 "mqtt_puback_sent_v_5_payload_format_invalid": 0, 412 "mqtt_puback_sent_v_5_quota_exceeded": 0, 413 "mqtt_puback_sent_v_5_success": 0, 414 "mqtt_puback_sent_v_5_topic_name_invalid": 0, 415 "mqtt_puback_sent_v_5_unspecified_error": 0, 416 "mqtt_pubcomp_invalid_error": 0, 417 "mqtt_pubcomp_invalid_error_v_4": 0, 418 "mqtt_pubcomp_invalid_error_v_5": 0, 419 "mqtt_pubcomp_received": 0, 420 "mqtt_pubcomp_received_packet_id_not_found": 0, 421 "mqtt_pubcomp_received_success": 0, 422 "mqtt_pubcomp_received_v_4": 0, 423 "mqtt_pubcomp_received_v_5": 0, 424 "mqtt_pubcomp_received_v_5_packet_id_not_found": 0, 425 "mqtt_pubcomp_received_v_5_success": 0, 426 "mqtt_pubcomp_sent": 0, 427 "mqtt_pubcomp_sent_packet_id_not_found": 0, 428 "mqtt_pubcomp_sent_success": 0, 429 "mqtt_pubcomp_sent_v_4": 0, 430 "mqtt_pubcomp_sent_v_5": 0, 431 "mqtt_pubcomp_sent_v_5_packet_id_not_found": 0, 432 "mqtt_pubcomp_sent_v_5_success": 0, 433 "mqtt_publish_auth_error": 0, 434 "mqtt_publish_auth_error_v_4": 0, 435 "mqtt_publish_auth_error_v_5": 0, 436 "mqtt_publish_error": 0, 437 "mqtt_publish_error_v_4": 0, 438 "mqtt_publish_error_v_5": 0, 439 "mqtt_publish_received": 537088, 440 "mqtt_publish_received_v_4": 537088, 441 "mqtt_publish_received_v_5": 0, 442 "mqtt_publish_sent": 525721, 443 "mqtt_publish_sent_v_4": 525721, 444 "mqtt_publish_sent_v_5": 0, 445 "mqtt_pubrec_invalid_error": 0, 446 "mqtt_pubrec_invalid_error_v_4": 0, 447 "mqtt_pubrec_received": 0, 448 "mqtt_pubrec_received_impl_specific_error": 0, 449 "mqtt_pubrec_received_no_matching_subscribers": 0, 450 "mqtt_pubrec_received_not_authorized": 0, 451 "mqtt_pubrec_received_packet_id_in_use": 0, 452 "mqtt_pubrec_received_payload_format_invalid": 0, 453 "mqtt_pubrec_received_quota_exceeded": 0, 454 "mqtt_pubrec_received_success": 0, 455 "mqtt_pubrec_received_topic_name_invalid": 0, 456 "mqtt_pubrec_received_unspecified_error": 0, 457 "mqtt_pubrec_received_v_4": 0, 458 "mqtt_pubrec_received_v_5": 0, 459 "mqtt_pubrec_received_v_5_impl_specific_error": 0, 460 "mqtt_pubrec_received_v_5_no_matching_subscribers": 0, 461 "mqtt_pubrec_received_v_5_not_authorized": 0, 462 "mqtt_pubrec_received_v_5_packet_id_in_use": 0, 463 "mqtt_pubrec_received_v_5_payload_format_invalid": 0, 464 "mqtt_pubrec_received_v_5_quota_exceeded": 0, 465 "mqtt_pubrec_received_v_5_success": 0, 466 "mqtt_pubrec_received_v_5_topic_name_invalid": 0, 467 "mqtt_pubrec_received_v_5_unspecified_error": 0, 468 "mqtt_pubrec_sent": 0, 469 "mqtt_pubrec_sent_impl_specific_error": 0, 470 "mqtt_pubrec_sent_no_matching_subscribers": 0, 471 "mqtt_pubrec_sent_not_authorized": 0, 472 "mqtt_pubrec_sent_packet_id_in_use": 0, 473 "mqtt_pubrec_sent_payload_format_invalid": 0, 474 "mqtt_pubrec_sent_quota_exceeded": 0, 475 "mqtt_pubrec_sent_success": 0, 476 "mqtt_pubrec_sent_topic_name_invalid": 0, 477 "mqtt_pubrec_sent_unspecified_error": 0, 478 "mqtt_pubrec_sent_v_4": 0, 479 "mqtt_pubrec_sent_v_5": 0, 480 "mqtt_pubrec_sent_v_5_impl_specific_error": 0, 481 "mqtt_pubrec_sent_v_5_no_matching_subscribers": 0, 482 "mqtt_pubrec_sent_v_5_not_authorized": 0, 483 "mqtt_pubrec_sent_v_5_packet_id_in_use": 0, 484 "mqtt_pubrec_sent_v_5_payload_format_invalid": 0, 485 "mqtt_pubrec_sent_v_5_quota_exceeded": 0, 486 "mqtt_pubrec_sent_v_5_success": 0, 487 "mqtt_pubrec_sent_v_5_topic_name_invalid": 0, 488 "mqtt_pubrec_sent_v_5_unspecified_error": 0, 489 "mqtt_pubrel_received": 0, 490 "mqtt_pubrel_received_packet_id_not_found": 0, 491 "mqtt_pubrel_received_success": 0, 492 "mqtt_pubrel_received_v_4": 0, 493 "mqtt_pubrel_received_v_5": 0, 494 "mqtt_pubrel_received_v_5_packet_id_not_found": 0, 495 "mqtt_pubrel_received_v_5_success": 0, 496 "mqtt_pubrel_sent": 0, 497 "mqtt_pubrel_sent_packet_id_not_found": 0, 498 "mqtt_pubrel_sent_success": 0, 499 "mqtt_pubrel_sent_v_4": 0, 500 "mqtt_pubrel_sent_v_5": 0, 501 "mqtt_pubrel_sent_v_5_packet_id_not_found": 0, 502 "mqtt_pubrel_sent_v_5_success": 0, 503 "mqtt_suback_sent": 122, 504 "mqtt_suback_sent_v_4": 122, 505 "mqtt_suback_sent_v_5": 0, 506 "mqtt_subscribe_auth_error": 0, 507 "mqtt_subscribe_auth_error_v_4": 0, 508 "mqtt_subscribe_auth_error_v_5": 0, 509 "mqtt_subscribe_error": 0, 510 "mqtt_subscribe_error_v_4": 0, 511 "mqtt_subscribe_error_v_5": 0, 512 "mqtt_subscribe_received": 122, 513 "mqtt_subscribe_received_v_4": 122, 514 "mqtt_subscribe_received_v_5": 0, 515 "mqtt_unsuback_sent": 108, 516 "mqtt_unsuback_sent_v_4": 108, 517 "mqtt_unsuback_sent_v_5": 0, 518 "mqtt_unsubscribe_error": 0, 519 "mqtt_unsubscribe_error_v_4": 0, 520 "mqtt_unsubscribe_error_v_5": 0, 521 "mqtt_unsubscribe_received": 108, 522 "mqtt_unsubscribe_received_v_4": 108, 523 "mqtt_unsubscribe_received_v_5": 0, 524 "netsplit_detected": 0, 525 "netsplit_resolved": 0, 526 "netsplit_unresolved": 0, 527 "open_sockets": 0, 528 "queue_initialized_from_storage": 0, 529 "queue_message_drop": 0, 530 "queue_message_expired": 0, 531 "queue_message_in": 525722, 532 "queue_message_out": 525721, 533 "queue_message_unhandled": 1, 534 "queue_processes": 0, 535 "queue_setup": 338948, 536 "queue_teardown": 338948, 537 "retain_memory": 11344, 538 "retain_messages": 0, 539 "router_matches_local": 525722, 540 "router_matches_remote": 0, 541 "router_memory": 12752, 542 "router_subscriptions": 0, 543 "socket_close": 338956, 544 "socket_close_timeout": 0, 545 "socket_error": 0, 546 "socket_open": 338956, 547 "system_context_switches": 39088198, 548 "system_gc_count": 12189976, 549 "system_io_in": 68998296, 550 "system_io_out": 961001488, 551 "system_process_count": 329, 552 "system_reductions": 3857458067, 553 "system_run_queue": 0, 554 "system_utilization": 9, 555 "system_utilization_scheduler_1": 34, 556 "system_utilization_scheduler_2": 8, 557 "system_utilization_scheduler_3": 14, 558 "system_utilization_scheduler_4": 19, 559 "system_utilization_scheduler_5": 0, 560 "system_utilization_scheduler_6": 0, 561 "system_utilization_scheduler_7": 0, 562 "system_utilization_scheduler_8": 0, 563 "system_wallclock": 163457858, 564 "system_words_reclaimed_by_gc": 7158470019, 565 "vm_memory_processes": 8673288, 566 "vm_memory_system": 27051848, 567 }