github.com/netdata/go.d.plugin@v0.58.1/modules/vernemq/charts.go (about)

     1  // SPDX-License-Identifier: GPL-3.0-or-later
     2  
     3  package vernemq
     4  
     5  import "github.com/netdata/go.d.plugin/agent/module"
     6  
     7  type (
     8  	Charts = module.Charts
     9  	Chart  = module.Chart
    10  	Dims   = module.Dims
    11  	Dim    = module.Dim
    12  )
    13  
    14  var charts = Charts{
    15  	chartOpenSockets.Copy(),
    16  	chartSocketEvents.Copy(),
    17  	chartClientKeepaliveExpired.Copy(),
    18  	chartSocketErrors.Copy(),
    19  	chartSocketCloseTimeout.Copy(),
    20  
    21  	chartQueueProcesses.Copy(),
    22  	chartQueueProcessesEvents.Copy(),
    23  	chartQueueProcessesOfflineStorage.Copy(),
    24  	chartQueueMessages.Copy(),
    25  	chartQueueUndeliveredMessages.Copy(),
    26  
    27  	chartRouterSubscriptions.Copy(),
    28  	chartRouterMatchedSubscriptions.Copy(),
    29  	chartRouterMemory.Copy(),
    30  
    31  	chartAverageSchedulerUtilization.Copy(),
    32  	chartSchedulerUtilization.Copy(),
    33  	chartSystemProcesses.Copy(),
    34  	chartSystemReductions.Copy(),
    35  	chartSystemContextSwitches.Copy(),
    36  	chartSystemIO.Copy(),
    37  	chartSystemRunQueue.Copy(),
    38  	chartSystemGCCount.Copy(),
    39  	chartSystemGCWordsReclaimed.Copy(),
    40  	chartSystemMemoryAllocated.Copy(),
    41  
    42  	chartBandwidth.Copy(),
    43  
    44  	chartRetainMessages.Copy(),
    45  	chartRetainMemoryUsage.Copy(),
    46  
    47  	chartClusterCommunicationBandwidth.Copy(),
    48  	chartClusterCommunicationDropped.Copy(),
    49  	chartNetSplitUnresolved.Copy(),
    50  	chartNetSplits.Copy(),
    51  
    52  	chartMQTTv5AUTH.Copy(),
    53  	chartMQTTv5AUTHReceivedReason.Copy(),
    54  	chartMQTTv5AUTHSentReason.Copy(),
    55  
    56  	chartMQTTv3v5CONNECT.Copy(),
    57  	chartMQTTv3v5CONNACKSentReason.Copy(),
    58  
    59  	chartMQTTv3v5DISCONNECT.Copy(),
    60  	chartMQTTv5DISCONNECTReceivedReason.Copy(),
    61  	chartMQTTv5DISCONNECTSentReason.Copy(),
    62  
    63  	chartMQTTv3v5SUBSCRIBE.Copy(),
    64  	chartMQTTv3v5SUBSCRIBEError.Copy(),
    65  	chartMQTTv3v5SUBSCRIBEAuthError.Copy(),
    66  
    67  	chartMQTTv3v5UNSUBSCRIBE.Copy(),
    68  	chartMQTTv3v5UNSUBSCRIBEError.Copy(),
    69  
    70  	chartMQTTv3v5PUBLISH.Copy(),
    71  	chartMQTTv3v5PUBLISHErrors.Copy(),
    72  	chartMQTTv3v5PUBLISHAuthErrors.Copy(),
    73  	chartMQTTv3v5PUBACK.Copy(),
    74  	chartMQTTv5PUBACKReceivedReason.Copy(),
    75  	chartMQTTv5PUBACKSentReason.Copy(),
    76  	chartMQTTv3v5PUBACKUnexpected.Copy(),
    77  	chartMQTTv3v5PUBREC.Copy(),
    78  	chartMQTTv5PUBRECReceivedReason.Copy(),
    79  	chartMQTTv5PUBRECSentReason.Copy(),
    80  	chartMQTTv3PUBRECUnexpected.Copy(),
    81  	chartMQTTv3v5PUBREL.Copy(),
    82  	chartMQTTv5PUBRELReceivedReason.Copy(),
    83  	chartMQTTv5PUBRELSentReason.Copy(),
    84  	chartMQTTv3v5PUBCOMP.Copy(),
    85  	chartMQTTv5PUBCOMPReceivedReason.Copy(),
    86  	chartMQTTv5PUBCOMPSentReason.Copy(),
    87  	chartMQTTv3v5PUBCOMPUnexpected.Copy(),
    88  
    89  	chartMQTTv3v5PING.Copy(),
    90  
    91  	chartUptime.Copy(),
    92  }
    93  
    94  // Sockets
    95  var (
    96  	chartOpenSockets = Chart{
    97  		ID:    "sockets",
    98  		Title: "Open Sockets",
    99  		Units: "sockets",
   100  		Fam:   "sockets",
   101  		Ctx:   "vernemq.sockets",
   102  		Dims: Dims{
   103  			{ID: "open_sockets", Name: "open"},
   104  		},
   105  	}
   106  	chartSocketEvents = Chart{
   107  		ID:    "socket_events",
   108  		Title: "Socket Open and Close Events",
   109  		Units: "events/s",
   110  		Fam:   "sockets",
   111  		Ctx:   "vernemq.socket_operations",
   112  		Dims: Dims{
   113  			{ID: metricSocketOpen, Name: "open", Algo: module.Incremental},
   114  			{ID: metricSocketClose, Name: "close", Algo: module.Incremental, Mul: -1},
   115  		},
   116  	}
   117  	chartClientKeepaliveExpired = Chart{
   118  		ID:    "client_keepalive_expired",
   119  		Title: "Closed Sockets due to Keepalive Time Expired",
   120  		Units: "sockets/s",
   121  		Fam:   "sockets",
   122  		Ctx:   "vernemq.client_keepalive_expired",
   123  		Dims: Dims{
   124  			{ID: metricClientKeepaliveExpired, Name: "closed", Algo: module.Incremental},
   125  		},
   126  	}
   127  	chartSocketCloseTimeout = Chart{
   128  		ID:    "socket_close_timeout",
   129  		Title: "Closed Sockets due to no CONNECT Frame On Time",
   130  		Units: "sockets/s",
   131  		Fam:   "sockets",
   132  		Ctx:   "vernemq.socket_close_timeout",
   133  		Dims: Dims{
   134  			{ID: metricSocketCloseTimeout, Name: "closed", Algo: module.Incremental},
   135  		},
   136  	}
   137  	chartSocketErrors = Chart{
   138  		ID:    "socket_errors",
   139  		Title: "Socket Errors",
   140  		Units: "errors/s",
   141  		Fam:   "sockets",
   142  		Ctx:   "vernemq.socket_errors",
   143  		Dims: Dims{
   144  			{ID: metricSocketError, Name: "errors", Algo: module.Incremental},
   145  		},
   146  	}
   147  )
   148  
   149  // Queues
   150  var (
   151  	chartQueueProcesses = Chart{
   152  		ID:    "queue_processes",
   153  		Title: "Living Queues in an Online or an Offline State",
   154  		Units: "queue processes",
   155  		Fam:   "queues",
   156  		Ctx:   "vernemq.queue_processes",
   157  		Dims: Dims{
   158  			{ID: metricQueueProcesses, Name: "queue_processes"},
   159  		},
   160  	}
   161  	chartQueueProcessesEvents = Chart{
   162  		ID:    "queue_processes_events",
   163  		Title: "Queue Processes Setup and Teardown Events",
   164  		Units: "events/s",
   165  		Fam:   "queues",
   166  		Ctx:   "vernemq.queue_processes_operations",
   167  		Dims: Dims{
   168  			{ID: metricQueueSetup, Name: "setup", Algo: module.Incremental},
   169  			{ID: metricQueueTeardown, Name: "teardown", Algo: module.Incremental, Mul: -1},
   170  		},
   171  	}
   172  	chartQueueProcessesOfflineStorage = Chart{
   173  		ID:    "queue_process_init_from_storage",
   174  		Title: "Queue Processes Initialized from Offline Storage",
   175  		Units: "queue processes/s",
   176  		Fam:   "queues",
   177  		Ctx:   "vernemq.queue_process_init_from_storage",
   178  		Dims: Dims{
   179  			{ID: metricQueueInitializedFromStorage, Name: "queue processes", Algo: module.Incremental},
   180  		},
   181  	}
   182  	chartQueueMessages = Chart{
   183  		ID:    "queue_messages",
   184  		Title: "Received and Sent PUBLISH Messages",
   185  		Units: "messages/s",
   186  		Fam:   "queues",
   187  		Ctx:   "vernemq.queue_messages",
   188  		Type:  module.Area,
   189  		Dims: Dims{
   190  			{ID: metricQueueMessageIn, Name: "received", Algo: module.Incremental},
   191  			{ID: metricQueueMessageOut, Name: "sent", Algo: module.Incremental, Mul: -1},
   192  		},
   193  	}
   194  	chartQueueUndeliveredMessages = Chart{
   195  		ID:    "queue_undelivered_messages",
   196  		Title: "Undelivered PUBLISH Messages",
   197  		Units: "messages/s",
   198  		Fam:   "queues",
   199  		Ctx:   "vernemq.queue_undelivered_messages",
   200  		Type:  module.Stacked,
   201  		Dims: Dims{
   202  			{ID: metricQueueMessageDrop, Name: "dropped", Algo: module.Incremental},
   203  			{ID: metricQueueMessageExpired, Name: "expired", Algo: module.Incremental},
   204  			{ID: metricQueueMessageUnhandled, Name: "unhandled", Algo: module.Incremental},
   205  		},
   206  	}
   207  )
   208  
   209  // Subscriptions
   210  var (
   211  	chartRouterSubscriptions = Chart{
   212  		ID:    "router_subscriptions",
   213  		Title: "Subscriptions in the Routing Table",
   214  		Units: "subscriptions",
   215  		Fam:   "subscriptions",
   216  		Ctx:   "vernemq.router_subscriptions",
   217  		Dims: Dims{
   218  			{ID: metricRouterSubscriptions, Name: "subscriptions"},
   219  		},
   220  	}
   221  	chartRouterMatchedSubscriptions = Chart{
   222  		ID:    "router_matched_subscriptions",
   223  		Title: "Matched Subscriptions",
   224  		Units: "subscriptions/s",
   225  		Fam:   "subscriptions",
   226  		Ctx:   "vernemq.router_matched_subscriptions",
   227  		Dims: Dims{
   228  			{ID: metricRouterMatchesLocal, Name: "local", Algo: module.Incremental},
   229  			{ID: metricRouterMatchesRemote, Name: "remote", Algo: module.Incremental},
   230  		},
   231  	}
   232  	chartRouterMemory = Chart{
   233  		ID:    "router_memory",
   234  		Title: "Routing Table Memory Usage",
   235  		Units: "KiB",
   236  		Fam:   "subscriptions",
   237  		Ctx:   "vernemq.router_memory",
   238  		Type:  module.Area,
   239  		Dims: Dims{
   240  			{ID: metricRouterMemory, Name: "used", Div: 1024},
   241  		},
   242  	}
   243  )
   244  
   245  // Erlang VM
   246  var (
   247  	chartAverageSchedulerUtilization = Chart{
   248  		ID:    "average_scheduler_utilization",
   249  		Title: "Average Scheduler Utilization",
   250  		Units: "percentage",
   251  		Fam:   "erlang vm",
   252  		Ctx:   "vernemq.average_scheduler_utilization",
   253  		Type:  module.Area,
   254  		Dims: Dims{
   255  			{ID: metricSystemUtilization, Name: "utilization"},
   256  		},
   257  	}
   258  	chartSchedulerUtilization = Chart{
   259  		ID:    "scheduler_utilization",
   260  		Title: "Scheduler Utilization",
   261  		Units: "percentage",
   262  		Fam:   "erlang vm",
   263  		Type:  module.Stacked,
   264  		Ctx:   "vernemq.system_utilization_scheduler",
   265  	}
   266  	chartSystemProcesses = Chart{
   267  		ID:    "system_processes",
   268  		Title: "Erlang Processes",
   269  		Units: "processes",
   270  		Fam:   "erlang vm",
   271  		Ctx:   "vernemq.system_processes",
   272  		Dims: Dims{
   273  			{ID: metricSystemProcessCount, Name: "processes"},
   274  		},
   275  	}
   276  	chartSystemReductions = Chart{
   277  		ID:    "system_reductions",
   278  		Title: "Reductions",
   279  		Units: "ops/s",
   280  		Fam:   "erlang vm",
   281  		Ctx:   "vernemq.system_reductions",
   282  		Dims: Dims{
   283  			{ID: metricSystemReductions, Name: "reductions", Algo: module.Incremental},
   284  		},
   285  	}
   286  	chartSystemContextSwitches = Chart{
   287  		ID:    "system_context_switches",
   288  		Title: "Context Switches",
   289  		Units: "ops/s",
   290  		Fam:   "erlang vm",
   291  		Ctx:   "vernemq.system_context_switches",
   292  		Dims: Dims{
   293  			{ID: metricSystemContextSwitches, Name: "context switches", Algo: module.Incremental},
   294  		},
   295  	}
   296  	chartSystemIO = Chart{
   297  		ID:    "system_io",
   298  		Title: "Received and Sent Traffic through Ports",
   299  		Units: "kilobits/s",
   300  		Fam:   "erlang vm",
   301  		Ctx:   "vernemq.system_io",
   302  		Type:  module.Area,
   303  		Dims: Dims{
   304  			{ID: metricSystemIOIn, Name: "received", Algo: module.Incremental, Mul: 8, Div: 1024},
   305  			{ID: metricSystemIOOut, Name: "sent", Algo: module.Incremental, Mul: 8, Div: -1024},
   306  		},
   307  	}
   308  	chartSystemRunQueue = Chart{
   309  		ID:    "system_run_queue",
   310  		Title: "Processes that are Ready to Run on All Run-Queues",
   311  		Units: "processes",
   312  		Fam:   "erlang vm",
   313  		Ctx:   "vernemq.system_run_queue",
   314  		Dims: Dims{
   315  			{ID: metricSystemRunQueue, Name: "ready"},
   316  		},
   317  	}
   318  	chartSystemGCCount = Chart{
   319  		ID:    "system_gc_count",
   320  		Title: "GC Count",
   321  		Units: "ops/s",
   322  		Fam:   "erlang vm",
   323  		Ctx:   "vernemq.system_gc_count",
   324  		Dims: Dims{
   325  			{ID: metricSystemGCCount, Name: "gc", Algo: module.Incremental},
   326  		},
   327  	}
   328  	chartSystemGCWordsReclaimed = Chart{
   329  		ID:    "system_gc_words_reclaimed",
   330  		Title: "GC Words Reclaimed",
   331  		Units: "ops/s",
   332  		Fam:   "erlang vm",
   333  		Ctx:   "vernemq.system_gc_words_reclaimed",
   334  		Dims: Dims{
   335  			{ID: metricSystemWordsReclaimedByGC, Name: "words reclaimed", Algo: module.Incremental},
   336  		},
   337  	}
   338  	chartSystemMemoryAllocated = Chart{
   339  		ID:    "system_allocated_memory",
   340  		Title: "Memory Allocated by the Erlang Processes and by the Emulator",
   341  		Units: "KiB",
   342  		Fam:   "erlang vm",
   343  		Ctx:   "vernemq.system_allocated_memory",
   344  		Type:  module.Stacked,
   345  		Dims: Dims{
   346  			{ID: metricVMMemoryProcesses, Name: "processes", Div: 1024},
   347  			{ID: metricVMMemorySystem, Name: "system", Div: 1024},
   348  		},
   349  	}
   350  )
   351  
   352  // Bandwidth
   353  var (
   354  	chartBandwidth = Chart{
   355  		ID:    "bandwidth",
   356  		Title: "Bandwidth",
   357  		Units: "kilobits/s",
   358  		Fam:   "bandwidth",
   359  		Ctx:   "vernemq.bandwidth",
   360  		Type:  module.Area,
   361  		Dims: Dims{
   362  			{ID: metricBytesReceived, Name: "received", Algo: module.Incremental, Mul: 8, Div: 1024},
   363  			{ID: metricBytesSent, Name: "sent", Algo: module.Incremental, Mul: 8, Div: -1024},
   364  		},
   365  	}
   366  )
   367  
   368  // Retain
   369  var (
   370  	chartRetainMessages = Chart{
   371  		ID:    "retain_messages",
   372  		Title: "Stored Retained Messages",
   373  		Units: "messages",
   374  		Fam:   "retain",
   375  		Ctx:   "vernemq.retain_messages",
   376  		Dims: Dims{
   377  			{ID: metricRetainMessages, Name: "messages"},
   378  		},
   379  	}
   380  	chartRetainMemoryUsage = Chart{
   381  		ID:    "retain_memory",
   382  		Title: "Stored Retained Messages Memory Usage",
   383  		Units: "KiB",
   384  		Fam:   "retain",
   385  		Ctx:   "vernemq.retain_memory",
   386  		Type:  module.Area,
   387  		Dims: Dims{
   388  			{ID: metricRetainMemory, Name: "used", Div: 1024},
   389  		},
   390  	}
   391  )
   392  
   393  // Cluster
   394  var (
   395  	chartClusterCommunicationBandwidth = Chart{
   396  		ID:    "cluster_bandwidth",
   397  		Title: "Communication with Other Cluster Nodes",
   398  		Units: "kilobits/s",
   399  		Fam:   "cluster",
   400  		Ctx:   "vernemq.cluster_bandwidth",
   401  		Type:  module.Area,
   402  		Dims: Dims{
   403  			{ID: metricClusterBytesReceived, Name: "received", Algo: module.Incremental, Mul: 8, Div: 1024},
   404  			{ID: metricClusterBytesSent, Name: "sent", Algo: module.Incremental, Mul: 8, Div: -1024},
   405  		},
   406  	}
   407  	chartClusterCommunicationDropped = Chart{
   408  		ID:    "cluster_dropped",
   409  		Title: "Traffic Dropped During Communication with Other Cluster Nodes",
   410  		Units: "kilobits/s",
   411  		Fam:   "cluster",
   412  		Type:  module.Area,
   413  		Ctx:   "vernemq.cluster_dropped",
   414  		Dims: Dims{
   415  			{ID: metricClusterBytesDropped, Name: "dropped", Algo: module.Incremental, Mul: 8, Div: 1024},
   416  		},
   417  	}
   418  	chartNetSplitUnresolved = Chart{
   419  		ID:    "netsplit_unresolved",
   420  		Title: "Unresolved Netsplits",
   421  		Units: "netsplits",
   422  		Fam:   "cluster",
   423  		Ctx:   "vernemq.netsplit_unresolved",
   424  		Dims: Dims{
   425  			{ID: "netsplit_unresolved", Name: "unresolved"},
   426  		},
   427  	}
   428  	chartNetSplits = Chart{
   429  		ID:    "netsplit",
   430  		Title: "Netsplits",
   431  		Units: "netsplits/s",
   432  		Fam:   "cluster",
   433  		Ctx:   "vernemq.netsplits",
   434  		Type:  module.Stacked,
   435  		Dims: Dims{
   436  			{ID: metricNetSplitResolved, Name: "resolved", Algo: module.Incremental},
   437  			{ID: metricNetSplitDetected, Name: "detected", Algo: module.Incremental},
   438  		},
   439  	}
   440  )
   441  
   442  // AUTH
   443  var (
   444  	chartMQTTv5AUTH = Chart{
   445  		ID:    "mqtt_auth",
   446  		Title: "v5 AUTH",
   447  		Units: "packets/s",
   448  		Fam:   "mqtt auth",
   449  		Ctx:   "vernemq.mqtt_auth",
   450  		Dims: Dims{
   451  			{ID: metricAUTHReceived, Name: "received", Algo: module.Incremental},
   452  			{ID: metricAUTHSent, Name: "sent", Algo: module.Incremental, Mul: -1},
   453  		},
   454  	}
   455  	chartMQTTv5AUTHReceivedReason = Chart{
   456  		ID:    "mqtt_auth_received_reason",
   457  		Title: "v5 AUTH Received by Reason",
   458  		Units: "packets/s",
   459  		Fam:   "mqtt auth",
   460  		Ctx:   "vernemq.mqtt_auth_received_reason",
   461  		Type:  module.Stacked,
   462  		Dims: Dims{
   463  			{ID: join(metricAUTHReceived, "success"), Name: "success", Algo: module.Incremental},
   464  		},
   465  	}
   466  	chartMQTTv5AUTHSentReason = Chart{
   467  		ID:    "mqtt_auth_sent_reason",
   468  		Title: "v5 AUTH Sent by Reason",
   469  		Units: "packets/s",
   470  		Fam:   "mqtt auth",
   471  		Ctx:   "vernemq.mqtt_auth_sent_reason",
   472  		Type:  module.Stacked,
   473  		Dims: Dims{
   474  			{ID: join(metricAUTHSent, "success"), Name: "success", Algo: module.Incremental},
   475  		},
   476  	}
   477  )
   478  
   479  // CONNECT
   480  var (
   481  	chartMQTTv3v5CONNECT = Chart{
   482  		ID:    "mqtt_connect",
   483  		Title: "v3/v5 CONNECT and CONNACK",
   484  		Units: "packets/s",
   485  		Fam:   "mqtt connect",
   486  		Ctx:   "vernemq.mqtt_connect",
   487  		Dims: Dims{
   488  			{ID: metricCONNECTReceived, Name: "CONNECT", Algo: module.Incremental},
   489  			{ID: metricCONNACKSent, Name: "CONNACK", Algo: module.Incremental, Mul: -1},
   490  		},
   491  	}
   492  	chartMQTTv3v5CONNACKSentReason = Chart{
   493  		ID:    "mqtt_connack_sent_reason",
   494  		Title: "v3/v5 CONNACK Sent by Reason",
   495  		Units: "packets/s",
   496  		Fam:   "mqtt connect",
   497  		Ctx:   "vernemq.mqtt_connack_sent_reason",
   498  		Type:  module.Stacked,
   499  		Dims: Dims{
   500  			{ID: join(metricCONNACKSent, "success"), Name: "success", Algo: module.Incremental},
   501  		},
   502  	}
   503  )
   504  
   505  // DISCONNECT
   506  var (
   507  	chartMQTTv3v5DISCONNECT = Chart{
   508  		ID:    "mqtt_disconnect",
   509  		Title: "v3/v5 DISCONNECT",
   510  		Units: "packets/s",
   511  		Fam:   "mqtt disconnect",
   512  		Ctx:   "vernemq.mqtt_disconnect",
   513  		Dims: Dims{
   514  			{ID: metricDISCONNECTReceived, Name: "received", Algo: module.Incremental},
   515  			{ID: metricDISCONNECTSent, Name: "sent", Algo: module.Incremental, Mul: -1},
   516  		},
   517  	}
   518  	chartMQTTv5DISCONNECTReceivedReason = Chart{
   519  		ID:    "mqtt_disconnect_received_reason",
   520  		Title: "v5 DISCONNECT Received by Reason",
   521  		Units: "packets/s",
   522  		Fam:   "mqtt disconnect",
   523  		Ctx:   "vernemq.mqtt_disconnect_received_reason",
   524  		Type:  module.Stacked,
   525  		Dims: Dims{
   526  			{ID: join(metricDISCONNECTReceived, "normal_disconnect"), Name: "normal_disconnect", Algo: module.Incremental},
   527  		},
   528  	}
   529  	chartMQTTv5DISCONNECTSentReason = Chart{
   530  		ID:    "mqtt_disconnect_sent_reason",
   531  		Title: "v5 DISCONNECT Sent by Reason",
   532  		Units: "packets/s",
   533  		Fam:   "mqtt disconnect",
   534  		Ctx:   "vernemq.mqtt_disconnect_sent_reason",
   535  		Type:  module.Stacked,
   536  		Dims: Dims{
   537  			{ID: join(metricDISCONNECTSent, "normal_disconnect"), Name: "normal_disconnect", Algo: module.Incremental},
   538  		},
   539  	}
   540  )
   541  
   542  // SUBSCRIBE
   543  var (
   544  	chartMQTTv3v5SUBSCRIBE = Chart{
   545  		ID:    "mqtt_subscribe",
   546  		Title: "v3/v5 SUBSCRIBE and SUBACK",
   547  		Units: "packets/s",
   548  		Fam:   "mqtt subscribe",
   549  		Ctx:   "vernemq.mqtt_subscribe",
   550  		Dims: Dims{
   551  			{ID: metricSUBSCRIBEReceived, Name: "SUBSCRIBE", Algo: module.Incremental},
   552  			{ID: metricSUBACKSent, Name: "SUBACK", Algo: module.Incremental, Mul: -1},
   553  		},
   554  	}
   555  	chartMQTTv3v5SUBSCRIBEError = Chart{
   556  		ID:    "mqtt_subscribe_error",
   557  		Title: "v3/v5 Failed SUBSCRIBE Operations due to a Netsplit",
   558  		Units: "ops/s",
   559  		Fam:   "mqtt subscribe",
   560  		Ctx:   "vernemq.mqtt_subscribe_error",
   561  		Dims: Dims{
   562  			{ID: metricSUBSCRIBEError, Name: "failed", Algo: module.Incremental},
   563  		},
   564  	}
   565  	chartMQTTv3v5SUBSCRIBEAuthError = Chart{
   566  		ID:    "mqtt_subscribe_auth_error",
   567  		Title: "v3/v5 Unauthorized SUBSCRIBE Attempts",
   568  		Units: "attempts/s",
   569  		Fam:   "mqtt subscribe",
   570  		Ctx:   "vernemq.mqtt_subscribe_auth_error",
   571  		Dims: Dims{
   572  			{ID: metricSUBSCRIBEAuthError, Name: "unauth", Algo: module.Incremental},
   573  		},
   574  	}
   575  )
   576  
   577  // UNSUBSCRIBE
   578  var (
   579  	chartMQTTv3v5UNSUBSCRIBE = Chart{
   580  		ID:    "mqtt_unsubscribe",
   581  		Title: "v3/v5 UNSUBSCRIBE and UNSUBACK",
   582  		Units: "packets/s",
   583  		Fam:   "mqtt unsubscribe",
   584  		Ctx:   "vernemq.mqtt_unsubscribe",
   585  		Dims: Dims{
   586  			{ID: metricUNSUBSCRIBEReceived, Name: "UNSUBSCRIBE", Algo: module.Incremental},
   587  			{ID: metricUNSUBACKSent, Name: "UNSUBACK", Algo: module.Incremental, Mul: -1},
   588  		},
   589  	}
   590  	chartMQTTv3v5UNSUBSCRIBEError = Chart{
   591  		ID:    "mqtt_unsubscribe_error",
   592  		Title: "v3/v5 Failed UNSUBSCRIBE Operations due to a Netsplit",
   593  		Units: "ops/s",
   594  		Fam:   "mqtt unsubscribe",
   595  		Ctx:   "vernemq.mqtt_unsubscribe_error",
   596  		Dims: Dims{
   597  			{ID: metricUNSUBSCRIBEError, Name: "failed", Algo: module.Incremental},
   598  		},
   599  	}
   600  )
   601  
   602  // PUBLISH
   603  var (
   604  	chartMQTTv3v5PUBLISH = Chart{
   605  		ID:    "mqtt_publish",
   606  		Title: "v3/v5 QoS 0,1,2 PUBLISH",
   607  		Units: "packets/s",
   608  		Fam:   "mqtt publish",
   609  		Ctx:   "vernemq.mqtt_publish",
   610  		Dims: Dims{
   611  			{ID: metricPUBSLISHReceived, Name: "received", Algo: module.Incremental},
   612  			{ID: metricPUBSLIHSent, Name: "sent", Algo: module.Incremental, Mul: -1},
   613  		},
   614  	}
   615  	chartMQTTv3v5PUBLISHErrors = Chart{
   616  		ID:    "mqtt_publish_errors",
   617  		Title: "v3/v5 Failed PUBLISH Operations due to a Netsplit",
   618  		Units: "ops/s",
   619  		Fam:   "mqtt publish",
   620  		Ctx:   "vernemq.mqtt_publish_errors",
   621  		Dims: Dims{
   622  			{ID: metricPUBLISHError, Name: "failed", Algo: module.Incremental},
   623  		},
   624  	}
   625  	chartMQTTv3v5PUBLISHAuthErrors = Chart{
   626  		ID:    "mqtt_publish_auth_errors",
   627  		Title: "v3/v5 Unauthorized PUBLISH Attempts",
   628  		Units: "attempts/s",
   629  		Fam:   "mqtt publish",
   630  		Ctx:   "vernemq.mqtt_publish_auth_errors",
   631  		Type:  module.Area,
   632  		Dims: Dims{
   633  			{ID: metricPUBLISHAuthError, Name: "unauth", Algo: module.Incremental},
   634  		},
   635  	}
   636  	chartMQTTv3v5PUBACK = Chart{
   637  		ID:    "mqtt_puback",
   638  		Title: "v3/v5 QoS 1 PUBACK",
   639  		Units: "packets/s",
   640  		Fam:   "mqtt publish",
   641  		Ctx:   "vernemq.mqtt_puback",
   642  		Dims: Dims{
   643  			{ID: metricPUBACKReceived, Name: "received", Algo: module.Incremental},
   644  			{ID: metricPUBACKSent, Name: "sent", Algo: module.Incremental, Mul: -1},
   645  		},
   646  	}
   647  	chartMQTTv5PUBACKReceivedReason = Chart{
   648  		ID:    "mqtt_puback_received_reason",
   649  		Title: "v5 PUBACK QoS 1 Received by Reason",
   650  		Units: "packets/s",
   651  		Fam:   "mqtt publish",
   652  		Ctx:   "vernemq.mqtt_puback_received_reason",
   653  		Type:  module.Stacked,
   654  		Dims: Dims{
   655  			{ID: join(metricPUBACKReceived, "success"), Name: "success", Algo: module.Incremental},
   656  		},
   657  	}
   658  	chartMQTTv5PUBACKSentReason = Chart{
   659  		ID:    "mqtt_puback_sent_reason",
   660  		Title: "v5 PUBACK QoS 1 Sent by Reason",
   661  		Units: "packets/s",
   662  		Fam:   "mqtt publish",
   663  		Ctx:   "vernemq.mqtt_puback_sent_reason",
   664  		Type:  module.Stacked,
   665  		Dims: Dims{
   666  			{ID: join(metricPUBACKSent, "success"), Name: "success", Algo: module.Incremental},
   667  		},
   668  	}
   669  	chartMQTTv3v5PUBACKUnexpected = Chart{
   670  		ID:    "mqtt_puback_unexpected",
   671  		Title: "v3/v5 PUBACK QoS 1 Received Unexpected Messages",
   672  		Units: "messages/s",
   673  		Fam:   "mqtt publish",
   674  		Ctx:   "vernemq.mqtt_puback_invalid_error",
   675  		Dims: Dims{
   676  			{ID: metricPUBACKInvalid, Name: "unexpected", Algo: module.Incremental},
   677  		},
   678  	}
   679  	chartMQTTv3v5PUBREC = Chart{
   680  		ID:    "mqtt_pubrec",
   681  		Title: "v3/v5 PUBREC QoS 2",
   682  		Units: "packets/s",
   683  		Fam:   "mqtt publish",
   684  		Ctx:   "vernemq.mqtt_pubrec",
   685  		Dims: Dims{
   686  			{ID: metricPUBRECReceived, Name: "received", Algo: module.Incremental},
   687  			{ID: metricPUBRECSent, Name: "sent", Algo: module.Incremental, Mul: -1},
   688  		},
   689  	}
   690  	chartMQTTv5PUBRECReceivedReason = Chart{
   691  		ID:    "mqtt_pubrec_received_reason",
   692  		Title: "v5 PUBREC QoS 2 Received by Reason",
   693  		Units: "packets/s",
   694  		Fam:   "mqtt publish",
   695  		Ctx:   "vernemq.mqtt_pubrec_received_reason",
   696  		Type:  module.Stacked,
   697  		Dims: Dims{
   698  			{ID: join(metricPUBRECReceived, "success"), Name: "success", Algo: module.Incremental},
   699  		},
   700  	}
   701  	chartMQTTv5PUBRECSentReason = Chart{
   702  		ID:    "mqtt_pubrec_sent_reason",
   703  		Title: "v5 PUBREC QoS 2 Sent by Reason",
   704  		Units: "packets/s",
   705  		Fam:   "mqtt publish",
   706  		Ctx:   "vernemq.mqtt_pubrec_sent_reason",
   707  		Type:  module.Stacked,
   708  		Dims: Dims{
   709  			{ID: join(metricPUBRECSent, "success"), Name: "success", Algo: module.Incremental},
   710  		},
   711  	}
   712  	chartMQTTv3PUBRECUnexpected = Chart{
   713  		ID:    "mqtt_pubrec_unexpected",
   714  		Title: "v3 PUBREC QoS 2 Received Unexpected Messages",
   715  		Units: "messages/s",
   716  		Fam:   "mqtt publish",
   717  		Ctx:   "vernemq.mqtt_pubrec_invalid_error",
   718  		Dims: Dims{
   719  			{ID: metricPUBRECInvalid, Name: "unexpected", Algo: module.Incremental},
   720  		},
   721  	}
   722  	chartMQTTv3v5PUBREL = Chart{
   723  		ID:    "mqtt_pubrel",
   724  		Title: "v3/v5 PUBREL QoS 2",
   725  		Units: "packets/s",
   726  		Fam:   "mqtt publish",
   727  		Ctx:   "vernemq.mqtt_pubrel",
   728  		Dims: Dims{
   729  			{ID: metricPUBRELReceived, Name: "received", Algo: module.Incremental},
   730  			{ID: metricPUBRELSent, Name: "sent", Algo: module.Incremental, Mul: -1},
   731  		},
   732  	}
   733  	chartMQTTv5PUBRELReceivedReason = Chart{
   734  		ID:    "mqtt_pubrel_received_reason",
   735  		Title: "v5 PUBREL QoS 2 Received by Reason",
   736  		Units: "packets/s",
   737  		Fam:   "mqtt publish",
   738  		Ctx:   "vernemq.mqtt_pubrel_received_reason",
   739  		Type:  module.Stacked,
   740  		Dims: Dims{
   741  			{ID: join(metricPUBRELReceived, "success"), Name: "success", Algo: module.Incremental},
   742  		},
   743  	}
   744  	chartMQTTv5PUBRELSentReason = Chart{
   745  		ID:    "mqtt_pubrel_sent_reason",
   746  		Title: "v5 PUBREL QoS 2 Sent by Reason",
   747  		Units: "packets/s",
   748  		Fam:   "mqtt publish",
   749  		Ctx:   "vernemq.mqtt_pubrel_sent_reason",
   750  		Type:  module.Stacked,
   751  		Dims: Dims{
   752  			{ID: join(metricPUBRELSent, "success"), Name: "success", Algo: module.Incremental},
   753  		},
   754  	}
   755  	chartMQTTv3v5PUBCOMP = Chart{
   756  		ID:    "mqtt_pubcomp",
   757  		Title: "v3/v5 PUBCOMP QoS 2",
   758  		Units: "packets/s",
   759  		Fam:   "mqtt publish",
   760  		Ctx:   "vernemq.mqtt_pubcom",
   761  		Dims: Dims{
   762  			{ID: metricPUBCOMPReceived, Name: "received", Algo: module.Incremental},
   763  			{ID: metricPUBCOMPSent, Name: "sent", Algo: module.Incremental, Mul: -1},
   764  		},
   765  	}
   766  	chartMQTTv5PUBCOMPReceivedReason = Chart{
   767  		ID:    "mqtt_pubcomp_received_reason",
   768  		Title: "v5 PUBCOMP QoS 2 Received by Reason",
   769  		Units: "packets/s",
   770  		Fam:   "mqtt publish",
   771  		Ctx:   "vernemq.mqtt_pubcomp_received_reason",
   772  		Type:  module.Stacked,
   773  		Dims: Dims{
   774  			{ID: join(metricPUBCOMPReceived, "success"), Name: "success", Algo: module.Incremental},
   775  		},
   776  	}
   777  	chartMQTTv5PUBCOMPSentReason = Chart{
   778  		ID:    "mqtt_pubcomp_sent_reason",
   779  		Title: "v5 PUBCOMP QoS 2 Sent by Reason",
   780  		Units: "packets/s",
   781  		Fam:   "mqtt publish",
   782  		Ctx:   "vernemq.mqtt_pubcomp_sent_reason",
   783  		Type:  module.Stacked,
   784  		Dims: Dims{
   785  			{ID: join(metricPUBCOMPSent, "success"), Name: "success", Algo: module.Incremental},
   786  		},
   787  	}
   788  	chartMQTTv3v5PUBCOMPUnexpected = Chart{
   789  		ID:    "mqtt_pubcomp_unexpected",
   790  		Title: "v3/v5 PUBCOMP QoS 2 Received Unexpected Messages",
   791  		Units: "messages/s",
   792  		Fam:   "mqtt publish",
   793  		Ctx:   "vernemq.mqtt_pubcomp_invalid_error",
   794  		Dims: Dims{
   795  			{ID: metricPUNCOMPInvalid, Name: "unexpected", Algo: module.Incremental},
   796  		},
   797  	}
   798  )
   799  
   800  // PING
   801  var (
   802  	chartMQTTv3v5PING = Chart{
   803  		ID:    "mqtt_ping",
   804  		Title: "v3/v5 PING",
   805  		Units: "packets/s",
   806  		Fam:   "mqtt ping",
   807  		Ctx:   "vernemq.mqtt_ping",
   808  		Dims: Dims{
   809  			{ID: metricPINGREQReceived, Name: "PINGREQ", Algo: module.Incremental},
   810  			{ID: metricPINGRESPSent, Name: "PINGRESP", Algo: module.Incremental, Mul: -1},
   811  		},
   812  	}
   813  )
   814  
   815  var (
   816  	chartUptime = Chart{
   817  		ID:    "node_uptime",
   818  		Title: "Node Uptime",
   819  		Units: "seconds",
   820  		Fam:   "uptime",
   821  		Ctx:   "vernemq.node_uptime",
   822  		Dims: Dims{
   823  			{ID: metricSystemWallClock, Name: "time", Div: 1000},
   824  		},
   825  	}
   826  )
   827  
   828  func (v *VerneMQ) notifyNewScheduler(name string) {
   829  	if v.cache.hasP(name) {
   830  		return
   831  	}
   832  
   833  	id := chartSchedulerUtilization.ID
   834  	num := name[len("system_utilization_scheduler_"):]
   835  
   836  	v.addAbsDimToChart(id, name, num)
   837  }
   838  
   839  func (v *VerneMQ) notifyNewReason(name, reason string) {
   840  	if reason == "success" || reason == "normal_disconnect" {
   841  		return
   842  	}
   843  	key := join(name, reason)
   844  	if v.cache.hasP(key) {
   845  		return
   846  	}
   847  
   848  	var chart Chart
   849  	switch name {
   850  	case metricAUTHReceived:
   851  		chart = chartMQTTv5AUTHReceivedReason
   852  	case metricAUTHSent:
   853  		chart = chartMQTTv5AUTHSentReason
   854  	case metricCONNACKSent:
   855  		chart = chartMQTTv3v5CONNACKSentReason
   856  	case metricDISCONNECTReceived:
   857  		chart = chartMQTTv5DISCONNECTReceivedReason
   858  	case metricDISCONNECTSent:
   859  		chart = chartMQTTv5DISCONNECTSentReason
   860  	case metricPUBACKReceived:
   861  		chart = chartMQTTv5PUBACKReceivedReason
   862  	case metricPUBACKSent:
   863  		chart = chartMQTTv5PUBACKSentReason
   864  	case metricPUBRECReceived:
   865  		chart = chartMQTTv5PUBRECReceivedReason
   866  	case metricPUBRECSent:
   867  		chart = chartMQTTv5PUBRECSentReason
   868  	case metricPUBRELReceived:
   869  		chart = chartMQTTv5PUBRELReceivedReason
   870  	case metricPUBRELSent:
   871  		chart = chartMQTTv5PUBRELSentReason
   872  	case metricPUBCOMPReceived:
   873  		chart = chartMQTTv5PUBCOMPReceivedReason
   874  	case metricPUBCOMPSent:
   875  		chart = chartMQTTv5PUBCOMPSentReason
   876  	default:
   877  		v.Warningf("unknown metric name, wont be added to the charts: '%s'", name)
   878  		return
   879  	}
   880  
   881  	v.addIncDimToChart(chart.ID, key, reason)
   882  }
   883  
   884  func (v *VerneMQ) addAbsDimToChart(chartID, dimID, dimName string) {
   885  	v.addDimToChart(chartID, dimID, dimName, false)
   886  }
   887  
   888  func (v *VerneMQ) addIncDimToChart(chartID, dimID, dimName string) {
   889  	v.addDimToChart(chartID, dimID, dimName, true)
   890  }
   891  
   892  func (v *VerneMQ) addDimToChart(chartID, dimID, dimName string, inc bool) {
   893  	chart := v.Charts().Get(chartID)
   894  	if chart == nil {
   895  		v.Warningf("add '%s' dim: couldn't find '%s' chart", dimID, chartID)
   896  		return
   897  	}
   898  
   899  	dim := &Dim{ID: dimID, Name: dimName}
   900  	if inc {
   901  		dim.Algo = module.Incremental
   902  	}
   903  
   904  	if err := chart.AddDim(dim); err != nil {
   905  		v.Warningf("add '%s' dim: %v", dimID, err)
   906  		return
   907  	}
   908  	chart.MarkNotCreated()
   909  }