summaryrefslogtreecommitdiffstats
path: root/src/go/collectors/go.d.plugin/modules/vernemq/charts.go
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/go/collectors/go.d.plugin/modules/vernemq/charts.go911
1 files changed, 911 insertions, 0 deletions
diff --git a/src/go/collectors/go.d.plugin/modules/vernemq/charts.go b/src/go/collectors/go.d.plugin/modules/vernemq/charts.go
new file mode 100644
index 000000000..f94be0823
--- /dev/null
+++ b/src/go/collectors/go.d.plugin/modules/vernemq/charts.go
@@ -0,0 +1,911 @@
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+package vernemq
+
+import "github.com/netdata/netdata/go/go.d.plugin/agent/module"
+
+type (
+ Charts = module.Charts
+ Chart = module.Chart
+ Dims = module.Dims
+ Dim = module.Dim
+)
+
+var charts = Charts{
+ chartOpenSockets.Copy(),
+ chartSocketEvents.Copy(),
+ chartClientKeepaliveExpired.Copy(),
+ chartSocketErrors.Copy(),
+ chartSocketCloseTimeout.Copy(),
+
+ chartQueueProcesses.Copy(),
+ chartQueueProcessesEvents.Copy(),
+ chartQueueProcessesOfflineStorage.Copy(),
+ chartQueueMessages.Copy(),
+ chartQueueUndeliveredMessages.Copy(),
+
+ chartRouterSubscriptions.Copy(),
+ chartRouterMatchedSubscriptions.Copy(),
+ chartRouterMemory.Copy(),
+
+ chartAverageSchedulerUtilization.Copy(),
+ chartSchedulerUtilization.Copy(),
+ chartSystemProcesses.Copy(),
+ chartSystemReductions.Copy(),
+ chartSystemContextSwitches.Copy(),
+ chartSystemIO.Copy(),
+ chartSystemRunQueue.Copy(),
+ chartSystemGCCount.Copy(),
+ chartSystemGCWordsReclaimed.Copy(),
+ chartSystemMemoryAllocated.Copy(),
+
+ chartBandwidth.Copy(),
+
+ chartRetainMessages.Copy(),
+ chartRetainMemoryUsage.Copy(),
+
+ chartClusterCommunicationBandwidth.Copy(),
+ chartClusterCommunicationDropped.Copy(),
+ chartNetSplitUnresolved.Copy(),
+ chartNetSplits.Copy(),
+
+ chartMQTTv5AUTH.Copy(),
+ chartMQTTv5AUTHReceivedReason.Copy(),
+ chartMQTTv5AUTHSentReason.Copy(),
+
+ chartMQTTv3v5CONNECT.Copy(),
+ chartMQTTv3v5CONNACKSentReason.Copy(),
+
+ chartMQTTv3v5DISCONNECT.Copy(),
+ chartMQTTv5DISCONNECTReceivedReason.Copy(),
+ chartMQTTv5DISCONNECTSentReason.Copy(),
+
+ chartMQTTv3v5SUBSCRIBE.Copy(),
+ chartMQTTv3v5SUBSCRIBEError.Copy(),
+ chartMQTTv3v5SUBSCRIBEAuthError.Copy(),
+
+ chartMQTTv3v5UNSUBSCRIBE.Copy(),
+ chartMQTTv3v5UNSUBSCRIBEError.Copy(),
+
+ chartMQTTv3v5PUBLISH.Copy(),
+ chartMQTTv3v5PUBLISHErrors.Copy(),
+ chartMQTTv3v5PUBLISHAuthErrors.Copy(),
+ chartMQTTv3v5PUBACK.Copy(),
+ chartMQTTv5PUBACKReceivedReason.Copy(),
+ chartMQTTv5PUBACKSentReason.Copy(),
+ chartMQTTv3v5PUBACKUnexpected.Copy(),
+ chartMQTTv3v5PUBREC.Copy(),
+ chartMQTTv5PUBRECReceivedReason.Copy(),
+ chartMQTTv5PUBRECSentReason.Copy(),
+ chartMQTTv3PUBRECUnexpected.Copy(),
+ chartMQTTv3v5PUBREL.Copy(),
+ chartMQTTv5PUBRELReceivedReason.Copy(),
+ chartMQTTv5PUBRELSentReason.Copy(),
+ chartMQTTv3v5PUBCOMP.Copy(),
+ chartMQTTv5PUBCOMPReceivedReason.Copy(),
+ chartMQTTv5PUBCOMPSentReason.Copy(),
+ chartMQTTv3v5PUBCOMPUnexpected.Copy(),
+
+ chartMQTTv3v5PING.Copy(),
+
+ chartUptime.Copy(),
+}
+
+// Sockets
+var (
+ chartOpenSockets = Chart{
+ ID: "sockets",
+ Title: "Open Sockets",
+ Units: "sockets",
+ Fam: "sockets",
+ Ctx: "vernemq.sockets",
+ Dims: Dims{
+ {ID: "open_sockets", Name: "open"},
+ },
+ }
+ chartSocketEvents = Chart{
+ ID: "socket_events",
+ Title: "Socket Open and Close Events",
+ Units: "events/s",
+ Fam: "sockets",
+ Ctx: "vernemq.socket_operations",
+ Dims: Dims{
+ {ID: metricSocketOpen, Name: "open", Algo: module.Incremental},
+ {ID: metricSocketClose, Name: "close", Algo: module.Incremental, Mul: -1},
+ },
+ }
+ chartClientKeepaliveExpired = Chart{
+ ID: "client_keepalive_expired",
+ Title: "Closed Sockets due to Keepalive Time Expired",
+ Units: "sockets/s",
+ Fam: "sockets",
+ Ctx: "vernemq.client_keepalive_expired",
+ Dims: Dims{
+ {ID: metricClientKeepaliveExpired, Name: "closed", Algo: module.Incremental},
+ },
+ }
+ chartSocketCloseTimeout = Chart{
+ ID: "socket_close_timeout",
+ Title: "Closed Sockets due to no CONNECT Frame On Time",
+ Units: "sockets/s",
+ Fam: "sockets",
+ Ctx: "vernemq.socket_close_timeout",
+ Dims: Dims{
+ {ID: metricSocketCloseTimeout, Name: "closed", Algo: module.Incremental},
+ },
+ }
+ chartSocketErrors = Chart{
+ ID: "socket_errors",
+ Title: "Socket Errors",
+ Units: "errors/s",
+ Fam: "sockets",
+ Ctx: "vernemq.socket_errors",
+ Dims: Dims{
+ {ID: metricSocketError, Name: "errors", Algo: module.Incremental},
+ },
+ }
+)
+
+// Queues
+var (
+ chartQueueProcesses = Chart{
+ ID: "queue_processes",
+ Title: "Living Queues in an Online or an Offline State",
+ Units: "queue processes",
+ Fam: "queues",
+ Ctx: "vernemq.queue_processes",
+ Dims: Dims{
+ {ID: metricQueueProcesses, Name: "queue_processes"},
+ },
+ }
+ chartQueueProcessesEvents = Chart{
+ ID: "queue_processes_events",
+ Title: "Queue Processes Setup and Teardown Events",
+ Units: "events/s",
+ Fam: "queues",
+ Ctx: "vernemq.queue_processes_operations",
+ Dims: Dims{
+ {ID: metricQueueSetup, Name: "setup", Algo: module.Incremental},
+ {ID: metricQueueTeardown, Name: "teardown", Algo: module.Incremental, Mul: -1},
+ },
+ }
+ chartQueueProcessesOfflineStorage = Chart{
+ ID: "queue_process_init_from_storage",
+ Title: "Queue Processes Initialized from Offline Storage",
+ Units: "queue processes/s",
+ Fam: "queues",
+ Ctx: "vernemq.queue_process_init_from_storage",
+ Dims: Dims{
+ {ID: metricQueueInitializedFromStorage, Name: "queue processes", Algo: module.Incremental},
+ },
+ }
+ chartQueueMessages = Chart{
+ ID: "queue_messages",
+ Title: "Received and Sent PUBLISH Messages",
+ Units: "messages/s",
+ Fam: "queues",
+ Ctx: "vernemq.queue_messages",
+ Type: module.Area,
+ Dims: Dims{
+ {ID: metricQueueMessageIn, Name: "received", Algo: module.Incremental},
+ {ID: metricQueueMessageOut, Name: "sent", Algo: module.Incremental, Mul: -1},
+ },
+ }
+ chartQueueUndeliveredMessages = Chart{
+ ID: "queue_undelivered_messages",
+ Title: "Undelivered PUBLISH Messages",
+ Units: "messages/s",
+ Fam: "queues",
+ Ctx: "vernemq.queue_undelivered_messages",
+ Type: module.Stacked,
+ Dims: Dims{
+ {ID: metricQueueMessageDrop, Name: "dropped", Algo: module.Incremental},
+ {ID: metricQueueMessageExpired, Name: "expired", Algo: module.Incremental},
+ {ID: metricQueueMessageUnhandled, Name: "unhandled", Algo: module.Incremental},
+ },
+ }
+)
+
+// Subscriptions
+var (
+ chartRouterSubscriptions = Chart{
+ ID: "router_subscriptions",
+ Title: "Subscriptions in the Routing Table",
+ Units: "subscriptions",
+ Fam: "subscriptions",
+ Ctx: "vernemq.router_subscriptions",
+ Dims: Dims{
+ {ID: metricRouterSubscriptions, Name: "subscriptions"},
+ },
+ }
+ chartRouterMatchedSubscriptions = Chart{
+ ID: "router_matched_subscriptions",
+ Title: "Matched Subscriptions",
+ Units: "subscriptions/s",
+ Fam: "subscriptions",
+ Ctx: "vernemq.router_matched_subscriptions",
+ Dims: Dims{
+ {ID: metricRouterMatchesLocal, Name: "local", Algo: module.Incremental},
+ {ID: metricRouterMatchesRemote, Name: "remote", Algo: module.Incremental},
+ },
+ }
+ chartRouterMemory = Chart{
+ ID: "router_memory",
+ Title: "Routing Table Memory Usage",
+ Units: "KiB",
+ Fam: "subscriptions",
+ Ctx: "vernemq.router_memory",
+ Type: module.Area,
+ Dims: Dims{
+ {ID: metricRouterMemory, Name: "used", Div: 1024},
+ },
+ }
+)
+
+// Erlang VM
+var (
+ chartAverageSchedulerUtilization = Chart{
+ ID: "average_scheduler_utilization",
+ Title: "Average Scheduler Utilization",
+ Units: "percentage",
+ Fam: "erlang vm",
+ Ctx: "vernemq.average_scheduler_utilization",
+ Type: module.Area,
+ Dims: Dims{
+ {ID: metricSystemUtilization, Name: "utilization"},
+ },
+ }
+ chartSchedulerUtilization = Chart{
+ ID: "scheduler_utilization",
+ Title: "Scheduler Utilization",
+ Units: "percentage",
+ Fam: "erlang vm",
+ Type: module.Stacked,
+ Ctx: "vernemq.system_utilization_scheduler",
+ }
+ chartSystemProcesses = Chart{
+ ID: "system_processes",
+ Title: "Erlang Processes",
+ Units: "processes",
+ Fam: "erlang vm",
+ Ctx: "vernemq.system_processes",
+ Dims: Dims{
+ {ID: metricSystemProcessCount, Name: "processes"},
+ },
+ }
+ chartSystemReductions = Chart{
+ ID: "system_reductions",
+ Title: "Reductions",
+ Units: "ops/s",
+ Fam: "erlang vm",
+ Ctx: "vernemq.system_reductions",
+ Dims: Dims{
+ {ID: metricSystemReductions, Name: "reductions", Algo: module.Incremental},
+ },
+ }
+ chartSystemContextSwitches = Chart{
+ ID: "system_context_switches",
+ Title: "Context Switches",
+ Units: "ops/s",
+ Fam: "erlang vm",
+ Ctx: "vernemq.system_context_switches",
+ Dims: Dims{
+ {ID: metricSystemContextSwitches, Name: "context switches", Algo: module.Incremental},
+ },
+ }
+ chartSystemIO = Chart{
+ ID: "system_io",
+ Title: "Received and Sent Traffic through Ports",
+ Units: "kilobits/s",
+ Fam: "erlang vm",
+ Ctx: "vernemq.system_io",
+ Type: module.Area,
+ Dims: Dims{
+ {ID: metricSystemIOIn, Name: "received", Algo: module.Incremental, Mul: 8, Div: 1024},
+ {ID: metricSystemIOOut, Name: "sent", Algo: module.Incremental, Mul: 8, Div: -1024},
+ },
+ }
+ chartSystemRunQueue = Chart{
+ ID: "system_run_queue",
+ Title: "Processes that are Ready to Run on All Run-Queues",
+ Units: "processes",
+ Fam: "erlang vm",
+ Ctx: "vernemq.system_run_queue",
+ Dims: Dims{
+ {ID: metricSystemRunQueue, Name: "ready"},
+ },
+ }
+ chartSystemGCCount = Chart{
+ ID: "system_gc_count",
+ Title: "GC Count",
+ Units: "ops/s",
+ Fam: "erlang vm",
+ Ctx: "vernemq.system_gc_count",
+ Dims: Dims{
+ {ID: metricSystemGCCount, Name: "gc", Algo: module.Incremental},
+ },
+ }
+ chartSystemGCWordsReclaimed = Chart{
+ ID: "system_gc_words_reclaimed",
+ Title: "GC Words Reclaimed",
+ Units: "ops/s",
+ Fam: "erlang vm",
+ Ctx: "vernemq.system_gc_words_reclaimed",
+ Dims: Dims{
+ {ID: metricSystemWordsReclaimedByGC, Name: "words reclaimed", Algo: module.Incremental},
+ },
+ }
+ chartSystemMemoryAllocated = Chart{
+ ID: "system_allocated_memory",
+ Title: "Memory Allocated by the Erlang Processes and by the Emulator",
+ Units: "KiB",
+ Fam: "erlang vm",
+ Ctx: "vernemq.system_allocated_memory",
+ Type: module.Stacked,
+ Dims: Dims{
+ {ID: metricVMMemoryProcesses, Name: "processes", Div: 1024},
+ {ID: metricVMMemorySystem, Name: "system", Div: 1024},
+ },
+ }
+)
+
+// Bandwidth
+var (
+ chartBandwidth = Chart{
+ ID: "bandwidth",
+ Title: "Bandwidth",
+ Units: "kilobits/s",
+ Fam: "bandwidth",
+ Ctx: "vernemq.bandwidth",
+ Type: module.Area,
+ Dims: Dims{
+ {ID: metricBytesReceived, Name: "received", Algo: module.Incremental, Mul: 8, Div: 1024},
+ {ID: metricBytesSent, Name: "sent", Algo: module.Incremental, Mul: 8, Div: -1024},
+ },
+ }
+)
+
+// Retain
+var (
+ chartRetainMessages = Chart{
+ ID: "retain_messages",
+ Title: "Stored Retained Messages",
+ Units: "messages",
+ Fam: "retain",
+ Ctx: "vernemq.retain_messages",
+ Dims: Dims{
+ {ID: metricRetainMessages, Name: "messages"},
+ },
+ }
+ chartRetainMemoryUsage = Chart{
+ ID: "retain_memory",
+ Title: "Stored Retained Messages Memory Usage",
+ Units: "KiB",
+ Fam: "retain",
+ Ctx: "vernemq.retain_memory",
+ Type: module.Area,
+ Dims: Dims{
+ {ID: metricRetainMemory, Name: "used", Div: 1024},
+ },
+ }
+)
+
+// Cluster
+var (
+ chartClusterCommunicationBandwidth = Chart{
+ ID: "cluster_bandwidth",
+ Title: "Communication with Other Cluster Nodes",
+ Units: "kilobits/s",
+ Fam: "cluster",
+ Ctx: "vernemq.cluster_bandwidth",
+ Type: module.Area,
+ Dims: Dims{
+ {ID: metricClusterBytesReceived, Name: "received", Algo: module.Incremental, Mul: 8, Div: 1024},
+ {ID: metricClusterBytesSent, Name: "sent", Algo: module.Incremental, Mul: 8, Div: -1024},
+ },
+ }
+ chartClusterCommunicationDropped = Chart{
+ ID: "cluster_dropped",
+ Title: "Traffic Dropped During Communication with Other Cluster Nodes",
+ Units: "kilobits/s",
+ Fam: "cluster",
+ Type: module.Area,
+ Ctx: "vernemq.cluster_dropped",
+ Dims: Dims{
+ {ID: metricClusterBytesDropped, Name: "dropped", Algo: module.Incremental, Mul: 8, Div: 1024},
+ },
+ }
+ chartNetSplitUnresolved = Chart{
+ ID: "netsplit_unresolved",
+ Title: "Unresolved Netsplits",
+ Units: "netsplits",
+ Fam: "cluster",
+ Ctx: "vernemq.netsplit_unresolved",
+ Dims: Dims{
+ {ID: "netsplit_unresolved", Name: "unresolved"},
+ },
+ }
+ chartNetSplits = Chart{
+ ID: "netsplit",
+ Title: "Netsplits",
+ Units: "netsplits/s",
+ Fam: "cluster",
+ Ctx: "vernemq.netsplits",
+ Type: module.Stacked,
+ Dims: Dims{
+ {ID: metricNetSplitResolved, Name: "resolved", Algo: module.Incremental},
+ {ID: metricNetSplitDetected, Name: "detected", Algo: module.Incremental},
+ },
+ }
+)
+
+// AUTH
+var (
+ chartMQTTv5AUTH = Chart{
+ ID: "mqtt_auth",
+ Title: "v5 AUTH",
+ Units: "packets/s",
+ Fam: "mqtt auth",
+ Ctx: "vernemq.mqtt_auth",
+ Dims: Dims{
+ {ID: metricAUTHReceived, Name: "received", Algo: module.Incremental},
+ {ID: metricAUTHSent, Name: "sent", Algo: module.Incremental, Mul: -1},
+ },
+ }
+ chartMQTTv5AUTHReceivedReason = Chart{
+ ID: "mqtt_auth_received_reason",
+ Title: "v5 AUTH Received by Reason",
+ Units: "packets/s",
+ Fam: "mqtt auth",
+ Ctx: "vernemq.mqtt_auth_received_reason",
+ Type: module.Stacked,
+ Dims: Dims{
+ {ID: join(metricAUTHReceived, "success"), Name: "success", Algo: module.Incremental},
+ },
+ }
+ chartMQTTv5AUTHSentReason = Chart{
+ ID: "mqtt_auth_sent_reason",
+ Title: "v5 AUTH Sent by Reason",
+ Units: "packets/s",
+ Fam: "mqtt auth",
+ Ctx: "vernemq.mqtt_auth_sent_reason",
+ Type: module.Stacked,
+ Dims: Dims{
+ {ID: join(metricAUTHSent, "success"), Name: "success", Algo: module.Incremental},
+ },
+ }
+)
+
+// CONNECT
+var (
+ chartMQTTv3v5CONNECT = Chart{
+ ID: "mqtt_connect",
+ Title: "v3/v5 CONNECT and CONNACK",
+ Units: "packets/s",
+ Fam: "mqtt connect",
+ Ctx: "vernemq.mqtt_connect",
+ Dims: Dims{
+ {ID: metricCONNECTReceived, Name: "CONNECT", Algo: module.Incremental},
+ {ID: metricCONNACKSent, Name: "CONNACK", Algo: module.Incremental, Mul: -1},
+ },
+ }
+ chartMQTTv3v5CONNACKSentReason = Chart{
+ ID: "mqtt_connack_sent_reason",
+ Title: "v3/v5 CONNACK Sent by Reason",
+ Units: "packets/s",
+ Fam: "mqtt connect",
+ Ctx: "vernemq.mqtt_connack_sent_reason",
+ Type: module.Stacked,
+ Dims: Dims{
+ {ID: join(metricCONNACKSent, "success"), Name: "success", Algo: module.Incremental},
+ },
+ }
+)
+
+// DISCONNECT
+var (
+ chartMQTTv3v5DISCONNECT = Chart{
+ ID: "mqtt_disconnect",
+ Title: "v3/v5 DISCONNECT",
+ Units: "packets/s",
+ Fam: "mqtt disconnect",
+ Ctx: "vernemq.mqtt_disconnect",
+ Dims: Dims{
+ {ID: metricDISCONNECTReceived, Name: "received", Algo: module.Incremental},
+ {ID: metricDISCONNECTSent, Name: "sent", Algo: module.Incremental, Mul: -1},
+ },
+ }
+ chartMQTTv5DISCONNECTReceivedReason = Chart{
+ ID: "mqtt_disconnect_received_reason",
+ Title: "v5 DISCONNECT Received by Reason",
+ Units: "packets/s",
+ Fam: "mqtt disconnect",
+ Ctx: "vernemq.mqtt_disconnect_received_reason",
+ Type: module.Stacked,
+ Dims: Dims{
+ {ID: join(metricDISCONNECTReceived, "normal_disconnect"), Name: "normal_disconnect", Algo: module.Incremental},
+ },
+ }
+ chartMQTTv5DISCONNECTSentReason = Chart{
+ ID: "mqtt_disconnect_sent_reason",
+ Title: "v5 DISCONNECT Sent by Reason",
+ Units: "packets/s",
+ Fam: "mqtt disconnect",
+ Ctx: "vernemq.mqtt_disconnect_sent_reason",
+ Type: module.Stacked,
+ Dims: Dims{
+ {ID: join(metricDISCONNECTSent, "normal_disconnect"), Name: "normal_disconnect", Algo: module.Incremental},
+ },
+ }
+)
+
+// SUBSCRIBE
+var (
+ chartMQTTv3v5SUBSCRIBE = Chart{
+ ID: "mqtt_subscribe",
+ Title: "v3/v5 SUBSCRIBE and SUBACK",
+ Units: "packets/s",
+ Fam: "mqtt subscribe",
+ Ctx: "vernemq.mqtt_subscribe",
+ Dims: Dims{
+ {ID: metricSUBSCRIBEReceived, Name: "SUBSCRIBE", Algo: module.Incremental},
+ {ID: metricSUBACKSent, Name: "SUBACK", Algo: module.Incremental, Mul: -1},
+ },
+ }
+ chartMQTTv3v5SUBSCRIBEError = Chart{
+ ID: "mqtt_subscribe_error",
+ Title: "v3/v5 Failed SUBSCRIBE Operations due to a Netsplit",
+ Units: "ops/s",
+ Fam: "mqtt subscribe",
+ Ctx: "vernemq.mqtt_subscribe_error",
+ Dims: Dims{
+ {ID: metricSUBSCRIBEError, Name: "failed", Algo: module.Incremental},
+ },
+ }
+ chartMQTTv3v5SUBSCRIBEAuthError = Chart{
+ ID: "mqtt_subscribe_auth_error",
+ Title: "v3/v5 Unauthorized SUBSCRIBE Attempts",
+ Units: "attempts/s",
+ Fam: "mqtt subscribe",
+ Ctx: "vernemq.mqtt_subscribe_auth_error",
+ Dims: Dims{
+ {ID: metricSUBSCRIBEAuthError, Name: "unauth", Algo: module.Incremental},
+ },
+ }
+)
+
+// UNSUBSCRIBE
+var (
+ chartMQTTv3v5UNSUBSCRIBE = Chart{
+ ID: "mqtt_unsubscribe",
+ Title: "v3/v5 UNSUBSCRIBE and UNSUBACK",
+ Units: "packets/s",
+ Fam: "mqtt unsubscribe",
+ Ctx: "vernemq.mqtt_unsubscribe",
+ Dims: Dims{
+ {ID: metricUNSUBSCRIBEReceived, Name: "UNSUBSCRIBE", Algo: module.Incremental},
+ {ID: metricUNSUBACKSent, Name: "UNSUBACK", Algo: module.Incremental, Mul: -1},
+ },
+ }
+ chartMQTTv3v5UNSUBSCRIBEError = Chart{
+ ID: "mqtt_unsubscribe_error",
+ Title: "v3/v5 Failed UNSUBSCRIBE Operations due to a Netsplit",
+ Units: "ops/s",
+ Fam: "mqtt unsubscribe",
+ Ctx: "vernemq.mqtt_unsubscribe_error",
+ Dims: Dims{
+ {ID: metricUNSUBSCRIBEError, Name: "failed", Algo: module.Incremental},
+ },
+ }
+)
+
+// PUBLISH
+var (
+ chartMQTTv3v5PUBLISH = Chart{
+ ID: "mqtt_publish",
+ Title: "v3/v5 QoS 0,1,2 PUBLISH",
+ Units: "packets/s",
+ Fam: "mqtt publish",
+ Ctx: "vernemq.mqtt_publish",
+ Dims: Dims{
+ {ID: metricPUBSLISHReceived, Name: "received", Algo: module.Incremental},
+ {ID: metricPUBSLIHSent, Name: "sent", Algo: module.Incremental, Mul: -1},
+ },
+ }
+ chartMQTTv3v5PUBLISHErrors = Chart{
+ ID: "mqtt_publish_errors",
+ Title: "v3/v5 Failed PUBLISH Operations due to a Netsplit",
+ Units: "ops/s",
+ Fam: "mqtt publish",
+ Ctx: "vernemq.mqtt_publish_errors",
+ Dims: Dims{
+ {ID: metricPUBLISHError, Name: "failed", Algo: module.Incremental},
+ },
+ }
+ chartMQTTv3v5PUBLISHAuthErrors = Chart{
+ ID: "mqtt_publish_auth_errors",
+ Title: "v3/v5 Unauthorized PUBLISH Attempts",
+ Units: "attempts/s",
+ Fam: "mqtt publish",
+ Ctx: "vernemq.mqtt_publish_auth_errors",
+ Type: module.Area,
+ Dims: Dims{
+ {ID: metricPUBLISHAuthError, Name: "unauth", Algo: module.Incremental},
+ },
+ }
+ chartMQTTv3v5PUBACK = Chart{
+ ID: "mqtt_puback",
+ Title: "v3/v5 QoS 1 PUBACK",
+ Units: "packets/s",
+ Fam: "mqtt publish",
+ Ctx: "vernemq.mqtt_puback",
+ Dims: Dims{
+ {ID: metricPUBACKReceived, Name: "received", Algo: module.Incremental},
+ {ID: metricPUBACKSent, Name: "sent", Algo: module.Incremental, Mul: -1},
+ },
+ }
+ chartMQTTv5PUBACKReceivedReason = Chart{
+ ID: "mqtt_puback_received_reason",
+ Title: "v5 PUBACK QoS 1 Received by Reason",
+ Units: "packets/s",
+ Fam: "mqtt publish",
+ Ctx: "vernemq.mqtt_puback_received_reason",
+ Type: module.Stacked,
+ Dims: Dims{
+ {ID: join(metricPUBACKReceived, "success"), Name: "success", Algo: module.Incremental},
+ },
+ }
+ chartMQTTv5PUBACKSentReason = Chart{
+ ID: "mqtt_puback_sent_reason",
+ Title: "v5 PUBACK QoS 1 Sent by Reason",
+ Units: "packets/s",
+ Fam: "mqtt publish",
+ Ctx: "vernemq.mqtt_puback_sent_reason",
+ Type: module.Stacked,
+ Dims: Dims{
+ {ID: join(metricPUBACKSent, "success"), Name: "success", Algo: module.Incremental},
+ },
+ }
+ chartMQTTv3v5PUBACKUnexpected = Chart{
+ ID: "mqtt_puback_unexpected",
+ Title: "v3/v5 PUBACK QoS 1 Received Unexpected Messages",
+ Units: "messages/s",
+ Fam: "mqtt publish",
+ Ctx: "vernemq.mqtt_puback_invalid_error",
+ Dims: Dims{
+ {ID: metricPUBACKInvalid, Name: "unexpected", Algo: module.Incremental},
+ },
+ }
+ chartMQTTv3v5PUBREC = Chart{
+ ID: "mqtt_pubrec",
+ Title: "v3/v5 PUBREC QoS 2",
+ Units: "packets/s",
+ Fam: "mqtt publish",
+ Ctx: "vernemq.mqtt_pubrec",
+ Dims: Dims{
+ {ID: metricPUBRECReceived, Name: "received", Algo: module.Incremental},
+ {ID: metricPUBRECSent, Name: "sent", Algo: module.Incremental, Mul: -1},
+ },
+ }
+ chartMQTTv5PUBRECReceivedReason = Chart{
+ ID: "mqtt_pubrec_received_reason",
+ Title: "v5 PUBREC QoS 2 Received by Reason",
+ Units: "packets/s",
+ Fam: "mqtt publish",
+ Ctx: "vernemq.mqtt_pubrec_received_reason",
+ Type: module.Stacked,
+ Dims: Dims{
+ {ID: join(metricPUBRECReceived, "success"), Name: "success", Algo: module.Incremental},
+ },
+ }
+ chartMQTTv5PUBRECSentReason = Chart{
+ ID: "mqtt_pubrec_sent_reason",
+ Title: "v5 PUBREC QoS 2 Sent by Reason",
+ Units: "packets/s",
+ Fam: "mqtt publish",
+ Ctx: "vernemq.mqtt_pubrec_sent_reason",
+ Type: module.Stacked,
+ Dims: Dims{
+ {ID: join(metricPUBRECSent, "success"), Name: "success", Algo: module.Incremental},
+ },
+ }
+ chartMQTTv3PUBRECUnexpected = Chart{
+ ID: "mqtt_pubrec_unexpected",
+ Title: "v3 PUBREC QoS 2 Received Unexpected Messages",
+ Units: "messages/s",
+ Fam: "mqtt publish",
+ Ctx: "vernemq.mqtt_pubrec_invalid_error",
+ Dims: Dims{
+ {ID: metricPUBRECInvalid, Name: "unexpected", Algo: module.Incremental},
+ },
+ }
+ chartMQTTv3v5PUBREL = Chart{
+ ID: "mqtt_pubrel",
+ Title: "v3/v5 PUBREL QoS 2",
+ Units: "packets/s",
+ Fam: "mqtt publish",
+ Ctx: "vernemq.mqtt_pubrel",
+ Dims: Dims{
+ {ID: metricPUBRELReceived, Name: "received", Algo: module.Incremental},
+ {ID: metricPUBRELSent, Name: "sent", Algo: module.Incremental, Mul: -1},
+ },
+ }
+ chartMQTTv5PUBRELReceivedReason = Chart{
+ ID: "mqtt_pubrel_received_reason",
+ Title: "v5 PUBREL QoS 2 Received by Reason",
+ Units: "packets/s",
+ Fam: "mqtt publish",
+ Ctx: "vernemq.mqtt_pubrel_received_reason",
+ Type: module.Stacked,
+ Dims: Dims{
+ {ID: join(metricPUBRELReceived, "success"), Name: "success", Algo: module.Incremental},
+ },
+ }
+ chartMQTTv5PUBRELSentReason = Chart{
+ ID: "mqtt_pubrel_sent_reason",
+ Title: "v5 PUBREL QoS 2 Sent by Reason",
+ Units: "packets/s",
+ Fam: "mqtt publish",
+ Ctx: "vernemq.mqtt_pubrel_sent_reason",
+ Type: module.Stacked,
+ Dims: Dims{
+ {ID: join(metricPUBRELSent, "success"), Name: "success", Algo: module.Incremental},
+ },
+ }
+ chartMQTTv3v5PUBCOMP = Chart{
+ ID: "mqtt_pubcomp",
+ Title: "v3/v5 PUBCOMP QoS 2",
+ Units: "packets/s",
+ Fam: "mqtt publish",
+ Ctx: "vernemq.mqtt_pubcom",
+ Dims: Dims{
+ {ID: metricPUBCOMPReceived, Name: "received", Algo: module.Incremental},
+ {ID: metricPUBCOMPSent, Name: "sent", Algo: module.Incremental, Mul: -1},
+ },
+ }
+ chartMQTTv5PUBCOMPReceivedReason = Chart{
+ ID: "mqtt_pubcomp_received_reason",
+ Title: "v5 PUBCOMP QoS 2 Received by Reason",
+ Units: "packets/s",
+ Fam: "mqtt publish",
+ Ctx: "vernemq.mqtt_pubcomp_received_reason",
+ Type: module.Stacked,
+ Dims: Dims{
+ {ID: join(metricPUBCOMPReceived, "success"), Name: "success", Algo: module.Incremental},
+ },
+ }
+ chartMQTTv5PUBCOMPSentReason = Chart{
+ ID: "mqtt_pubcomp_sent_reason",
+ Title: "v5 PUBCOMP QoS 2 Sent by Reason",
+ Units: "packets/s",
+ Fam: "mqtt publish",
+ Ctx: "vernemq.mqtt_pubcomp_sent_reason",
+ Type: module.Stacked,
+ Dims: Dims{
+ {ID: join(metricPUBCOMPSent, "success"), Name: "success", Algo: module.Incremental},
+ },
+ }
+ chartMQTTv3v5PUBCOMPUnexpected = Chart{
+ ID: "mqtt_pubcomp_unexpected",
+ Title: "v3/v5 PUBCOMP QoS 2 Received Unexpected Messages",
+ Units: "messages/s",
+ Fam: "mqtt publish",
+ Ctx: "vernemq.mqtt_pubcomp_invalid_error",
+ Dims: Dims{
+ {ID: metricPUNCOMPInvalid, Name: "unexpected", Algo: module.Incremental},
+ },
+ }
+)
+
+// PING
+var (
+ chartMQTTv3v5PING = Chart{
+ ID: "mqtt_ping",
+ Title: "v3/v5 PING",
+ Units: "packets/s",
+ Fam: "mqtt ping",
+ Ctx: "vernemq.mqtt_ping",
+ Dims: Dims{
+ {ID: metricPINGREQReceived, Name: "PINGREQ", Algo: module.Incremental},
+ {ID: metricPINGRESPSent, Name: "PINGRESP", Algo: module.Incremental, Mul: -1},
+ },
+ }
+)
+
+var (
+ chartUptime = Chart{
+ ID: "node_uptime",
+ Title: "Node Uptime",
+ Units: "seconds",
+ Fam: "uptime",
+ Ctx: "vernemq.node_uptime",
+ Dims: Dims{
+ {ID: metricSystemWallClock, Name: "time", Div: 1000},
+ },
+ }
+)
+
+func (v *VerneMQ) notifyNewScheduler(name string) {
+ if v.cache[name] {
+ return
+ }
+ v.cache[name] = true
+
+ id := chartSchedulerUtilization.ID
+ num := name[len("system_utilization_scheduler_"):]
+
+ v.addAbsDimToChart(id, name, num)
+}
+
+func (v *VerneMQ) notifyNewReason(name, reason string) {
+ if reason == "success" || reason == "normal_disconnect" {
+ return
+ }
+ key := join(name, reason)
+ if v.cache[key] {
+ return
+ }
+ v.cache[key] = true
+
+ var chart Chart
+ switch name {
+ case metricAUTHReceived:
+ chart = chartMQTTv5AUTHReceivedReason
+ case metricAUTHSent:
+ chart = chartMQTTv5AUTHSentReason
+ case metricCONNACKSent:
+ chart = chartMQTTv3v5CONNACKSentReason
+ case metricDISCONNECTReceived:
+ chart = chartMQTTv5DISCONNECTReceivedReason
+ case metricDISCONNECTSent:
+ chart = chartMQTTv5DISCONNECTSentReason
+ case metricPUBACKReceived:
+ chart = chartMQTTv5PUBACKReceivedReason
+ case metricPUBACKSent:
+ chart = chartMQTTv5PUBACKSentReason
+ case metricPUBRECReceived:
+ chart = chartMQTTv5PUBRECReceivedReason
+ case metricPUBRECSent:
+ chart = chartMQTTv5PUBRECSentReason
+ case metricPUBRELReceived:
+ chart = chartMQTTv5PUBRELReceivedReason
+ case metricPUBRELSent:
+ chart = chartMQTTv5PUBRELSentReason
+ case metricPUBCOMPReceived:
+ chart = chartMQTTv5PUBCOMPReceivedReason
+ case metricPUBCOMPSent:
+ chart = chartMQTTv5PUBCOMPSentReason
+ default:
+ v.Warningf("unknown metric name, wont be added to the charts: '%s'", name)
+ return
+ }
+
+ v.addIncDimToChart(chart.ID, key, reason)
+}
+
+func (v *VerneMQ) addAbsDimToChart(chartID, dimID, dimName string) {
+ v.addDimToChart(chartID, dimID, dimName, false)
+}
+
+func (v *VerneMQ) addIncDimToChart(chartID, dimID, dimName string) {
+ v.addDimToChart(chartID, dimID, dimName, true)
+}
+
+func (v *VerneMQ) addDimToChart(chartID, dimID, dimName string, inc bool) {
+ chart := v.Charts().Get(chartID)
+ if chart == nil {
+ v.Warningf("add '%s' dim: couldn't find '%s' chart", dimID, chartID)
+ return
+ }
+
+ dim := &Dim{ID: dimID, Name: dimName}
+ if inc {
+ dim.Algo = module.Incremental
+ }
+
+ if err := chart.AddDim(dim); err != nil {
+ v.Warningf("add '%s' dim: %v", dimID, err)
+ return
+ }
+ chart.MarkNotCreated()
+}