diff options
Diffstat (limited to 'src/go/collectors/go.d.plugin/modules/vernemq/charts.go')
-rw-r--r-- | src/go/collectors/go.d.plugin/modules/vernemq/charts.go | 911 |
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() +} |