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  }