@cryptotaxi247 / netdata-1 / commits / 7e26fa5f4

fix(go.d/vernemq)!: support prometheus namespace added in v2.0 (#18815)

Ilya Mashchenko committed Oct 20, 2024 at 19:17 UTC 7e26fa5f451927f5c523dbba28af0784d98a6ad3
12 files changed +3149 -1932
src/go/plugin/go.d/modules/vernemq/charts.go
+1067 -802
@@ -2,910 +2,1175 @@
2
3 package vernemq
4
5 -import "github.com/netdata/netdata/go/plugins/plugin/go.d/agent/module"
5 +import (
6 + "fmt"
7 + "strings"
8
7 -type (
8 - Charts = module.Charts
9 - Chart = module.Chart
10 - Dims = module.Dims
11 - Dim = module.Dim
9 + "github.com/netdata/netdata/go/plugins/plugin/go.d/agent/module"
10 )
11
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(),
12 +const (
13 + prioNodeSockets = module.Priority + iota
14 + prioNodeSocketEvents
15 + prioNodeClientKeepaliveExpired
16 + prioNodeSocketCloseTimeout
17 + prioNodeSocketErrors
18 +
19 + prioNodeQueueProcesses
20 + prioNodeQueueProcessesEvents
21 + prioNodeQueueProcessesOfflineStorage
22 + prioNodeQueueMessages
23 + prioNodeQueueUndeliveredMessages
24 +
25 + prioNodeRouterSubscriptions
26 + prioNodeRouterMatchedSubscriptions
27 + prioNodeRouterMemory
28 +
29 + prioNodeAverageSchedulerUtilization
30 + prioNodeSystemProcesses
31 + prioNodeSystemReductions
32 + prioNodeSystemContext
33 + prioNodeSystemIO
34 + prioNodeSystemRunQueue
35 + prioNodeSystemGCCount
36 + prioNodeSystemGCWordsReclaimed
37 + prioNodeSystemMemoryAllocated
38 +
39 + prioNodeTraffic
40 +
41 + prioNodeRetainMessages
42 + prioNodeRetainMemoryUsage
43 +
44 + prioNodeClusterCommunicationTraffic
45 + prioNodeClusterCommunicationDropped
46 + prioNodeNetSplitUnresolved
47 + prioNodeNetSplits
48 +
49 + prioMqttPublishPackets
50 + prioMqttPublishErrors
51 + prioMqttPublishAuthPackets
52 +
53 + prioMqttPubAckPackets
54 + prioMqttPubAckReceivedReason
55 + prioMqttPubAckSentReason
56 + prioMqttPubAckUnexpectedMessages
57 +
58 + prioMqttPubRecPackets
59 + prioMqttPubRecReceivedReason
60 + prioMqttPubRecSentReason
61 + prioMqttPubRecUnexpectedMessages
62 +
63 + prioMqttPubRelPackets
64 + prioMqttPubRelReceivedReason
65 + prioMqttPubRelSentReason
66 +
67 + prioMqttPubCompPackets
68 + prioMqttPubCompReceivedReason
69 + prioMqttPubCompSentReason
70 + prioMqttPubCompUnexpectedMessages
71 +
72 + prioMqttConnectPackets
73 + prioMqttConnectSentReason
74 +
75 + prioMqttDisconnectPackets
76 + prioMqttDisconnectReceivedReason
77 + prioMqttDisconnectSentReason
78 +
79 + prioMqttSubscribePackets
80 + prioMqttSubscribeErrors
81 + prioMqttSubscribeAuthPackets
82 +
83 + prioMqttUnsubscribePackets
84 + prioMqttUnsubscribeErrors
85 +
86 + prioMqttAuthPackets
87 + prioMqttAuthReceivedReason
88 + prioMqttAuthSentReason
89 +
90 + prioMqttPingPackets
91 +
92 + prioNodeUptime
93 +)
94 +
95 +var nodeChartsTmpl = module.Charts{
96 + nodeOpenSocketsChartTmpl.Copy(),
97 + nodeSocketEventsChartTmpl.Copy(),
98 + nodeSocketCloseTimeoutChartTmpl.Copy(),
99 + nodeSocketErrorsChartTmpl.Copy(),
100 +
101 + nodeQueueProcessesChartTmpl.Copy(),
102 + nodeQueueProcessesEventsChartTmpl.Copy(),
103 + nodeQueueProcessesOfflineStorageChartTmpl.Copy(),
104 + nodeQueueMessagesChartTmpl.Copy(),
105 + nodeQueueUndeliveredMessagesChartTmpl.Copy(),
106 +
107 + nodeRouterSubscriptionsChartTmpl.Copy(),
108 + nodeRouterMatchedSubscriptionsChartTmpl.Copy(),
109 + nodeRouterMemoryChartTmpl.Copy(),
110 +
111 + nodeAverageSchedulerUtilizationChartTmpl.Copy(),
112 + nodeSystemProcessesChartTmpl.Copy(),
113 + nodeSystemReductionsChartTmpl.Copy(),
114 + nodeSystemContextSwitches.Copy(),
115 + nodeSystemIOChartTmpl.Copy(),
116 + nodeSystemRunQueueChartTmpl.Copy(),
117 + nodeSystemGCCountChartTmpl.Copy(),
118 + nodeSystemGCWordsReclaimedChartTmpl.Copy(),
119 + nodeSystemMemoryAllocatedChartTmpl.Copy(),
120 +
121 + nodeTrafficChartTmpl.Copy(),
122 +
123 + nodeRetainMessagesChartsTmpl.Copy(),
124 + nodeRetainMemoryUsageChartTmpl.Copy(),
125 +
126 + nodeClusterCommunicationTrafficChartTmpl.Copy(),
127 + nodeClusterCommunicationDroppedChartTmpl.Copy(),
128 + nodeNetSplitUnresolvedChartTmpl.Copy(),
129 + nodeNetSplitsChartTmpl.Copy(),
130 +
131 + nodeUptimeChartTmpl.Copy(),
132 +}
133 +
134 +var nodeMqtt5ChartsTmpl = module.Charts{
135 + nodeClientKeepaliveExpiredChartTmpl.Copy(),
136 +
137 + nodeMqttPUBLISHPacketsChartTmpl.Copy(),
138 + nodeMqttPUBLISHErrorsChartTmpl.Copy(),
139 + nodeMqttPUBLISHAuthErrorsChartTmpl.Copy(),
140 +
141 + nodeMqttPUBACKPacketsChartTmpl.Copy(),
142 + nodeMqttPUBACKReceivedByReasonChartTmpl.Copy(),
143 + nodeMqttPUBACKSentByReasonChartTmpl.Copy(),
144 + nodeMqttPUBACKUnexpectedMessagesChartTmpl.Copy(),
145 +
146 + nodeMqttPUBRECPacketsChartTmpl.Copy(),
147 + nodeMqttPUBRECReceivedByReasonChartTmpl.Copy(),
148 + nodeMqttPUBRECSentByReasonChartTmpl.Copy(),
149 +
150 + nodeMqttPUBRELPacketsChartTmpl.Copy(),
151 + nodeMqttPUBRELReceivedByReasonChartTmpl.Copy(),
152 + nodeMqttPUBRELSentByReasonChartTmpl.Copy(),
153 +
154 + nodeMqttPUBCOMPPacketsChartTmpl.Copy(),
155 + nodeMqttPUBCOMPReceivedByReasonChartTmpl.Copy(),
156 + nodeMqttPUBCOMPSentByReasonChartTmpl.Copy(),
157 + nodeMqttPUBCOMPUnexpectedMessagesChartTmpl.Copy(),
158 +
159 + nodeMqttCONNECTPacketsChartTmpl.Copy(),
160 + nodeMqttCONNACKSentByReasonCodeChartTmpl.Copy(),
161 +
162 + nodeMqtt5DISCONNECTPacketsChartTmpl.Copy(),
163 + nodeMqttDISCONNECTReceivedByReasonChartTmpl.Copy(),
164 + nodeMqttDISCONNECTSentByReasonChartTmpl.Copy(),
165 +
166 + nodeMqttSUBSCRIBEPacketsChartTmpl.Copy(),
167 + modeMqttSUBSCRIBEErrorsChartTmpl.Copy(),
168 + nodeMqttSUBSCRIBEAuthErrorsChartTmpl.Copy(),
169 +
170 + nodeMqttUNSUBSCRIBEPacketsChartTmpl.Copy(),
171 + nodeMqttUNSUBSCRIBEErrorsChartTmpl.Copy(),
172 +
173 + nodeMqttAUTHPacketsChartTmpl.Copy(),
174 + nodeMqttAUTHReceivedByReasonChartTmpl.Copy(),
175 + nodeMqttAUTHSentByReasonChartTmpl.Copy(),
176 +
177 + nodeMqttPINGPacketsChartTmpl.Copy(),
178 +}
179 +
180 +var nodeMqtt4ChartsTmpl = module.Charts{
181 + nodeClientKeepaliveExpiredChartTmpl.Copy(),
182 +
183 + nodeMqttPUBLISHPacketsChartTmpl.Copy(),
184 + nodeMqttPUBLISHErrorsChartTmpl.Copy(),
185 + nodeMqttPUBLISHAuthErrorsChartTmpl.Copy(),
186 +
187 + nodeMqttPUBACKPacketsChartTmpl.Copy(),
188 + nodeMqttPUBACKUnexpectedMessagesChartTmpl.Copy(),
189 +
190 + nodeMqttPUBRECPacketsChartTmpl.Copy(),
191 + nodeMqttPUBRECUnexpectedMessagesChartTmpl.Copy(),
192 +
193 + nodeMqttPUBRELPacketsChartTmpl.Copy(),
194 +
195 + nodeMqttPUBCOMPPacketsChartTmpl.Copy(),
196 + nodeMqttPUBCOMPUnexpectedMessagesChartTmpl.Copy(),
197 +
198 + nodeMqttCONNECTPacketsChartTmpl.Copy(),
199 + nodeMqttCONNACKSentByReturnCodeChartTmpl.Copy(),
200 +
201 + nodeMqtt4DISCONNECTPacketsChartTmpl.Copy(),
202 +
203 + nodeMqttSUBSCRIBEPacketsChartTmpl.Copy(),
204 + modeMqttSUBSCRIBEErrorsChartTmpl.Copy(),
205 +
206 + nodeMqttSUBSCRIBEAuthErrorsChartTmpl.Copy(),
207 + nodeMqttUNSUBSCRIBEPacketsChartTmpl.Copy(),
208 + nodeMqttUNSUBSCRIBEErrorsChartTmpl.Copy(),
209 +
210 + nodeMqttPINGPacketsChartTmpl.Copy(),
211 }
212
213 // Sockets
214 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},
215 + nodeOpenSocketsChartTmpl = module.Chart{
216 + ID: "node_%s_sockets",
217 + Title: "Open Sockets",
218 + Units: "sockets",
219 + Fam: "sockets",
220 + Ctx: "vernemq.node_sockets",
221 + Priority: prioNodeSockets,
222 + Dims: module.Dims{
223 + {ID: dimNode("open_sockets"), Name: "open"},
224 + },
225 + }
226 + nodeSocketEventsChartTmpl = module.Chart{
227 + ID: "node_%s_socket_events",
228 + Title: "Open and Close Socket Events",
229 + Units: "events/s",
230 + Fam: "sockets",
231 + Ctx: "vernemq.node_socket_operations",
232 + Priority: prioNodeSocketEvents,
233 + Dims: module.Dims{
234 + {ID: dimNode(metricSocketOpen), Name: "open", Algo: module.Incremental},
235 + {ID: dimNode(metricSocketClose), Name: "close", Algo: module.Incremental, Mul: -1},
236 + },
237 + }
238 + nodeClientKeepaliveExpiredChartTmpl = module.Chart{
239 + ID: "node_%s_mqtt%s_client_keepalive_expired",
240 + Title: "Closed Sockets due to Keepalive Time Expired",
241 + Units: "sockets/s",
242 + Fam: "sockets",
243 + Ctx: "vernemq.node_client_keepalive_expired",
244 + Priority: prioNodeClientKeepaliveExpired,
245 + Dims: module.Dims{
246 + {ID: dimMqttVer(metricClientKeepaliveExpired), Name: "closed", Algo: module.Incremental},
247 + },
248 + }
249 + nodeSocketCloseTimeoutChartTmpl = module.Chart{
250 + ID: "node_%s_socket_close_timeout",
251 + Title: "Closed Sockets due to no CONNECT Frame On Time",
252 + Units: "sockets/s",
253 + Fam: "sockets",
254 + Ctx: "vernemq.node_socket_close_timeout",
255 + Priority: prioNodeSocketCloseTimeout,
256 + Dims: module.Dims{
257 + {ID: dimNode(metricSocketCloseTimeout), Name: "closed", Algo: module.Incremental},
258 + },
259 + }
260 + nodeSocketErrorsChartTmpl = module.Chart{
261 + ID: "node_%s_socket_errors",
262 + Title: "Socket Errors",
263 + Units: "errors/s",
264 + Fam: "sockets",
265 + Ctx: "vernemq.node_socket_errors",
266 + Priority: prioNodeSocketErrors,
267 + Dims: module.Dims{
268 + {ID: dimNode(metricSocketError), Name: "errors", Algo: module.Incremental},
269 },
270 }
271 )
272
273 // Queues
274 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},
275 + nodeQueueProcessesChartTmpl = module.Chart{
276 + ID: "node_%s_queue_processes",
277 + Title: "Living Queues in an Online or an Offline State",
278 + Units: "queue processes",
279 + Fam: "queues",
280 + Ctx: "vernemq.node_queue_processes",
281 + Priority: prioNodeQueueProcesses,
282 + Dims: module.Dims{
283 + {ID: dimNode(metricQueueProcesses), Name: "queue_processes"},
284 + },
285 + }
286 + nodeQueueProcessesEventsChartTmpl = module.Chart{
287 + ID: "node_%s_queue_processes_events",
288 + Title: "Queue Processes Setup and Teardown Events",
289 + Units: "events/s",
290 + Fam: "queues",
291 + Ctx: "vernemq.node_queue_processes_operations",
292 + Priority: prioNodeQueueProcessesEvents,
293 + Dims: module.Dims{
294 + {ID: dimNode(metricQueueSetup), Name: "setup", Algo: module.Incremental},
295 + {ID: dimNode(metricQueueTeardown), Name: "teardown", Algo: module.Incremental, Mul: -1},
296 + },
297 + }
298 + nodeQueueProcessesOfflineStorageChartTmpl = module.Chart{
299 + ID: "node_%s_queue_process_init_from_storage",
300 + Title: "Queue Processes Initialized from Offline Storage",
301 + Units: "queue processes/s",
302 + Fam: "queues",
303 + Ctx: "vernemq.node_queue_process_init_from_storage",
304 + Priority: prioNodeQueueProcessesOfflineStorage,
305 + Dims: module.Dims{
306 + {ID: dimNode(metricQueueInitializedFromStorage), Name: "queue processes", Algo: module.Incremental},
307 + },
308 + }
309 + nodeQueueMessagesChartTmpl = module.Chart{
310 + ID: "node_%s_queue_messages",
311 + Title: "Received and Sent PUBLISH Messages",
312 + Units: "messages/s",
313 + Fam: "queues",
314 + Ctx: "vernemq.node_queue_messages",
315 + Type: module.Area,
316 + Priority: prioNodeQueueMessages,
317 + Dims: module.Dims{
318 + {ID: dimNode(metricQueueMessageIn), Name: "received", Algo: module.Incremental},
319 + {ID: dimNode(metricQueueMessageOut), Name: "sent", Algo: module.Incremental, Mul: -1},
320 + },
321 + }
322 + nodeQueueUndeliveredMessagesChartTmpl = module.Chart{
323 + ID: "node_%s_queue_undelivered_messages",
324 + Title: "Undelivered PUBLISH Messages",
325 + Units: "messages/s",
326 + Fam: "queues",
327 + Ctx: "vernemq.node_queue_undelivered_messages",
328 + Type: module.Stacked,
329 + Priority: prioNodeQueueUndeliveredMessages,
330 + Dims: module.Dims{
331 + {ID: dimNode(metricQueueMessageDrop), Name: "dropped", Algo: module.Incremental},
332 + {ID: dimNode(metricQueueMessageExpired), Name: "expired", Algo: module.Incremental},
333 + {ID: dimNode(metricQueueMessageUnhandled), Name: "unhandled", Algo: module.Incremental},
334 },
335 }
336 )
337
338 // Subscriptions
339 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},
340 + nodeRouterSubscriptionsChartTmpl = module.Chart{
341 + ID: "node_%s_router_subscriptions",
342 + Title: "Subscriptions in the Routing Table",
343 + Units: "subscriptions",
344 + Fam: "subscriptions",
345 + Ctx: "vernemq.node_router_subscriptions",
346 + Priority: prioNodeRouterSubscriptions,
347 + Dims: module.Dims{
348 + {ID: dimNode(metricRouterSubscriptions), Name: "subscriptions"},
349 + },
350 + }
351 + nodeRouterMatchedSubscriptionsChartTmpl = module.Chart{
352 + ID: "node_%s_router_matched_subscriptions",
353 + Title: "Matched Subscriptions",
354 + Units: "subscriptions/s",
355 + Fam: "subscriptions",
356 + Ctx: "vernemq.node_router_matched_subscriptions",
357 + Priority: prioNodeRouterMatchedSubscriptions,
358 + Dims: module.Dims{
359 + {ID: dimNode(metricRouterMatchesLocal), Name: "local", Algo: module.Incremental},
360 + {ID: dimNode(metricRouterMatchesRemote), Name: "remote", Algo: module.Incremental},
361 + },
362 + }
363 + nodeRouterMemoryChartTmpl = module.Chart{
364 + ID: "node_%s_router_memory",
365 + Title: "Routing Table Memory Usage",
366 + Units: "bytes",
367 + Fam: "subscriptions",
368 + Ctx: "vernemq.node_router_memory",
369 + Type: module.Area,
370 + Priority: prioNodeRouterMemory,
371 + Dims: module.Dims{
372 + {ID: dimNode(metricRouterMemory), Name: "used"},
373 },
374 }
375 )
376
377 // Erlang VM
378 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},
379 + nodeAverageSchedulerUtilizationChartTmpl = module.Chart{
380 + ID: "node_%s_average_scheduler_utilization",
381 + Title: "Average Scheduler Utilization",
382 + Units: "percentage",
383 + Fam: "erlang vm",
384 + Ctx: "vernemq.node_average_scheduler_utilization",
385 + Type: module.Area,
386 + Priority: prioNodeAverageSchedulerUtilization,
387 + Dims: module.Dims{
388 + {ID: dimNode(metricSystemUtilization), Name: "utilization"},
389 + },
390 + }
391 + nodeSystemProcessesChartTmpl = module.Chart{
392 + ID: "node_%s_system_processes",
393 + Title: "Erlang Processes",
394 + Units: "processes",
395 + Fam: "erlang vm",
396 + Ctx: "vernemq.node_system_processes",
397 + Priority: prioNodeSystemProcesses,
398 + Dims: module.Dims{
399 + {ID: dimNode(metricSystemProcessCount), Name: "processes"},
400 + },
401 + }
402 + nodeSystemReductionsChartTmpl = module.Chart{
403 + ID: "node_%s_system_reductions",
404 + Title: "Reductions",
405 + Units: "ops/s",
406 + Fam: "erlang vm",
407 + Ctx: "vernemq.node_system_reductions",
408 + Priority: prioNodeSystemReductions,
409 + Dims: module.Dims{
410 + {ID: dimNode(metricSystemReductions), Name: "reductions", Algo: module.Incremental},
411 + },
412 + }
413 + nodeSystemContextSwitches = module.Chart{
414 + ID: "node_%s_system_context_switches",
415 + Title: "Context Switches",
416 + Units: "ops/s",
417 + Fam: "erlang vm",
418 + Ctx: "vernemq.node_system_context_switches",
419 + Priority: prioNodeSystemContext,
420 + Dims: module.Dims{
421 + {ID: dimNode(metricSystemContextSwitches), Name: "context switches", Algo: module.Incremental},
422 + },
423 + }
424 + nodeSystemIOChartTmpl = module.Chart{
425 + ID: "node_%s_system_io",
426 + Title: "Received and Sent Traffic through Ports",
427 + Units: "bytes/s",
428 + Fam: "erlang vm",
429 + Ctx: "vernemq.node_system_io",
430 + Type: module.Area,
431 + Priority: prioNodeSystemIO,
432 + Dims: module.Dims{
433 + {ID: dimNode(metricSystemIOIn), Name: "received", Algo: module.Incremental},
434 + {ID: dimNode(metricSystemIOOut), Name: "sent", Algo: module.Incremental, Mul: -1},
435 + },
436 + }
437 + nodeSystemRunQueueChartTmpl = module.Chart{
438 + ID: "node_%s_system_run_queue",
439 + Title: "Processes that are Ready to Run on All Run-Queues",
440 + Units: "processes",
441 + Fam: "erlang vm",
442 + Ctx: "vernemq.node_system_run_queue",
443 + Priority: prioNodeSystemRunQueue,
444 + Dims: module.Dims{
445 + {ID: dimNode(metricSystemRunQueue), Name: "ready"},
446 + },
447 + }
448 + nodeSystemGCCountChartTmpl = module.Chart{
449 + ID: "node_%s_system_gc_count",
450 + Title: "GC Count",
451 + Units: "ops/s",
452 + Fam: "erlang vm",
453 + Ctx: "vernemq.node_system_gc_count",
454 + Priority: prioNodeSystemGCCount,
455 + Dims: module.Dims{
456 + {ID: dimNode(metricSystemGCCount), Name: "gc", Algo: module.Incremental},
457 + },
458 + }
459 + nodeSystemGCWordsReclaimedChartTmpl = module.Chart{
460 + ID: "node_%s_system_gc_words_reclaimed",
461 + Title: "GC Words Reclaimed",
462 + Units: "ops/s",
463 + Fam: "erlang vm",
464 + Ctx: "vernemq.node_system_gc_words_reclaimed",
465 + Priority: prioNodeSystemGCWordsReclaimed,
466 + Dims: module.Dims{
467 + {ID: dimNode(metricSystemWordsReclaimedByGC), Name: "words reclaimed", Algo: module.Incremental},
468 + },
469 + }
470 + nodeSystemMemoryAllocatedChartTmpl = module.Chart{
471 + ID: "node_%s_system_allocated_memory",
472 + Title: "Memory Allocated by the Erlang Processes and by the Emulator",
473 + Units: "bytes",
474 + Fam: "erlang vm",
475 + Ctx: "vernemq.node_system_allocated_memory",
476 + Type: module.Stacked,
477 + Priority: prioNodeSystemMemoryAllocated,
478 + Dims: module.Dims{
479 + {ID: dimNode(metricVMMemoryProcesses), Name: "processes"},
480 + {ID: dimNode(metricVMMemorySystem), Name: "system"},
481 },
482 }
483 )
484
352 -// Bandwidth
485 +// Traffic
486 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},
487 + nodeTrafficChartTmpl = module.Chart{
488 + ID: "node_%s_traffic",
489 + Title: "Node Traffic",
490 + Units: "bytes/s",
491 + Fam: "traffic",
492 + Ctx: "vernemq.node_traffic",
493 + Type: module.Area,
494 + Priority: prioNodeTraffic,
495 + Dims: module.Dims{
496 + {ID: dimNode(metricBytesReceived), Name: "received", Algo: module.Incremental},
497 + {ID: dimNode(metricBytesSent), Name: "sent", Algo: module.Incremental, Mul: -1},
498 },
499 }
500 )
501
502 // Retain
503 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},
504 + nodeRetainMessagesChartsTmpl = module.Chart{
505 + ID: "node_%s_retain_messages",
506 + Title: "Stored Retained Messages",
507 + Units: "messages",
508 + Fam: "retain",
509 + Ctx: "vernemq.node_retain_messages",
510 + Priority: prioNodeRetainMessages,
511 + Dims: module.Dims{
512 + {ID: dimNode(metricRetainMessages), Name: "messages"},
513 + },
514 + }
515 + nodeRetainMemoryUsageChartTmpl = module.Chart{
516 + ID: "node_%s_retain_memory",
517 + Title: "Stored Retained Messages Memory Usage",
518 + Units: "bytes",
519 + Fam: "retain",
520 + Ctx: "vernemq.node_retain_memory",
521 + Type: module.Area,
522 + Priority: prioNodeRetainMemoryUsage,
523 + Dims: module.Dims{
524 + {ID: dimNode(metricRetainMemory), Name: "used"},
525 },
526 }
527 )
528
529 // Cluster
530 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},
531 + nodeClusterCommunicationTrafficChartTmpl = module.Chart{
532 + ID: "node_%s_cluster_traffic",
533 + Title: "Communication with Other Cluster Nodes",
534 + Units: "bytes/s",
535 + Fam: "cluster",
536 + Ctx: "vernemq.node_cluster_traffic",
537 + Type: module.Area,
538 + Priority: prioNodeClusterCommunicationTraffic,
539 + Dims: module.Dims{
540 + {ID: dimNode(metricClusterBytesReceived), Name: "received", Algo: module.Incremental},
541 + {ID: dimNode(metricClusterBytesSent), Name: "sent", Algo: module.Incremental, Mul: -1},
542 + },
543 + }
544 + nodeClusterCommunicationDroppedChartTmpl = module.Chart{
545 + ID: "node_%s_cluster_dropped",
546 + Title: "Traffic Dropped During Communication with Other Cluster Nodes",
547 + Units: "bytes/s",
548 + Fam: "cluster",
549 + Type: module.Area,
550 + Ctx: "vernemq.node_cluster_dropped",
551 + Priority: prioNodeClusterCommunicationDropped,
552 + Dims: module.Dims{
553 + {ID: dimNode(metricClusterBytesDropped), Name: "dropped", Algo: module.Incremental},
554 + },
555 + }
556 + nodeNetSplitUnresolvedChartTmpl = module.Chart{
557 + ID: "node_%s_netsplit_unresolved",
558 + Title: "Unresolved Netsplits",
559 + Units: "netsplits",
560 + Fam: "cluster",
561 + Ctx: "vernemq.node_netsplit_unresolved",
562 + Priority: prioNodeNetSplitUnresolved,
563 + Dims: module.Dims{
564 + {ID: dimNode("netsplit_unresolved"), Name: "unresolved"},
565 + },
566 + }
567 + nodeNetSplitsChartTmpl = module.Chart{
568 + ID: "node_%s_netsplit",
569 + Title: "Netsplits",
570 + Units: "netsplits/s",
571 + Fam: "cluster",
572 + Ctx: "vernemq.node_netsplits",
573 + Type: module.Stacked,
574 + Priority: prioNodeNetSplits,
575 + Dims: module.Dims{
576 + {ID: dimNode(metricNetSplitResolved), Name: "resolved", Algo: module.Incremental},
577 + {ID: dimNode(metricNetSplitDetected), Name: "detected", Algo: module.Incremental},
578 },
579 }
580 )
581
442 -// AUTH
582 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},
583 + nodeUptimeChartTmpl = module.Chart{
584 + ID: "node_%s_uptime",
585 + Title: "Node Uptime",
586 + Units: "seconds",
587 + Fam: "uptime",
588 + Ctx: "vernemq.node_uptime",
589 + Priority: prioNodeUptime,
590 + Dims: module.Dims{
591 + {ID: dimNode(metricSystemWallClock), Name: "time", Div: 1000},
592 + },
593 + }
594 +)
595 +
596 +// PUBLISH
597 +var (
598 + nodeMqttPUBLISHPacketsChartTmpl = module.Chart{
599 + ID: "node_%s_mqtt%s_publish",
600 + Title: "MQTT QoS 0,1,2 PUBLISH",
601 + Units: "packets/s",
602 + Fam: "mqtt publish",
603 + Ctx: "vernemq.node_mqtt_publish",
604 + Priority: prioMqttPublishPackets,
605 + Dims: module.Dims{
606 + {ID: dimMqttVer(metricPUBSLISHReceived), Name: "received", Algo: module.Incremental},
607 + {ID: dimMqttVer(metricPUBSLIHSent), Name: "sent", Algo: module.Incremental, Mul: -1},
608 + },
609 + }
610 + nodeMqttPUBLISHErrorsChartTmpl = module.Chart{
611 + ID: "node_%s_mqtt%s_publish_errors",
612 + Title: "MQTT Failed PUBLISH Operations due to a Netsplit",
613 + Units: "errors/s",
614 + Fam: "mqtt publish",
615 + Ctx: "vernemq.node_mqtt_publish_errors",
616 + Priority: prioMqttPublishErrors,
617 + Dims: module.Dims{
618 + {ID: dimMqttVer(metricPUBLISHError), Name: "publish", Algo: module.Incremental},
619 + },
620 + }
621 + nodeMqttPUBLISHAuthErrorsChartTmpl = module.Chart{
622 + ID: "node_%s_mqtt%s_publish_auth_errors",
623 + Title: "MQTT Unauthorized PUBLISH Attempts",
624 + Units: "errors/s",
625 + Fam: "mqtt publish",
626 + Ctx: "vernemq.node_mqtt_publish_auth_errors",
627 + Type: module.Area,
628 + Priority: prioMqttPublishAuthPackets,
629 + Dims: module.Dims{
630 + {ID: dimMqttVer(metricPUBLISHAuthError), Name: "publish_auth", Algo: module.Incremental},
631 + },
632 + }
633 + nodeMqttPUBACKPacketsChartTmpl = module.Chart{
634 + ID: "node_%s_mqtt%s_puback",
635 + Title: "MQTT QoS 1 PUBACK Packets",
636 + Units: "packets/s",
637 + Fam: "mqtt publish",
638 + Ctx: "vernemq.node_mqtt_puback",
639 + Priority: prioMqttPubAckPackets,
640 + Dims: module.Dims{
641 + {ID: dimMqttVer(metricPUBACKReceived), Name: "received", Algo: module.Incremental},
642 + {ID: dimMqttVer(metricPUBACKSent), Name: "sent", Algo: module.Incremental, Mul: -1},
643 + },
644 + }
645 + nodeMqttPUBACKReceivedByReasonChartTmpl = func() module.Chart {
646 + chart := module.Chart{
647 + ID: "node_%s_mqtt%s_puback_received_by_reason_code",
648 + Title: "MQTT PUBACK QoS 1 Received by Reason",
649 + Units: "packets/s",
650 + Fam: "mqtt publish",
651 + Ctx: "vernemq.node_mqtt_puback_received_by_reason_code",
652 + Type: module.Stacked,
653 + Priority: prioMqttPubAckReceivedReason,
654 + }
655 + for _, v := range mqtt5PUBACKReceivedReasonCodes {
656 + chart.Dims = append(chart.Dims, &module.Dim{
657 + ID: dimMqttReason(metricPUBACKReceived, v), Name: v, Algo: module.Incremental,
658 + })
659 + }
660 + return chart
661 + }()
662 + nodeMqttPUBACKSentByReasonChartTmpl = func() module.Chart {
663 + chart := module.Chart{
664 + ID: "node_%s_mqtt%s_puback_sent_by_reason_code",
665 + Title: "MQTT PUBACK QoS 1 Sent by Reason",
666 + Units: "packets/s",
667 + Fam: "mqtt publish",
668 + Ctx: "vernemq.node_mqtt_puback_sent_by_reason_code",
669 + Type: module.Stacked,
670 + Priority: prioMqttPubAckSentReason,
671 + }
672 + for _, v := range mqtt5PUBACKSentReasonCodes {
673 + chart.Dims = append(chart.Dims, &module.Dim{
674 + ID: dimMqttReason(metricPUBACKSent, v), Name: v, Algo: module.Incremental,
675 + })
676 + }
677 + return chart
678 + }()
679 + nodeMqttPUBACKUnexpectedMessagesChartTmpl = module.Chart{
680 + ID: "node_%s_mqtt%s_puback_unexpected",
681 + Title: "MQTT PUBACK QoS 1 Received Unexpected Messages",
682 + Units: "messages/s",
683 + Fam: "mqtt publish",
684 + Ctx: "vernemq.node_mqtt_puback_invalid_error",
685 + Priority: prioMqttPubAckUnexpectedMessages,
686 + Dims: module.Dims{
687 + {ID: dimMqttVer(metricPUBACKInvalid), Name: "unexpected", Algo: module.Incremental},
688 + },
689 + }
690 + nodeMqttPUBRECPacketsChartTmpl = module.Chart{
691 + ID: "node_%s_mqtt%s_pubrec",
692 + Title: "MQTT PUBREC QoS 2 Packets",
693 + Units: "packets/s",
694 + Fam: "mqtt publish",
695 + Ctx: "vernemq.node_mqtt_pubrec",
696 + Priority: prioMqttPubRecPackets,
697 + Dims: module.Dims{
698 + {ID: dimMqttVer(metricPUBRECReceived), Name: "received", Algo: module.Incremental},
699 + {ID: dimMqttVer(metricPUBRECSent), Name: "sent", Algo: module.Incremental, Mul: -1},
700 + },
701 + }
702 + nodeMqttPUBRECReceivedByReasonChartTmpl = func() module.Chart {
703 + chart := module.Chart{
704 + ID: "node_%s_mqtt%s_pubrec_received_by_reason_code",
705 + Title: "MQTT PUBREC QoS 2 Received by Reason",
706 + Units: "packets/s",
707 + Fam: "mqtt publish",
708 + Ctx: "vernemq.node_mqtt_pubrec_received_by_reason_code",
709 + Type: module.Stacked,
710 + Priority: prioMqttPubRecReceivedReason,
711 + }
712 + for _, v := range mqtt5PUBRECReceivedReasonCodes {
713 + chart.Dims = append(chart.Dims, &module.Dim{
714 + ID: dimMqttReason(metricPUBRECReceived, v), Name: v, Algo: module.Incremental,
715 + })
716 + }
717 + return chart
718 + }()
719 + nodeMqttPUBRECSentByReasonChartTmpl = func() module.Chart {
720 + chart := module.Chart{
721 + ID: "node_%s_mqtt%s_pubrec_sent_by_reason_code",
722 + Title: "MQTT PUBREC QoS 2 Sent by Reason",
723 + Units: "packets/s",
724 + Fam: "mqtt publish",
725 + Ctx: "vernemq.node_mqtt_pubrec_sent_by_reason_code",
726 + Type: module.Stacked,
727 + Priority: prioMqttPubRecSentReason,
728 + }
729 + for _, v := range mqtt5PUBRECSentReasonCodes {
730 + chart.Dims = append(chart.Dims, &module.Dim{
731 + ID: dimMqttReason(metricPUBRECSent, v), Name: v, Algo: module.Incremental,
732 + })
733 + }
734 + return chart
735 + }()
736 + nodeMqttPUBRECUnexpectedMessagesChartTmpl = module.Chart{
737 + ID: "node_%s_mqtt%s_pubrec_unexpected",
738 + Title: "MQTT PUBREC QoS 2 Received Unexpected Messages",
739 + Units: "messages/s",
740 + Fam: "mqtt publish",
741 + Ctx: "vernemq.node_mqtt_pubrec_invalid_error",
742 + Priority: prioMqttPubRecUnexpectedMessages,
743 + Dims: module.Dims{
744 + {ID: dimMqttVer(metricPUBRECInvalid), Name: "unexpected", Algo: module.Incremental},
745 + },
746 + }
747 + nodeMqttPUBRELPacketsChartTmpl = module.Chart{
748 + ID: "node_%s_mqtt%s_pubrel",
749 + Title: "MQTT PUBREL QoS 2 Packets¬",
750 + Units: "packets/s",
751 + Fam: "mqtt publish",
752 + Ctx: "vernemq.node_mqtt_pubrel",
753 + Priority: prioMqttPubRelPackets,
754 + Dims: module.Dims{
755 + {ID: dimMqttVer(metricPUBRELReceived), Name: "received", Algo: module.Incremental},
756 + {ID: dimMqttVer(metricPUBRELSent), Name: "sent", Algo: module.Incremental, Mul: -1},
757 + },
758 + }
759 + nodeMqttPUBRELReceivedByReasonChartTmpl = func() module.Chart {
760 + chart := module.Chart{
761 + ID: "node_%s_mqtt%s_pubrel_received_by_reason_code",
762 + Title: "MQTT PUBREL QoS 2 Received by Reason",
763 + Units: "packets/s",
764 + Fam: "mqtt publish",
765 + Ctx: "vernemq.node_mqtt_pubrel_received_by_reason_code",
766 + Type: module.Stacked,
767 + Priority: prioMqttPubRelReceivedReason,
768 + }
769 + for _, v := range mqtt5PUBRELReceivedReasonCodes {
770 + chart.Dims = append(chart.Dims, &module.Dim{
771 + ID: dimMqttReason(metricPUBRELReceived, v), Name: v, Algo: module.Incremental,
772 + })
773 + }
774 + return chart
775 + }()
776 + nodeMqttPUBRELSentByReasonChartTmpl = func() module.Chart {
777 + chart := module.Chart{
778 + ID: "node_%s_mqtt%s_pubrel_sent_by_reason_code",
779 + Title: "MQTT PUBREL QoS 2 Sent by Reason",
780 + Units: "packets/s",
781 + Fam: "mqtt publish",
782 + Ctx: "vernemq.node_mqtt_pubrel_sent_by_reason_code",
783 + Type: module.Stacked,
784 + Priority: prioMqttPubRelSentReason,
785 + }
786 + for _, v := range mqtt5PUBRELSentReasonCodes {
787 + chart.Dims = append(chart.Dims, &module.Dim{
788 + ID: dimMqttReason(metricPUBRELSent, v), Name: v, Algo: module.Incremental,
789 + })
790 + }
791 + return chart
792 + }()
793 + nodeMqttPUBCOMPPacketsChartTmpl = module.Chart{
794 + ID: "node_%s_mqtt%s_pubcomp",
795 + Title: "MQTT PUBCOMP QoS 2 Packets",
796 + Units: "packets/s",
797 + Fam: "mqtt publish",
798 + Ctx: "vernemq.node_mqtt_pubcomp",
799 + Priority: prioMqttPubCompPackets,
800 + Dims: module.Dims{
801 + {ID: dimMqttVer(metricPUBCOMPReceived), Name: "received", Algo: module.Incremental},
802 + {ID: dimMqttVer(metricPUBCOMPSent), Name: "sent", Algo: module.Incremental, Mul: -1},
803 + },
804 + }
805 + nodeMqttPUBCOMPReceivedByReasonChartTmpl = func() module.Chart {
806 + chart := module.Chart{
807 + ID: "node_%s_mqtt%s_pubcomp_received_by_reason_code",
808 + Title: "MQTT PUBCOMP QoS 2 Received by Reason",
809 + Units: "packets/s",
810 + Fam: "mqtt publish",
811 + Ctx: "vernemq.node_mqtt_pubcomp_received_by_reason_code",
812 + Type: module.Stacked,
813 + Priority: prioMqttPubCompReceivedReason,
814 + }
815 + for _, v := range mqtt5PUBCOMPReceivedReasonCodes {
816 + chart.Dims = append(chart.Dims, &module.Dim{
817 + ID: dimMqttReason(metricPUBCOMPReceived, v), Name: v, Algo: module.Incremental,
818 + })
819 + }
820 + return chart
821 + }()
822 + nodeMqttPUBCOMPSentByReasonChartTmpl = func() module.Chart {
823 + chart := module.Chart{
824 + ID: "node_%s_mqtt%s_pubcomp_sent_by_reason_code",
825 + Title: "MQTT PUBCOMP QoS 2 Sent by Reason",
826 + Units: "packets/s",
827 + Fam: "mqtt publish",
828 + Ctx: "vernemq.node_mqtt_pubcomp_sent_by_reason_code",
829 + Type: module.Stacked,
830 + Priority: prioMqttPubCompSentReason,
831 + }
832 + for _, v := range mqtt5PUBCOMPSentReasonCodes {
833 + chart.Dims = append(chart.Dims, &module.Dim{
834 + ID: dimMqttReason(metricPUBCOMPSent, v), Name: v, Algo: module.Incremental,
835 + })
836 + }
837 + return chart
838 + }()
839 + nodeMqttPUBCOMPUnexpectedMessagesChartTmpl = module.Chart{
840 + ID: "node_%s_mqtt%s_pubcomp_unexpected",
841 + Title: "MQTT PUBCOMP QoS 2 Received Unexpected Messages",
842 + Units: "messages/s",
843 + Fam: "mqtt publish",
844 + Ctx: "vernemq.node_mqtt_pubcomp_invalid_error",
845 + Priority: prioMqttPubCompUnexpectedMessages,
846 + Dims: module.Dims{
847 + {ID: dimMqttVer(metricPUNCOMPInvalid), Name: "unexpected", Algo: module.Incremental},
848 },
849 }
850 )
851
852 // CONNECT
853 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},
854 + nodeMqttCONNECTPacketsChartTmpl = module.Chart{
855 + ID: "node_%s_mqtt%s_connect",
856 + Title: "MQTT CONNECT and CONNACK",
857 + Units: "packets/s",
858 + Fam: "mqtt connect",
859 + Ctx: "vernemq.node_mqtt_connect",
860 + Priority: prioMqttConnectPackets,
861 + Dims: module.Dims{
862 + {ID: dimMqttVer(metricCONNECTReceived), Name: "connect", Algo: module.Incremental},
863 + {ID: dimMqttVer(metricCONNACKSent), Name: "connack", Algo: module.Incremental, Mul: -1},
864 },
865 }
866 + nodeMqttCONNACKSentByReturnCodeChartTmpl = func() module.Chart {
867 + chart := module.Chart{
868 + ID: "node_%s_mqtt%s_connack_sent_by_return_code",
869 + Title: "MQTT CONNACK Sent by Return Code",
870 + Units: "packets/s",
871 + Fam: "mqtt connect",
872 + Ctx: "vernemq.node_mqtt_connack_sent_by_return_code",
873 + Type: module.Stacked,
874 + Priority: prioMqttConnectSentReason,
875 + }
876 + for _, v := range mqtt4CONNACKSentReturnCodes {
877 + chart.Dims = append(chart.Dims, &module.Dim{
878 + ID: dimMqttRCode(metricCONNACKSent, v), Name: v, Algo: module.Incremental,
879 + })
880 + }
881 + return chart
882 + }()
883 + nodeMqttCONNACKSentByReasonCodeChartTmpl = func() module.Chart {
884 + chart := module.Chart{
885 + ID: "node_%s_mqtt%s_connack_sent_by_reason_code",
886 + Title: "MQTT CONNACK Sent by Reason",
887 + Units: "packets/s",
888 + Fam: "mqtt connect",
889 + Ctx: "vernemq.node_mqtt_connack_sent_by_reason_code",
890 + Type: module.Stacked,
891 + Priority: prioMqttConnectSentReason,
892 + }
893 + for _, v := range mqtt5CONNACKSentReasonCodes {
894 + chart.Dims = append(chart.Dims, &module.Dim{
895 + ID: dimMqttReason(metricCONNACKSent, v), Name: v, Algo: module.Incremental,
896 + })
897 + }
898 + return chart
899 + }()
900 )
901
902 // DISCONNECT
903 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},
904 + nodeMqtt5DISCONNECTPacketsChartTmpl = module.Chart{
905 + ID: "node_%s_mqtt%s_disconnect",
906 + Title: "MQTT DISCONNECT Packets",
907 + Units: "packets/s",
908 + Fam: "mqtt disconnect",
909 + Ctx: "vernemq.node_mqtt_disconnect",
910 + Priority: prioMqttDisconnectPackets,
911 + Dims: module.Dims{
912 + {ID: dimMqttVer(metricDISCONNECTReceived), Name: "received", Algo: module.Incremental},
913 + {ID: dimMqttVer(metricDISCONNECTSent), Name: "sent", Algo: module.Incremental, Mul: -1},
914 },
915 }
916 + nodeMqtt4DISCONNECTPacketsChartTmpl = func() module.Chart {
917 + chart := nodeMqtt5DISCONNECTPacketsChartTmpl.Copy()
918 + _ = chart.RemoveDim(dimMqttVer(metricDISCONNECTSent))
919 + return *chart
920 + }()
921 + nodeMqttDISCONNECTReceivedByReasonChartTmpl = func() module.Chart {
922 + chart := module.Chart{
923 + ID: "node_%s_mqtt%s_disconnect_received_by_reason_code",
924 + Title: "MQTT DISCONNECT Received by Reason",
925 + Units: "packets/s",
926 + Fam: "mqtt disconnect",
927 + Ctx: "vernemq.node_mqtt_disconnect_received_by_reason_code",
928 + Type: module.Stacked,
929 + Priority: prioMqttDisconnectReceivedReason,
930 + }
931 + for _, v := range mqtt5DISCONNECTReceivedReasonCodes {
932 + chart.Dims = append(chart.Dims, &module.Dim{
933 + ID: dimMqttReason(metricDISCONNECTReceived, v), Name: v, Algo: module.Incremental,
934 + })
935 + }
936 + return chart
937 + }()
938 + nodeMqttDISCONNECTSentByReasonChartTmpl = func() module.Chart {
939 + chart := module.Chart{
940 + ID: "node_%s_mqtt%s_disconnect_sent_by_reason_code",
941 + Title: "MQTT DISCONNECT Sent by Reason",
942 + Units: "packets/s",
943 + Fam: "mqtt disconnect",
944 + Ctx: "vernemq.node_mqtt_disconnect_sent_by_reason_code",
945 + Type: module.Stacked,
946 + Priority: prioMqttDisconnectSentReason,
947 + }
948 + for _, v := range mqtt5DISCONNECTSentReasonCodes {
949 + chart.Dims = append(chart.Dims, &module.Dim{
950 + ID: dimMqttReason(metricDISCONNECTSent, v), Name: v, Algo: module.Incremental,
951 + })
952 + }
953 + return chart
954 + }()
955 )
956
957 // SUBSCRIBE
958 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},
959 + nodeMqttSUBSCRIBEPacketsChartTmpl = module.Chart{
960 + ID: "node_%s_mqtt%s_subscribe",
961 + Title: "MQTT SUBSCRIBE and SUBACK Packets",
962 + Units: "packets/s",
963 + Fam: "mqtt subscribe",
964 + Ctx: "vernemq.node_mqtt_subscribe",
965 + Priority: prioMqttSubscribePackets,
966 + Dims: module.Dims{
967 + {ID: dimMqttVer(metricSUBSCRIBEReceived), Name: "subscribe", Algo: module.Incremental},
968 + {ID: dimMqttVer(metricSUBACKSent), Name: "suback", Algo: module.Incremental, Mul: -1},
969 + },
970 + }
971 + modeMqttSUBSCRIBEErrorsChartTmpl = module.Chart{
972 + ID: "node_%s_mqtt%s_subscribe_error",
973 + Title: "MQTT Failed SUBSCRIBE Operations due to Netsplit",
974 + Units: "errors/s",
975 + Fam: "mqtt subscribe",
976 + Ctx: "vernemq.node_mqtt_subscribe_error",
977 + Priority: prioMqttSubscribeErrors,
978 + Dims: module.Dims{
979 + {ID: dimMqttVer(metricSUBSCRIBEError), Name: "subscribe", Algo: module.Incremental},
980 + },
981 + }
982 + nodeMqttSUBSCRIBEAuthErrorsChartTmpl = module.Chart{
983 + ID: "node_%s_mqtt%s_subscribe_auth_error",
984 + Title: "MQTT Unauthorized SUBSCRIBE Attempts",
985 + Units: "errors/s",
986 + Fam: "mqtt subscribe",
987 + Ctx: "vernemq.node_mqtt_subscribe_auth_error",
988 + Priority: prioMqttSubscribeAuthPackets,
989 + Dims: module.Dims{
990 + {ID: dimMqttVer(metricSUBSCRIBEAuthError), Name: "subscribe_auth", Algo: module.Incremental},
991 },
992 }
993 )
994
995 // UNSUBSCRIBE
996 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},
997 + nodeMqttUNSUBSCRIBEPacketsChartTmpl = module.Chart{
998 + ID: "node_%s_mqtt%s_unsubscribe",
999 + Title: "MQTT UNSUBSCRIBE and UNSUBACK Packets",
1000 + Units: "packets/s",
1001 + Fam: "mqtt unsubscribe",
1002 + Ctx: "vernemq.node_mqtt_unsubscribe",
1003 + Priority: prioMqttUnsubscribePackets,
1004 + Dims: module.Dims{
1005 + {ID: dimMqttVer(metricUNSUBSCRIBEReceived), Name: "unsubscribe", Algo: module.Incremental},
1006 + {ID: dimMqttVer(metricUNSUBACKSent), Name: "unsuback", Algo: module.Incremental, Mul: -1},
1007 + },
1008 + }
1009 + nodeMqttUNSUBSCRIBEErrorsChartTmpl = module.Chart{
1010 + ID: "node_%s_mqtt%s_unsubscribe_error",
1011 + Title: "MQTT Failed UNSUBSCRIBE Operations due to Netsplit",
1012 + Units: "errors/s",
1013 + Fam: "mqtt unsubscribe",
1014 + Ctx: "vernemq.node_mqtt_unsubscribe_error",
1015 + Priority: prioMqttUnsubscribeErrors,
1016 + Dims: module.Dims{
1017 + {ID: dimMqttVer(metricUNSUBSCRIBEError), Name: "unsubscribe", Algo: module.Incremental},
1018 },
1019 }
1020 )
1021
602 -// PUBLISH
1022 +// AUTH
1023 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},
1024 + nodeMqttAUTHPacketsChartTmpl = module.Chart{
1025 + ID: "node_%s_mqtt%s_auth",
1026 + Title: "MQTT AUTH Packets",
1027 + Units: "packets/s",
1028 + Fam: "mqtt auth",
1029 + Ctx: "vernemq.node_mqtt_auth",
1030 + Priority: prioMqttAuthPackets,
1031 + Dims: module.Dims{
1032 + {ID: dimMqttVer(metricAUTHReceived), Name: "received", Algo: module.Incremental},
1033 + {ID: dimMqttVer(metricAUTHSent), Name: "sent", Algo: module.Incremental, Mul: -1},
1034 },
1035 }
1036 + nodeMqttAUTHReceivedByReasonChartTmpl = func() module.Chart {
1037 + chart := module.Chart{
1038 + ID: "node_%s_mqtt%s_auth_received_by_reason_code",
1039 + Title: "MQTT AUTH Received by Reason",
1040 + Units: "packets/s",
1041 + Fam: "mqtt auth",
1042 + Ctx: "vernemq.node_mqtt_auth_received_by_reason_code",
1043 + Type: module.Stacked,
1044 + Priority: prioMqttAuthReceivedReason,
1045 + }
1046 + for _, v := range mqtt5AUTHReceivedReasonCodes {
1047 + chart.Dims = append(chart.Dims, &module.Dim{
1048 + ID: dimMqttReason(metricAUTHReceived, v), Name: v, Algo: module.Incremental,
1049 + })
1050 + }
1051 + return chart
1052 + }()
1053 + nodeMqttAUTHSentByReasonChartTmpl = func() module.Chart {
1054 + chart := module.Chart{
1055 + ID: "node_%s_mqtt%s_auth_sent_by_reason_code",
1056 + Title: "MQTT AUTH Sent by Reason",
1057 + Units: "packets/s",
1058 + Fam: "mqtt auth",
1059 + Ctx: "vernemq.node_mqtt_auth_sent_by_reason_code",
1060 + Type: module.Stacked,
1061 + Priority: prioMqttAuthSentReason,
1062 + }
1063 + for _, v := range mqtt5AUTHSentReasonCodes {
1064 + chart.Dims = append(chart.Dims, &module.Dim{
1065 + ID: dimMqttReason(metricAUTHSent, v), Name: v, Algo: module.Incremental,
1066 + })
1067 + }
1068 + return chart
1069 + }()
1070 )
1071
1072 // PING
1073 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},
1074 + nodeMqttPINGPacketsChartTmpl = module.Chart{
1075 + ID: "node_%s_mqtt_ver_%s_ping",
1076 + Title: "MQTT PING Packets",
1077 + Units: "packets/s",
1078 + Fam: "mqtt ping",
1079 + Ctx: "vernemq.node_mqtt_ping",
1080 + Priority: prioMqttPingPackets,
1081 + Dims: module.Dims{
1082 + {ID: dimMqttVer(metricPINGREQReceived), Name: "pingreq", Algo: module.Incremental},
1083 + {ID: dimMqttVer(metricPINGRESPSent), Name: "pingresp", Algo: module.Incremental, Mul: -1},
1084 },
1085 }
1086 )
1087
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 - },
1088 +func (v *VerneMQ) addNodeCharts(node string, nst *nodeStats) {
1089 + if err := v.Charts().Add(*newNodeCharts(node)...); err != nil {
1090 + v.Warningf("error on adding node '%s' charts: %v", node, err)
1091 }
826 -)
1092 + if len(nst.mqtt4) > 0 {
1093 + if err := v.Charts().Add(*newNodeMqttCharts(node, "4")...); err != nil {
1094 + v.Warningf("error on adding node '%s' mqtt v4 charts: %v", node, err)
1095 + }
1096 + }
1097 + if len(nst.mqtt5) > 0 {
1098 + if err := v.Charts().Add(*newNodeMqttCharts(node, "5")...); err != nil {
1099 + v.Warningf("error on adding node '%s' mqtt 5 charts: %v", node, err)
1100 + }
1101 + }
1102 +}
1103 +
1104 +func (v *VerneMQ) removeNodeCharts(node string) {
1105 + px := cleanChartID(fmt.Sprintf("node_%s_", node))
1106
828 -func (v *VerneMQ) notifyNewScheduler(name string) {
829 - if v.cache[name] {
830 - return
1107 + for _, chart := range *v.Charts() {
1108 + if strings.HasPrefix(chart.ID, px) {
1109 + chart.MarkRemove()
1110 + chart.MarkNotCreated()
1111 + }
1112 }
832 - v.cache[name] = true
1113 +}
1114 +
1115 +func newNodeCharts(node string) *module.Charts {
1116 + charts := nodeChartsTmpl.Copy()
1117
834 - id := chartSchedulerUtilization.ID
835 - num := name[len("system_utilization_scheduler_"):]
1118 + for _, chart := range *charts {
1119 + chart.ID = cleanChartID(fmt.Sprintf(chart.ID, node))
1120 + chart.Labels = []module.Label{
1121 + {Key: "node", Value: node},
1122 + }
1123 + for _, dim := range chart.Dims {
1124 + dim.ID = fmt.Sprintf(dim.ID, node)
1125 + }
1126 + }
1127
837 - v.addAbsDimToChart(id, name, num)
1128 + return charts
1129 }
1130
840 -func (v *VerneMQ) notifyNewReason(name, reason string) {
841 - if reason == "success" || reason == "normal_disconnect" {
842 - return
843 - }
844 - key := join(name, reason)
845 - if v.cache[key] {
846 - return
847 - }
848 - v.cache[key] = true
849 -
850 - var chart Chart
851 - switch name {
852 - case metricAUTHReceived:
853 - chart = chartMQTTv5AUTHReceivedReason
854 - case metricAUTHSent:
855 - chart = chartMQTTv5AUTHSentReason
856 - case metricCONNACKSent:
857 - chart = chartMQTTv3v5CONNACKSentReason
858 - case metricDISCONNECTReceived:
859 - chart = chartMQTTv5DISCONNECTReceivedReason
860 - case metricDISCONNECTSent:
861 - chart = chartMQTTv5DISCONNECTSentReason
862 - case metricPUBACKReceived:
863 - chart = chartMQTTv5PUBACKReceivedReason
864 - case metricPUBACKSent:
865 - chart = chartMQTTv5PUBACKSentReason
866 - case metricPUBRECReceived:
867 - chart = chartMQTTv5PUBRECReceivedReason
868 - case metricPUBRECSent:
869 - chart = chartMQTTv5PUBRECSentReason
870 - case metricPUBRELReceived:
871 - chart = chartMQTTv5PUBRELReceivedReason
872 - case metricPUBRELSent:
873 - chart = chartMQTTv5PUBRELSentReason
874 - case metricPUBCOMPReceived:
875 - chart = chartMQTTv5PUBCOMPReceivedReason
876 - case metricPUBCOMPSent:
877 - chart = chartMQTTv5PUBCOMPSentReason
1131 +func newNodeMqttCharts(node, mqttVer string) *module.Charts {
1132 + var charts *module.Charts
1133 +
1134 + switch mqttVer {
1135 + case "4":
1136 + charts = nodeMqtt4ChartsTmpl.Copy()
1137 + case "5":
1138 + charts = nodeMqtt5ChartsTmpl.Copy()
1139 default:
879 - v.Warningf("unknown metric name, wont be added to the charts: '%s'", name)
880 - return
1140 + return nil
1141 }
1142
883 - v.addIncDimToChart(chart.ID, key, reason)
1143 + for _, chart := range *charts {
1144 + chart.ID = cleanChartID(fmt.Sprintf(chart.ID, node, mqttVer))
1145 + chart.Labels = []module.Label{
1146 + {Key: "node", Value: node},
1147 + {Key: "mqtt_version", Value: mqttVer},
1148 + }
1149 + for _, dim := range chart.Dims {
1150 + dim.ID = fmt.Sprintf(dim.ID, node, mqttVer)
1151 + }
1152 + }
1153 +
1154 + return charts
1155 }
1156
886 -func (v *VerneMQ) addAbsDimToChart(chartID, dimID, dimName string) {
887 - v.addDimToChart(chartID, dimID, dimName, false)
1157 +func dimNode(name string) string {
1158 + return join("node_%s", name)
1159 }
1160
890 -func (v *VerneMQ) addIncDimToChart(chartID, dimID, dimName string) {
891 - v.addDimToChart(chartID, dimID, dimName, true)
1161 +func dimMqttVer(name string) string {
1162 + return join("node_%s_mqtt%s", name)
1163 }
1164
894 -func (v *VerneMQ) addDimToChart(chartID, dimID, dimName string, inc bool) {
895 - chart := v.Charts().Get(chartID)
896 - if chart == nil {
897 - v.Warningf("add '%s' dim: couldn't find '%s' chart", dimID, chartID)
898 - return
899 - }
1165 +func dimMqttReason(name, reason string) string {
1166 + return join("node_%s_mqtt%s", name, "reason_code", reason)
1167 +}
1168
901 - dim := &Dim{ID: dimID, Name: dimName}
902 - if inc {
903 - dim.Algo = module.Incremental
904 - }
1169 +func dimMqttRCode(name, rcode string) string {
1170 + return join("node_%s_mqtt%s", name, "return_code", rcode)
1171 +}
1172
906 - if err := chart.AddDim(dim); err != nil {
907 - v.Warningf("add '%s' dim: %v", dimID, err)
908 - return
909 - }
910 - chart.MarkNotCreated()
1173 +func cleanChartID(id string) string {
1174 + r := strings.NewReplacer(".", "_", "'", "_", " ", "_")
1175 + return r.Replace(id)
1176 }
src/go/plugin/go.d/modules/vernemq/collect.go
+108 -239
@@ -6,283 +6,152 @@ import (
6 "errors"
7 "strings"
8
9 + "github.com/prometheus/common/model"
10 + "github.com/prometheus/prometheus/model/labels"
11 +
12 "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/prometheus"
10 - "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/stm"
13 )
14
13 -func isValidVerneMQMetrics(pms prometheus.Series) bool {
14 - return pms.FindByName(metricPUBLISHError).Len() > 0 && pms.FindByName(metricRouterSubscriptions).Len() > 0
15 -}
16 -
15 func (v *VerneMQ) collect() (map[string]int64, error) {
18 - pms, err := v.prom.ScrapeSeries()
16 + mfs, err := v.prom.Scrape()
17 if err != nil {
18 return nil, err
19 }
20
23 - if !isValidVerneMQMetrics(pms) {
24 - return nil, errors.New("returned metrics aren't VerneMQ metrics")
21 + if !v.namespace.found {
22 + name, err := v.getMetricNamespace(mfs)
23 + if err != nil {
24 + return nil, err
25 + }
26 + v.namespace.found = true
27 + v.namespace.name = name
28 }
29
27 - mx := v.collectVerneMQ(pms)
28 -
29 - return stm.ToMap(mx), nil
30 -}
31 -
32 -func (v *VerneMQ) collectVerneMQ(pms prometheus.Series) map[string]float64 {
33 - mx := make(map[string]float64)
34 - collectSockets(mx, pms)
35 - collectQueues(mx, pms)
36 - collectSubscriptions(mx, pms)
37 - v.collectErlangVM(mx, pms)
38 - collectBandwidth(mx, pms)
39 - collectRetain(mx, pms)
40 - collectCluster(mx, pms)
41 - collectUptime(mx, pms)
42 -
43 - v.collectAUTH(mx, pms)
44 - v.collectCONNECT(mx, pms)
45 - v.collectDISCONNECT(mx, pms)
46 - v.collectSUBSCRIBE(mx, pms)
47 - v.collectUNSUBSCRIBE(mx, pms)
48 - v.collectPUBLISH(mx, pms)
49 - v.collectPING(mx, pms)
50 - v.collectMQTTInvalidMsgSize(mx, pms)
51 - return mx
52 -}
53 -
54 -func (v *VerneMQ) collectCONNECT(mx map[string]float64, pms prometheus.Series) {
55 - pms = pms.FindByNames(
56 - metricCONNECTReceived,
57 - metricCONNACKSent,
58 - )
59 - v.collectMQTT(mx, pms)
60 -}
61 -
62 -func (v *VerneMQ) collectDISCONNECT(mx map[string]float64, pms prometheus.Series) {
63 - pms = pms.FindByNames(
64 - metricDISCONNECTReceived,
65 - metricDISCONNECTSent,
66 - )
67 - v.collectMQTT(mx, pms)
68 -}
69 -
70 -func (v *VerneMQ) collectPUBLISH(mx map[string]float64, pms prometheus.Series) {
71 - pms = pms.FindByNames(
72 - metricPUBACKReceived,
73 - metricPUBACKSent,
74 - metricPUBACKInvalid,
75 -
76 - metricPUBCOMPReceived,
77 - metricPUBCOMPSent,
78 - metricPUNCOMPInvalid,
79 -
80 - metricPUBSLISHReceived,
81 - metricPUBSLIHSent,
82 - metricPUBLISHError,
83 - metricPUBLISHAuthError,
84 -
85 - metricPUBRECReceived,
86 - metricPUBRECSent,
87 - metricPUBRECInvalid,
30 + mx := make(map[string]int64)
31
89 - metricPUBRELReceived,
90 - metricPUBRELSent,
91 - )
92 - v.collectMQTT(mx, pms)
93 -}
94 -
95 -func (v *VerneMQ) collectSUBSCRIBE(mx map[string]float64, pms prometheus.Series) {
96 - pms = pms.FindByNames(
97 - metricSUBSCRIBEReceived,
98 - metricSUBACKSent,
99 - metricSUBSCRIBEError,
100 - metricSUBSCRIBEAuthError,
101 - )
102 - v.collectMQTT(mx, pms)
103 -}
104 -
105 -func (v *VerneMQ) collectUNSUBSCRIBE(mx map[string]float64, pms prometheus.Series) {
106 - pms = pms.FindByNames(
107 - metricUNSUBSCRIBEReceived,
108 - metricUNSUBACKSent,
109 - metricUNSUBSCRIBEError,
110 - )
111 - v.collectMQTT(mx, pms)
112 -}
113 -
114 -func (v *VerneMQ) collectPING(mx map[string]float64, pms prometheus.Series) {
115 - pms = pms.FindByNames(
116 - metricPINGREQReceived,
117 - metricPINGRESPSent,
118 - )
119 - v.collectMQTT(mx, pms)
120 -}
121 -
122 -func (v *VerneMQ) collectAUTH(mx map[string]float64, pms prometheus.Series) {
123 - pms = pms.FindByNames(
124 - metricAUTHReceived,
125 - metricAUTHSent,
126 - )
127 - v.collectMQTT(mx, pms)
128 -}
32 + v.collectMetrics(mx, mfs)
33
130 -func (v *VerneMQ) collectMQTTInvalidMsgSize(mx map[string]float64, pms prometheus.Series) {
131 - pms = pms.FindByName(metricMQTTInvalidMsgSizeError)
132 - v.collectMQTT(mx, pms)
34 + return mx, nil
35 }
36
135 -func collectSockets(mx map[string]float64, pms prometheus.Series) {
136 - pms = pms.FindByNames(
137 - metricSocketClose,
138 - metricSocketCloseTimeout,
139 - metricSocketError,
140 - metricSocketOpen,
141 - metricClientKeepaliveExpired,
142 - )
143 - collectNonMQTT(mx, pms)
144 - mx["open_sockets"] = mx[metricSocketOpen] - mx[metricSocketClose]
145 -}
37 +func (v *VerneMQ) collectMetrics(mx map[string]int64, mfs prometheus.MetricFamilies) {
38 + nodes := v.getNodesStats(mfs)
39
147 -func collectQueues(mx map[string]float64, pms prometheus.Series) {
148 - pms = pms.FindByNames(
149 - metricQueueInitializedFromStorage,
150 - metricQueueMessageDrop,
151 - metricQueueMessageExpired,
152 - metricQueueMessageIn,
153 - metricQueueMessageOut,
154 - metricQueueMessageUnhandled,
155 - metricQueueProcesses,
156 - metricQueueSetup,
157 - metricQueueTeardown,
158 - )
159 - collectNonMQTT(mx, pms)
160 -}
40 + for node, st := range nodes {
41 + if !v.seenNodes[node] {
42 + v.seenNodes[node] = true
43 + v.addNodeCharts(node, st)
44 + }
45
162 -func collectSubscriptions(mx map[string]float64, pms prometheus.Series) {
163 - pms = pms.FindByNames(
164 - metricRouterMatchesLocal,
165 - metricRouterMatchesRemote,
166 - metricRouterMemory,
167 - metricRouterSubscriptions,
168 - )
169 - collectNonMQTT(mx, pms)
170 -}
46 + st.stats["open_sockets"] = st.stats[metricSocketOpen] - st.stats[metricSocketClose]
47 + st.stats["netsplit_unresolved"] = st.stats[metricNetSplitDetected] - st.stats[metricNetSplitResolved]
48
172 -func (v *VerneMQ) collectErlangVM(mx map[string]float64, pms prometheus.Series) {
173 - v.collectSchedulersUtilization(mx, pms)
174 - pms = pms.FindByNames(
175 - metricSystemContextSwitches,
176 - metricSystemGCCount,
177 - metricSystemIOIn,
178 - metricSystemIOOut,
179 - metricSystemProcessCount,
180 - metricSystemReductions,
181 - metricSystemRunQueue,
182 - metricSystemUtilization,
183 - metricSystemWordsReclaimedByGC,
184 - metricVMMemoryProcesses,
185 - metricVMMemorySystem,
186 - )
187 - collectNonMQTT(mx, pms)
188 -}
49 + px := join("node", node)
50
190 -func (v *VerneMQ) collectSchedulersUtilization(mx map[string]float64, pms prometheus.Series) {
191 - for _, pm := range pms {
192 - if isSchedulerUtilizationMetric(pm) {
193 - mx[pm.Name()] += pm.Value
194 - v.notifyNewScheduler(pm.Name())
51 + for k, val := range st.stats {
52 + mx[join(px, k)] = val
53 + }
54 + for k, val := range st.mqtt4 {
55 + mx[join(px, "mqtt4", k)] = val
56 + }
57 + for k, val := range st.mqtt5 {
58 + mx[join(px, "mqtt5", k)] = val
59 }
60 }
197 -}
198 -
199 -func collectBandwidth(mx map[string]float64, pms prometheus.Series) {
200 - pms = pms.FindByNames(
201 - metricBytesReceived,
202 - metricBytesSent,
203 - )
204 - collectNonMQTT(mx, pms)
205 -}
61
207 -func collectRetain(mx map[string]float64, pms prometheus.Series) {
208 - pms = pms.FindByNames(
209 - metricRetainMemory,
210 - metricRetainMessages,
211 - )
212 - collectNonMQTT(mx, pms)
213 -}
214 -
215 -func collectCluster(mx map[string]float64, pms prometheus.Series) {
216 - pms = pms.FindByNames(
217 - metricClusterBytesDropped,
218 - metricClusterBytesReceived,
219 - metricClusterBytesSent,
220 - metricNetSplitDetected,
221 - metricNetSplitResolved,
222 - )
223 - collectNonMQTT(mx, pms)
224 - mx["netsplit_unresolved"] = mx[metricNetSplitDetected] - mx[metricNetSplitResolved]
225 -}
62 + for node := range v.seenNodes {
63 + if _, ok := nodes[node]; !ok {
64 + delete(v.seenNodes, node)
65 + v.removeNodeCharts(node)
66 + }
67 + }
68
227 -func collectUptime(mx map[string]float64, pms prometheus.Series) {
228 - pms = pms.FindByName(metricSystemWallClock)
229 - collectNonMQTT(mx, pms)
69 }
70
232 -func collectNonMQTT(mx map[string]float64, pms prometheus.Series) {
233 - for _, pm := range pms {
234 - mx[pm.Name()] += pm.Value
235 - }
236 -}
71 +func (v *VerneMQ) getNodesStats(mfs prometheus.MetricFamilies) map[string]*nodeStats {
72 + nodes := make(map[string]*nodeStats)
73
238 -func (v *VerneMQ) collectMQTT(mx map[string]float64, pms prometheus.Series) {
239 - for _, pm := range pms {
240 - if !isMQTTMetric(pm) {
74 + for _, mf := range mfs {
75 + name, _ := strings.CutPrefix(mf.Name(), v.namespace.name+"_")
76 + if isSchedulerUtilizationMetric(name) {
77 continue
78 }
243 - version := versionLabelValue(pm)
244 - if version == "" {
245 - continue
246 - }
247 -
248 - mx[pm.Name()] += pm.Value
249 - mx[join(pm.Name(), "v", version)] += pm.Value
79
251 - if reason := reasonCodeLabelValue(pm); reason != "" {
252 - mx[join(pm.Name(), reason)] += pm.Value
253 - mx[join(pm.Name(), "v", version, reason)] += pm.Value
254 -
255 - v.notifyNewReason(pm.Name(), reason)
80 + for _, m := range mf.Metrics() {
81 + node := m.Labels().Get("node")
82 + if node == "" {
83 + continue
84 + }
85 +
86 + if _, ok := nodes[node]; !ok {
87 + nodes[node] = newNodeStats()
88 + }
89 +
90 + nst := nodes[node]
91 +
92 + var value float64
93 +
94 + switch mf.Type() {
95 + case model.MetricTypeGauge:
96 + value = m.Gauge().Value()
97 + case model.MetricTypeCounter:
98 + value = m.Counter().Value()
99 + default:
100 + continue
101 + }
102 +
103 + if len(m.Labels()) == 1 {
104 + nst.stats[name] += int64(value)
105 + continue
106 + }
107 +
108 + if !strings.HasPrefix(name, "mqtt_") && name != metricClientKeepaliveExpired {
109 + continue
110 + }
111 +
112 + switch m.Labels().Get("mqtt_version") {
113 + case "4":
114 + nst.mqtt4[name] += int64(value)
115 + m.Labels().Range(func(l labels.Label) {
116 + if l.Name == "return_code" {
117 + nst.mqtt4[join(name, l.Name, l.Value)] += int64(value)
118 + }
119 + })
120 + case "5":
121 + nst.mqtt5[name] += int64(value)
122 + m.Labels().Range(func(l labels.Label) {
123 + if l.Name == "reason_code" {
124 + nst.mqtt5[join(name, l.Name, l.Value)] += int64(value)
125 + }
126 + })
127 + }
128 }
129 }
258 -}
259 -
260 -func isMQTTMetric(pm prometheus.SeriesSample) bool {
261 - return strings.HasPrefix(pm.Name(), "mqtt_")
262 -}
130
264 -func isSchedulerUtilizationMetric(pm prometheus.SeriesSample) bool {
265 - return strings.HasPrefix(pm.Name(), "system_utilization_scheduler_")
131 + return nodes
132 }
133
268 -func reasonCodeLabelValue(pm prometheus.SeriesSample) string {
269 - if v := pm.Labels.Get("reason_code"); v != "" {
270 - return v
134 +func (v *VerneMQ) getMetricNamespace(mfs prometheus.MetricFamilies) (string, error) {
135 + want := metricPUBLISHError
136 + for _, mf := range mfs {
137 + if strings.HasSuffix(mf.Name(), want) {
138 + s := strings.TrimSuffix(mf.Name(), want)
139 + s = strings.TrimSuffix(s, "_")
140 + return s, nil
141 + }
142 }
272 - // "mqtt_connack_sent" v4 has return_code
273 - return pm.Labels.Get("return_code")
143 +
144 + return "", errors.New("unexpected response: not VerneMQ metrics")
145 }
146
276 -func versionLabelValue(pm prometheus.SeriesSample) string {
277 - return pm.Labels.Get("mqtt_version")
147 +func isSchedulerUtilizationMetric(name string) bool {
148 + return strings.HasPrefix(name, "system_utilization_scheduler_")
149 }
150
151 func join(a, b string, rest ...string) string {
281 - v := a + "_" + b
282 - switch len(rest) {
283 - case 0:
284 - return v
285 - default:
286 - return join(v, rest[0], rest[1:]...)
152 + s := a + "_" + b
153 + for _, v := range rest {
154 + s += "_" + v
155 }
156 + return s
157 }
src/go/plugin/go.d/modules/vernemq/init.go
+1 -1
@@ -11,7 +11,7 @@ import (
11
12 func (v *VerneMQ) validateConfig() error {
13 if v.URL == "" {
14 - return errors.New("url is not set")
14 + return errors.New("url is required but not set")
15 }
16 return nil
17 }
src/go/plugin/go.d/modules/vernemq/metadata.yaml
+307 -191
@@ -154,108 +154,108 @@ modules:
154 list: []
155 alerts:
156 - name: vernemq_socket_errors
157 - metric: vernemq.socket_errors
158 - info: number of socket errors in the last minute
157 + metric: vernemq.node_socket_errors
158 + info: Node ${label:node} socket errors in the last minute
159 link: https://github.com/netdata/netdata/blob/master/src/health/health.d/vernemq.conf
160 - name: vernemq_queue_message_drop
161 - metric: vernemq.queue_undelivered_messages
162 - info: number of dropped messaged due to full queues in the last minute
161 + metric: vernemq.node_queue_undelivered_messages
162 + info: Node ${label:node} dropped messages due to full queues in the last minute
163 link: https://github.com/netdata/netdata/blob/master/src/health/health.d/vernemq.conf
164 - name: vernemq_queue_message_expired
165 - metric: vernemq.queue_undelivered_messages
166 - info: number of messages which expired before delivery in the last minute
165 + metric: vernemq.node_queue_undelivered_messages
166 + info: Node ${label:node} expired before delivery messages in the last minute
167 link: https://github.com/netdata/netdata/blob/master/src/health/health.d/vernemq.conf
168 - name: vernemq_queue_message_unhandled
169 - metric: vernemq.queue_undelivered_messages
170 - info: "number of unhandled messages (connections with clean session=true) in the last minute"
169 + metric: vernemq.node_queue_undelivered_messages
170 + info: Node ${label:node} unhandled messages in the last minute
171 link: https://github.com/netdata/netdata/blob/master/src/health/health.d/vernemq.conf
172 - name: vernemq_average_scheduler_utilization
173 - metric: vernemq.average_scheduler_utilization
174 - info: average scheduler utilization over the last 10 minutes
173 + metric: vernemq.node_average_scheduler_utilization
174 + info: Node ${label:node} scheduler utilization over the last 10 minutes
175 link: https://github.com/netdata/netdata/blob/master/src/health/health.d/vernemq.conf
176 - name: vernemq_cluster_dropped
177 - metric: vernemq.cluster_dropped
178 - info: amount of traffic dropped during communication with the cluster nodes in the last minute
177 + metric: vernemq.node_cluster_dropped
178 + info: Node ${label:node} traffic dropped during communication with the cluster nodes in the last minute
179 link: https://github.com/netdata/netdata/blob/master/src/health/health.d/vernemq.conf
180 - name: vernemq_netsplits
181 - metric: vvernemq.netsplits
182 - info: "number of detected netsplits (split brain situation) in the last minute"
181 + metric: vernemq.node_netsplits
182 + info: "Node ${label:node} detected netsplits (split brain) in the last minute"
183 link: https://github.com/netdata/netdata/blob/master/src/health/health.d/vernemq.conf
184 - name: vernemq_mqtt_connack_sent_reason_unsuccessful
185 - metric: vernemq.mqtt_connack_sent_reason
186 - info: number of sent unsuccessful v3/v5 CONNACK packets in the last minute
185 + metric: vernemq.node_mqtt_connack_sent_by_reason_code
186 + info: Node ${label:node} unsuccessful sent v5 CONNACK packets in the last minute
187 link: https://github.com/netdata/netdata/blob/master/src/health/health.d/vernemq.conf
188 - name: vernemq_mqtt_disconnect_received_reason_not_normal
189 - metric: vernemq.mqtt_disconnect_received_reason
190 - info: number of received not normal v5 DISCONNECT packets in the last minute
189 + metric: vernemq.node_mqtt_disconnect_received_by_reason_code
190 + info: Node ${label:node} received not normal v5 DISCONNECT packets in the last minute
191 link: https://github.com/netdata/netdata/blob/master/src/health/health.d/vernemq.conf
192 - name: vernemq_mqtt_disconnect_sent_reason_not_normal
193 - metric: vernemq.mqtt_disconnect_sent_reason
194 - info: number of sent not normal v5 DISCONNECT packets in the last minute
193 + metric: vernemq.node_mqtt_disconnect_sent_by_reason_code
194 + info: Node ${label:node} sent not normal v5 DISCONNECT packets in the last minute
195 link: https://github.com/netdata/netdata/blob/master/src/health/health.d/vernemq.conf
196 - name: vernemq_mqtt_subscribe_error
197 - metric: vernemq.mqtt_subscribe_error
198 - info: number of failed v3/v5 SUBSCRIBE operations in the last minute
197 + metric: vernemq.node_mqtt_subscribe_error
198 + info: Node ${label:node} mqtt v${label:mqtt_version} failed SUBSCRIBE operations in the last minute
199 link: https://github.com/netdata/netdata/blob/master/src/health/health.d/vernemq.conf
200 - name: vernemq_mqtt_subscribe_auth_error
201 - metric: vernemq.mqtt_subscribe_auth_error
202 - info: number of unauthorized v3/v5 SUBSCRIBE attempts in the last minute
201 + metric: vernemq.node_mqtt_subscribe_auth_error
202 + info: Node ${label:node} mqtt v${label:mqtt_version} unauthorized SUBSCRIBE attempts in the last minute
203 link: https://github.com/netdata/netdata/blob/master/src/health/health.d/vernemq.conf
204 - name: vernemq_mqtt_unsubscribe_error
205 - metric: vernemq.mqtt_unsubscribe_error
206 - info: number of failed v3/v5 UNSUBSCRIBE operations in the last minute
205 + metric: vernemq.node_mqtt_unsubscribe_error
206 + info: Node ${label:node} mqtt v${label:mqtt_version} failed UNSUBSCRIBE operations in the last minute
207 link: https://github.com/netdata/netdata/blob/master/src/health/health.d/vernemq.conf
208 - name: vernemq_mqtt_publish_errors
209 - metric: vernemq.mqtt_publish_errors
210 - info: number of failed v3/v5 PUBLISH operations in the last minute
209 + metric: vernemq.node_mqtt_publish_errors
210 + info: Node ${label:node} mqtt v${label:mqtt_version} failed PUBLISH operations in the last minute
211 link: https://github.com/netdata/netdata/blob/master/src/health/health.d/vernemq.conf
212 - name: vernemq_mqtt_publish_auth_errors
213 - metric: vernemq.mqtt_publish_auth_errors
214 - info: number of unauthorized v3/v5 PUBLISH attempts in the last minute
213 + metric: vernemq.node_mqtt_publish_auth_errors
214 + info: Node ${label:node} mqtt v${label:mqtt_version} unauthorized PUBLISH attempts in the last minute
215 link: https://github.com/netdata/netdata/blob/master/src/health/health.d/vernemq.conf
216 - name: vernemq_mqtt_puback_received_reason_unsuccessful
217 - metric: vernemq.mqtt_puback_received_reason
218 - info: number of received unsuccessful v5 PUBACK packets in the last minute
217 + metric: vernemq.node_mqtt_puback_received_by_reason_code
218 + info: Node ${label:node} mqtt v5 received unsuccessful PUBACK packets in the last minute
219 link: https://github.com/netdata/netdata/blob/master/src/health/health.d/vernemq.conf
220 - name: vernemq_mqtt_puback_sent_reason_unsuccessful
221 - metric: vernemq.mqtt_puback_sent_reason
222 - info: number of sent unsuccessful v5 PUBACK packets in the last minute
221 + metric: vernemq.node_mqtt_puback_sent_by_reason_code
222 + info: Node ${label:node} mqtt v5 unsuccessful sent PUBACK packets in the last minute
223 link: https://github.com/netdata/netdata/blob/master/src/health/health.d/vernemq.conf
224 - name: vernemq_mqtt_puback_unexpected
225 - metric: vernemq.mqtt_puback_invalid_error
226 - info: number of received unexpected v3/v5 PUBACK packets in the last minute
225 + metric: vernemq.node_mqtt_puback_invalid_error
226 + info: Node ${label:node} mqtt v${label:mqtt_version} received unexpected PUBACK messages in the last minute
227 link: https://github.com/netdata/netdata/blob/master/src/health/health.d/vernemq.conf
228 - name: vernemq_mqtt_pubrec_received_reason_unsuccessful
229 - metric: vernemq.mqtt_pubrec_received_reason
230 - info: number of received unsuccessful v5 PUBREC packets in the last minute
229 + metric: vernemq.node_mqtt_pubrec_received_by_reason_code
230 + info: Node ${label:node} mqtt v5 received unsuccessful PUBREC packets in the last minute
231 link: https://github.com/netdata/netdata/blob/master/src/health/health.d/vernemq.conf
232 - name: vernemq_mqtt_pubrec_sent_reason_unsuccessful
233 - metric: vernemq.mqtt_pubrec_sent_reason
234 - info: number of sent unsuccessful v5 PUBREC packets in the last minute
233 + metric: vernemq.node_mqtt_pubrec_sent_by_reason_code
234 + info: Node ${label:node} mqtt v5 unsuccessful sent PUBREC packets in the last minute
235 link: https://github.com/netdata/netdata/blob/master/src/health/health.d/vernemq.conf
236 - name: vernemq_mqtt_pubrec_invalid_error
237 - metric: vernemq.mqtt_pubrec_invalid_error
238 - info: number of received unexpected v3 PUBREC packets in the last minute
237 + metric: vernemq.node_mqtt_pubrec_invalid_error
238 + info: Node ${label:node} mqtt v${label:mqtt_version} received invalid PUBREC packets in the last minute
239 link: https://github.com/netdata/netdata/blob/master/src/health/health.d/vernemq.conf
240 - name: vernemq_mqtt_pubrel_received_reason_unsuccessful
241 - metric: vernemq.mqtt_pubrel_received_reason
242 - info: number of received unsuccessful v5 PUBREL packets in the last minute
241 + metric: vernemq.node_mqtt_pubrel_received_by_reason_code
242 + info: Node ${label:node} mqtt v5 received unsuccessful PUBREL packets in the last minute
243 link: https://github.com/netdata/netdata/blob/master/src/health/health.d/vernemq.conf
244 - name: vernemq_mqtt_pubrel_sent_reason_unsuccessful
245 - metric: vernemq.mqtt_pubrel_sent_reason
246 - info: number of sent unsuccessful v5 PUBREL packets in the last minute
245 + metric: vernemq.node_mqtt_pubrel_sent_by_reason_code
246 + info: Node ${label:node} mqtt v5 unsuccessful sent PUBREL packets in the last minute
247 link: https://github.com/netdata/netdata/blob/master/src/health/health.d/vernemq.conf
248 - name: vernemq_mqtt_pubcomp_received_reason_unsuccessful
249 - metric: vernemq.mqtt_pubcomp_received_reason
250 - info: number of received unsuccessful v5 PUBCOMP packets in the last minute
249 + metric: vernemq.node_mqtt_pubcomp_received_by_reason_code
250 + info: Node ${label:node} mqtt v5 received unsuccessful PUBCOMP packets in the last minute
251 link: https://github.com/netdata/netdata/blob/master/src/health/health.d/vernemq.conf
252 - name: vernemq_mqtt_pubcomp_sent_reason_unsuccessful
253 - metric: vernemq.mqtt_pubcomp_sent_reason
254 - info: number of sent unsuccessful v5 PUBCOMP packets in the last minute
253 + metric: vernemq.node_mqtt_pubcomp_sent_by_reason_code
254 + info: Node ${label:node} mqtt v5 unsuccessful sent PUBCOMP packets in the last minute
255 link: https://github.com/netdata/netdata/blob/master/src/health/health.d/vernemq.conf
256 - name: vernemq_mqtt_pubcomp_unexpected
257 - metric: vernemq.mqtt_pubcomp_invalid_error
258 - info: number of received unexpected v3/v5 PUBCOMP packets in the last minute
257 + metric: vernemq.node_mqtt_pubcomp_invalid_error
258 + info: Node ${label:node} mqtt v${label:mqtt_version} received unexpected PUBCOMP packets in the last minute
259 link: https://github.com/netdata/netdata/blob/master/src/health/health.d/vernemq.conf
260 metrics:
261 folding:
@@ -264,68 +264,70 @@ modules:
264 description: ""
265 availability: []
266 scopes:
267 - - name: global
268 - description: These metrics refer to the entire monitored application.
269 - labels: []
267 + - name: node
268 + description: These metrics refer to the VerneMQ node.
269 + labels:
270 + - name: node
271 + description: The value of this label is identical to the value of the "node" label exposed by VerneMQ.
272 metrics:
271 - - name: vernemq.sockets
273 + - name: vernemq.node_socket
274 description: Open Sockets
275 unit: sockets
276 chart_type: line
277 dimensions:
278 - name: open
277 - - name: vernemq.socket_operations
279 + - name: vernemq.node_socket_operations
280 description: Socket Open and Close Events
281 unit: sockets/s
282 chart_type: line
283 dimensions:
284 - name: open
285 - name: close
284 - - name: vernemq.client_keepalive_expired
286 + - name: vernemq.node_client_keepalive_expired
287 description: Closed Sockets due to Keepalive Time Expired
288 unit: sockets/s
289 chart_type: line
290 dimensions:
291 - name: closed
290 - - name: vernemq.socket_close_timeout
292 + - name: vernemq.node_socket_close_timeout
293 description: Closed Sockets due to no CONNECT Frame On Time
294 unit: sockets/s
295 chart_type: line
296 dimensions:
297 - name: closed
296 - - name: vernemq.socket_errors
298 + - name: vernemq.node_socket_errors
299 description: Socket Errors
300 unit: errors/s
301 chart_type: line
302 dimensions:
303 - name: errors
302 - - name: vernemq.queue_processes
304 + - name: vernemq.node_queue_processes
305 description: Living Queues in an Online or an Offline State
306 unit: queue processes
307 chart_type: line
308 dimensions:
309 - name: queue_processes
308 - - name: vernemq.queue_processes_operations
310 + - name: vernemq.node_queue_processes_operations
311 description: Queue Processes Setup and Teardown Events
312 unit: events/s
313 chart_type: line
314 dimensions:
315 - name: setup
316 - name: teardown
315 - - name: vernemq.queue_process_init_from_storage
317 + - name: vernemq.node_queue_process_init_from_storage
318 description: Queue Processes Initialized from Offline Storage
319 unit: queue processes/s
320 chart_type: line
321 dimensions:
322 - name: queue_processes
321 - - name: vernemq.queue_messages
323 + - name: vernemq.node_queue_messages
324 description: Received and Sent PUBLISH Messages
325 unit: messages/s
326 chart_type: area
327 dimensions:
328 - name: received
329 - name: sent
328 - - name: vernemq.queue_undelivered_messages
330 + - name: vernemq.node_queue_undelivered_messages
331 description: Undelivered PUBLISH Messages
332 unit: messages/s
333 chart_type: stacked
@@ -333,338 +335,452 @@ modules:
335 - name: dropped
336 - name: expired
337 - name: unhandled
336 - - name: vernemq.router_subscriptions
338 + - name: vernemq.node_router_subscriptions
339 description: Subscriptions in the Routing Table
340 unit: subscriptions
341 chart_type: line
342 dimensions:
343 - name: subscriptions
342 - - name: vernemq.router_matched_subscriptions
344 + - name: vernemq.node_router_matched_subscriptions
345 description: Matched Subscriptions
346 unit: subscriptions/s
347 chart_type: line
348 dimensions:
349 - name: local
350 - name: remote
349 - - name: vernemq.router_memory
351 + - name: vernemq.node_router_memory
352 description: Routing Table Memory Usage
351 - unit: KiB
353 + unit: bytes
354 chart_type: area
355 dimensions:
356 - name: used
355 - - name: vernemq.average_scheduler_utilization
357 + - name: vernemq.node_average_scheduler_utilization
358 description: Average Scheduler Utilization
359 unit: percentage
360 chart_type: area
361 dimensions:
362 - name: utilization
361 - - name: vernemq.system_utilization_scheduler
362 - description: Scheduler Utilization
363 - unit: percentage
364 - chart_type: stacked
365 - dimensions:
366 - - name: a dimension per scheduler
367 - - name: vernemq.system_processes
363 + - name: vernemq.node_system_processes
364 description: Erlang Processes
365 unit: processes
366 chart_type: line
367 dimensions:
368 - name: processes
373 - - name: vernemq.system_reductions
369 + - name: vernemq.node_system_reductions
370 description: Reductions
371 unit: ops/s
372 chart_type: line
373 dimensions:
374 - name: reductions
379 - - name: vernemq.system_context_switches
375 + - name: vernemq.node_system_context_switches
376 description: Context Switches
377 unit: ops/s
378 chart_type: line
379 dimensions:
380 - name: context_switches
385 - - name: vernemq.system_io
381 + - name: vernemq.node_system_io
382 description: Received and Sent Traffic through Ports
387 - unit: kilobits/s
383 + unit: bytes/s
384 chart_type: area
385 dimensions:
386 - name: received
387 - name: sent
392 - - name: vernemq.system_run_queue
388 + - name: vernemq.node_system_run_queue
389 description: Processes that are Ready to Run on All Run-Queues
390 unit: processes
391 chart_type: line
392 dimensions:
393 - name: ready
398 - - name: vernemq.system_gc_count
394 + - name: vernemq.node_system_gc_count
395 description: GC Count
396 unit: ops/s
397 chart_type: line
398 dimensions:
399 - name: gc
404 - - name: vernemq.system_gc_words_reclaimed
400 + - name: vernemq.node_system_gc_words_reclaimed
401 description: GC Words Reclaimed
402 unit: ops/s
403 chart_type: line
404 dimensions:
405 - name: words_reclaimed
410 - - name: vernemq.system_allocated_memory
406 + - name: vernemq.node_system_allocated_memory
407 description: Memory Allocated by the Erlang Processes and by the Emulator
412 - unit: KiB
408 + unit: bytes
409 chart_type: stacked
410 dimensions:
411 - name: processes
412 - name: system
417 - - name: vernemq.bandwidth
418 - description: Bandwidth
419 - unit: kilobits/s
413 + - name: vernemq.node_traffic
414 + description: Traffic
415 + unit: bytes/s
416 chart_type: area
417 dimensions:
418 - name: received
419 - name: sent
424 - - name: vernemq.retain_messages
420 + - name: vernemq.node_retain_messages
421 description: Stored Retained Messages
422 unit: messages
423 chart_type: line
424 dimensions:
425 - name: messages
430 - - name: vernemq.retain_memory
426 + - name: vernemq.node_retain_memory
427 description: Stored Retained Messages Memory Usage
432 - unit: KiB
428 + unit: bytes
429 chart_type: area
430 dimensions:
431 - name: used
436 - - name: vernemq.cluster_bandwidth
432 + - name: vernemq.node_cluster_traffic
433 description: Communication with Other Cluster Nodes
438 - unit: kilobits/s
434 + unit: bytes/s
435 chart_type: area
436 dimensions:
437 - name: received
438 - name: sent
443 - - name: vernemq.cluster_dropped
439 + - name: vernemq.node_cluster_dropped
440 description: Traffic Dropped During Communication with Other Cluster Nodes
445 - unit: kilobits/s
441 + unit: bytes/s
442 chart_type: area
443 dimensions:
444 - name: dropped
449 - - name: vernemq.netsplit_unresolved
445 + - name: vernemq.node_netsplit_unresolved
446 description: Unresolved Netsplits
447 unit: netsplits
448 chart_type: line
449 dimensions:
450 - name: unresolved
455 - - name: vernemq.netsplits
451 + - name: vernemq.node_netsplits
452 description: Netsplits
453 unit: netsplits/s
454 chart_type: stacked
455 dimensions:
456 - name: resolved
457 - name: detected
462 - - name: vernemq.mqtt_auth
463 - description: v5 AUTH
458 + - name: vernemq.node_uptime
459 + description: Node Uptime
460 + unit: seconds
461 + chart_type: line
462 + dimensions:
463 + - name: time
464 + - name: mqtt
465 + description: These metrics are specific to the used MQTT protocol version.
466 + labels:
467 + - name: node
468 + description: The value of this label is identical to the value of the "node" label exposed by VerneMQ.
469 + - name: mqtt_version
470 + description: MQTT version.
471 + metrics:
472 + - name: vernemq.node_mqtt_auth
473 + description: MQTT AUTH Packets
474 unit: packets/s
475 chart_type: line
476 dimensions:
477 - name: received
478 - name: sent
469 - - name: vernemq.mqtt_auth_received_reason
470 - description: v5 AUTH Received by Reason
479 + - name: vernemq.node_mqtt_auth_received_by_reason_code
480 + description: MQTT AUTH Received by Reason
481 unit: packets/s
482 chart_type: stacked
483 dimensions:
474 - - name: a dimensions per reason
475 - - name: vernemq.mqtt_auth_sent_reason
476 - description: v5 AUTH Sent by Reason
484 + - name: success
485 + - name: continue_authentication
486 + - name: reauthenticate
487 + - name: vernemq.node_mqtt_auth_sent_by_reason_code
488 + description: MQTT AUTH Sent by Reason
489 unit: packets/s
490 chart_type: stacked
491 dimensions:
480 - - name: a dimensions per reason
481 - - name: vernemq.mqtt_connect
482 - description: v3/v5 CONNECT and CONNACK
492 + - name: success
493 + - name: continue_authentication
494 + - name: reauthenticate
495 + - name: vernemq.node_mqtt_connect
496 + description: MQTT CONNECT and CONNACK
497 unit: packets/s
498 chart_type: line
499 dimensions:
500 - name: connect
501 - name: connack
488 - - name: vernemq.mqtt_connack_sent_reason
489 - description: v3/v5 CONNACK Sent by Reason
502 + - name: vernemq.node_mqtt_connack_sent_by_return_code
503 + description: MQTT CONNACK Sent by Return Code
504 unit: packets/s
505 chart_type: stacked
506 dimensions:
493 - - name: a dimensions per reason
494 - - name: vernemq.mqtt_disconnect
495 - description: v3/v5 DISCONNECT
507 + - name: success
508 + - name: unsupported_protocol_version
509 + - name: client_identifier_not_valid
510 + - name: server_unavailable
511 + - name: bad_username_or_password
512 + - name: not_authorized
513 + - name: vernemq.node_mqtt_connack_sent_by_reason_code
514 + description: MQTT CONNACK Sent by Reason
515 + unit: packets/s
516 + chart_type: stacked
517 + dimensions:
518 + - name: success
519 + - name: unspecified_error
520 + - name: malformed_packet
521 + - name: protocol_error
522 + - name: impl_specific_error
523 + - name: unsupported_protocol_version
524 + - name: client_identifier_not_valid
525 + - name: bad_username_or_password
526 + - name: not_authorized
527 + - name: server_unavailable
528 + - name: server_busy
529 + - name: banned
530 + - name: bad_authentication_method
531 + - name: topic_name_invalid
532 + - name: packet_too_large
533 + - name: quota_exceeded
534 + - name: payload_format_invalid
535 + - name: retain_not_supported
536 + - name: qos_not_supported
537 + - name: use_another_server
538 + - name: server_moved
539 + - name: connection_rate_exceeded
540 + - name: vernemq.node_mqtt_disconnect
541 + description: MQTT DISCONNECT Packets
542 unit: packets/s
543 chart_type: line
544 dimensions:
545 - name: received
546 - name: sent
501 - - name: vernemq.mqtt_disconnect_received_reason
502 - description: v5 DISCONNECT Received by Reason
547 + - name: vernemq.node_mqtt_disconnect_received_by_reason_code
548 + description: MQTT DISCONNECT Received by Reason
549 unit: packets/s
550 chart_type: stacked
551 dimensions:
506 - - name: a dimensions per reason
507 - - name: vernemq.mqtt_disconnect_sent_reason
508 - description: v5 DISCONNECT Sent by Reason
552 + - name: normal_disconnect
553 + - name: disconnect_with_will_msg
554 + - name: unspecified_error
555 + - name: malformed_packet
556 + - name: protocol_error
557 + - name: impl_specific_error
558 + - name: topic_name_invalid
559 + - name: receive_max_exceeded
560 + - name: topic_alias_invalid
561 + - name: packet_too_large
562 + - name: message_rate_too_high
563 + - name: quota_exceeded
564 + - name: administrative_action
565 + - name: payload_format_invalid
566 + - name: node_mqtt_disconnect_sent_by_reason_code
567 + description: MQTT DISCONNECT Sent by Reason
568 unit: packets/s
569 chart_type: stacked
570 dimensions:
512 - - name: a dimensions per reason
513 - - name: vernemq.mqtt_subscribe
514 - description: v3/v5 SUBSCRIBE and SUBACK
571 + - name: normal_disconnect
572 + - name: unspecified_error
573 + - name: malformed_packet
574 + - name: protocol_error
575 + - name: impl_specific_error
576 + - name: not_authorized
577 + - name: server_busy
578 + - name: server_shutting_down
579 + - name: keep_alive_timeout
580 + - name: session_taken_over
581 + - name: topic_filter_invalid
582 + - name: topic_name_invalid
583 + - name: receive_max_exceeded
584 + - name: topic_alias_invalid
585 + - name: packet_too_large
586 + - name: message_rate_too_high
587 + - name: quota_exceeded
588 + - name: administrative_action
589 + - name: payload_format_invalid
590 + - name: retain_not_supported
591 + - name: qos_not_supported
592 + - name: use_another_server
593 + - name: server_moved
594 + - name: shared_subs_not_supported
595 + - name: connection_rate_exceeded
596 + - name: max_connect_time
597 + - name: subscription_ids_not_supported
598 + - name: wildcard_subs_not_supported
599 + - name: vernemq.node_mqtt_subscribe
600 + description: MQTT SUBSCRIBE and SUBACK Packets
601 unit: packets/s
602 chart_type: line
603 dimensions:
604 - name: subscribe
605 - name: suback
520 - - name: vernemq.mqtt_subscribe_error
521 - description: v3/v5 Failed SUBSCRIBE Operations due to a Netsplit
522 - unit: ops/s
606 + - name: vernemq.node_mqtt_subscribe_error
607 + description: MQTT Failed SUBSCRIBE Operations due to a Netsplit
608 + unit: errors/s
609 chart_type: line
610 dimensions:
525 - - name: failed
526 - - name: vernemq.mqtt_subscribe_auth_error
527 - description: v3/v5 Unauthorized SUBSCRIBE Attempts
528 - unit: attempts/s
611 + - name: subscribe
612 + - name: vernemq.node_mqtt_subscribe_auth_error
613 + description: MQTT Unauthorized SUBSCRIBE Attempts
614 + unit: errors/s
615 chart_type: line
616 dimensions:
531 - - name: unauth
532 - - name: vernemq.mqtt_unsubscribe
533 - description: v3/v5 UNSUBSCRIBE and UNSUBACK
617 + - name: subscribe_auth
618 + - name: vernemq.node_mqtt_unsubscribe
619 + description: MQTT UNSUBSCRIBE and UNSUBACK Packets
620 unit: packets/s
621 chart_type: line
622 dimensions:
623 - name: unsubscribe
624 - name: unsuback
539 - - name: vernemq.mqtt_unsubscribe_error
540 - description: v3/v5 Failed UNSUBSCRIBE Operations due to a Netsplit
541 - unit: ops/s
625 + - name: vernemq.node_mqtt_unsubscribe_error
626 + description: MQTT Failed UNSUBSCRIBE Operations due to a Netsplit
627 + unit: errors/s
628 chart_type: line
629 dimensions:
544 - - name: mqtt_unsubscribe_error
545 - - name: vernemq.mqtt_publish
546 - description: v3/v5 QoS 0,1,2 PUBLISH
630 + - name: unsubscribe
631 + - name: vernemq.node_mqtt_publish
632 + description: MQTT QoS 0,1,2 PUBLISH
633 unit: packets/s
634 chart_type: line
635 dimensions:
636 - name: received
637 - name: sent
552 - - name: vernemq.mqtt_publish_errors
553 - description: v3/v5 Failed PUBLISH Operations due to a Netsplit
554 - unit: ops/s
638 + - name: vernemq.node_mqtt_publish_errors
639 + description: MQTT Failed PUBLISH Operations due to a Netsplit
640 + unit: errors/s
641 chart_type: line
642 dimensions:
557 - - name: failed
558 - - name: vernemq.mqtt_publish_auth_errors
559 - description: v3/v5 Unauthorized PUBLISH Attempts
560 - unit: attempts/s
643 + - name: publish
644 + - name: vernemq.node_mqtt_publish_auth_errors
645 + description: MQTT Unauthorized PUBLISH Attempts
646 + unit: errors/s
647 chart_type: area
648 dimensions:
563 - - name: unauth
564 - - name: vernemq.mqtt_puback
565 - description: v3/v5 QoS 1 PUBACK
649 + - name: publish_auth
650 + - name: vernemq.node_mqtt_puback
651 + description: vMQTT QoS 1 PUBACK Packets
652 unit: packets/s
653 chart_type: line
654 dimensions:
655 - name: received
656 - name: sent
571 - - name: vernemq.mqtt_puback_received_reason
572 - description: v5 PUBACK QoS 1 Received by Reason
657 + - name: vernemq.node_mqtt_puback_received_by_reason_code
658 + description: MQTT PUBACK QoS 1 Received by Reason
659 unit: packets/s
660 chart_type: stacked
661 dimensions:
576 - - name: a dimensions per reason
577 - - name: vernemq.mqtt_puback_sent_reason
578 - description: v5 PUBACK QoS 1 Sent by Reason
662 + - name: success
663 + - name: no_matching_subscribers
664 + - name: unspecified_error
665 + - name: impl_specific_error
666 + - name: not_authorized
667 + - name: topic_name_invalid
668 + - name: packet_id_in_use
669 + - name: quota_exceeded
670 + - name: payload_format_invalid
671 + - name: vernemq.node_mqtt_puback_sent_by_reason_code
672 + description: MQTT PUBACK QoS 1 Sent by Reason
673 unit: packets/s
674 chart_type: stacked
675 dimensions:
582 - - name: a dimensions per reason
583 - - name: vernemq.mqtt_puback_invalid_error
584 - description: v3/v5 PUBACK QoS 1 Received Unexpected Messages
676 + - name: success
677 + - name: no_matching_subscribers
678 + - name: unspecified_error
679 + - name: impl_specific_error
680 + - name: not_authorized
681 + - name: topic_name_invalid
682 + - name: packet_id_in_use
683 + - name: quota_exceeded
684 + - name: payload_format_invalid
685 + - name: vernemq.node_mqtt_puback_invalid_error
686 + description: MQTT PUBACK QoS 1 Received Unexpected Messages
687 unit: messages/s
688 chart_type: line
689 dimensions:
690 - name: unexpected
589 - - name: vernemq.mqtt_pubrec
590 - description: v3/v5 PUBREC QoS 2
691 + - name: vernemq.node_mqtt_pubrec
692 + description: MQTT PUBREC QoS 2 Packets
693 unit: packets/s
694 chart_type: line
695 dimensions:
696 - name: received
697 - name: sent
596 - - name: vernemq.mqtt_pubrec_received_reason
597 - description: v5 PUBREC QoS 2 Received by Reason
698 + - name: vernemq.node_mqtt_pubrec_received_by_reason_code
699 + description: MQTT PUBREC QoS 2 Received by Reason
700 unit: packets/s
701 chart_type: stacked
702 dimensions:
601 - - name: a dimensions per reason
602 - - name: vernemq.mqtt_pubrec_sent_reason
603 - description: v5 PUBREC QoS 2 Sent by Reason
703 + - name: success
704 + - name: no_matching_subscribers
705 + - name: unspecified_error
706 + - name: impl_specific_error
707 + - name: not_authorized
708 + - name: topic_name_invalid
709 + - name: packet_id_in_use
710 + - name: quota_exceeded
711 + - name: payload_format_invalid
712 + - name: vernemq.node_mqtt_pubrec_sent_by_reason_code
713 + description: MQTT PUBREC QoS 2 Sent by Reason
714 unit: packets/s
715 chart_type: stacked
716 dimensions:
607 - - name: a dimensions per reason
608 - - name: vernemq.mqtt_pubrec_invalid_error
609 - description: v3 PUBREC QoS 2 Received Unexpected Messages
717 + - name: success
718 + - name: no_matching_subscribers
719 + - name: unspecified_error
720 + - name: impl_specific_error
721 + - name: not_authorized
722 + - name: topic_name_invalid
723 + - name: packet_id_in_use
724 + - name: quota_exceeded
725 + - name: payload_format_invalid
726 + - name: vernemq.node_mqtt_pubrec_invalid_error
727 + description: MQTT PUBREC QoS 2 Received Unexpected Messages
728 unit: messages/s
729 chart_type: line
730 dimensions:
731 - name: unexpected
614 - - name: vernemq.mqtt_pubrel
615 - description: v3/v5 PUBREL QoS 2
732 + - name: vernemq.node_mqtt_pubrel
733 + description: MQTT PUBREL QoS 2 Packets
734 unit: packets/s
735 chart_type: line
736 dimensions:
737 - name: received
738 - name: sent
621 - - name: vernemq.mqtt_pubrel_received_reason
622 - description: v5 PUBREL QoS 2 Received by Reason
739 + - name: vernemq.node_mqtt_pubrel_received_by_reason_code
740 + description: MQTT PUBREL QoS 2 Received by Reason
741 unit: packets/s
742 chart_type: stacked
743 dimensions:
626 - - name: a dimensions per reason
627 - - name: vernemq.mqtt_pubrel_sent_reason
628 - description: v5 PUBREL QoS 2 Sent by Reason
744 + - name: success
745 + - name: packet_id_not_found
746 + - name: vernemq.node_mqtt_pubrel_sent_by_reason_code
747 + description: MQTT PUBREL QoS 2 Sent by Reason
748 unit: packets/s
749 chart_type: stacked
750 dimensions:
632 - - name: a dimensions per reason
633 - - name: vernemq.mqtt_pubcom
634 - description: v3/v5 PUBCOMP QoS 2
751 + - name: success
752 + - name: packet_id_not_found
753 + - name: vernemq.node_mqtt_pubcomp
754 + description: MQTT PUBCOMP QoS 2 Packets
755 unit: packets/s
756 chart_type: line
757 dimensions:
758 - name: received
759 - name: sent
640 - - name: vernemq.mqtt_pubcomp_received_reason
641 - description: v5 PUBCOMP QoS 2 Received by Reason
760 + - name: vernemq.node_mqtt_pubcomp_received_by_reason_code
761 + description: MQTT PUBCOMP QoS 2 Received by Reason
762 unit: packets/s
763 chart_type: stacked
764 dimensions:
645 - - name: a dimensions per reason
646 - - name: vernemq.mqtt_pubcomp_sent_reason
647 - description: v5 PUBCOMP QoS 2 Sent by Reason
765 + - name: success
766 + - name: packet_id_not_found
767 + - name: vernemq.node_mqtt_pubcomp_sent_by_reason_cod
768 + description: MQTT PUBCOMP QoS 2 Sent by Reason
769 unit: packets/s
770 chart_type: stacked
771 dimensions:
651 - - name: a dimensions per reason
652 - - name: vernemq.mqtt_pubcomp_invalid_error
653 - description: v3/v5 PUBCOMP QoS 2 Received Unexpected Messages
772 + - name: success
773 + - name: packet_id_not_found
774 + - name: vernemq.node_mqtt_pubcomp_invalid_error
775 + description: MQTT PUBCOMP QoS 2 Received Unexpected Messages
776 unit: messages/s
777 chart_type: line
778 dimensions:
779 - name: unexpected
658 - - name: vernemq.mqtt_ping
659 - description: v3/v5 PING
780 + - name: vernemq.node_mqtt_ping
781 + description: MQTT PING Packets
782 unit: packets/s
783 chart_type: line
784 dimensions:
785 - name: pingreq
786 - name: pingresp
665 - - name: vernemq.node_uptime
666 - description: Node Uptime
667 - unit: seconds
668 - chart_type: line
669 - dimensions:
670 - - name: time
src/go/plugin/go.d/modules/vernemq/metrics.go
+185 -86
@@ -2,37 +2,79 @@
2
3 package vernemq
4
5 -// Source Code Metrics:
6 -// - https://github.com/vernemq/vernemq/blob/master/apps/vmq_server/src/vmq_metrics.erl
7 -// - https://github.com/vernemq/vernemq/blob/master/apps/vmq_server/src/vmq_metrics.hrl
8 -
9 -// Source Code FSM:
10 -// - https://github.com/vernemq/vernemq/blob/master/apps/vmq_server/src/vmq_mqtt_fsm.erl
11 -// - https://github.com/vernemq/vernemq/blob/master/apps/vmq_server/src/vmq_mqtt5_fsm.erl
12 -
13 -// MQTT Packet Types:
14 -// - v4: http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/errata01/os/mqtt-v3.1.1-errata01-os-complete.html#_Toc442180834
15 -// - v5: https://docs.oasis-open.org/mqtt/mqtt/v5.0/os/mqtt-v5.0-os.html#_Toc3901019
16 -
17 -// Erlang VM:
18 -// - http://erlang.org/documentation/doc-5.7.1/erts-5.7.1/doc/html/erlang.html
19 -
20 -// Not used metrics (https://docs.vernemq.com/monitoring/introduction):
21 -// - "mqtt_connack_accepted_sent" // v4, not populated, "mqtt_connack_sent" used instead
22 -// - "mqtt_connack_unacceptable_protocol_sent" // v4, not populated, "mqtt_connack_sent" used instead
23 -// - "mqtt_connack_identifier_rejected_sent" // v4, not populated, "mqtt_connack_sent" used instead
24 -// - "mqtt_connack_server_unavailable_sent" // v4, not populated, "mqtt_connack_sent" used instead
25 -// - "mqtt_connack_bad_credentials_sent" // v4, not populated, "mqtt_connack_sent" used instead
26 -// - "mqtt_connack_not_authorized_sent" // v4, not populated, "mqtt_connack_sent" used instead
27 -// - "system_exact_reductions"
28 -// - "system_runtime"
29 -// - "vm_memory_atom"
30 -// - "vm_memory_atom_used"
31 -// - "vm_memory_binary"
32 -// - "vm_memory_code"
33 -// - "vm_memory_ets"
34 -// - "vm_memory_processes_used"
35 -// - "vm_memory_total"
5 +func newNodeStats() *nodeStats {
6 + return &nodeStats{
7 + stats: make(map[string]int64),
8 + mqtt4: make(map[string]int64),
9 + mqtt5: make(map[string]int64),
10 + }
11 +}
12 +
13 +type nodeStats struct {
14 + stats map[string]int64
15 + mqtt4 map[string]int64
16 + mqtt5 map[string]int64
17 +}
18 +
19 +// Source code metrics: https://github.com/vernemq/vernemq/blob/master/apps/vmq_server/src/vmq_metrics.erl
20 +// Not used metrics: https://docs.vernemq.com/monitoring/introduction
21 +
22 +const (
23 + // Sockets
24 + metricSocketOpen = "socket_open"
25 + metricSocketClose = "socket_close"
26 + metricSocketError = "socket_error"
27 + metricSocketCloseTimeout = "socket_close_timeout"
28 + metricClientKeepaliveExpired = "client_keepalive_expired" // v4, v5
29 +
30 + // Queues
31 + metricQueueProcesses = "queue_processes"
32 + metricQueueSetup = "queue_setup"
33 + metricQueueTeardown = "queue_teardown"
34 + metricQueueMessageIn = "queue_message_in"
35 + metricQueueMessageOut = "queue_message_out"
36 + metricQueueMessageDrop = "queue_message_drop"
37 + metricQueueMessageExpired = "queue_message_expired"
38 + metricQueueMessageUnhandled = "queue_message_unhandled"
39 + metricQueueInitializedFromStorage = "queue_initialized_from_storage"
40 +
41 + // Subscriptions
42 + metricRouterMatchesLocal = "router_matches_local"
43 + metricRouterMatchesRemote = "router_matches_remote"
44 + metricRouterMemory = "router_memory"
45 + metricRouterSubscriptions = "router_subscriptions"
46 +
47 + // Erlang VM
48 + metricSystemUtilization = "system_utilization"
49 + metricSystemProcessCount = "system_process_count"
50 + metricSystemReductions = "system_reductions"
51 + metricSystemContextSwitches = "system_context_switches"
52 + metricSystemIOIn = "system_io_in"
53 + metricSystemIOOut = "system_io_out"
54 + metricSystemRunQueue = "system_run_queue"
55 + metricSystemGCCount = "system_gc_count"
56 + metricSystemWordsReclaimedByGC = "system_words_reclaimed_by_gc"
57 + metricVMMemoryProcesses = "vm_memory_processes"
58 + metricVMMemorySystem = "vm_memory_system"
59 +
60 + // Bandwidth
61 + metricBytesReceived = "bytes_received"
62 + metricBytesSent = "bytes_sent"
63 +
64 + // Retain
65 + metricRetainMemory = "retain_memory"
66 + metricRetainMessages = "retain_messages"
67 +
68 + // Cluster
69 + metricClusterBytesDropped = "cluster_bytes_dropped"
70 + metricClusterBytesReceived = "cluster_bytes_received"
71 + metricClusterBytesSent = "cluster_bytes_sent"
72 + metricNetSplitDetected = "netsplit_detected"
73 + metricNetSplitResolved = "netsplit_resolved"
74 +
75 + // Uptime
76 + metricSystemWallClock = "system_wallclock"
77 +)
78
79 // -----------------------------------------------MQTT------------------------------------------------------------------
80 const (
@@ -92,59 +134,116 @@ const (
134 metricMQTTInvalidMsgSizeError = "mqtt_invalid_msg_size_error" // v4, v5
135 )
136
95 -const (
96 - // Sockets
97 - metricSocketOpen = "socket_open"
98 - metricSocketClose = "socket_close"
99 - metricSocketError = "socket_error"
100 - metricSocketCloseTimeout = "socket_close_timeout"
101 - metricClientKeepaliveExpired = "client_keepalive_expired" // v4, v5
102 -
103 - // Queues
104 - metricQueueProcesses = "queue_processes"
105 - metricQueueSetup = "queue_setup"
106 - metricQueueTeardown = "queue_teardown"
107 - metricQueueMessageIn = "queue_message_in"
108 - metricQueueMessageOut = "queue_message_out"
109 - metricQueueMessageDrop = "queue_message_drop"
110 - metricQueueMessageExpired = "queue_message_expired"
111 - metricQueueMessageUnhandled = "queue_message_unhandled"
112 - metricQueueInitializedFromStorage = "queue_initialized_from_storage"
113 -
114 - // Subscriptions
115 - metricRouterMatchesLocal = "router_matches_local"
116 - metricRouterMatchesRemote = "router_matches_remote"
117 - metricRouterMemory = "router_memory"
118 - metricRouterSubscriptions = "router_subscriptions"
119 -
120 - // Erlang VM
121 - metricSystemUtilization = "system_utilization"
122 - metricSystemProcessCount = "system_process_count"
123 - metricSystemReductions = "system_reductions"
124 - metricSystemContextSwitches = "system_context_switches"
125 - metricSystemIOIn = "system_io_in"
126 - metricSystemIOOut = "system_io_out"
127 - metricSystemRunQueue = "system_run_queue"
128 - metricSystemGCCount = "system_gc_count"
129 - metricSystemWordsReclaimedByGC = "system_words_reclaimed_by_gc"
130 - metricVMMemoryProcesses = "vm_memory_processes"
131 - metricVMMemorySystem = "vm_memory_system"
132 -
133 - // Bandwidth
134 - metricBytesReceived = "bytes_received"
135 - metricBytesSent = "bytes_sent"
136 -
137 - // Retain
138 - metricRetainMemory = "retain_memory"
139 - metricRetainMessages = "retain_messages"
140 -
141 - // Cluster
142 - metricClusterBytesDropped = "cluster_bytes_dropped"
143 - metricClusterBytesReceived = "cluster_bytes_received"
144 - metricClusterBytesSent = "cluster_bytes_sent"
145 - metricNetSplitDetected = "netsplit_detected"
146 - metricNetSplitResolved = "netsplit_resolved"
147 -
148 - // Uptime
149 - metricSystemWallClock = "system_wallclock"
137 +var (
138 + mqtt5AUTHReceivedReasonCodes = []string{
139 + "success",
140 + "continue_authentication",
141 + "reauthenticate",
142 + }
143 + mqtt5AUTHSentReasonCodes = mqtt5AUTHReceivedReasonCodes
144 +
145 + mqtt4CONNACKSentReturnCodes = []string{
146 + "success",
147 + "unsupported_protocol_version",
148 + "client_identifier_not_valid",
149 + "server_unavailable",
150 + "bad_username_or_password",
151 + "not_authorized",
152 + }
153 + mqtt5CONNACKSentReasonCodes = []string{
154 + "success",
155 + "unspecified_error",
156 + "malformed_packet",
157 + "protocol_error",
158 + "impl_specific_error",
159 + "unsupported_protocol_version",
160 + "client_identifier_not_valid",
161 + "bad_username_or_password",
162 + "not_authorized",
163 + "server_unavailable",
164 + "server_busy",
165 + "banned",
166 + "bad_authentication_method",
167 + "topic_name_invalid",
168 + "packet_too_large",
169 + "quota_exceeded",
170 + "payload_format_invalid",
171 + "retain_not_supported",
172 + "qos_not_supported",
173 + "use_another_server",
174 + "server_moved",
175 + "connection_rate_exceeded",
176 + }
177 +
178 + mqtt5DISCONNECTReceivedReasonCodes = []string{
179 + "normal_disconnect",
180 + "disconnect_with_will_msg",
181 + "unspecified_error",
182 + "malformed_packet",
183 + "protocol_error",
184 + "impl_specific_error",
185 + "topic_name_invalid",
186 + "receive_max_exceeded",
187 + "topic_alias_invalid",
188 + "packet_too_large",
189 + "message_rate_too_high",
190 + "quota_exceeded",
191 + "administrative_action",
192 + "payload_format_invalid",
193 + }
194 + mqtt5DISCONNECTSentReasonCodes = []string{
195 + "normal_disconnect",
196 + "unspecified_error",
197 + "malformed_packet",
198 + "protocol_error",
199 + "impl_specific_error",
200 + "not_authorized",
201 + "server_busy",
202 + "server_shutting_down",
203 + "keep_alive_timeout",
204 + "session_taken_over",
205 + "topic_filter_invalid",
206 + "topic_name_invalid",
207 + "receive_max_exceeded",
208 + "topic_alias_invalid",
209 + "packet_too_large",
210 + "message_rate_too_high",
211 + "quota_exceeded",
212 + "administrative_action",
213 + "payload_format_invalid",
214 + "retain_not_supported",
215 + "qos_not_supported",
216 + "use_another_server",
217 + "server_moved",
218 + "shared_subs_not_supported",
219 + "connection_rate_exceeded",
220 + "max_connect_time",
221 + "subscription_ids_not_supported",
222 + "wildcard_subs_not_supported",
223 + }
224 +
225 + mqtt5PUBACKReceivedReasonCodes = []string{
226 + "success",
227 + "no_matching_subscribers",
228 + "unspecified_error",
229 + "impl_specific_error",
230 + "not_authorized",
231 + "topic_name_invalid",
232 + "packet_id_in_use",
233 + "quota_exceeded",
234 + "payload_format_invalid",
235 + }
236 + mqtt5PUBACKSentReasonCodes = mqtt5PUBACKReceivedReasonCodes
237 +
238 + mqtt5PUBRECReceivedReasonCodes = mqtt5PUBACKReceivedReasonCodes
239 + mqtt5PUBRECSentReasonCodes = mqtt5PUBACKReceivedReasonCodes
240 +
241 + mqtt5PUBRELReceivedReasonCodes = []string{
242 + "success",
243 + "packet_id_not_found",
244 + }
245 + mqtt5PUBRELSentReasonCodes = mqtt5PUBRELReceivedReasonCodes
246 +
247 + mqtt5PUBCOMPReceivedReasonCodes = mqtt5PUBRELReceivedReasonCodes
248 + mqtt5PUBCOMPSentReasonCodes = mqtt5PUBRELReceivedReasonCodes
249 )
src/go/plugin/go.d/modules/vernemq/node_stats.go new
+123
@@ -0,0 +1,123 @@
1 +// SPDX-License-Identifier: GPL-3.0-or-later
2 +
3 +package vernemq
4 +
5 +//type (
6 +// vernemqNode struct {
7 +// name string
8 +//
9 +// ns nodeStats
10 +// m4 *mqtt4Stats
11 +// m5 *mqtt5Stats
12 +// }
13 +// nodeStats struct {
14 +// sockets struct {
15 +// open int64
16 +// closed int64
17 +// error int64
18 +// closeTimeout int64
19 +// }
20 +// queue struct {
21 +// processes int64
22 +// setup int64
23 +// teardown int64
24 +// message struct {
25 +// in int64
26 +// out int64
27 +// drop int64
28 +// expired int64
29 +// unhandled int64
30 +// }
31 +// initFromStorage int64
32 +// }
33 +// router struct {
34 +// matchesLocal int64
35 +// matchesRemote int64
36 +// memory int64
37 +// subscriptions int64
38 +// }
39 +// erlangVm struct {
40 +// system struct {
41 +// utilization int64
42 +// processCount int64
43 +// reductions int64
44 +// contextSwitches int64
45 +// io struct {
46 +// in int64
47 +// out int64
48 +// }
49 +// runQueue int64
50 +// gcCount int64
51 +// wordsReclaimedByGC int64
52 +// }
53 +// vm struct {
54 +// memoryProcesses int64
55 +// memorySystem int64
56 +// }
57 +// }
58 +// bandwidth struct {
59 +// receivedBytes int64
60 +// sentBytes int64
61 +// }
62 +// retain struct {
63 +// memory int64
64 +// messages int64
65 +// }
66 +// cluster struct {
67 +// bytes struct {
68 +// received int64
69 +// sent int64
70 +// dropped int64
71 +// }
72 +// netsplit struct {
73 +// detected int64
74 +// resolved int64
75 +// }
76 +// }
77 +// wallclock int64
78 +// }
79 +//
80 +// mqtt5Stats struct {
81 +// mqttCommonStats
82 +// }
83 +// mqtt4Stats struct {
84 +// mqttCommonStats
85 +// }
86 +// mqttCommonStats struct {
87 +// connect struct {
88 +// received int64
89 +// sent int64
90 +// }
91 +// subscribe struct {
92 +// received int64
93 +// sent int64
94 +// error int64
95 +// authError int64
96 +// }
97 +// unsubscribe struct {
98 +// received int64
99 +// sent int64
100 +// error int64
101 +// }
102 +// publish struct {
103 +// received int64
104 +// sent int64
105 +// error int64
106 +// authError int64
107 +// }
108 +// puback struct {
109 +// received int64
110 +// sent int64
111 +// invalid int64
112 +// }
113 +// pubrec struct {
114 +// received int64
115 +// sent int64
116 +// //invalidError int64
117 +// }
118 +// pubrel struct {
119 +// received int64
120 +// sent int64
121 +// }
122 +// }
123 +//)
src/go/plugin/go.d/modules/vernemq/testdata/non_vernemq.txt deleted
-27
@@ -1,27 +0,0 @@
1 -# HELP wmi_os_process_memory_limix_bytes OperatingSystem.MaxProcessMemorySize
2 -# TYPE wmi_os_process_memory_limix_bytes gauge
3 -wmi_os_process_memory_limix_bytes 1.40737488224256e+14
4 -# HELP wmi_os_processes OperatingSystem.NumberOfProcesses
5 -# TYPE wmi_os_processes gauge
6 -wmi_os_processes 124
7 -# HELP wmi_os_processes_limit OperatingSystem.MaxNumberOfProcesses
8 -# TYPE wmi_os_processes_limit gauge
9 -wmi_os_processes_limit 4.294967295e+09
10 -# HELP wmi_os_time OperatingSystem.LocalDateTime
11 -# TYPE wmi_os_time gauge
12 -wmi_os_time 1.57804974e+09
13 -# HELP wmi_os_timezone OperatingSystem.LocalDateTime
14 -# TYPE wmi_os_timezone gauge
15 -wmi_os_timezone{timezone="MSK"} 1
16 -# HELP wmi_os_users OperatingSystem.NumberOfUsers
17 -# TYPE wmi_os_users gauge
18 -wmi_os_users 2
19 -# HELP wmi_os_virtual_memory_bytes OperatingSystem.TotalVirtualMemorySize
20 -# TYPE wmi_os_virtual_memory_bytes gauge
21 -wmi_os_virtual_memory_bytes 5.770891264e+09
22 -# HELP wmi_os_virtual_memory_free_bytes OperatingSystem.FreeVirtualMemory
23 -# TYPE wmi_os_virtual_memory_free_bytes gauge
24 -wmi_os_virtual_memory_free_bytes 3.76489984e+09
25 -# HELP wmi_os_visible_memory_bytes OperatingSystem.TotalVisibleMemorySize
26 -# TYPE wmi_os_visible_memory_bytes gauge
27 -wmi_os_visible_memory_bytes 4.294496256e+09
\ No newline at end of file
src/go/plugin/go.d/modules/vernemq/testdata/v1.10.1/metrics.txt renamed
src/go/plugin/go.d/modules/vernemq/testdata/v2.0.1/metrics.txt new
+588
@@ -0,0 +1,588 @@
1 +# HELP vernemq_socket_open The number of times an MQTT socket has been opened.
2 +# TYPE vernemq_socket_open counter
3 +vernemq_socket_open{node="VerneMQ@10.10.10.20"} 0
4 +# HELP vernemq_socket_close The number of times an MQTT socket has been closed.
5 +# TYPE vernemq_socket_close counter
6 +vernemq_socket_close{node="VerneMQ@10.10.10.20"} 0
7 +# HELP vernemq_socket_close_timeout The number of times VerneMQ closed an MQTT socket due to no CONNECT frame has been received on time.
8 +# TYPE vernemq_socket_close_timeout counter
9 +vernemq_socket_close_timeout{node="VerneMQ@10.10.10.20"} 0
10 +# HELP vernemq_socket_error The total number of socket errors that have occurred.
11 +# TYPE vernemq_socket_error counter
12 +vernemq_socket_error{node="VerneMQ@10.10.10.20"} 0
13 +# HELP vernemq_bytes_received The total number of bytes received.
14 +# TYPE vernemq_bytes_received counter
15 +vernemq_bytes_received{node="VerneMQ@10.10.10.20"} 0
16 +# HELP vernemq_bytes_sent The total number of bytes sent.
17 +# TYPE vernemq_bytes_sent counter
18 +vernemq_bytes_sent{node="VerneMQ@10.10.10.20"} 0
19 +# HELP vernemq_mqtt_connect_received The number of CONNECT packets received.
20 +# TYPE vernemq_mqtt_connect_received counter
21 +vernemq_mqtt_connect_received{node="VerneMQ@10.10.10.20",mqtt_version="4"} 0
22 +vernemq_mqtt_connect_received{node="VerneMQ@10.10.10.20",mqtt_version="5"} 0
23 +# HELP vernemq_mqtt_publish_received The number of PUBLISH packets received.
24 +# TYPE vernemq_mqtt_publish_received counter
25 +vernemq_mqtt_publish_received{node="VerneMQ@10.10.10.20",mqtt_version="4"} 0
26 +vernemq_mqtt_publish_received{node="VerneMQ@10.10.10.20",mqtt_version="5"} 0
27 +# HELP vernemq_mqtt_puback_received The number of PUBACK packets received.
28 +# TYPE vernemq_mqtt_puback_received counter
29 +vernemq_mqtt_puback_received{node="VerneMQ@10.10.10.20",mqtt_version="4"} 0
30 +# HELP vernemq_mqtt_pubrec_received The number of PUBREC packets received.
31 +# TYPE vernemq_mqtt_pubrec_received counter
32 +vernemq_mqtt_pubrec_received{node="VerneMQ@10.10.10.20",mqtt_version="4"} 0
33 +# HELP vernemq_mqtt_pubrel_received The number of PUBREL packets received.
34 +# TYPE vernemq_mqtt_pubrel_received counter
35 +vernemq_mqtt_pubrel_received{node="VerneMQ@10.10.10.20",mqtt_version="4"} 0
36 +# HELP vernemq_mqtt_pubcomp_received The number of PUBCOMP packets received.
37 +# TYPE vernemq_mqtt_pubcomp_received counter
38 +vernemq_mqtt_pubcomp_received{node="VerneMQ@10.10.10.20",mqtt_version="4"} 0
39 +# HELP vernemq_mqtt_subscribe_received The number of SUBSCRIBE packets received.
40 +# TYPE vernemq_mqtt_subscribe_received counter
41 +vernemq_mqtt_subscribe_received{node="VerneMQ@10.10.10.20",mqtt_version="4"} 0
42 +vernemq_mqtt_subscribe_received{node="VerneMQ@10.10.10.20",mqtt_version="5"} 0
43 +# HELP vernemq_mqtt_unsubscribe_received The number of UNSUBSCRIBE packets received.
44 +# TYPE vernemq_mqtt_unsubscribe_received counter
45 +vernemq_mqtt_unsubscribe_received{node="VerneMQ@10.10.10.20",mqtt_version="4"} 0
46 +vernemq_mqtt_unsubscribe_received{node="VerneMQ@10.10.10.20",mqtt_version="5"} 0
47 +# HELP vernemq_mqtt_pingreq_received The number of PINGREQ packets received.
48 +# TYPE vernemq_mqtt_pingreq_received counter
49 +vernemq_mqtt_pingreq_received{node="VerneMQ@10.10.10.20",mqtt_version="4"} 0
50 +vernemq_mqtt_pingreq_received{node="VerneMQ@10.10.10.20",mqtt_version="5"} 0
51 +# HELP vernemq_mqtt_disconnect_received The number of DISCONNECT packets received.
52 +# TYPE vernemq_mqtt_disconnect_received counter
53 +vernemq_mqtt_disconnect_received{node="VerneMQ@10.10.10.20",mqtt_version="4"} 0
54 +# HELP vernemq_mqtt_connack_accepted_sent The number of times a connection has been accepted.
55 +# TYPE vernemq_mqtt_connack_accepted_sent counter
56 +vernemq_mqtt_connack_accepted_sent{node="VerneMQ@10.10.10.20",mqtt_version="4"} 0
57 +# HELP vernemq_mqtt_connack_unacceptable_protocol_sent The number of times the broker is not able to support the requested protocol.
58 +# TYPE vernemq_mqtt_connack_unacceptable_protocol_sent counter
59 +vernemq_mqtt_connack_unacceptable_protocol_sent{node="VerneMQ@10.10.10.20",mqtt_version="4"} 0
60 +# HELP vernemq_mqtt_connack_identifier_rejected_sent The number of times a client was rejected due to a unacceptable identifier.
61 +# TYPE vernemq_mqtt_connack_identifier_rejected_sent counter
62 +vernemq_mqtt_connack_identifier_rejected_sent{node="VerneMQ@10.10.10.20",mqtt_version="4"} 0
63 +# HELP vernemq_mqtt_connack_server_unavailable_sent The number of times a client was rejected due the the broker being unavailable.
64 +# TYPE vernemq_mqtt_connack_server_unavailable_sent counter
65 +vernemq_mqtt_connack_server_unavailable_sent{node="VerneMQ@10.10.10.20",mqtt_version="4"} 0
66 +# HELP vernemq_mqtt_connack_bad_credentials_sent The number of times a client sent bad credentials.
67 +# TYPE vernemq_mqtt_connack_bad_credentials_sent counter
68 +vernemq_mqtt_connack_bad_credentials_sent{node="VerneMQ@10.10.10.20",mqtt_version="4"} 0
69 +# HELP vernemq_mqtt_connack_not_authorized_sent The number of times a client was rejected due to insufficient authorization.
70 +# TYPE vernemq_mqtt_connack_not_authorized_sent counter
71 +vernemq_mqtt_connack_not_authorized_sent{node="VerneMQ@10.10.10.20",mqtt_version="4"} 0
72 +# HELP vernemq_mqtt_publish_sent The number of PUBLISH packets sent.
73 +# TYPE vernemq_mqtt_publish_sent counter
74 +vernemq_mqtt_publish_sent{node="VerneMQ@10.10.10.20",mqtt_version="4"} 0
75 +vernemq_mqtt_publish_sent{node="VerneMQ@10.10.10.20",mqtt_version="5"} 0
76 +# HELP vernemq_mqtt_puback_sent The number of PUBACK packets sent.
77 +# TYPE vernemq_mqtt_puback_sent counter
78 +vernemq_mqtt_puback_sent{node="VerneMQ@10.10.10.20",mqtt_version="4"} 0
79 +# HELP vernemq_mqtt_pubrec_sent The number of PUBREC packets sent.
80 +# TYPE vernemq_mqtt_pubrec_sent counter
81 +vernemq_mqtt_pubrec_sent{node="VerneMQ@10.10.10.20",mqtt_version="4"} 0
82 +# HELP vernemq_mqtt_pubrel_sent The number of PUBREL packets sent.
83 +# TYPE vernemq_mqtt_pubrel_sent counter
84 +vernemq_mqtt_pubrel_sent{node="VerneMQ@10.10.10.20",mqtt_version="4"} 0
85 +# HELP vernemq_mqtt_pubcomp_sent The number of PUBCOMP packets sent.
86 +# TYPE vernemq_mqtt_pubcomp_sent counter
87 +vernemq_mqtt_pubcomp_sent{node="VerneMQ@10.10.10.20",mqtt_version="4"} 0
88 +# HELP vernemq_mqtt_suback_sent The number of SUBACK packets sent.
89 +# TYPE vernemq_mqtt_suback_sent counter
90 +vernemq_mqtt_suback_sent{node="VerneMQ@10.10.10.20",mqtt_version="4"} 0
91 +vernemq_mqtt_suback_sent{node="VerneMQ@10.10.10.20",mqtt_version="5"} 0
92 +# HELP vernemq_mqtt_unsuback_sent The number of UNSUBACK packets sent.
93 +# TYPE vernemq_mqtt_unsuback_sent counter
94 +vernemq_mqtt_unsuback_sent{node="VerneMQ@10.10.10.20",mqtt_version="4"} 0
95 +vernemq_mqtt_unsuback_sent{node="VerneMQ@10.10.10.20",mqtt_version="5"} 0
96 +# HELP vernemq_mqtt_pingresp_sent The number of PINGRESP packets sent.
97 +# TYPE vernemq_mqtt_pingresp_sent counter
98 +vernemq_mqtt_pingresp_sent{node="VerneMQ@10.10.10.20",mqtt_version="4"} 0
99 +vernemq_mqtt_pingresp_sent{node="VerneMQ@10.10.10.20",mqtt_version="5"} 0
100 +# HELP vernemq_mqtt_publish_auth_error The number of unauthorized publish attempts.
101 +# TYPE vernemq_mqtt_publish_auth_error counter
102 +vernemq_mqtt_publish_auth_error{node="VerneMQ@10.10.10.20",mqtt_version="4"} 0
103 +vernemq_mqtt_publish_auth_error{node="VerneMQ@10.10.10.20",mqtt_version="5"} 0
104 +# HELP vernemq_mqtt_subscribe_auth_error The number of unauthorized subscription attempts.
105 +# TYPE vernemq_mqtt_subscribe_auth_error counter
106 +vernemq_mqtt_subscribe_auth_error{node="VerneMQ@10.10.10.20",mqtt_version="4"} 0
107 +vernemq_mqtt_subscribe_auth_error{node="VerneMQ@10.10.10.20",mqtt_version="5"} 0
108 +# HELP vernemq_mqtt_invalid_msg_size_error The number of packages exceeding the maximum allowed size.
109 +# TYPE vernemq_mqtt_invalid_msg_size_error counter
110 +vernemq_mqtt_invalid_msg_size_error{node="VerneMQ@10.10.10.20",mqtt_version="4"} 0
111 +vernemq_mqtt_invalid_msg_size_error{node="VerneMQ@10.10.10.20",mqtt_version="5"} 0
112 +# HELP vernemq_mqtt_puback_invalid_error The number of unexpected PUBACK messages received.
113 +# TYPE vernemq_mqtt_puback_invalid_error counter
114 +vernemq_mqtt_puback_invalid_error{node="VerneMQ@10.10.10.20",mqtt_version="4"} 0
115 +vernemq_mqtt_puback_invalid_error{node="VerneMQ@10.10.10.20",mqtt_version="5"} 0
116 +# HELP vernemq_mqtt_pubrec_invalid_error The number of unexpected PUBREC messages received.
117 +# TYPE vernemq_mqtt_pubrec_invalid_error counter
118 +vernemq_mqtt_pubrec_invalid_error{node="VerneMQ@10.10.10.20",mqtt_version="4"} 0
119 +# HELP vernemq_mqtt_pubcomp_invalid_error The number of unexpected PUBCOMP messages received.
120 +# TYPE vernemq_mqtt_pubcomp_invalid_error counter
121 +vernemq_mqtt_pubcomp_invalid_error{node="VerneMQ@10.10.10.20",mqtt_version="4"} 0
122 +vernemq_mqtt_pubcomp_invalid_error{node="VerneMQ@10.10.10.20",mqtt_version="5"} 0
123 +# HELP vernemq_mqtt_publish_error The number of times a PUBLISH operation failed due to a netsplit.
124 +# TYPE vernemq_mqtt_publish_error counter
125 +vernemq_mqtt_publish_error{node="VerneMQ@10.10.10.20",mqtt_version="4"} 0
126 +vernemq_mqtt_publish_error{node="VerneMQ@10.10.10.20",mqtt_version="5"} 0
127 +# HELP vernemq_mqtt_subscribe_error The number of times a SUBSCRIBE operation failed due to a netsplit.
128 +# TYPE vernemq_mqtt_subscribe_error counter
129 +vernemq_mqtt_subscribe_error{node="VerneMQ@10.10.10.20",mqtt_version="4"} 0
130 +vernemq_mqtt_subscribe_error{node="VerneMQ@10.10.10.20",mqtt_version="5"} 0
131 +# HELP vernemq_mqtt_unsubscribe_error The number of times an UNSUBSCRIBE operation failed due to a netsplit.
132 +# TYPE vernemq_mqtt_unsubscribe_error counter
133 +vernemq_mqtt_unsubscribe_error{node="VerneMQ@10.10.10.20",mqtt_version="4"} 0
134 +vernemq_mqtt_unsubscribe_error{node="VerneMQ@10.10.10.20",mqtt_version="5"} 0
135 +# HELP vernemq_client_keepalive_expired The number of clients which failed to communicate within the keepalive time period.
136 +# TYPE vernemq_client_keepalive_expired counter
137 +vernemq_client_keepalive_expired{node="VerneMQ@10.10.10.20",mqtt_version="4"} 0
138 +vernemq_client_keepalive_expired{node="VerneMQ@10.10.10.20",mqtt_version="5"} 0
139 +# HELP vernemq_queue_setup The number of times a MQTT queue process has been started.
140 +# TYPE vernemq_queue_setup counter
141 +vernemq_queue_setup{node="VerneMQ@10.10.10.20"} 0
142 +# HELP vernemq_queue_initialized_from_storage The number of times a MQTT queue process has been initialized from offline storage.
143 +# TYPE vernemq_queue_initialized_from_storage counter
144 +vernemq_queue_initialized_from_storage{node="VerneMQ@10.10.10.20"} 0
145 +# HELP vernemq_queue_teardown The number of times a MQTT queue process has been terminated.
146 +# TYPE vernemq_queue_teardown counter
147 +vernemq_queue_teardown{node="VerneMQ@10.10.10.20"} 0
148 +# HELP vernemq_queue_message_drop The number of messages dropped due to full queues.
149 +# TYPE vernemq_queue_message_drop counter
150 +vernemq_queue_message_drop{node="VerneMQ@10.10.10.20"} 0
151 +# HELP vernemq_queue_message_expired The number of messages which expired before delivery.
152 +# TYPE vernemq_queue_message_expired counter
153 +vernemq_queue_message_expired{node="VerneMQ@10.10.10.20"} 0
154 +# HELP vernemq_queue_message_unhandled The number of unhandled messages when connecting with clean session=true or QoS0 for offline sessions.
155 +# TYPE vernemq_queue_message_unhandled counter
156 +vernemq_queue_message_unhandled{node="VerneMQ@10.10.10.20"} 0
157 +# HELP vernemq_queue_message_in The number of PUBLISH packets received by MQTT queue processes.
158 +# TYPE vernemq_queue_message_in counter
159 +vernemq_queue_message_in{node="VerneMQ@10.10.10.20"} 0
160 +# HELP vernemq_queue_message_out The number of PUBLISH packets sent from MQTT queue processes.
161 +# TYPE vernemq_queue_message_out counter
162 +vernemq_queue_message_out{node="VerneMQ@10.10.10.20"} 0
163 +# HELP vernemq_client_expired Not in use (deprecated)
164 +# TYPE vernemq_client_expired counter
165 +vernemq_client_expired{node="VerneMQ@10.10.10.20"} 0
166 +# HELP vernemq_cluster_bytes_received The number of bytes received from other cluster nodes.
167 +# TYPE vernemq_cluster_bytes_received counter
168 +vernemq_cluster_bytes_received{node="VerneMQ@10.10.10.20"} 0
169 +# HELP vernemq_cluster_bytes_sent The number of bytes send to other cluster nodes.
170 +# TYPE vernemq_cluster_bytes_sent counter
171 +vernemq_cluster_bytes_sent{node="VerneMQ@10.10.10.20"} 0
172 +# HELP vernemq_cluster_bytes_dropped The number of bytes dropped while sending data to other cluster nodes.
173 +# TYPE vernemq_cluster_bytes_dropped counter
174 +vernemq_cluster_bytes_dropped{node="VerneMQ@10.10.10.20"} 0
175 +# HELP vernemq_router_matches_local The number of matched local subscriptions.
176 +# TYPE vernemq_router_matches_local counter
177 +vernemq_router_matches_local{node="VerneMQ@10.10.10.20"} 0
178 +# HELP vernemq_router_matches_remote The number of matched remote subscriptions.
179 +# TYPE vernemq_router_matches_remote counter
180 +vernemq_router_matches_remote{node="VerneMQ@10.10.10.20"} 0
181 +# HELP vernemq_mqtt_connack_sent The number of CONNACK packets sent.
182 +# TYPE vernemq_mqtt_connack_sent counter
183 +vernemq_mqtt_connack_sent{node="VerneMQ@10.10.10.20",mqtt_version="4",return_code="success"} 0
184 +vernemq_mqtt_connack_sent{node="VerneMQ@10.10.10.20",mqtt_version="4",return_code="unsupported_protocol_version"} 0
185 +vernemq_mqtt_connack_sent{node="VerneMQ@10.10.10.20",mqtt_version="4",return_code="client_identifier_not_valid"} 0
186 +vernemq_mqtt_connack_sent{node="VerneMQ@10.10.10.20",mqtt_version="4",return_code="server_unavailable"} 0
187 +vernemq_mqtt_connack_sent{node="VerneMQ@10.10.10.20",mqtt_version="4",return_code="bad_username_or_password"} 0
188 +vernemq_mqtt_connack_sent{node="VerneMQ@10.10.10.20",mqtt_version="4",return_code="not_authorized"} 0
189 +vernemq_mqtt_disconnect_received{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="normal_disconnect"} 0
190 +vernemq_mqtt_disconnect_received{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="disconnect_with_will_msg"} 0
191 +vernemq_mqtt_disconnect_received{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="unspecified_error"} 0
192 +vernemq_mqtt_disconnect_received{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="malformed_packet"} 0
193 +vernemq_mqtt_disconnect_received{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="protocol_error"} 0
194 +vernemq_mqtt_disconnect_received{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="impl_specific_error"} 0
195 +vernemq_mqtt_disconnect_received{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="topic_name_invalid"} 0
196 +vernemq_mqtt_disconnect_received{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="receive_max_exceeded"} 0
197 +vernemq_mqtt_disconnect_received{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="topic_alias_invalid"} 0
198 +vernemq_mqtt_disconnect_received{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="packet_too_large"} 0
199 +vernemq_mqtt_disconnect_received{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="message_rate_too_high"} 0
200 +vernemq_mqtt_disconnect_received{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="quota_exceeded"} 0
201 +vernemq_mqtt_disconnect_received{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="administrative_action"} 0
202 +vernemq_mqtt_disconnect_received{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="payload_format_invalid"} 0
203 +# HELP vernemq_mqtt_disconnect_sent The number of DISCONNECT packets sent.
204 +# TYPE vernemq_mqtt_disconnect_sent counter
205 +vernemq_mqtt_disconnect_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="normal_disconnect"} 0
206 +vernemq_mqtt_disconnect_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="unspecified_error"} 0
207 +vernemq_mqtt_disconnect_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="malformed_packet"} 0
208 +vernemq_mqtt_disconnect_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="protocol_error"} 0
209 +vernemq_mqtt_disconnect_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="impl_specific_error"} 0
210 +vernemq_mqtt_disconnect_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="not_authorized"} 0
211 +vernemq_mqtt_disconnect_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="server_busy"} 0
212 +vernemq_mqtt_disconnect_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="server_shutting_down"} 0
213 +vernemq_mqtt_disconnect_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="keep_alive_timeout"} 0
214 +vernemq_mqtt_disconnect_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="session_taken_over"} 0
215 +vernemq_mqtt_disconnect_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="topic_filter_invalid"} 0
216 +vernemq_mqtt_disconnect_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="topic_name_invalid"} 0
217 +vernemq_mqtt_disconnect_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="receive_max_exceeded"} 0
218 +vernemq_mqtt_disconnect_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="topic_alias_invalid"} 0
219 +vernemq_mqtt_disconnect_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="packet_too_large"} 0
220 +vernemq_mqtt_disconnect_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="message_rate_too_high"} 0
221 +vernemq_mqtt_disconnect_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="quota_exceeded"} 0
222 +vernemq_mqtt_disconnect_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="administrative_action"} 0
223 +vernemq_mqtt_disconnect_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="payload_format_invalid"} 0
224 +vernemq_mqtt_disconnect_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="retain_not_supported"} 0
225 +vernemq_mqtt_disconnect_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="qos_not_supported"} 0
226 +vernemq_mqtt_disconnect_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="use_another_server"} 0
227 +vernemq_mqtt_disconnect_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="server_moved"} 0
228 +vernemq_mqtt_disconnect_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="shared_subs_not_supported"} 0
229 +vernemq_mqtt_disconnect_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="connection_rate_exceeded"} 0
230 +vernemq_mqtt_disconnect_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="max_connect_time"} 0
231 +vernemq_mqtt_disconnect_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="subscription_ids_not_supported"} 0
232 +vernemq_mqtt_disconnect_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="wildcard_subs_not_supported"} 0
233 +vernemq_mqtt_connack_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="success"} 0
234 +vernemq_mqtt_connack_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="unspecified_error"} 0
235 +vernemq_mqtt_connack_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="malformed_packet"} 0
236 +vernemq_mqtt_connack_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="protocol_error"} 0
237 +vernemq_mqtt_connack_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="impl_specific_error"} 0
238 +vernemq_mqtt_connack_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="unsupported_protocol_version"} 0
239 +vernemq_mqtt_connack_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="client_identifier_not_valid"} 0
240 +vernemq_mqtt_connack_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="bad_username_or_password"} 0
241 +vernemq_mqtt_connack_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="not_authorized"} 0
242 +vernemq_mqtt_connack_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="server_unavailable"} 0
243 +vernemq_mqtt_connack_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="server_busy"} 0
244 +vernemq_mqtt_connack_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="banned"} 0
245 +vernemq_mqtt_connack_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="bad_authentication_method"} 0
246 +vernemq_mqtt_connack_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="topic_name_invalid"} 0
247 +vernemq_mqtt_connack_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="packet_too_large"} 0
248 +vernemq_mqtt_connack_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="quota_exceeded"} 0
249 +vernemq_mqtt_connack_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="payload_format_invalid"} 0
250 +vernemq_mqtt_connack_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="retain_not_supported"} 0
251 +vernemq_mqtt_connack_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="qos_not_supported"} 0
252 +vernemq_mqtt_connack_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="use_another_server"} 0
253 +vernemq_mqtt_connack_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="server_moved"} 0
254 +vernemq_mqtt_connack_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="connection_rate_exceeded"} 0
255 +vernemq_mqtt_puback_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="success"} 0
256 +vernemq_mqtt_puback_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="no_matching_subscribers"} 0
257 +vernemq_mqtt_puback_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="unspecified_error"} 0
258 +vernemq_mqtt_puback_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="impl_specific_error"} 0
259 +vernemq_mqtt_puback_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="not_authorized"} 0
260 +vernemq_mqtt_puback_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="topic_name_invalid"} 0
261 +vernemq_mqtt_puback_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="packet_id_in_use"} 0
262 +vernemq_mqtt_puback_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="quota_exceeded"} 0
263 +vernemq_mqtt_puback_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="payload_format_invalid"} 0
264 +vernemq_mqtt_puback_received{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="success"} 0
265 +vernemq_mqtt_puback_received{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="no_matching_subscribers"} 0
266 +vernemq_mqtt_puback_received{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="unspecified_error"} 0
267 +vernemq_mqtt_puback_received{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="impl_specific_error"} 0
268 +vernemq_mqtt_puback_received{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="not_authorized"} 0
269 +vernemq_mqtt_puback_received{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="topic_name_invalid"} 0
270 +vernemq_mqtt_puback_received{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="packet_id_in_use"} 0
271 +vernemq_mqtt_puback_received{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="quota_exceeded"} 0
272 +vernemq_mqtt_puback_received{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="payload_format_invalid"} 0
273 +vernemq_mqtt_pubrec_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="success"} 0
274 +vernemq_mqtt_pubrec_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="no_matching_subscribers"} 0
275 +vernemq_mqtt_pubrec_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="unspecified_error"} 0
276 +vernemq_mqtt_pubrec_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="impl_specific_error"} 0
277 +vernemq_mqtt_pubrec_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="not_authorized"} 0
278 +vernemq_mqtt_pubrec_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="topic_name_invalid"} 0
279 +vernemq_mqtt_pubrec_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="packet_id_in_use"} 0
280 +vernemq_mqtt_pubrec_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="quota_exceeded"} 0
281 +vernemq_mqtt_pubrec_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="payload_format_invalid"} 0
282 +vernemq_mqtt_pubrec_received{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="success"} 0
283 +vernemq_mqtt_pubrec_received{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="no_matching_subscribers"} 0
284 +vernemq_mqtt_pubrec_received{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="unspecified_error"} 0
285 +vernemq_mqtt_pubrec_received{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="impl_specific_error"} 0
286 +vernemq_mqtt_pubrec_received{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="not_authorized"} 0
287 +vernemq_mqtt_pubrec_received{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="topic_name_invalid"} 0
288 +vernemq_mqtt_pubrec_received{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="packet_id_in_use"} 0
289 +vernemq_mqtt_pubrec_received{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="quota_exceeded"} 0
290 +vernemq_mqtt_pubrec_received{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="payload_format_invalid"} 0
291 +vernemq_mqtt_pubrel_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="success"} 0
292 +vernemq_mqtt_pubrel_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="packet_id_not_found"} 0
293 +vernemq_mqtt_pubrel_received{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="success"} 0
294 +vernemq_mqtt_pubrel_received{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="packet_id_not_found"} 0
295 +vernemq_mqtt_pubcomp_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="success"} 0
296 +vernemq_mqtt_pubcomp_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="packet_id_not_found"} 0
297 +vernemq_mqtt_pubcomp_received{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="success"} 0
298 +vernemq_mqtt_pubcomp_received{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="packet_id_not_found"} 0
299 +# HELP vernemq_mqtt_auth_sent The number of AUTH packets sent.
300 +# TYPE vernemq_mqtt_auth_sent counter
301 +vernemq_mqtt_auth_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="success"} 0
302 +vernemq_mqtt_auth_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="continue_authentication"} 0
303 +vernemq_mqtt_auth_sent{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="reauthenticate"} 0
304 +# HELP vernemq_mqtt_auth_received The number of AUTH packets received.
305 +# TYPE vernemq_mqtt_auth_received counter
306 +vernemq_mqtt_auth_received{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="success"} 0
307 +vernemq_mqtt_auth_received{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="continue_authentication"} 0
308 +vernemq_mqtt_auth_received{node="VerneMQ@10.10.10.20",mqtt_version="5",reason_code="reauthenticate"} 0
309 +# HELP vernemq_total_active_connections The total number of active MQTT and MQTTWS connections.
310 +# TYPE vernemq_total_active_connections gauge
311 +vernemq_total_active_connections{node="VerneMQ@10.10.10.20"} 0
312 +# HELP vernemq_active_mqtt_connections The number of active MQTT(S) connections.
313 +# TYPE vernemq_active_mqtt_connections gauge
314 +vernemq_active_mqtt_connections{node="VerneMQ@10.10.10.20"} 0
315 +# HELP vernemq_active_mqttws_connections The number of active MQTT WS(S) connections.
316 +# TYPE vernemq_active_mqttws_connections gauge
317 +vernemq_active_mqttws_connections{node="VerneMQ@10.10.10.20"} 0
318 +# HELP vernemq_queue_processes The number of MQTT queue processes.
319 +# TYPE vernemq_queue_processes gauge
320 +vernemq_queue_processes{node="VerneMQ@10.10.10.20"} 0
321 +# HELP vernemq_retain_memory The number of bytes used for storing retained messages.
322 +# TYPE vernemq_retain_memory gauge
323 +vernemq_retain_memory{node="VerneMQ@10.10.10.20"} 15792
324 +# HELP vernemq_retain_messages The number of currently stored retained messages.
325 +# TYPE vernemq_retain_messages gauge
326 +vernemq_retain_messages{node="VerneMQ@10.10.10.20"} 0
327 +# HELP vernemq_router_memory The number of bytes used by the routing table.
328 +# TYPE vernemq_router_memory gauge
329 +vernemq_router_memory{node="VerneMQ@10.10.10.20"} 20224
330 +# HELP vernemq_router_subscriptions The number of subscriptions in the routing table.
331 +# TYPE vernemq_router_subscriptions gauge
332 +vernemq_router_subscriptions{node="VerneMQ@10.10.10.20"} 0
333 +# HELP vernemq_netsplit_resolved The number of resolved netsplits.
334 +# TYPE vernemq_netsplit_resolved counter
335 +vernemq_netsplit_resolved{node="VerneMQ@10.10.10.20"} 0
336 +# HELP vernemq_netsplit_detected The number of detected netsplits.
337 +# TYPE vernemq_netsplit_detected counter
338 +vernemq_netsplit_detected{node="VerneMQ@10.10.10.20"} 0
339 +# HELP vernemq_system_utilization_scheduler_32 Scheduler 32 utilization (percentage)
340 +# TYPE vernemq_system_utilization_scheduler_32 gauge
341 +vernemq_system_utilization_scheduler_32{node="VerneMQ@10.10.10.20"} 0
342 +# HELP vernemq_system_utilization_scheduler_31 Scheduler 31 utilization (percentage)
343 +# TYPE vernemq_system_utilization_scheduler_31 gauge
344 +vernemq_system_utilization_scheduler_31{node="VerneMQ@10.10.10.20"} 0
345 +# HELP vernemq_system_utilization_scheduler_30 Scheduler 30 utilization (percentage)
346 +# TYPE vernemq_system_utilization_scheduler_30 gauge
347 +vernemq_system_utilization_scheduler_30{node="VerneMQ@10.10.10.20"} 0
348 +# HELP vernemq_system_utilization_scheduler_29 Scheduler 29 utilization (percentage)
349 +# TYPE vernemq_system_utilization_scheduler_29 gauge
350 +vernemq_system_utilization_scheduler_29{node="VerneMQ@10.10.10.20"} 0
351 +# HELP vernemq_system_utilization_scheduler_28 Scheduler 28 utilization (percentage)
352 +# TYPE vernemq_system_utilization_scheduler_28 gauge
353 +vernemq_system_utilization_scheduler_28{node="VerneMQ@10.10.10.20"} 0
354 +# HELP vernemq_system_utilization_scheduler_27 Scheduler 27 utilization (percentage)
355 +# TYPE vernemq_system_utilization_scheduler_27 gauge
356 +vernemq_system_utilization_scheduler_27{node="VerneMQ@10.10.10.20"} 0
357 +# HELP vernemq_system_utilization_scheduler_26 Scheduler 26 utilization (percentage)
358 +# TYPE vernemq_system_utilization_scheduler_26 gauge
359 +vernemq_system_utilization_scheduler_26{node="VerneMQ@10.10.10.20"} 0
360 +# HELP vernemq_system_utilization_scheduler_25 Scheduler 25 utilization (percentage)
361 +# TYPE vernemq_system_utilization_scheduler_25 gauge
362 +vernemq_system_utilization_scheduler_25{node="VerneMQ@10.10.10.20"} 0
363 +# HELP vernemq_system_utilization_scheduler_24 Scheduler 24 utilization (percentage)
364 +# TYPE vernemq_system_utilization_scheduler_24 gauge
365 +vernemq_system_utilization_scheduler_24{node="VerneMQ@10.10.10.20"} 0
366 +# HELP vernemq_system_utilization_scheduler_23 Scheduler 23 utilization (percentage)
367 +# TYPE vernemq_system_utilization_scheduler_23 gauge
368 +vernemq_system_utilization_scheduler_23{node="VerneMQ@10.10.10.20"} 0
369 +# HELP vernemq_system_utilization_scheduler_22 Scheduler 22 utilization (percentage)
370 +# TYPE vernemq_system_utilization_scheduler_22 gauge
371 +vernemq_system_utilization_scheduler_22{node="VerneMQ@10.10.10.20"} 0
372 +# HELP vernemq_system_utilization_scheduler_21 Scheduler 21 utilization (percentage)
373 +# TYPE vernemq_system_utilization_scheduler_21 gauge
374 +vernemq_system_utilization_scheduler_21{node="VerneMQ@10.10.10.20"} 0
375 +# HELP vernemq_system_utilization_scheduler_20 Scheduler 20 utilization (percentage)
376 +# TYPE vernemq_system_utilization_scheduler_20 gauge
377 +vernemq_system_utilization_scheduler_20{node="VerneMQ@10.10.10.20"} 0
378 +# HELP vernemq_system_utilization_scheduler_19 Scheduler 19 utilization (percentage)
379 +# TYPE vernemq_system_utilization_scheduler_19 gauge
380 +vernemq_system_utilization_scheduler_19{node="VerneMQ@10.10.10.20"} 0
381 +# HELP vernemq_system_utilization_scheduler_18 Scheduler 18 utilization (percentage)
382 +# TYPE vernemq_system_utilization_scheduler_18 gauge
383 +vernemq_system_utilization_scheduler_18{node="VerneMQ@10.10.10.20"} 0
384 +# HELP vernemq_system_utilization_scheduler_17 Scheduler 17 utilization (percentage)
385 +# TYPE vernemq_system_utilization_scheduler_17 gauge
386 +vernemq_system_utilization_scheduler_17{node="VerneMQ@10.10.10.20"} 0
387 +# HELP vernemq_system_utilization_scheduler_16 Scheduler 16 utilization (percentage)
388 +# TYPE vernemq_system_utilization_scheduler_16 gauge
389 +vernemq_system_utilization_scheduler_16{node="VerneMQ@10.10.10.20"} 2
390 +# HELP vernemq_system_utilization_scheduler_15 Scheduler 15 utilization (percentage)
391 +# TYPE vernemq_system_utilization_scheduler_15 gauge
392 +vernemq_system_utilization_scheduler_15{node="VerneMQ@10.10.10.20"} 1
393 +# HELP vernemq_system_utilization_scheduler_14 Scheduler 14 utilization (percentage)
394 +# TYPE vernemq_system_utilization_scheduler_14 gauge
395 +vernemq_system_utilization_scheduler_14{node="VerneMQ@10.10.10.20"} 3
396 +# HELP vernemq_system_utilization_scheduler_13 Scheduler 13 utilization (percentage)
397 +# TYPE vernemq_system_utilization_scheduler_13 gauge
398 +vernemq_system_utilization_scheduler_13{node="VerneMQ@10.10.10.20"} 4
399 +# HELP vernemq_system_utilization_scheduler_12 Scheduler 12 utilization (percentage)
400 +# TYPE vernemq_system_utilization_scheduler_12 gauge
401 +vernemq_system_utilization_scheduler_12{node="VerneMQ@10.10.10.20"} 2
402 +# HELP vernemq_system_utilization_scheduler_11 Scheduler 11 utilization (percentage)
403 +# TYPE vernemq_system_utilization_scheduler_11 gauge
404 +vernemq_system_utilization_scheduler_11{node="VerneMQ@10.10.10.20"} 3
405 +# HELP vernemq_system_utilization_scheduler_10 Scheduler 10 utilization (percentage)
406 +# TYPE vernemq_system_utilization_scheduler_10 gauge
407 +vernemq_system_utilization_scheduler_10{node="VerneMQ@10.10.10.20"} 3
408 +# HELP vernemq_system_utilization_scheduler_9 Scheduler 9 utilization (percentage)
409 +# TYPE vernemq_system_utilization_scheduler_9 gauge
410 +vernemq_system_utilization_scheduler_9{node="VerneMQ@10.10.10.20"} 3
411 +# HELP vernemq_system_utilization_scheduler_8 Scheduler 8 utilization (percentage)
412 +# TYPE vernemq_system_utilization_scheduler_8 gauge
413 +vernemq_system_utilization_scheduler_8{node="VerneMQ@10.10.10.20"} 14
414 +# HELP vernemq_system_utilization_scheduler_7 Scheduler 7 utilization (percentage)
415 +# TYPE vernemq_system_utilization_scheduler_7 gauge
416 +vernemq_system_utilization_scheduler_7{node="VerneMQ@10.10.10.20"} 5
417 +# HELP vernemq_system_utilization_scheduler_6 Scheduler 6 utilization (percentage)
418 +# TYPE vernemq_system_utilization_scheduler_6 gauge
419 +vernemq_system_utilization_scheduler_6{node="VerneMQ@10.10.10.20"} 4
420 +# HELP vernemq_system_utilization_scheduler_5 Scheduler 5 utilization (percentage)
421 +# TYPE vernemq_system_utilization_scheduler_5 gauge
422 +vernemq_system_utilization_scheduler_5{node="VerneMQ@10.10.10.20"} 4
423 +# HELP vernemq_system_utilization_scheduler_4 Scheduler 4 utilization (percentage)
424 +# TYPE vernemq_system_utilization_scheduler_4 gauge
425 +vernemq_system_utilization_scheduler_4{node="VerneMQ@10.10.10.20"} 5
426 +# HELP vernemq_system_utilization_scheduler_3 Scheduler 3 utilization (percentage)
427 +# TYPE vernemq_system_utilization_scheduler_3 gauge
428 +vernemq_system_utilization_scheduler_3{node="VerneMQ@10.10.10.20"} 3
429 +# HELP vernemq_system_utilization_scheduler_2 Scheduler 2 utilization (percentage)
430 +# TYPE vernemq_system_utilization_scheduler_2 gauge
431 +vernemq_system_utilization_scheduler_2{node="VerneMQ@10.10.10.20"} 6
432 +# HELP vernemq_system_utilization_scheduler_1 Scheduler 1 utilization (percentage)
433 +# TYPE vernemq_system_utilization_scheduler_1 gauge
434 +vernemq_system_utilization_scheduler_1{node="VerneMQ@10.10.10.20"} 100
435 +# HELP vernemq_system_utilization The average system (scheduler) utilization (percentage).
436 +# TYPE vernemq_system_utilization gauge
437 +vernemq_system_utilization{node="VerneMQ@10.10.10.20"} 5
438 +# HELP vernemq_vm_memory_ets The amount of memory allocated for ETS tables.
439 +# TYPE vernemq_vm_memory_ets gauge
440 +vernemq_vm_memory_ets{node="VerneMQ@10.10.10.20"} 6665000
441 +# HELP vernemq_vm_memory_code The amount of memory allocated for code.
442 +# TYPE vernemq_vm_memory_code gauge
443 +vernemq_vm_memory_code{node="VerneMQ@10.10.10.20"} 13546686
444 +# HELP vernemq_vm_memory_binary The amount of memory allocated for binaries.
445 +# TYPE vernemq_vm_memory_binary gauge
446 +vernemq_vm_memory_binary{node="VerneMQ@10.10.10.20"} 729792
447 +# HELP vernemq_vm_memory_atom_used The amount of memory used by atoms.
448 +# TYPE vernemq_vm_memory_atom_used gauge
449 +vernemq_vm_memory_atom_used{node="VerneMQ@10.10.10.20"} 634383
450 +# HELP vernemq_vm_memory_atom The amount of memory allocated for atoms.
451 +# TYPE vernemq_vm_memory_atom gauge
452 +vernemq_vm_memory_atom{node="VerneMQ@10.10.10.20"} 639193
453 +# HELP vernemq_vm_memory_system The amount of memory allocated for the emulator.
454 +# TYPE vernemq_vm_memory_system gauge
455 +vernemq_vm_memory_system{node="VerneMQ@10.10.10.20"} 44839192
456 +# HELP vernemq_vm_memory_processes_used The amount of memory used by processes.
457 +# TYPE vernemq_vm_memory_processes_used gauge
458 +vernemq_vm_memory_processes_used{node="VerneMQ@10.10.10.20"} 13751224
459 +# HELP vernemq_vm_memory_processes The amount of memory allocated for processes.
460 +# TYPE vernemq_vm_memory_processes gauge
461 +vernemq_vm_memory_processes{node="VerneMQ@10.10.10.20"} 13754320
462 +# HELP vernemq_vm_memory_total The total amount of memory allocated.
463 +# TYPE vernemq_vm_memory_total gauge
464 +vernemq_vm_memory_total{node="VerneMQ@10.10.10.20"} 58593512
465 +# HELP vernemq_system_process_count The number of Erlang processes.
466 +# TYPE vernemq_system_process_count gauge
467 +vernemq_system_process_count{node="VerneMQ@10.10.10.20"} 465
468 +# HELP vernemq_system_wallclock The number of milli-seconds passed since the node was started.
469 +# TYPE vernemq_system_wallclock counter
470 +vernemq_system_wallclock{node="VerneMQ@10.10.10.20"} 51082602
471 +# HELP vernemq_system_runtime The sum of the runtime for all threads in the Erlang runtime system.
472 +# TYPE vernemq_system_runtime counter
473 +vernemq_system_runtime{node="VerneMQ@10.10.10.20"} 54249
474 +# HELP vernemq_system_run_queue The total number of processes and ports ready to run on all run-queues.
475 +# TYPE vernemq_system_run_queue gauge
476 +vernemq_system_run_queue{node="VerneMQ@10.10.10.20"} 0
477 +# HELP vernemq_system_reductions The number of reductions performed in the VM since the node was started.
478 +# TYPE vernemq_system_reductions counter
479 +vernemq_system_reductions{node="VerneMQ@10.10.10.20"} 340640218
480 +# HELP vernemq_system_io_out The total number of bytes sent through ports.
481 +# TYPE vernemq_system_io_out counter
482 +vernemq_system_io_out{node="VerneMQ@10.10.10.20"} 1702500
483 +# HELP vernemq_system_io_in The total number of bytes received through ports.
484 +# TYPE vernemq_system_io_in counter
485 +vernemq_system_io_in{node="VerneMQ@10.10.10.20"} 30616669
486 +# HELP vernemq_system_words_reclaimed_by_gc The number of words reclaimed by the garbage collector.
487 +# TYPE vernemq_system_words_reclaimed_by_gc counter
488 +vernemq_system_words_reclaimed_by_gc{node="VerneMQ@10.10.10.20"} 661531058
489 +# HELP vernemq_system_gc_count The number of garbage collections performed.
490 +# TYPE vernemq_system_gc_count counter
491 +vernemq_system_gc_count{node="VerneMQ@10.10.10.20"} 355236
492 +# HELP vernemq_system_exact_reductions The exact number of reductions performed.
493 +# TYPE vernemq_system_exact_reductions counter
494 +vernemq_system_exact_reductions{node="VerneMQ@10.10.10.20"} 340307987
495 +# HELP vernemq_system_context_switches The total number of context switches.
496 +# TYPE vernemq_system_context_switches counter
497 +vernemq_system_context_switches{node="VerneMQ@10.10.10.20"} 3902972
498 +# HELP vernemq_storage_scan_microseconds A histogram of the storage scan latency.
499 +# TYPE vernemq_storage_scan_microseconds histogram
500 +vernemq_storage_scan_microseconds_bucket{node="VerneMQ@10.10.10.20",le="+Inf"} 50
501 +vernemq_storage_scan_microseconds_bucket{node="VerneMQ@10.10.10.20",le="1000000"} 50
502 +vernemq_storage_scan_microseconds_bucket{node="VerneMQ@10.10.10.20",le="100000"} 50
503 +vernemq_storage_scan_microseconds_bucket{node="VerneMQ@10.10.10.20",le="10000"} 50
504 +vernemq_storage_scan_microseconds_bucket{node="VerneMQ@10.10.10.20",le="1000"} 50
505 +vernemq_storage_scan_microseconds_bucket{node="VerneMQ@10.10.10.20",le="100"} 8
506 +vernemq_storage_scan_microseconds_bucket{node="VerneMQ@10.10.10.20",le="10"} 0
507 +vernemq_storage_scan_microseconds_count{node="VerneMQ@10.10.10.20"} 50
508 +vernemq_storage_scan_microseconds_sum{node="VerneMQ@10.10.10.20"} 6482
509 +# HELP vernemq_storage_write_microseconds A histogram of the storage write latency.
510 +# TYPE vernemq_storage_write_microseconds histogram
511 +vernemq_storage_write_microseconds_bucket{node="VerneMQ@10.10.10.20",le="+Inf"} 68140
512 +vernemq_storage_write_microseconds_bucket{node="VerneMQ@10.10.10.20",le="1000000"} 68140
513 +vernemq_storage_write_microseconds_bucket{node="VerneMQ@10.10.10.20",le="100000"} 68140
514 +vernemq_storage_write_microseconds_bucket{node="VerneMQ@10.10.10.20",le="10000"} 68140
515 +vernemq_storage_write_microseconds_bucket{node="VerneMQ@10.10.10.20",le="1000"} 68112
516 +vernemq_storage_write_microseconds_bucket{node="VerneMQ@10.10.10.20",le="100"} 35957
517 +vernemq_storage_write_microseconds_bucket{node="VerneMQ@10.10.10.20",le="10"} 0
518 +vernemq_storage_write_microseconds_count{node="VerneMQ@10.10.10.20"} 68140
519 +vernemq_storage_write_microseconds_sum{node="VerneMQ@10.10.10.20"} 7490218
520 +# HELP vernemq_storage_read_microseconds A histogram of the storage read latency.
521 +# TYPE vernemq_storage_read_microseconds histogram
522 +vernemq_storage_read_microseconds_bucket{node="VerneMQ@10.10.10.20",le="+Inf"} 362
523 +vernemq_storage_read_microseconds_bucket{node="VerneMQ@10.10.10.20",le="1000000"} 362
524 +vernemq_storage_read_microseconds_bucket{node="VerneMQ@10.10.10.20",le="100000"} 362
525 +vernemq_storage_read_microseconds_bucket{node="VerneMQ@10.10.10.20",le="10000"} 362
526 +vernemq_storage_read_microseconds_bucket{node="VerneMQ@10.10.10.20",le="1000"} 362
527 +vernemq_storage_read_microseconds_bucket{node="VerneMQ@10.10.10.20",le="100"} 350
528 +vernemq_storage_read_microseconds_bucket{node="VerneMQ@10.10.10.20",le="10"} 0
529 +vernemq_storage_read_microseconds_count{node="VerneMQ@10.10.10.20"} 362
530 +vernemq_storage_read_microseconds_sum{node="VerneMQ@10.10.10.20"} 19097
531 +# HELP vernemq_metadata_fold_microseconds A histogram of the metadata fold latency.
532 +# TYPE vernemq_metadata_fold_microseconds histogram
533 +vernemq_metadata_fold_microseconds_bucket{node="VerneMQ@10.10.10.20",le="+Inf"} 3
534 +vernemq_metadata_fold_microseconds_bucket{node="VerneMQ@10.10.10.20",le="1000000"} 3
535 +vernemq_metadata_fold_microseconds_bucket{node="VerneMQ@10.10.10.20",le="100000"} 3
536 +vernemq_metadata_fold_microseconds_bucket{node="VerneMQ@10.10.10.20",le="10000"} 3
537 +vernemq_metadata_fold_microseconds_bucket{node="VerneMQ@10.10.10.20",le="1000"} 0
538 +vernemq_metadata_fold_microseconds_bucket{node="VerneMQ@10.10.10.20",le="100"} 0
539 +vernemq_metadata_fold_microseconds_bucket{node="VerneMQ@10.10.10.20",le="10"} 0
540 +vernemq_metadata_fold_microseconds_count{node="VerneMQ@10.10.10.20"} 3
541 +vernemq_metadata_fold_microseconds_sum{node="VerneMQ@10.10.10.20"} 4332
542 +# HELP vernemq_metadata_get_microseconds A histogram of the metadata get latency.
543 +# TYPE vernemq_metadata_get_microseconds histogram
544 +vernemq_metadata_get_microseconds_bucket{node="VerneMQ@10.10.10.20",le="+Inf"} 342
545 +vernemq_metadata_get_microseconds_bucket{node="VerneMQ@10.10.10.20",le="1000000"} 342
546 +vernemq_metadata_get_microseconds_bucket{node="VerneMQ@10.10.10.20",le="100000"} 342
547 +vernemq_metadata_get_microseconds_bucket{node="VerneMQ@10.10.10.20",le="10000"} 342
548 +vernemq_metadata_get_microseconds_bucket{node="VerneMQ@10.10.10.20",le="1000"} 341
549 +vernemq_metadata_get_microseconds_bucket{node="VerneMQ@10.10.10.20",le="100"} 327
550 +vernemq_metadata_get_microseconds_bucket{node="VerneMQ@10.10.10.20",le="10"} 0
551 +vernemq_metadata_get_microseconds_count{node="VerneMQ@10.10.10.20"} 342
552 +vernemq_metadata_get_microseconds_sum{node="VerneMQ@10.10.10.20"} 23294
553 +# HELP vernemq_swc_dotkeymap_memory The number of words allocated to the SWC group dotkeymap.
554 +# TYPE vernemq_swc_dotkeymap_memory gauge
555 +vernemq_swc_dotkeymap_memory{node="VerneMQ@10.10.10.20",group="meta1"} 915
556 +vernemq_swc_dotkeymap_memory{node="VerneMQ@10.10.10.20",group="meta10"} 915
557 +vernemq_swc_dotkeymap_memory{node="VerneMQ@10.10.10.20",group="meta2"} 915
558 +vernemq_swc_dotkeymap_memory{node="VerneMQ@10.10.10.20",group="meta3"} 915
559 +vernemq_swc_dotkeymap_memory{node="VerneMQ@10.10.10.20",group="meta4"} 915
560 +vernemq_swc_dotkeymap_memory{node="VerneMQ@10.10.10.20",group="meta5"} 915
561 +vernemq_swc_dotkeymap_memory{node="VerneMQ@10.10.10.20",group="meta6"} 915
562 +vernemq_swc_dotkeymap_memory{node="VerneMQ@10.10.10.20",group="meta7"} 915
563 +vernemq_swc_dotkeymap_memory{node="VerneMQ@10.10.10.20",group="meta8"} 915
564 +vernemq_swc_dotkeymap_memory{node="VerneMQ@10.10.10.20",group="meta9"} 915
565 +# HELP vernemq_swc_object_count The number of replicated objects by this SWC group.
566 +# TYPE vernemq_swc_object_count gauge
567 +vernemq_swc_object_count{node="VerneMQ@10.10.10.20",group="meta1"} 0
568 +vernemq_swc_object_count{node="VerneMQ@10.10.10.20",group="meta10"} 0
569 +vernemq_swc_object_count{node="VerneMQ@10.10.10.20",group="meta2"} 0
570 +vernemq_swc_object_count{node="VerneMQ@10.10.10.20",group="meta3"} 0
571 +vernemq_swc_object_count{node="VerneMQ@10.10.10.20",group="meta4"} 0
572 +vernemq_swc_object_count{node="VerneMQ@10.10.10.20",group="meta5"} 0
573 +vernemq_swc_object_count{node="VerneMQ@10.10.10.20",group="meta6"} 0
574 +vernemq_swc_object_count{node="VerneMQ@10.10.10.20",group="meta7"} 0
575 +vernemq_swc_object_count{node="VerneMQ@10.10.10.20",group="meta8"} 0
576 +vernemq_swc_object_count{node="VerneMQ@10.10.10.20",group="meta9"} 0
577 +# HELP vernemq_swc_tombstone_count The number of replicated tombstones by this SWC group.
578 +# TYPE vernemq_swc_tombstone_count gauge
579 +vernemq_swc_tombstone_count{node="VerneMQ@10.10.10.20",group="meta1"} 0
580 +vernemq_swc_tombstone_count{node="VerneMQ@10.10.10.20",group="meta10"} 0
581 +vernemq_swc_tombstone_count{node="VerneMQ@10.10.10.20",group="meta2"} 0
582 +vernemq_swc_tombstone_count{node="VerneMQ@10.10.10.20",group="meta3"} 0
583 +vernemq_swc_tombstone_count{node="VerneMQ@10.10.10.20",group="meta4"} 0
584 +vernemq_swc_tombstone_count{node="VerneMQ@10.10.10.20",group="meta5"} 0
585 +vernemq_swc_tombstone_count{node="VerneMQ@10.10.10.20",group="meta6"} 0
586 +vernemq_swc_tombstone_count{node="VerneMQ@10.10.10.20",group="meta7"} 0
587 +vernemq_swc_tombstone_count{node="VerneMQ@10.10.10.20",group="meta8"} 0
588 +vernemq_swc_tombstone_count{node="VerneMQ@10.10.10.20",group="meta9"} 0
src/go/plugin/go.d/modules/vernemq/vernemq.go
+21 -17
@@ -5,6 +5,7 @@ package vernemq
5 import (
6 _ "embed"
7 "errors"
8 + "fmt"
9 "time"
10
11 "github.com/netdata/netdata/go/plugins/plugin/go.d/agent/module"
@@ -36,8 +37,8 @@ func New() *VerneMQ {
37 },
38 },
39 },
39 - charts: charts.Copy(),
40 - cache: make(map[string]bool),
40 + charts: &module.Charts{},
41 + seenNodes: make(map[string]bool),
42 }
43 }
44
@@ -46,18 +47,21 @@ type Config struct {
47 web.HTTPConfig `yaml:",inline" json:""`
48 }
49
49 -type (
50 - VerneMQ struct {
51 - module.Base
52 - Config `yaml:",inline" json:""`
50 +type VerneMQ struct {
51 + module.Base
52 + Config `yaml:",inline" json:""`
53
54 - charts *Charts
54 + charts *module.Charts
55
56 - prom prometheus.Prometheus
56 + prom prometheus.Prometheus
57
58 - cache map[string]bool
59 - }
60 -)
58 + namespace struct {
59 + found bool
60 + name string
61 + } // added in v2.0 (default is 'vernemq')
62 +
63 + seenNodes map[string]bool
64 +}
65
66 func (v *VerneMQ) Configuration() any {
67 return v.Config
@@ -65,14 +69,12 @@ func (v *VerneMQ) Configuration() any {
69
70 func (v *VerneMQ) Init() error {
71 if err := v.validateConfig(); err != nil {
68 - v.Errorf("error on validating config: %v", err)
69 - return err
72 + return fmt.Errorf("config validation: %v", err)
73 }
74
75 prom, err := v.initPrometheusClient()
76 if err != nil {
74 - v.Error(err)
75 - return err
77 + return fmt.Errorf("init prometheus client: %v", err)
78 }
79 v.prom = prom
80
@@ -82,16 +84,17 @@ func (v *VerneMQ) Init() error {
84 func (v *VerneMQ) Check() error {
85 mx, err := v.collect()
86 if err != nil {
85 - v.Error(err)
87 return err
88 }
89 +
90 if len(mx) == 0 {
91 return errors.New("no metrics collected")
92 }
93 +
94 return nil
95 }
96
94 -func (v *VerneMQ) Charts() *Charts {
97 +func (v *VerneMQ) Charts() *module.Charts {
98 return v.charts
99 }
100
@@ -104,6 +107,7 @@ func (v *VerneMQ) Collect() map[string]int64 {
107 if len(mx) == 0 {
108 return nil
109 }
110 +
111 return mx
112 }
113
src/go/plugin/go.d/modules/vernemq/vernemq_test.go
+655 -475
@@ -9,6 +9,7 @@ import (
9 "testing"
10
11 "github.com/netdata/netdata/go/plugins/plugin/go.d/agent/module"
12 + "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/web"
13
14 "github.com/stretchr/testify/assert"
15 "github.com/stretchr/testify/require"
@@ -18,16 +19,16 @@ var (
19 dataConfigJSON, _ = os.ReadFile("testdata/config.json")
20 dataConfigYAML, _ = os.ReadFile("testdata/config.yaml")
21
21 - dataVer1101MQTTv5Metrics, _ = os.ReadFile("testdata/metrics-v1.10.1-mqtt5.txt")
22 - dataUnexpectedMetrics, _ = os.ReadFile("testdata/non_vernemq.txt")
22 + dataVer1101Metrics, _ = os.ReadFile("testdata/v1.10.1/metrics.txt")
23 + dataVer201Metrics, _ = os.ReadFile("testdata/v2.0.1/metrics.txt")
24 )
25
26 func Test_testDataIsValid(t *testing.T) {
27 for name, data := range map[string][]byte{
27 - "dataConfigJSON": dataConfigJSON,
28 - "dataConfigYAML": dataConfigYAML,
29 - "dataVer1101MQTTv5Metrics": dataVer1101MQTTv5Metrics,
30 - "dataUnexpectedMetrics": dataUnexpectedMetrics,
28 + "dataConfigJSON": dataConfigJSON,
29 + "dataConfigYAML": dataConfigYAML,
30 + "dataVer1101Metrics": dataVer1101Metrics,
31 + "dataVer201Metrics": dataVer201Metrics,
32 } {
33 require.NotNil(t, data, name)
34 }
@@ -38,45 +39,36 @@ func TestVerneMQ_ConfigurationSerialize(t *testing.T) {
39 }
40
41 func TestVerneMQ_Init(t *testing.T) {
41 - verneMQ := prepareVerneMQ()
42 -
43 - assert.NoError(t, verneMQ.Init())
44 -}
45 -
46 -func TestVerneMQ_Init_ReturnsFalseIfURLIsNotSet(t *testing.T) {
47 - verneMQ := prepareVerneMQ()
48 - verneMQ.URL = ""
49 -
50 - assert.Error(t, verneMQ.Init())
51 -}
52 -
53 -func TestVerneMQ_Init_ReturnsFalseIfClientWrongTLSCA(t *testing.T) {
54 - verneMQ := prepareVerneMQ()
55 - verneMQ.ClientConfig.TLSConfig.TLSCA = "testdata/tls"
56 -
57 - assert.Error(t, verneMQ.Init())
58 -}
59 -
60 -func TestVerneMQ_Check(t *testing.T) {
61 - verneMQ, srv := prepareClientServerV1101(t)
62 - defer srv.Close()
63 -
64 - assert.NoError(t, verneMQ.Check())
65 -}
66 -
67 -func TestVerneMQ_Check_ReturnsFalseIfConnectionRefused(t *testing.T) {
68 - verneMQ := prepareVerneMQ()
69 - require.NoError(t, verneMQ.Init())
70 -
71 - assert.Error(t, verneMQ.Check())
72 -}
73 -
74 -func TestVerneMQ_Check_ReturnsFalseIfMetricsAreNotVerneMQ(t *testing.T) {
75 - verneMQ, srv := prepareClientServerNotVerneMQ(t)
76 - defer srv.Close()
77 - require.NoError(t, verneMQ.Init())
42 + tests := map[string]struct {
43 + wantFail bool
44 + config Config
45 + }{
46 + "success with default": {
47 + wantFail: false,
48 + config: New().Config,
49 + },
50 + "fail when URL not set": {
51 + wantFail: true,
52 + config: Config{
53 + HTTPConfig: web.HTTPConfig{
54 + RequestConfig: web.RequestConfig{URL: ""},
55 + },
56 + },
57 + },
58 + }
59
79 - assert.Error(t, verneMQ.Check())
60 + for name, test := range tests {
61 + t.Run(name, func(t *testing.T) {
62 + vmq := New()
63 + vmq.Config = test.config
64 +
65 + if test.wantFail {
66 + assert.Error(t, vmq.Init())
67 + } else {
68 + assert.NoError(t, vmq.Init())
69 + }
70 + })
71 + }
72 }
73
74 func TestVerneMQ_Charts(t *testing.T) {
@@ -87,477 +79,665 @@ func TestVerneMQ_Cleanup(t *testing.T) {
79 assert.NotPanics(t, New().Cleanup)
80 }
81
90 -func TestVerneMQ_Collect(t *testing.T) {
91 - verneMQ, srv := prepareClientServerV1101(t)
92 - defer srv.Close()
93 -
94 - mx := verneMQ.Collect()
95 -
96 - assert.Equal(t, v1101ExpectedMetrics, mx)
82 +func TestVerneMQ_Check(t *testing.T) {
83 + tests := map[string]struct {
84 + wantFail bool
85 + prepare func(t *testing.T) (vmq *VerneMQ, cleanup func())
86 + }{
87 + "success on valid response v1.10.1": {
88 + wantFail: false,
89 + prepare: caseOkVer1101,
90 + },
91 + "success on valid response v2.0.1": {
92 + wantFail: false,
93 + prepare: caseOkVer201,
94 + },
95 + "fail on unexpected Prometheus": {
96 + wantFail: true,
97 + prepare: caseUnexpectedPrometheusMetrics,
98 + },
99 + "fail on invalid data response": {
100 + wantFail: true,
101 + prepare: caseInvalidDataResponse,
102 + },
103 + "fail on connection refused": {
104 + wantFail: true,
105 + prepare: caseConnectionRefused,
106 + },
107 + "fail on 404 response": {
108 + wantFail: true,
109 + prepare: case404,
110 + },
111 + }
112
98 - module.TestMetricsHasAllChartsDims(t, verneMQ.Charts(), mx)
113 + for name, test := range tests {
114 + t.Run(name, func(t *testing.T) {
115 + vmq, cleanup := test.prepare(t)
116 + defer cleanup()
117 +
118 + if test.wantFail {
119 + assert.Error(t, vmq.Check())
120 + } else {
121 + assert.NoError(t, vmq.Check())
122 + }
123 + })
124 + }
125 }
126
101 -func TestVerneMQ_Collect_ReturnsNilIfConnectionRefused(t *testing.T) {
102 - verneMQ := prepareVerneMQ()
103 - require.NoError(t, verneMQ.Init())
127 +func TestVerneMQ_Collect(t *testing.T) {
128 + tests := map[string]struct {
129 + prepare func(t *testing.T) (vmq *VerneMQ, cleanup func())
130 + wantNumOfCharts int
131 + wantMetrics map[string]int64
132 + }{
133 + "success on valid response ver 1.10.1": {
134 + prepare: caseOkVer1101,
135 + wantNumOfCharts: len(nodeChartsTmpl) + len(nodeMqtt4ChartsTmpl) + len(nodeMqtt5ChartsTmpl),
136 + wantMetrics: map[string]int64{
137 + "node_VerneMQ@172.17.0.2_bytes_received": 36796908,
138 + "node_VerneMQ@172.17.0.2_bytes_sent": 23361693,
139 + "node_VerneMQ@172.17.0.2_client_expired": 0,
140 + "node_VerneMQ@172.17.0.2_cluster_bytes_dropped": 0,
141 + "node_VerneMQ@172.17.0.2_cluster_bytes_received": 0,
142 + "node_VerneMQ@172.17.0.2_cluster_bytes_sent": 0,
143 + "node_VerneMQ@172.17.0.2_mqtt4_client_keepalive_expired": 1,
144 + "node_VerneMQ@172.17.0.2_mqtt4_mqtt_connack_accepted_sent": 0,
145 + "node_VerneMQ@172.17.0.2_mqtt4_mqtt_connack_bad_credentials_sent": 0,
146 + "node_VerneMQ@172.17.0.2_mqtt4_mqtt_connack_identifier_rejected_sent": 0,
147 + "node_VerneMQ@172.17.0.2_mqtt4_mqtt_connack_not_authorized_sent": 0,
148 + "node_VerneMQ@172.17.0.2_mqtt4_mqtt_connack_sent": 338956,
149 + "node_VerneMQ@172.17.0.2_mqtt4_mqtt_connack_sent_return_code_bad_username_or_password": 4,
150 + "node_VerneMQ@172.17.0.2_mqtt4_mqtt_connack_sent_return_code_client_identifier_not_valid": 0,
151 + "node_VerneMQ@172.17.0.2_mqtt4_mqtt_connack_sent_return_code_not_authorized": 4,
152 + "node_VerneMQ@172.17.0.2_mqtt4_mqtt_connack_sent_return_code_server_unavailable": 0,
153 + "node_VerneMQ@172.17.0.2_mqtt4_mqtt_connack_sent_return_code_success": 338948,
154 + "node_VerneMQ@172.17.0.2_mqtt4_mqtt_connack_sent_return_code_unsupported_protocol_version": 0,
155 + "node_VerneMQ@172.17.0.2_mqtt4_mqtt_connack_server_unavailable_sent": 0,
156 + "node_VerneMQ@172.17.0.2_mqtt4_mqtt_connack_unacceptable_protocol_sent": 0,
157 + "node_VerneMQ@172.17.0.2_mqtt4_mqtt_connect_received": 338956,
158 + "node_VerneMQ@172.17.0.2_mqtt4_mqtt_disconnect_received": 107,
159 + "node_VerneMQ@172.17.0.2_mqtt4_mqtt_invalid_msg_size_error": 0,
160 + "node_VerneMQ@172.17.0.2_mqtt4_mqtt_pingreq_received": 205,
161 + "node_VerneMQ@172.17.0.2_mqtt4_mqtt_pingresp_sent": 205,
162 + "node_VerneMQ@172.17.0.2_mqtt4_mqtt_puback_invalid_error": 0,
163 + "node_VerneMQ@172.17.0.2_mqtt4_mqtt_puback_received": 525694,
164 + "node_VerneMQ@172.17.0.2_mqtt4_mqtt_puback_sent": 537068,
165 + "node_VerneMQ@172.17.0.2_mqtt4_mqtt_pubcomp_invalid_error": 0,
166 + "node_VerneMQ@172.17.0.2_mqtt4_mqtt_pubcomp_received": 0,
167 + "node_VerneMQ@172.17.0.2_mqtt4_mqtt_pubcomp_sent": 0,
168 + "node_VerneMQ@172.17.0.2_mqtt4_mqtt_publish_auth_error": 0,
169 + "node_VerneMQ@172.17.0.2_mqtt4_mqtt_publish_error": 0,
170 + "node_VerneMQ@172.17.0.2_mqtt4_mqtt_publish_received": 537088,
171 + "node_VerneMQ@172.17.0.2_mqtt4_mqtt_publish_sent": 525721,
172 + "node_VerneMQ@172.17.0.2_mqtt4_mqtt_pubrec_invalid_error": 0,
173 + "node_VerneMQ@172.17.0.2_mqtt4_mqtt_pubrec_received": 0,
174 + "node_VerneMQ@172.17.0.2_mqtt4_mqtt_pubrec_sent": 0,
175 + "node_VerneMQ@172.17.0.2_mqtt4_mqtt_pubrel_received": 0,
176 + "node_VerneMQ@172.17.0.2_mqtt4_mqtt_pubrel_sent": 0,
177 + "node_VerneMQ@172.17.0.2_mqtt4_mqtt_suback_sent": 122,
178 + "node_VerneMQ@172.17.0.2_mqtt4_mqtt_subscribe_auth_error": 0,
179 + "node_VerneMQ@172.17.0.2_mqtt4_mqtt_subscribe_error": 0,
180 + "node_VerneMQ@172.17.0.2_mqtt4_mqtt_subscribe_received": 122,
181 + "node_VerneMQ@172.17.0.2_mqtt4_mqtt_unsuback_sent": 108,
182 + "node_VerneMQ@172.17.0.2_mqtt4_mqtt_unsubscribe_error": 0,
183 + "node_VerneMQ@172.17.0.2_mqtt4_mqtt_unsubscribe_received": 108,
184 + "node_VerneMQ@172.17.0.2_mqtt5_client_keepalive_expired": 0,
185 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_auth_received": 0,
186 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_auth_received_reason_code_continue_authentication": 0,
187 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_auth_received_reason_code_reauthenticate": 0,
188 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_auth_received_reason_code_success": 0,
189 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_auth_sent": 0,
190 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_auth_sent_reason_code_continue_authentication": 0,
191 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_auth_sent_reason_code_reauthenticate": 0,
192 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_auth_sent_reason_code_success": 0,
193 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_connack_sent": 0,
194 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_connack_sent_reason_code_bad_authentication_method": 0,
195 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_connack_sent_reason_code_bad_username_or_password": 0,
196 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_connack_sent_reason_code_banned": 0,
197 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_connack_sent_reason_code_client_identifier_not_valid": 0,
198 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_connack_sent_reason_code_connection_rate_exceeded": 0,
199 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_connack_sent_reason_code_impl_specific_error": 0,
200 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_connack_sent_reason_code_malformed_packet": 0,
201 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_connack_sent_reason_code_not_authorized": 0,
202 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_connack_sent_reason_code_packet_too_large": 0,
203 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_connack_sent_reason_code_payload_format_invalid": 0,
204 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_connack_sent_reason_code_protocol_error": 0,
205 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_connack_sent_reason_code_qos_not_supported": 0,
206 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_connack_sent_reason_code_quota_exceeded": 0,
207 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_connack_sent_reason_code_retain_not_supported": 0,
208 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_connack_sent_reason_code_server_busy": 0,
209 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_connack_sent_reason_code_server_moved": 0,
210 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_connack_sent_reason_code_server_unavailable": 0,
211 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_connack_sent_reason_code_success": 0,
212 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_connack_sent_reason_code_topic_name_invalid": 0,
213 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_connack_sent_reason_code_unspecified_error": 0,
214 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_connack_sent_reason_code_unsupported_protocol_version": 0,
215 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_connack_sent_reason_code_use_another_server": 0,
216 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_connect_received": 0,
217 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_received": 0,
218 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_received_reason_code_administrative_action": 0,
219 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_received_reason_code_disconnect_with_will_msg": 0,
220 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_received_reason_code_impl_specific_error": 0,
221 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_received_reason_code_malformed_packet": 0,
222 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_received_reason_code_message_rate_too_high": 0,
223 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_received_reason_code_normal_disconnect": 0,
224 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_received_reason_code_packet_too_large": 0,
225 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_received_reason_code_payload_format_invalid": 0,
226 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_received_reason_code_protocol_error": 0,
227 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_received_reason_code_quota_exceeded": 0,
228 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_received_reason_code_receive_max_exceeded": 0,
229 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_received_reason_code_topic_alias_invalid": 0,
230 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_received_reason_code_topic_name_invalid": 0,
231 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_received_reason_code_unspecified_error": 0,
232 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_sent": 0,
233 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_sent_reason_code_administrative_action": 0,
234 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_sent_reason_code_connection_rate_exceeded": 0,
235 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_sent_reason_code_impl_specific_error": 0,
236 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_sent_reason_code_keep_alive_timeout": 0,
237 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_sent_reason_code_malformed_packet": 0,
238 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_sent_reason_code_max_connect_time": 0,
239 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_sent_reason_code_message_rate_too_high": 0,
240 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_sent_reason_code_normal_disconnect": 0,
241 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_sent_reason_code_not_authorized": 0,
242 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_sent_reason_code_packet_too_large": 0,
243 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_sent_reason_code_payload_format_invalid": 0,
244 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_sent_reason_code_protocol_error": 0,
245 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_sent_reason_code_qos_not_supported": 0,
246 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_sent_reason_code_quota_exceeded": 0,
247 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_sent_reason_code_receive_max_exceeded": 0,
248 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_sent_reason_code_retain_not_supported": 0,
249 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_sent_reason_code_server_busy": 0,
250 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_sent_reason_code_server_moved": 0,
251 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_sent_reason_code_server_shutting_down": 0,
252 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_sent_reason_code_session_taken_over": 0,
253 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_sent_reason_code_shared_subs_not_supported": 0,
254 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_sent_reason_code_subscription_ids_not_supported": 0,
255 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_sent_reason_code_topic_alias_invalid": 0,
256 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_sent_reason_code_topic_filter_invalid": 0,
257 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_sent_reason_code_topic_name_invalid": 0,
258 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_sent_reason_code_unspecified_error": 0,
259 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_sent_reason_code_use_another_server": 0,
260 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_disconnect_sent_reason_code_wildcard_subs_not_supported": 0,
261 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_invalid_msg_size_error": 0,
262 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pingreq_received": 0,
263 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pingresp_sent": 0,
264 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_puback_invalid_error": 0,
265 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_puback_received": 0,
266 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_puback_received_reason_code_impl_specific_error": 0,
267 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_puback_received_reason_code_no_matching_subscribers": 0,
268 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_puback_received_reason_code_not_authorized": 0,
269 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_puback_received_reason_code_packet_id_in_use": 0,
270 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_puback_received_reason_code_payload_format_invalid": 0,
271 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_puback_received_reason_code_quota_exceeded": 0,
272 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_puback_received_reason_code_success": 0,
273 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_puback_received_reason_code_topic_name_invalid": 0,
274 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_puback_received_reason_code_unspecified_error": 0,
275 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_puback_sent": 0,
276 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_puback_sent_reason_code_impl_specific_error": 0,
277 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_puback_sent_reason_code_no_matching_subscribers": 0,
278 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_puback_sent_reason_code_not_authorized": 0,
279 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_puback_sent_reason_code_packet_id_in_use": 0,
280 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_puback_sent_reason_code_payload_format_invalid": 0,
281 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_puback_sent_reason_code_quota_exceeded": 0,
282 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_puback_sent_reason_code_success": 0,
283 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_puback_sent_reason_code_topic_name_invalid": 0,
284 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_puback_sent_reason_code_unspecified_error": 0,
285 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pubcomp_invalid_error": 0,
286 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pubcomp_received": 0,
287 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pubcomp_received_reason_code_packet_id_not_found": 0,
288 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pubcomp_received_reason_code_success": 0,
289 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pubcomp_sent": 0,
290 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pubcomp_sent_reason_code_packet_id_not_found": 0,
291 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pubcomp_sent_reason_code_success": 0,
292 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_publish_auth_error": 0,
293 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_publish_error": 0,
294 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_publish_received": 0,
295 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_publish_sent": 0,
296 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pubrec_received": 0,
297 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pubrec_received_reason_code_impl_specific_error": 0,
298 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pubrec_received_reason_code_no_matching_subscribers": 0,
299 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pubrec_received_reason_code_not_authorized": 0,
300 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pubrec_received_reason_code_packet_id_in_use": 0,
301 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pubrec_received_reason_code_payload_format_invalid": 0,
302 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pubrec_received_reason_code_quota_exceeded": 0,
303 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pubrec_received_reason_code_success": 0,
304 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pubrec_received_reason_code_topic_name_invalid": 0,
305 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pubrec_received_reason_code_unspecified_error": 0,
306 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pubrec_sent": 0,
307 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pubrec_sent_reason_code_impl_specific_error": 0,
308 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pubrec_sent_reason_code_no_matching_subscribers": 0,
309 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pubrec_sent_reason_code_not_authorized": 0,
310 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pubrec_sent_reason_code_packet_id_in_use": 0,
311 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pubrec_sent_reason_code_payload_format_invalid": 0,
312 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pubrec_sent_reason_code_quota_exceeded": 0,
313 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pubrec_sent_reason_code_success": 0,
314 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pubrec_sent_reason_code_topic_name_invalid": 0,
315 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pubrec_sent_reason_code_unspecified_error": 0,
316 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pubrel_received": 0,
317 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pubrel_received_reason_code_packet_id_not_found": 0,
318 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pubrel_received_reason_code_success": 0,
319 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pubrel_sent": 0,
320 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pubrel_sent_reason_code_packet_id_not_found": 0,
321 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_pubrel_sent_reason_code_success": 0,
322 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_suback_sent": 0,
323 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_subscribe_auth_error": 0,
324 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_subscribe_error": 0,
325 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_subscribe_received": 0,
326 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_unsuback_sent": 0,
327 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_unsubscribe_error": 0,
328 + "node_VerneMQ@172.17.0.2_mqtt5_mqtt_unsubscribe_received": 0,
329 + "node_VerneMQ@172.17.0.2_netsplit_detected": 0,
330 + "node_VerneMQ@172.17.0.2_netsplit_resolved": 0,
331 + "node_VerneMQ@172.17.0.2_netsplit_unresolved": 0,
332 + "node_VerneMQ@172.17.0.2_open_sockets": 0,
333 + "node_VerneMQ@172.17.0.2_queue_initialized_from_storage": 0,
334 + "node_VerneMQ@172.17.0.2_queue_message_drop": 0,
335 + "node_VerneMQ@172.17.0.2_queue_message_expired": 0,
336 + "node_VerneMQ@172.17.0.2_queue_message_in": 525722,
337 + "node_VerneMQ@172.17.0.2_queue_message_out": 525721,
338 + "node_VerneMQ@172.17.0.2_queue_message_unhandled": 1,
339 + "node_VerneMQ@172.17.0.2_queue_processes": 0,
340 + "node_VerneMQ@172.17.0.2_queue_setup": 338948,
341 + "node_VerneMQ@172.17.0.2_queue_teardown": 338948,
342 + "node_VerneMQ@172.17.0.2_retain_memory": 11344,
343 + "node_VerneMQ@172.17.0.2_retain_messages": 0,
344 + "node_VerneMQ@172.17.0.2_router_matches_local": 525722,
345 + "node_VerneMQ@172.17.0.2_router_matches_remote": 0,
346 + "node_VerneMQ@172.17.0.2_router_memory": 12752,
347 + "node_VerneMQ@172.17.0.2_router_subscriptions": 0,
348 + "node_VerneMQ@172.17.0.2_socket_close": 338956,
349 + "node_VerneMQ@172.17.0.2_socket_close_timeout": 0,
350 + "node_VerneMQ@172.17.0.2_socket_error": 0,
351 + "node_VerneMQ@172.17.0.2_socket_open": 338956,
352 + "node_VerneMQ@172.17.0.2_system_context_switches": 39088198,
353 + "node_VerneMQ@172.17.0.2_system_exact_reductions": 3854024620,
354 + "node_VerneMQ@172.17.0.2_system_gc_count": 12189976,
355 + "node_VerneMQ@172.17.0.2_system_io_in": 68998296,
356 + "node_VerneMQ@172.17.0.2_system_io_out": 961001488,
357 + "node_VerneMQ@172.17.0.2_system_process_count": 329,
358 + "node_VerneMQ@172.17.0.2_system_reductions": 3857458067,
359 + "node_VerneMQ@172.17.0.2_system_run_queue": 0,
360 + "node_VerneMQ@172.17.0.2_system_runtime": 1775355,
361 + "node_VerneMQ@172.17.0.2_system_utilization": 9,
362 + "node_VerneMQ@172.17.0.2_system_wallclock": 163457858,
363 + "node_VerneMQ@172.17.0.2_system_words_reclaimed_by_gc": 7158470019,
364 + "node_VerneMQ@172.17.0.2_vm_memory_atom": 768953,
365 + "node_VerneMQ@172.17.0.2_vm_memory_atom_used": 755998,
366 + "node_VerneMQ@172.17.0.2_vm_memory_binary": 1293672,
367 + "node_VerneMQ@172.17.0.2_vm_memory_code": 11372082,
368 + "node_VerneMQ@172.17.0.2_vm_memory_ets": 6065944,
369 + "node_VerneMQ@172.17.0.2_vm_memory_processes": 8673288,
370 + "node_VerneMQ@172.17.0.2_vm_memory_processes_used": 8671232,
371 + "node_VerneMQ@172.17.0.2_vm_memory_system": 27051848,
372 + "node_VerneMQ@172.17.0.2_vm_memory_total": 35725136,
373 + },
374 + },
375 + "success on valid response ver 2.0.1": {
376 + prepare: caseOkVer201,
377 + wantNumOfCharts: len(nodeChartsTmpl) + len(nodeMqtt4ChartsTmpl) + len(nodeMqtt5ChartsTmpl),
378 + wantMetrics: map[string]int64{
379 + "node_VerneMQ@10.10.10.20_active_mqtt_connections": 0,
380 + "node_VerneMQ@10.10.10.20_active_mqttws_connections": 0,
381 + "node_VerneMQ@10.10.10.20_bytes_received": 0,
382 + "node_VerneMQ@10.10.10.20_bytes_sent": 0,
383 + "node_VerneMQ@10.10.10.20_client_expired": 0,
384 + "node_VerneMQ@10.10.10.20_cluster_bytes_dropped": 0,
385 + "node_VerneMQ@10.10.10.20_cluster_bytes_received": 0,
386 + "node_VerneMQ@10.10.10.20_cluster_bytes_sent": 0,
387 + "node_VerneMQ@10.10.10.20_mqtt4_client_keepalive_expired": 0,
388 + "node_VerneMQ@10.10.10.20_mqtt4_mqtt_connack_accepted_sent": 0,
389 + "node_VerneMQ@10.10.10.20_mqtt4_mqtt_connack_bad_credentials_sent": 0,
390 + "node_VerneMQ@10.10.10.20_mqtt4_mqtt_connack_identifier_rejected_sent": 0,
391 + "node_VerneMQ@10.10.10.20_mqtt4_mqtt_connack_not_authorized_sent": 0,
392 + "node_VerneMQ@10.10.10.20_mqtt4_mqtt_connack_sent": 0,
393 + "node_VerneMQ@10.10.10.20_mqtt4_mqtt_connack_sent_return_code_bad_username_or_password": 0,
394 + "node_VerneMQ@10.10.10.20_mqtt4_mqtt_connack_sent_return_code_client_identifier_not_valid": 0,
395 + "node_VerneMQ@10.10.10.20_mqtt4_mqtt_connack_sent_return_code_not_authorized": 0,
396 + "node_VerneMQ@10.10.10.20_mqtt4_mqtt_connack_sent_return_code_server_unavailable": 0,
397 + "node_VerneMQ@10.10.10.20_mqtt4_mqtt_connack_sent_return_code_success": 0,
398 + "node_VerneMQ@10.10.10.20_mqtt4_mqtt_connack_sent_return_code_unsupported_protocol_version": 0,
399 + "node_VerneMQ@10.10.10.20_mqtt4_mqtt_connack_server_unavailable_sent": 0,
400 + "node_VerneMQ@10.10.10.20_mqtt4_mqtt_connack_unacceptable_protocol_sent": 0,
401 + "node_VerneMQ@10.10.10.20_mqtt4_mqtt_connect_received": 0,
402 + "node_VerneMQ@10.10.10.20_mqtt4_mqtt_disconnect_received": 0,
403 + "node_VerneMQ@10.10.10.20_mqtt4_mqtt_invalid_msg_size_error": 0,
404 + "node_VerneMQ@10.10.10.20_mqtt4_mqtt_pingreq_received": 0,
405 + "node_VerneMQ@10.10.10.20_mqtt4_mqtt_pingresp_sent": 0,
406 + "node_VerneMQ@10.10.10.20_mqtt4_mqtt_puback_invalid_error": 0,
407 + "node_VerneMQ@10.10.10.20_mqtt4_mqtt_puback_received": 0,
408 + "node_VerneMQ@10.10.10.20_mqtt4_mqtt_puback_sent": 0,
409 + "node_VerneMQ@10.10.10.20_mqtt4_mqtt_pubcomp_invalid_error": 0,
410 + "node_VerneMQ@10.10.10.20_mqtt4_mqtt_pubcomp_received": 0,
411 + "node_VerneMQ@10.10.10.20_mqtt4_mqtt_pubcomp_sent": 0,
412 + "node_VerneMQ@10.10.10.20_mqtt4_mqtt_publish_auth_error": 0,
413 + "node_VerneMQ@10.10.10.20_mqtt4_mqtt_publish_error": 0,
414 + "node_VerneMQ@10.10.10.20_mqtt4_mqtt_publish_received": 0,
415 + "node_VerneMQ@10.10.10.20_mqtt4_mqtt_publish_sent": 0,
416 + "node_VerneMQ@10.10.10.20_mqtt4_mqtt_pubrec_invalid_error": 0,
417 + "node_VerneMQ@10.10.10.20_mqtt4_mqtt_pubrec_received": 0,
418 + "node_VerneMQ@10.10.10.20_mqtt4_mqtt_pubrec_sent": 0,
419 + "node_VerneMQ@10.10.10.20_mqtt4_mqtt_pubrel_received": 0,
420 + "node_VerneMQ@10.10.10.20_mqtt4_mqtt_pubrel_sent": 0,
421 + "node_VerneMQ@10.10.10.20_mqtt4_mqtt_suback_sent": 0,
422 + "node_VerneMQ@10.10.10.20_mqtt4_mqtt_subscribe_auth_error": 0,
423 + "node_VerneMQ@10.10.10.20_mqtt4_mqtt_subscribe_error": 0,
424 + "node_VerneMQ@10.10.10.20_mqtt4_mqtt_subscribe_received": 0,
425 + "node_VerneMQ@10.10.10.20_mqtt4_mqtt_unsuback_sent": 0,
426 + "node_VerneMQ@10.10.10.20_mqtt4_mqtt_unsubscribe_error": 0,
427 + "node_VerneMQ@10.10.10.20_mqtt4_mqtt_unsubscribe_received": 0,
428 + "node_VerneMQ@10.10.10.20_mqtt5_client_keepalive_expired": 0,
429 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_auth_received": 0,
430 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_auth_received_reason_code_continue_authentication": 0,
431 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_auth_received_reason_code_reauthenticate": 0,
432 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_auth_received_reason_code_success": 0,
433 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_auth_sent": 0,
434 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_auth_sent_reason_code_continue_authentication": 0,
435 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_auth_sent_reason_code_reauthenticate": 0,
436 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_auth_sent_reason_code_success": 0,
437 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_connack_sent": 0,
438 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_connack_sent_reason_code_bad_authentication_method": 0,
439 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_connack_sent_reason_code_bad_username_or_password": 0,
440 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_connack_sent_reason_code_banned": 0,
441 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_connack_sent_reason_code_client_identifier_not_valid": 0,
442 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_connack_sent_reason_code_connection_rate_exceeded": 0,
443 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_connack_sent_reason_code_impl_specific_error": 0,
444 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_connack_sent_reason_code_malformed_packet": 0,
445 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_connack_sent_reason_code_not_authorized": 0,
446 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_connack_sent_reason_code_packet_too_large": 0,
447 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_connack_sent_reason_code_payload_format_invalid": 0,
448 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_connack_sent_reason_code_protocol_error": 0,
449 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_connack_sent_reason_code_qos_not_supported": 0,
450 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_connack_sent_reason_code_quota_exceeded": 0,
451 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_connack_sent_reason_code_retain_not_supported": 0,
452 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_connack_sent_reason_code_server_busy": 0,
453 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_connack_sent_reason_code_server_moved": 0,
454 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_connack_sent_reason_code_server_unavailable": 0,
455 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_connack_sent_reason_code_success": 0,
456 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_connack_sent_reason_code_topic_name_invalid": 0,
457 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_connack_sent_reason_code_unspecified_error": 0,
458 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_connack_sent_reason_code_unsupported_protocol_version": 0,
459 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_connack_sent_reason_code_use_another_server": 0,
460 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_connect_received": 0,
461 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_received": 0,
462 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_received_reason_code_administrative_action": 0,
463 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_received_reason_code_disconnect_with_will_msg": 0,
464 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_received_reason_code_impl_specific_error": 0,
465 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_received_reason_code_malformed_packet": 0,
466 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_received_reason_code_message_rate_too_high": 0,
467 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_received_reason_code_normal_disconnect": 0,
468 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_received_reason_code_packet_too_large": 0,
469 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_received_reason_code_payload_format_invalid": 0,
470 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_received_reason_code_protocol_error": 0,
471 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_received_reason_code_quota_exceeded": 0,
472 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_received_reason_code_receive_max_exceeded": 0,
473 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_received_reason_code_topic_alias_invalid": 0,
474 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_received_reason_code_topic_name_invalid": 0,
475 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_received_reason_code_unspecified_error": 0,
476 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_sent": 0,
477 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_sent_reason_code_administrative_action": 0,
478 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_sent_reason_code_connection_rate_exceeded": 0,
479 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_sent_reason_code_impl_specific_error": 0,
480 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_sent_reason_code_keep_alive_timeout": 0,
481 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_sent_reason_code_malformed_packet": 0,
482 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_sent_reason_code_max_connect_time": 0,
483 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_sent_reason_code_message_rate_too_high": 0,
484 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_sent_reason_code_normal_disconnect": 0,
485 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_sent_reason_code_not_authorized": 0,
486 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_sent_reason_code_packet_too_large": 0,
487 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_sent_reason_code_payload_format_invalid": 0,
488 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_sent_reason_code_protocol_error": 0,
489 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_sent_reason_code_qos_not_supported": 0,
490 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_sent_reason_code_quota_exceeded": 0,
491 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_sent_reason_code_receive_max_exceeded": 0,
492 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_sent_reason_code_retain_not_supported": 0,
493 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_sent_reason_code_server_busy": 0,
494 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_sent_reason_code_server_moved": 0,
495 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_sent_reason_code_server_shutting_down": 0,
496 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_sent_reason_code_session_taken_over": 0,
497 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_sent_reason_code_shared_subs_not_supported": 0,
498 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_sent_reason_code_subscription_ids_not_supported": 0,
499 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_sent_reason_code_topic_alias_invalid": 0,
500 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_sent_reason_code_topic_filter_invalid": 0,
501 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_sent_reason_code_topic_name_invalid": 0,
502 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_sent_reason_code_unspecified_error": 0,
503 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_sent_reason_code_use_another_server": 0,
504 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_disconnect_sent_reason_code_wildcard_subs_not_supported": 0,
505 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_invalid_msg_size_error": 0,
506 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pingreq_received": 0,
507 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pingresp_sent": 0,
508 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_puback_invalid_error": 0,
509 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_puback_received": 0,
510 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_puback_received_reason_code_impl_specific_error": 0,
511 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_puback_received_reason_code_no_matching_subscribers": 0,
512 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_puback_received_reason_code_not_authorized": 0,
513 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_puback_received_reason_code_packet_id_in_use": 0,
514 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_puback_received_reason_code_payload_format_invalid": 0,
515 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_puback_received_reason_code_quota_exceeded": 0,
516 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_puback_received_reason_code_success": 0,
517 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_puback_received_reason_code_topic_name_invalid": 0,
518 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_puback_received_reason_code_unspecified_error": 0,
519 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_puback_sent": 0,
520 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_puback_sent_reason_code_impl_specific_error": 0,
521 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_puback_sent_reason_code_no_matching_subscribers": 0,
522 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_puback_sent_reason_code_not_authorized": 0,
523 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_puback_sent_reason_code_packet_id_in_use": 0,
524 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_puback_sent_reason_code_payload_format_invalid": 0,
525 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_puback_sent_reason_code_quota_exceeded": 0,
526 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_puback_sent_reason_code_success": 0,
527 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_puback_sent_reason_code_topic_name_invalid": 0,
528 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_puback_sent_reason_code_unspecified_error": 0,
529 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pubcomp_invalid_error": 0,
530 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pubcomp_received": 0,
531 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pubcomp_received_reason_code_packet_id_not_found": 0,
532 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pubcomp_received_reason_code_success": 0,
533 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pubcomp_sent": 0,
534 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pubcomp_sent_reason_code_packet_id_not_found": 0,
535 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pubcomp_sent_reason_code_success": 0,
536 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_publish_auth_error": 0,
537 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_publish_error": 0,
538 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_publish_received": 0,
539 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_publish_sent": 0,
540 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pubrec_received": 0,
541 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pubrec_received_reason_code_impl_specific_error": 0,
542 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pubrec_received_reason_code_no_matching_subscribers": 0,
543 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pubrec_received_reason_code_not_authorized": 0,
544 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pubrec_received_reason_code_packet_id_in_use": 0,
545 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pubrec_received_reason_code_payload_format_invalid": 0,
546 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pubrec_received_reason_code_quota_exceeded": 0,
547 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pubrec_received_reason_code_success": 0,
548 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pubrec_received_reason_code_topic_name_invalid": 0,
549 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pubrec_received_reason_code_unspecified_error": 0,
550 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pubrec_sent": 0,
551 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pubrec_sent_reason_code_impl_specific_error": 0,
552 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pubrec_sent_reason_code_no_matching_subscribers": 0,
553 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pubrec_sent_reason_code_not_authorized": 0,
554 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pubrec_sent_reason_code_packet_id_in_use": 0,
555 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pubrec_sent_reason_code_payload_format_invalid": 0,
556 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pubrec_sent_reason_code_quota_exceeded": 0,
557 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pubrec_sent_reason_code_success": 0,
558 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pubrec_sent_reason_code_topic_name_invalid": 0,
559 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pubrec_sent_reason_code_unspecified_error": 0,
560 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pubrel_received": 0,
561 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pubrel_received_reason_code_packet_id_not_found": 0,
562 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pubrel_received_reason_code_success": 0,
563 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pubrel_sent": 0,
564 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pubrel_sent_reason_code_packet_id_not_found": 0,
565 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_pubrel_sent_reason_code_success": 0,
566 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_suback_sent": 0,
567 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_subscribe_auth_error": 0,
568 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_subscribe_error": 0,
569 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_subscribe_received": 0,
570 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_unsuback_sent": 0,
571 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_unsubscribe_error": 0,
572 + "node_VerneMQ@10.10.10.20_mqtt5_mqtt_unsubscribe_received": 0,
573 + "node_VerneMQ@10.10.10.20_netsplit_detected": 0,
574 + "node_VerneMQ@10.10.10.20_netsplit_resolved": 0,
575 + "node_VerneMQ@10.10.10.20_netsplit_unresolved": 0,
576 + "node_VerneMQ@10.10.10.20_open_sockets": 0,
577 + "node_VerneMQ@10.10.10.20_queue_initialized_from_storage": 0,
578 + "node_VerneMQ@10.10.10.20_queue_message_drop": 0,
579 + "node_VerneMQ@10.10.10.20_queue_message_expired": 0,
580 + "node_VerneMQ@10.10.10.20_queue_message_in": 0,
581 + "node_VerneMQ@10.10.10.20_queue_message_out": 0,
582 + "node_VerneMQ@10.10.10.20_queue_message_unhandled": 0,
583 + "node_VerneMQ@10.10.10.20_queue_processes": 0,
584 + "node_VerneMQ@10.10.10.20_queue_setup": 0,
585 + "node_VerneMQ@10.10.10.20_queue_teardown": 0,
586 + "node_VerneMQ@10.10.10.20_retain_memory": 15792,
587 + "node_VerneMQ@10.10.10.20_retain_messages": 0,
588 + "node_VerneMQ@10.10.10.20_router_matches_local": 0,
589 + "node_VerneMQ@10.10.10.20_router_matches_remote": 0,
590 + "node_VerneMQ@10.10.10.20_router_memory": 20224,
591 + "node_VerneMQ@10.10.10.20_router_subscriptions": 0,
592 + "node_VerneMQ@10.10.10.20_socket_close": 0,
593 + "node_VerneMQ@10.10.10.20_socket_close_timeout": 0,
594 + "node_VerneMQ@10.10.10.20_socket_error": 0,
595 + "node_VerneMQ@10.10.10.20_socket_open": 0,
596 + "node_VerneMQ@10.10.10.20_system_context_switches": 3902972,
597 + "node_VerneMQ@10.10.10.20_system_exact_reductions": 340307987,
598 + "node_VerneMQ@10.10.10.20_system_gc_count": 355236,
599 + "node_VerneMQ@10.10.10.20_system_io_in": 30616669,
600 + "node_VerneMQ@10.10.10.20_system_io_out": 1702500,
601 + "node_VerneMQ@10.10.10.20_system_process_count": 465,
602 + "node_VerneMQ@10.10.10.20_system_reductions": 340640218,
603 + "node_VerneMQ@10.10.10.20_system_run_queue": 0,
604 + "node_VerneMQ@10.10.10.20_system_runtime": 54249,
605 + "node_VerneMQ@10.10.10.20_system_utilization": 5,
606 + "node_VerneMQ@10.10.10.20_system_wallclock": 51082602,
607 + "node_VerneMQ@10.10.10.20_system_words_reclaimed_by_gc": 661531058,
608 + "node_VerneMQ@10.10.10.20_total_active_connections": 0,
609 + "node_VerneMQ@10.10.10.20_vm_memory_atom": 639193,
610 + "node_VerneMQ@10.10.10.20_vm_memory_atom_used": 634383,
611 + "node_VerneMQ@10.10.10.20_vm_memory_binary": 729792,
612 + "node_VerneMQ@10.10.10.20_vm_memory_code": 13546686,
613 + "node_VerneMQ@10.10.10.20_vm_memory_ets": 6665000,
614 + "node_VerneMQ@10.10.10.20_vm_memory_processes": 13754320,
615 + "node_VerneMQ@10.10.10.20_vm_memory_processes_used": 13751224,
616 + "node_VerneMQ@10.10.10.20_vm_memory_system": 44839192,
617 + "node_VerneMQ@10.10.10.20_vm_memory_total": 58593512,
618 + },
619 + },
620 + "fails on unexpected Prometheus response": {
621 + prepare: caseUnexpectedPrometheusMetrics,
622 + wantMetrics: nil,
623 + },
624 + "fails on invalid data response": {
625 + prepare: caseInvalidDataResponse,
626 + wantMetrics: nil,
627 + },
628 + "fails on connection refused": {
629 + prepare: caseConnectionRefused,
630 + wantMetrics: nil,
631 + },
632 + "fails on 404 response": {
633 + prepare: case404,
634 + wantMetrics: nil,
635 + },
636 + }
637
105 - assert.Nil(t, verneMQ.Collect())
106 -}
638 + for name, test := range tests {
639 + t.Run(name, func(t *testing.T) {
640 + vmq, cleanup := test.prepare(t)
641 + defer cleanup()
642
108 -func TestVerneMQ_Collect_ReturnsNilIfMetricsAreNotVerneMQ(t *testing.T) {
109 - verneMQ, srv := prepareClientServerNotVerneMQ(t)
110 - defer srv.Close()
643 + mx := vmq.Collect()
644
112 - assert.Nil(t, verneMQ.Collect())
113 -}
645 + require.Equal(t, test.wantMetrics, mx)
646
115 -func TestVerneMQ_Collect_ReturnsNilIfReceiveInvalidResponse(t *testing.T) {
116 - verneMQ, ts := prepareClientServerInvalid(t)
117 - defer ts.Close()
647 + if len(test.wantMetrics) > 0 {
648 + assert.Equal(t, test.wantNumOfCharts, len(*vmq.Charts()), "want charts")
649
119 - assert.Nil(t, verneMQ.Collect())
650 + module.TestMetricsHasAllChartsDims(t, vmq.Charts(), mx)
651 + }
652 + })
653 + }
654 }
655
122 -func TestVerneMQ_Collect_ReturnsNilIfReceiveResponse404(t *testing.T) {
123 - verneMQ, ts := prepareClientServerResponse404(t)
124 - defer ts.Close()
656 +func caseOkVer201(t *testing.T) (*VerneMQ, func()) {
657 + t.Helper()
658 + srv := httptest.NewServer(http.HandlerFunc(
659 + func(w http.ResponseWriter, r *http.Request) {
660 + _, _ = w.Write(dataVer201Metrics)
661 + }))
662
126 - assert.Nil(t, verneMQ.Collect())
127 -}
663 + vmq := New()
664 + vmq.URL = srv.URL
665 + require.NoError(t, vmq.Init())
666
129 -func prepareVerneMQ() *VerneMQ {
130 - verneMQ := New()
131 - verneMQ.URL = "http://127.0.0.1:38001/metrics"
132 - return verneMQ
667 + return vmq, srv.Close
668 }
669
135 -func prepareClientServerV1101(t *testing.T) (*VerneMQ, *httptest.Server) {
670 +func caseOkVer1101(t *testing.T) (*VerneMQ, func()) {
671 t.Helper()
137 - ts := httptest.NewServer(http.HandlerFunc(
672 + srv := httptest.NewServer(http.HandlerFunc(
673 func(w http.ResponseWriter, r *http.Request) {
139 - _, _ = w.Write(dataVer1101MQTTv5Metrics)
674 + _, _ = w.Write(dataVer1101Metrics)
675 }))
676
142 - verneMQ := New()
143 - verneMQ.URL = ts.URL
144 - require.NoError(t, verneMQ.Init())
677 + vmq := New()
678 + vmq.URL = srv.URL
679 + require.NoError(t, vmq.Init())
680
146 - return verneMQ, ts
681 + return vmq, srv.Close
682 }
683
149 -func prepareClientServerNotVerneMQ(t *testing.T) (*VerneMQ, *httptest.Server) {
684 +func caseUnexpectedPrometheusMetrics(t *testing.T) (*VerneMQ, func()) {
685 + data := `
686 +# HELP wmi_os_process_memory_limix_bytes OperatingSystem.MaxProcessMemorySize
687 +# TYPE wmi_os_process_memory_limix_bytes gauge
688 +wmi_os_process_memory_limix_bytes 1.40737488224256e+14
689 +# HELP wmi_os_processes OperatingSystem.NumberOfProcesses
690 +# TYPE wmi_os_processes gauge
691 +wmi_os_processes 124
692 +# HELP wmi_os_processes_limit OperatingSystem.MaxNumberOfProcesses
693 +# TYPE wmi_os_processes_limit gauge
694 +wmi_os_processes_limit 4.294967295e+09
695 +`
696 t.Helper()
151 - ts := httptest.NewServer(http.HandlerFunc(
697 + srv := httptest.NewServer(http.HandlerFunc(
698 func(w http.ResponseWriter, r *http.Request) {
153 - _, _ = w.Write(dataUnexpectedMetrics)
699 + _, _ = w.Write([]byte(data))
700 }))
701
156 - verneMQ := New()
157 - verneMQ.URL = ts.URL
158 - require.NoError(t, verneMQ.Init())
702 + vmq := New()
703 + vmq.URL = srv.URL
704 + require.NoError(t, vmq.Init())
705
160 - return verneMQ, ts
706 + return vmq, srv.Close
707 }
708
163 -func prepareClientServerInvalid(t *testing.T) (*VerneMQ, *httptest.Server) {
709 +func caseInvalidDataResponse(t *testing.T) (*VerneMQ, func()) {
710 t.Helper()
165 - ts := httptest.NewServer(http.HandlerFunc(
711 + srv := httptest.NewServer(http.HandlerFunc(
712 func(w http.ResponseWriter, r *http.Request) {
713 _, _ = w.Write([]byte("hello and\n goodbye"))
714 }))
715 + vmq := New()
716 + vmq.URL = srv.URL
717 + require.NoError(t, vmq.Init())
718
170 - verneMQ := New()
171 - verneMQ.URL = ts.URL
172 - require.NoError(t, verneMQ.Init())
719 + return vmq, srv.Close
720 +}
721 +
722 +func caseConnectionRefused(t *testing.T) (*VerneMQ, func()) {
723 + t.Helper()
724 + vmq := New()
725 + vmq.URL = "http://127.0.0.1:65001"
726 + require.NoError(t, vmq.Init())
727
174 - return verneMQ, ts
728 + return vmq, func() {}
729 }
730
177 -func prepareClientServerResponse404(t *testing.T) (*VerneMQ, *httptest.Server) {
731 +func case404(t *testing.T) (*VerneMQ, func()) {
732 t.Helper()
179 - ts := httptest.NewServer(http.HandlerFunc(
733 + srv := httptest.NewServer(http.HandlerFunc(
734 func(w http.ResponseWriter, r *http.Request) {
735 w.WriteHeader(http.StatusNotFound)
736 }))
737
184 - verneMQ := New()
185 - verneMQ.URL = ts.URL
186 - require.NoError(t, verneMQ.Init())
187 - return verneMQ, ts
188 -}
738 + vmq := New()
739 + vmq.URL = srv.URL
740 + require.NoError(t, vmq.Init())
741
190 -var v1101ExpectedMetrics = map[string]int64{
191 - "bytes_received": 36796908,
192 - "bytes_sent": 23361693,
193 - "client_keepalive_expired": 1,
194 - "cluster_bytes_dropped": 0,
195 - "cluster_bytes_received": 0,
196 - "cluster_bytes_sent": 0,
197 - "mqtt_auth_received": 0,
198 - "mqtt_auth_received_continue_authentication": 0,
199 - "mqtt_auth_received_reauthenticate": 0,
200 - "mqtt_auth_received_success": 0,
201 - "mqtt_auth_received_v_5": 0,
202 - "mqtt_auth_received_v_5_continue_authentication": 0,
203 - "mqtt_auth_received_v_5_reauthenticate": 0,
204 - "mqtt_auth_received_v_5_success": 0,
205 - "mqtt_auth_sent": 0,
206 - "mqtt_auth_sent_continue_authentication": 0,
207 - "mqtt_auth_sent_reauthenticate": 0,
208 - "mqtt_auth_sent_success": 0,
209 - "mqtt_auth_sent_v_5": 0,
210 - "mqtt_auth_sent_v_5_continue_authentication": 0,
211 - "mqtt_auth_sent_v_5_reauthenticate": 0,
212 - "mqtt_auth_sent_v_5_success": 0,
213 - "mqtt_connack_sent": 338956,
214 - "mqtt_connack_sent_bad_authentication_method": 0,
215 - "mqtt_connack_sent_bad_username_or_password": 4,
216 - "mqtt_connack_sent_banned": 0,
217 - "mqtt_connack_sent_client_identifier_not_valid": 0,
218 - "mqtt_connack_sent_connection_rate_exceeded": 0,
219 - "mqtt_connack_sent_impl_specific_error": 0,
220 - "mqtt_connack_sent_malformed_packet": 0,
221 - "mqtt_connack_sent_not_authorized": 4,
222 - "mqtt_connack_sent_packet_too_large": 0,
223 - "mqtt_connack_sent_payload_format_invalid": 0,
224 - "mqtt_connack_sent_protocol_error": 0,
225 - "mqtt_connack_sent_qos_not_supported": 0,
226 - "mqtt_connack_sent_quota_exceeded": 0,
227 - "mqtt_connack_sent_retain_not_supported": 0,
228 - "mqtt_connack_sent_server_busy": 0,
229 - "mqtt_connack_sent_server_moved": 0,
230 - "mqtt_connack_sent_server_unavailable": 0,
231 - "mqtt_connack_sent_success": 338948,
232 - "mqtt_connack_sent_topic_name_invalid": 0,
233 - "mqtt_connack_sent_unspecified_error": 0,
234 - "mqtt_connack_sent_unsupported_protocol_version": 0,
235 - "mqtt_connack_sent_use_another_server": 0,
236 - "mqtt_connack_sent_v_4": 338956,
237 - "mqtt_connack_sent_v_4_bad_username_or_password": 4,
238 - "mqtt_connack_sent_v_4_client_identifier_not_valid": 0,
239 - "mqtt_connack_sent_v_4_not_authorized": 4,
240 - "mqtt_connack_sent_v_4_server_unavailable": 0,
241 - "mqtt_connack_sent_v_4_success": 338948,
242 - "mqtt_connack_sent_v_4_unsupported_protocol_version": 0,
243 - "mqtt_connack_sent_v_5": 0,
244 - "mqtt_connack_sent_v_5_bad_authentication_method": 0,
245 - "mqtt_connack_sent_v_5_bad_username_or_password": 0,
246 - "mqtt_connack_sent_v_5_banned": 0,
247 - "mqtt_connack_sent_v_5_client_identifier_not_valid": 0,
248 - "mqtt_connack_sent_v_5_connection_rate_exceeded": 0,
249 - "mqtt_connack_sent_v_5_impl_specific_error": 0,
250 - "mqtt_connack_sent_v_5_malformed_packet": 0,
251 - "mqtt_connack_sent_v_5_not_authorized": 0,
252 - "mqtt_connack_sent_v_5_packet_too_large": 0,
253 - "mqtt_connack_sent_v_5_payload_format_invalid": 0,
254 - "mqtt_connack_sent_v_5_protocol_error": 0,
255 - "mqtt_connack_sent_v_5_qos_not_supported": 0,
256 - "mqtt_connack_sent_v_5_quota_exceeded": 0,
257 - "mqtt_connack_sent_v_5_retain_not_supported": 0,
258 - "mqtt_connack_sent_v_5_server_busy": 0,
259 - "mqtt_connack_sent_v_5_server_moved": 0,
260 - "mqtt_connack_sent_v_5_server_unavailable": 0,
261 - "mqtt_connack_sent_v_5_success": 0,
262 - "mqtt_connack_sent_v_5_topic_name_invalid": 0,
263 - "mqtt_connack_sent_v_5_unspecified_error": 0,
264 - "mqtt_connack_sent_v_5_unsupported_protocol_version": 0,
265 - "mqtt_connack_sent_v_5_use_another_server": 0,
266 - "mqtt_connect_received": 338956,
267 - "mqtt_connect_received_v_4": 338956,
268 - "mqtt_connect_received_v_5": 0,
269 - "mqtt_disconnect_received": 107,
270 - "mqtt_disconnect_received_administrative_action": 0,
271 - "mqtt_disconnect_received_disconnect_with_will_msg": 0,
272 - "mqtt_disconnect_received_impl_specific_error": 0,
273 - "mqtt_disconnect_received_malformed_packet": 0,
274 - "mqtt_disconnect_received_message_rate_too_high": 0,
275 - "mqtt_disconnect_received_normal_disconnect": 0,
276 - "mqtt_disconnect_received_packet_too_large": 0,
277 - "mqtt_disconnect_received_payload_format_invalid": 0,
278 - "mqtt_disconnect_received_protocol_error": 0,
279 - "mqtt_disconnect_received_quota_exceeded": 0,
280 - "mqtt_disconnect_received_receive_max_exceeded": 0,
281 - "mqtt_disconnect_received_topic_alias_invalid": 0,
282 - "mqtt_disconnect_received_topic_name_invalid": 0,
283 - "mqtt_disconnect_received_unspecified_error": 0,
284 - "mqtt_disconnect_received_v_4": 107,
285 - "mqtt_disconnect_received_v_5": 0,
286 - "mqtt_disconnect_received_v_5_administrative_action": 0,
287 - "mqtt_disconnect_received_v_5_disconnect_with_will_msg": 0,
288 - "mqtt_disconnect_received_v_5_impl_specific_error": 0,
289 - "mqtt_disconnect_received_v_5_malformed_packet": 0,
290 - "mqtt_disconnect_received_v_5_message_rate_too_high": 0,
291 - "mqtt_disconnect_received_v_5_normal_disconnect": 0,
292 - "mqtt_disconnect_received_v_5_packet_too_large": 0,
293 - "mqtt_disconnect_received_v_5_payload_format_invalid": 0,
294 - "mqtt_disconnect_received_v_5_protocol_error": 0,
295 - "mqtt_disconnect_received_v_5_quota_exceeded": 0,
296 - "mqtt_disconnect_received_v_5_receive_max_exceeded": 0,
297 - "mqtt_disconnect_received_v_5_topic_alias_invalid": 0,
298 - "mqtt_disconnect_received_v_5_topic_name_invalid": 0,
299 - "mqtt_disconnect_received_v_5_unspecified_error": 0,
300 - "mqtt_disconnect_sent": 0,
301 - "mqtt_disconnect_sent_administrative_action": 0,
302 - "mqtt_disconnect_sent_connection_rate_exceeded": 0,
303 - "mqtt_disconnect_sent_impl_specific_error": 0,
304 - "mqtt_disconnect_sent_keep_alive_timeout": 0,
305 - "mqtt_disconnect_sent_malformed_packet": 0,
306 - "mqtt_disconnect_sent_max_connect_time": 0,
307 - "mqtt_disconnect_sent_message_rate_too_high": 0,
308 - "mqtt_disconnect_sent_normal_disconnect": 0,
309 - "mqtt_disconnect_sent_not_authorized": 0,
310 - "mqtt_disconnect_sent_packet_too_large": 0,
311 - "mqtt_disconnect_sent_payload_format_invalid": 0,
312 - "mqtt_disconnect_sent_protocol_error": 0,
313 - "mqtt_disconnect_sent_qos_not_supported": 0,
314 - "mqtt_disconnect_sent_quota_exceeded": 0,
315 - "mqtt_disconnect_sent_receive_max_exceeded": 0,
316 - "mqtt_disconnect_sent_retain_not_supported": 0,
317 - "mqtt_disconnect_sent_server_busy": 0,
318 - "mqtt_disconnect_sent_server_moved": 0,
319 - "mqtt_disconnect_sent_server_shutting_down": 0,
320 - "mqtt_disconnect_sent_session_taken_over": 0,
321 - "mqtt_disconnect_sent_shared_subs_not_supported": 0,
322 - "mqtt_disconnect_sent_subscription_ids_not_supported": 0,
323 - "mqtt_disconnect_sent_topic_alias_invalid": 0,
324 - "mqtt_disconnect_sent_topic_filter_invalid": 0,
325 - "mqtt_disconnect_sent_topic_name_invalid": 0,
326 - "mqtt_disconnect_sent_unspecified_error": 0,
327 - "mqtt_disconnect_sent_use_another_server": 0,
328 - "mqtt_disconnect_sent_v_5": 0,
329 - "mqtt_disconnect_sent_v_5_administrative_action": 0,
330 - "mqtt_disconnect_sent_v_5_connection_rate_exceeded": 0,
331 - "mqtt_disconnect_sent_v_5_impl_specific_error": 0,
332 - "mqtt_disconnect_sent_v_5_keep_alive_timeout": 0,
333 - "mqtt_disconnect_sent_v_5_malformed_packet": 0,
334 - "mqtt_disconnect_sent_v_5_max_connect_time": 0,
335 - "mqtt_disconnect_sent_v_5_message_rate_too_high": 0,
336 - "mqtt_disconnect_sent_v_5_normal_disconnect": 0,
337 - "mqtt_disconnect_sent_v_5_not_authorized": 0,
338 - "mqtt_disconnect_sent_v_5_packet_too_large": 0,
339 - "mqtt_disconnect_sent_v_5_payload_format_invalid": 0,
340 - "mqtt_disconnect_sent_v_5_protocol_error": 0,
341 - "mqtt_disconnect_sent_v_5_qos_not_supported": 0,
342 - "mqtt_disconnect_sent_v_5_quota_exceeded": 0,
343 - "mqtt_disconnect_sent_v_5_receive_max_exceeded": 0,
344 - "mqtt_disconnect_sent_v_5_retain_not_supported": 0,
345 - "mqtt_disconnect_sent_v_5_server_busy": 0,
346 - "mqtt_disconnect_sent_v_5_server_moved": 0,
347 - "mqtt_disconnect_sent_v_5_server_shutting_down": 0,
348 - "mqtt_disconnect_sent_v_5_session_taken_over": 0,
349 - "mqtt_disconnect_sent_v_5_shared_subs_not_supported": 0,
350 - "mqtt_disconnect_sent_v_5_subscription_ids_not_supported": 0,
351 - "mqtt_disconnect_sent_v_5_topic_alias_invalid": 0,
352 - "mqtt_disconnect_sent_v_5_topic_filter_invalid": 0,
353 - "mqtt_disconnect_sent_v_5_topic_name_invalid": 0,
354 - "mqtt_disconnect_sent_v_5_unspecified_error": 0,
355 - "mqtt_disconnect_sent_v_5_use_another_server": 0,
356 - "mqtt_disconnect_sent_v_5_wildcard_subs_not_supported": 0,
357 - "mqtt_disconnect_sent_wildcard_subs_not_supported": 0,
358 - "mqtt_invalid_msg_size_error": 0,
359 - "mqtt_invalid_msg_size_error_v_4": 0,
360 - "mqtt_invalid_msg_size_error_v_5": 0,
361 - "mqtt_pingreq_received": 205,
362 - "mqtt_pingreq_received_v_4": 205,
363 - "mqtt_pingreq_received_v_5": 0,
364 - "mqtt_pingresp_sent": 205,
365 - "mqtt_pingresp_sent_v_4": 205,
366 - "mqtt_pingresp_sent_v_5": 0,
367 - "mqtt_puback_invalid_error": 0,
368 - "mqtt_puback_invalid_error_v_4": 0,
369 - "mqtt_puback_invalid_error_v_5": 0,
370 - "mqtt_puback_received": 525694,
371 - "mqtt_puback_received_impl_specific_error": 0,
372 - "mqtt_puback_received_no_matching_subscribers": 0,
373 - "mqtt_puback_received_not_authorized": 0,
374 - "mqtt_puback_received_packet_id_in_use": 0,
375 - "mqtt_puback_received_payload_format_invalid": 0,
376 - "mqtt_puback_received_quota_exceeded": 0,
377 - "mqtt_puback_received_success": 0,
378 - "mqtt_puback_received_topic_name_invalid": 0,
379 - "mqtt_puback_received_unspecified_error": 0,
380 - "mqtt_puback_received_v_4": 525694,
381 - "mqtt_puback_received_v_5": 0,
382 - "mqtt_puback_received_v_5_impl_specific_error": 0,
383 - "mqtt_puback_received_v_5_no_matching_subscribers": 0,
384 - "mqtt_puback_received_v_5_not_authorized": 0,
385 - "mqtt_puback_received_v_5_packet_id_in_use": 0,
386 - "mqtt_puback_received_v_5_payload_format_invalid": 0,
387 - "mqtt_puback_received_v_5_quota_exceeded": 0,
388 - "mqtt_puback_received_v_5_success": 0,
389 - "mqtt_puback_received_v_5_topic_name_invalid": 0,
390 - "mqtt_puback_received_v_5_unspecified_error": 0,
391 - "mqtt_puback_sent": 537068,
392 - "mqtt_puback_sent_impl_specific_error": 0,
393 - "mqtt_puback_sent_no_matching_subscribers": 0,
394 - "mqtt_puback_sent_not_authorized": 0,
395 - "mqtt_puback_sent_packet_id_in_use": 0,
396 - "mqtt_puback_sent_payload_format_invalid": 0,
397 - "mqtt_puback_sent_quota_exceeded": 0,
398 - "mqtt_puback_sent_success": 0,
399 - "mqtt_puback_sent_topic_name_invalid": 0,
400 - "mqtt_puback_sent_unspecified_error": 0,
401 - "mqtt_puback_sent_v_4": 537068,
402 - "mqtt_puback_sent_v_5": 0,
403 - "mqtt_puback_sent_v_5_impl_specific_error": 0,
404 - "mqtt_puback_sent_v_5_no_matching_subscribers": 0,
405 - "mqtt_puback_sent_v_5_not_authorized": 0,
406 - "mqtt_puback_sent_v_5_packet_id_in_use": 0,
407 - "mqtt_puback_sent_v_5_payload_format_invalid": 0,
408 - "mqtt_puback_sent_v_5_quota_exceeded": 0,
409 - "mqtt_puback_sent_v_5_success": 0,
410 - "mqtt_puback_sent_v_5_topic_name_invalid": 0,
411 - "mqtt_puback_sent_v_5_unspecified_error": 0,
412 - "mqtt_pubcomp_invalid_error": 0,
413 - "mqtt_pubcomp_invalid_error_v_4": 0,
414 - "mqtt_pubcomp_invalid_error_v_5": 0,
415 - "mqtt_pubcomp_received": 0,
416 - "mqtt_pubcomp_received_packet_id_not_found": 0,
417 - "mqtt_pubcomp_received_success": 0,
418 - "mqtt_pubcomp_received_v_4": 0,
419 - "mqtt_pubcomp_received_v_5": 0,
420 - "mqtt_pubcomp_received_v_5_packet_id_not_found": 0,
421 - "mqtt_pubcomp_received_v_5_success": 0,
422 - "mqtt_pubcomp_sent": 0,
423 - "mqtt_pubcomp_sent_packet_id_not_found": 0,
424 - "mqtt_pubcomp_sent_success": 0,
425 - "mqtt_pubcomp_sent_v_4": 0,
426 - "mqtt_pubcomp_sent_v_5": 0,
427 - "mqtt_pubcomp_sent_v_5_packet_id_not_found": 0,
428 - "mqtt_pubcomp_sent_v_5_success": 0,
429 - "mqtt_publish_auth_error": 0,
430 - "mqtt_publish_auth_error_v_4": 0,
431 - "mqtt_publish_auth_error_v_5": 0,
432 - "mqtt_publish_error": 0,
433 - "mqtt_publish_error_v_4": 0,
434 - "mqtt_publish_error_v_5": 0,
435 - "mqtt_publish_received": 537088,
436 - "mqtt_publish_received_v_4": 537088,
437 - "mqtt_publish_received_v_5": 0,
438 - "mqtt_publish_sent": 525721,
439 - "mqtt_publish_sent_v_4": 525721,
440 - "mqtt_publish_sent_v_5": 0,
441 - "mqtt_pubrec_invalid_error": 0,
442 - "mqtt_pubrec_invalid_error_v_4": 0,
443 - "mqtt_pubrec_received": 0,
444 - "mqtt_pubrec_received_impl_specific_error": 0,
445 - "mqtt_pubrec_received_no_matching_subscribers": 0,
446 - "mqtt_pubrec_received_not_authorized": 0,
447 - "mqtt_pubrec_received_packet_id_in_use": 0,
448 - "mqtt_pubrec_received_payload_format_invalid": 0,
449 - "mqtt_pubrec_received_quota_exceeded": 0,
450 - "mqtt_pubrec_received_success": 0,
451 - "mqtt_pubrec_received_topic_name_invalid": 0,
452 - "mqtt_pubrec_received_unspecified_error": 0,
453 - "mqtt_pubrec_received_v_4": 0,
454 - "mqtt_pubrec_received_v_5": 0,
455 - "mqtt_pubrec_received_v_5_impl_specific_error": 0,
456 - "mqtt_pubrec_received_v_5_no_matching_subscribers": 0,
457 - "mqtt_pubrec_received_v_5_not_authorized": 0,
458 - "mqtt_pubrec_received_v_5_packet_id_in_use": 0,
459 - "mqtt_pubrec_received_v_5_payload_format_invalid": 0,
460 - "mqtt_pubrec_received_v_5_quota_exceeded": 0,
461 - "mqtt_pubrec_received_v_5_success": 0,
462 - "mqtt_pubrec_received_v_5_topic_name_invalid": 0,
463 - "mqtt_pubrec_received_v_5_unspecified_error": 0,
464 - "mqtt_pubrec_sent": 0,
465 - "mqtt_pubrec_sent_impl_specific_error": 0,
466 - "mqtt_pubrec_sent_no_matching_subscribers": 0,
467 - "mqtt_pubrec_sent_not_authorized": 0,
468 - "mqtt_pubrec_sent_packet_id_in_use": 0,
469 - "mqtt_pubrec_sent_payload_format_invalid": 0,
470 - "mqtt_pubrec_sent_quota_exceeded": 0,
471 - "mqtt_pubrec_sent_success": 0,
472 - "mqtt_pubrec_sent_topic_name_invalid": 0,
473 - "mqtt_pubrec_sent_unspecified_error": 0,
474 - "mqtt_pubrec_sent_v_4": 0,
475 - "mqtt_pubrec_sent_v_5": 0,
476 - "mqtt_pubrec_sent_v_5_impl_specific_error": 0,
477 - "mqtt_pubrec_sent_v_5_no_matching_subscribers": 0,
478 - "mqtt_pubrec_sent_v_5_not_authorized": 0,
479 - "mqtt_pubrec_sent_v_5_packet_id_in_use": 0,
480 - "mqtt_pubrec_sent_v_5_payload_format_invalid": 0,
481 - "mqtt_pubrec_sent_v_5_quota_exceeded": 0,
482 - "mqtt_pubrec_sent_v_5_success": 0,
483 - "mqtt_pubrec_sent_v_5_topic_name_invalid": 0,
484 - "mqtt_pubrec_sent_v_5_unspecified_error": 0,
485 - "mqtt_pubrel_received": 0,
486 - "mqtt_pubrel_received_packet_id_not_found": 0,
487 - "mqtt_pubrel_received_success": 0,
488 - "mqtt_pubrel_received_v_4": 0,
489 - "mqtt_pubrel_received_v_5": 0,
490 - "mqtt_pubrel_received_v_5_packet_id_not_found": 0,
491 - "mqtt_pubrel_received_v_5_success": 0,
492 - "mqtt_pubrel_sent": 0,
493 - "mqtt_pubrel_sent_packet_id_not_found": 0,
494 - "mqtt_pubrel_sent_success": 0,
495 - "mqtt_pubrel_sent_v_4": 0,
496 - "mqtt_pubrel_sent_v_5": 0,
497 - "mqtt_pubrel_sent_v_5_packet_id_not_found": 0,
498 - "mqtt_pubrel_sent_v_5_success": 0,
499 - "mqtt_suback_sent": 122,
500 - "mqtt_suback_sent_v_4": 122,
501 - "mqtt_suback_sent_v_5": 0,
502 - "mqtt_subscribe_auth_error": 0,
503 - "mqtt_subscribe_auth_error_v_4": 0,
504 - "mqtt_subscribe_auth_error_v_5": 0,
505 - "mqtt_subscribe_error": 0,
506 - "mqtt_subscribe_error_v_4": 0,
507 - "mqtt_subscribe_error_v_5": 0,
508 - "mqtt_subscribe_received": 122,
509 - "mqtt_subscribe_received_v_4": 122,
510 - "mqtt_subscribe_received_v_5": 0,
511 - "mqtt_unsuback_sent": 108,
512 - "mqtt_unsuback_sent_v_4": 108,
513 - "mqtt_unsuback_sent_v_5": 0,
514 - "mqtt_unsubscribe_error": 0,
515 - "mqtt_unsubscribe_error_v_4": 0,
516 - "mqtt_unsubscribe_error_v_5": 0,
517 - "mqtt_unsubscribe_received": 108,
518 - "mqtt_unsubscribe_received_v_4": 108,
519 - "mqtt_unsubscribe_received_v_5": 0,
520 - "netsplit_detected": 0,
521 - "netsplit_resolved": 0,
522 - "netsplit_unresolved": 0,
523 - "open_sockets": 0,
524 - "queue_initialized_from_storage": 0,
525 - "queue_message_drop": 0,
526 - "queue_message_expired": 0,
527 - "queue_message_in": 525722,
528 - "queue_message_out": 525721,
529 - "queue_message_unhandled": 1,
530 - "queue_processes": 0,
531 - "queue_setup": 338948,
532 - "queue_teardown": 338948,
533 - "retain_memory": 11344,
534 - "retain_messages": 0,
535 - "router_matches_local": 525722,
536 - "router_matches_remote": 0,
537 - "router_memory": 12752,
538 - "router_subscriptions": 0,
539 - "socket_close": 338956,
540 - "socket_close_timeout": 0,
541 - "socket_error": 0,
542 - "socket_open": 338956,
543 - "system_context_switches": 39088198,
544 - "system_gc_count": 12189976,
545 - "system_io_in": 68998296,
546 - "system_io_out": 961001488,
547 - "system_process_count": 329,
548 - "system_reductions": 3857458067,
549 - "system_run_queue": 0,
550 - "system_utilization": 9,
551 - "system_utilization_scheduler_1": 34,
552 - "system_utilization_scheduler_2": 8,
553 - "system_utilization_scheduler_3": 14,
554 - "system_utilization_scheduler_4": 19,
555 - "system_utilization_scheduler_5": 0,
556 - "system_utilization_scheduler_6": 0,
557 - "system_utilization_scheduler_7": 0,
558 - "system_utilization_scheduler_8": 0,
559 - "system_wallclock": 163457858,
560 - "system_words_reclaimed_by_gc": 7158470019,
561 - "vm_memory_processes": 8673288,
562 - "vm_memory_system": 27051848,
742 + return vmq, srv.Close
743 }
src/health/health.d/vernemq.conf
+94 -94
@@ -2,67 +2,67 @@
2 # Socket errors
3
4 template: vernemq_socket_errors
5 - on: vernemq.socket_errors
5 + on: vernemq.node_socket_errors
6 class: Errors
7 type: Messaging
8 component: VerneMQ
9 - lookup: sum -1m unaligned absolute of socket_error
9 + lookup: sum -1m unaligned
10 units: errors
11 every: 1m
12 warn: $this > (($status >= $WARNING) ? (0) : (5))
13 delay: up 2m down 5m multiplier 1.5 max 2h
14 - summary: VerneMQ socket errors
15 - info: Number of socket errors in the last minute
14 + summary: Node ${label:node} socket errors
15 + info: Node ${label:node} socket errors in the last minute
16 to: sysadmin
17
18 # Queues dropped/expired/unhandled PUBLISH messages
19
20 template: vernemq_queue_message_drop
21 - on: vernemq.queue_undelivered_messages
21 + on: vernemq.node_queue_undelivered_messages
22 class: Errors
23 type: Messaging
24 component: VerneMQ
25 - lookup: average -1m unaligned absolute of queue_message_drop
25 + lookup: average -1m unaligned absolute of dropped
26 units: dropped messages
27 every: 1m
28 warn: $this > (($status >= $WARNING) ? (0) : (5))
29 delay: up 2m down 5m multiplier 1.5 max 2h
30 - summary: VerneMQ dropped messages
31 - info: Number of dropped messages due to full queues in the last minute
30 + summary: Node ${label:node} dropped messages
31 + info: Node ${label:node} dropped messages due to full queues in the last minute
32 to: sysadmin
33
34 template: vernemq_queue_message_expired
35 - on: vernemq.queue_undelivered_messages
35 + on: vernemq.node_queue_undelivered_messages
36 class: Latency
37 type: Messaging
38 component: VerneMQ
39 - lookup: average -1m unaligned absolute of queue_message_expired
39 + lookup: average -1m unaligned absolute of expired
40 units: expired messages
41 every: 1m
42 warn: $this > (($status >= $WARNING) ? (0) : (5))
43 delay: up 2m down 5m multiplier 1.5 max 2h
44 - summary: VerneMQ expired messages
45 - info: number of messages which expired before delivery in the last minute
44 + summary: Node ${label:node} expired messages
45 + info: Node ${label:node} expired before delivery messages in the last minute
46 to: sysadmin
47
48 template: vernemq_queue_message_unhandled
49 - on: vernemq.queue_undelivered_messages
49 + on: vernemq.node_queue_undelivered_messages
50 class: Latency
51 type: Messaging
52 component: VerneMQ
53 - lookup: average -1m unaligned absolute of queue_message_unhandled
53 + lookup: average -1m unaligned absolute of unhandled
54 units: unhandled messages
55 every: 1m
56 warn: $this > (($status >= $WARNING) ? (0) : (5))
57 delay: up 2m down 5m multiplier 1.5 max 2h
58 - summary: VerneMQ unhandled messages
59 - info: Number of unhandled messages (connections with clean session=true) in the last minute
58 + summary: Node ${label:node} unhandled messages
59 + info: Node ${label:node} unhandled messages in the last minute
60 to: sysadmin
61
62 # Erlang VM
63
64 template: vernemq_average_scheduler_utilization
65 - on: vernemq.average_scheduler_utilization
65 + on: vernemq.node_average_scheduler_utilization
66 class: Utilization
67 type: Messaging
68 component: VerneMQ
@@ -72,14 +72,14 @@ component: VerneMQ
72 warn: $this > (($status >= $WARNING) ? (75) : (85))
73 crit: $this > (($status == $CRITICAL) ? (85) : (95))
74 delay: down 15m multiplier 1.5 max 1h
75 - summary: VerneMQ scheduler utilization
76 - info: Average scheduler utilization over the last 10 minutes
75 + summary: Node ${label:node} scheduler utilization
76 + info: Node ${label:node} scheduler utilization over the last 10 minutes
77 to: sysadmin
78
79 # Cluster communication and netsplits
80
81 template: vernemq_cluster_dropped
82 - on: vernemq.cluster_dropped
82 + on: vernemq.node_cluster_dropped
83 class: Errors
84 type: Messaging
85 component: VerneMQ
@@ -88,74 +88,74 @@ component: VerneMQ
88 every: 1m
89 warn: $this > 0
90 delay: up 5m down 5m multiplier 1.5 max 1h
91 - summary: VerneMQ dropped traffic
92 - info: Amount of traffic dropped during communication with the cluster nodes in the last minute
91 + summary: Node ${label:node} dropped cluster traffic
92 + info: Node ${label:node} traffic dropped during communication with the cluster nodes in the last minute
93 to: sysadmin
94
95 template: vernemq_netsplits
96 - on: vernemq.netsplits
96 + on: vernemq.node_netsplits
97 class: Workload
98 type: Messaging
99 component: VerneMQ
100 - lookup: sum -1m unaligned absolute of netsplit_detected
100 + lookup: sum -1m unaligned absolute of detected
101 units: netsplits
102 every: 10s
103 warn: $this > 0
104 delay: down 5m multiplier 1.5 max 2h
105 - summary: VerneMQ netsplits
106 - info: Number of detected netsplits (split brain situation) in the last minute
105 + summary: Node ${label:node} detected netsplits
106 + info: Node ${label:node} detected netsplits (split brain) in the last minute
107 to: sysadmin
108
109 # Unsuccessful CONNACK
110
111 template: vernemq_mqtt_connack_sent_reason_unsuccessful
112 - on: vernemq.mqtt_connack_sent_reason
112 + on: vernemq.node_mqtt_connack_sent_by_reason_code
113 class: Errors
114 type: Messaging
115 component: VerneMQ
116 - lookup: average -1m unaligned absolute match-names of !success,*
116 + lookup: average -1m unaligned absolute of !success,*
117 units: packets
118 every: 1m
119 warn: $this > (($status >= $WARNING) ? (0) : (5))
120 delay: up 2m down 5m multiplier 1.5 max 2h
121 - summary: VerneMQ unsuccessful CONNACK
122 - info: Number of sent unsuccessful v3/v5 CONNACK packets in the last minute
121 + summary: Node ${label:node} unsuccessful sent CONNACK
122 + info: Node ${label:node} unsuccessful sent v5 CONNACK packets in the last minute
123 to: sysadmin
124
125 # Not normal DISCONNECT
126
127 template: vernemq_mqtt_disconnect_received_reason_not_normal
128 - on: vernemq.mqtt_disconnect_received_reason
128 + on: vernemq.node_mqtt_disconnect_received_by_reason_code
129 class: Workload
130 type: Messaging
131 component: VerneMQ
132 - lookup: average -1m unaligned absolute match-names of !normal_disconnect,*
132 + lookup: average -1m unaligned absolute of !normal_disconnect,*
133 units: packets
134 every: 1m
135 warn: $this > (($status >= $WARNING) ? (0) : (5))
136 delay: up 2m down 5m multiplier 1.5 max 2h
137 - summary: VerneMQ received not normal DISCONNECT
138 - info: Number of received not normal v5 DISCONNECT packets in the last minute
137 + summary: Node ${label:node} received not normal DISCONNECT
138 + info: Node ${label:node} received not normal v5 DISCONNECT packets in the last minute
139 to: sysadmin
140
141 template: vernemq_mqtt_disconnect_sent_reason_not_normal
142 - on: vernemq.mqtt_disconnect_sent_reason
142 + on: vernemq.node_mqtt_disconnect_sent_by_reason_code
143 class: Errors
144 type: Messaging
145 component: VerneMQ
146 - lookup: average -1m unaligned absolute match-names of !normal_disconnect,*
146 + lookup: average -1m unaligned absolute of !normal_disconnect,*
147 units: packets
148 every: 1m
149 warn: $this > (($status >= $WARNING) ? (0) : (5))
150 delay: up 2m down 5m multiplier 1.5 max 2h
151 - summary: VerneMQ sent not normal DISCONNECT
152 - info: Number of sent not normal v5 DISCONNECT packets in the last minute
151 + summary: Node ${label:node} sent not normal DISCONNECT
152 + info: Node ${label:node} sent not normal v5 DISCONNECT packets in the last minute
153 to: sysadmin
154
155 # SUBSCRIBE errors and unauthorized attempts
156
157 template: vernemq_mqtt_subscribe_error
158 - on: vernemq.mqtt_subscribe_error
158 + on: vernemq.node_mqtt_subscribe_error
159 class: Errors
160 type: Messaging
161 component: VerneMQ
@@ -164,12 +164,12 @@ component: VerneMQ
164 every: 1m
165 warn: $this > (($status >= $WARNING) ? (0) : (5))
166 delay: up 2m down 5m multiplier 1.5 max 2h
167 - summary: VerneMQ failed SUBSCRIBE
168 - info: Number of failed v3/v5 SUBSCRIBE operations in the last minute
167 + summary: Node ${label:node} mqtt v${label:mqtt_version} failed SUBSCRIBE
168 + info: Node ${label:node} mqtt v${label:mqtt_version} failed SUBSCRIBE operations in the last minute
169 to: sysadmin
170
171 template: vernemq_mqtt_subscribe_auth_error
172 - on: vernemq.mqtt_subscribe_auth_error
172 + on: vernemq.node_mqtt_subscribe_auth_error
173 class: Workload
174 type: Messaging
175 component: VerneMQ
@@ -178,14 +178,14 @@ component: VerneMQ
178 every: 1m
179 warn: $this > (($status >= $WARNING) ? (0) : (5))
180 delay: up 2m down 5m multiplier 1.5 max 2h
181 - summary: VerneMQ unauthorized SUBSCRIBE
182 - info: number of unauthorized v3/v5 SUBSCRIBE attempts in the last minute
181 + summary: Node ${label:node} mqtt v${label:mqtt_version} unauthorized SUBSCRIBE
182 + info: Node ${label:node} mqtt v${label:mqtt_version} unauthorized SUBSCRIBE attempts in the last minute
183 to: sysadmin
184
185 # UNSUBSCRIBE errors
186
187 template: vernemq_mqtt_unsubscribe_error
188 - on: vernemq.mqtt_unsubscribe_error
188 + on: vernemq.node_mqtt_unsubscribe_error
189 class: Errors
190 type: Messaging
191 component: VerneMQ
@@ -194,14 +194,14 @@ component: VerneMQ
194 every: 1m
195 warn: $this > (($status >= $WARNING) ? (0) : (5))
196 delay: up 2m down 5m multiplier 1.5 max 2h
197 - summary: VerneMQ failed UNSUBSCRIBE
198 - info: Number of failed v3/v5 UNSUBSCRIBE operations in the last minute
197 + summary: Node ${label:node} mqtt v${label:mqtt_version} failed UNSUBSCRIBE
198 + info: Node ${label:node} mqtt v${label:mqtt_version} failed UNSUBSCRIBE operations in the last minute
199 to: sysadmin
200
201 # PUBLISH errors and unauthorized attempts
202
203 template: vernemq_mqtt_publish_errors
204 - on: vernemq.mqtt_publish_errors
204 + on: vernemq.node_mqtt_publish_errors
205 class: Errors
206 type: Messaging
207 component: VerneMQ
@@ -210,12 +210,12 @@ component: VerneMQ
210 every: 1m
211 warn: $this > (($status >= $WARNING) ? (0) : (5))
212 delay: up 2m down 5m multiplier 1.5 max 2h
213 - summary: VerneMQ failed PUBLISH
214 - info: Number of failed v3/v5 PUBLISH operations in the last minute
213 + summary: Node ${label:node} mqtt v${label:mqtt_version} failed PUBLISH
214 + info: Node ${label:node} mqtt v${label:mqtt_version} failed PUBLISH operations in the last minute
215 to: sysadmin
216
217 template: vernemq_mqtt_publish_auth_errors
218 - on: vernemq.mqtt_publish_auth_errors
218 + on: vernemq.node_mqtt_publish_auth_errors
219 class: Workload
220 type: Messaging
221 component: VerneMQ
@@ -224,42 +224,42 @@ component: VerneMQ
224 every: 1m
225 warn: $this > (($status >= $WARNING) ? (0) : (5))
226 delay: up 2m down 5m multiplier 1.5 max 2h
227 - summary: VerneMQ unauthorized PUBLISH
228 - info: Number of unauthorized v3/v5 PUBLISH attempts in the last minute
227 + summary: Node ${label:node} mqtt v${label:mqtt_version} unauthorized PUBLISH
228 + info: Node ${label:node} mqtt v${label:mqtt_version} unauthorized PUBLISH attempts in the last minute
229 to: sysadmin
230
231 # Unsuccessful and unexpected PUBACK
232
233 template: vernemq_mqtt_puback_received_reason_unsuccessful
234 - on: vernemq.mqtt_puback_received_reason
234 + on: vernemq.node_mqtt_puback_received_by_reason_code
235 class: Errors
236 type: Messaging
237 component: VerneMQ
238 - lookup: average -1m unaligned absolute match-names of !success,*
238 + lookup: average -1m unaligned absolute of !success,*
239 units: packets
240 every: 1m
241 warn: $this > (($status >= $WARNING) ? (0) : (5))
242 delay: up 2m down 5m multiplier 1.5 max 2h
243 - summary: VerneMQ unsuccessful received PUBACK
244 - info: Number of received unsuccessful v5 PUBACK packets in the last minute
243 + summary: Node ${label:node} mqtt v5 received unsuccessful PUBACK
244 + info: Node ${label:node} mqtt v5 received unsuccessful PUBACK packets in the last minute
245 to: sysadmin
246
247 template: vernemq_mqtt_puback_sent_reason_unsuccessful
248 - on: vernemq.mqtt_puback_sent_reason
248 + on: vernemq.node_mqtt_puback_sent_by_reason_code
249 class: Errors
250 type: Messaging
251 component: VerneMQ
252 - lookup: average -1m unaligned absolute match-names of !success,*
252 + lookup: average -1m unaligned absolute of !success,*
253 units: packets
254 every: 1m
255 warn: $this > (($status >= $WARNING) ? (0) : (5))
256 delay: up 2m down 5m multiplier 1.5 max 2h
257 - summary: VerneMQ unsuccessful sent PUBACK
258 - info: Number of sent unsuccessful v5 PUBACK packets in the last minute
257 + summary: Node ${label:node} mqtt v5 unsuccessful sent PUBACK
258 + info: Node ${label:node} mqtt v5 unsuccessful sent PUBACK packets in the last minute
259 to: sysadmin
260
261 template: vernemq_mqtt_puback_unexpected
262 - on: vernemq.mqtt_puback_invalid_error
262 + on: vernemq.node_mqtt_puback_invalid_error
263 class: Workload
264 type: Messaging
265 component: VerneMQ
@@ -268,42 +268,42 @@ component: VerneMQ
268 every: 1m
269 warn: $this > (($status >= $WARNING) ? (0) : (5))
270 delay: up 2m down 5m multiplier 1.5 max 2h
271 - summary: VerneMQ unnexpected recieved PUBACK
272 - info: Number of received unexpected v3/v5 PUBACK packets in the last minute
271 + summary: Node ${label:node} mqtt v${label:mqtt_version} recieved unnexpected PUBACK
272 + info: Node ${label:node} mqtt v${label:mqtt_version} received unexpected PUBACK messages in the last minute
273 to: sysadmin
274
275 # Unsuccessful and unexpected PUBREC
276
277 template: vernemq_mqtt_pubrec_received_reason_unsuccessful
278 - on: vernemq.mqtt_pubrec_received_reason
278 + on: vernemq.node_mqtt_pubrec_received_by_reason_code
279 class: Errors
280 type: Messaging
281 component: VerneMQ
282 - lookup: average -1m unaligned absolute match-names of !success,*
282 + lookup: average -1m unaligned absolute of !success,*
283 units: packets
284 every: 1m
285 warn: $this > (($status >= $WARNING) ? (0) : (5))
286 delay: up 2m down 5m multiplier 1.5 max 2h
287 - summary: VerneMQ unsuccessful received PUBREC
288 - info: Number of received unsuccessful v5 PUBREC packets in the last minute
287 + summary: Node ${label:node} mqtt v5 received unsuccessful PUBREC
288 + info: Node ${label:node} mqtt v5 received unsuccessful PUBREC packets in the last minute
289 to: sysadmin
290
291 template: vernemq_mqtt_pubrec_sent_reason_unsuccessful
292 - on: vernemq.mqtt_pubrec_sent_reason
292 + on: vernemq.node_mqtt_pubrec_sent_by_reason_code
293 class: Errors
294 type: Messaging
295 component: VerneMQ
296 - lookup: average -1m unaligned absolute match-names of !success,*
296 + lookup: average -1m unaligned absolute of !success,*
297 units: packets
298 every: 1m
299 warn: $this > (($status >= $WARNING) ? (0) : (5))
300 delay: up 2m down 5m multiplier 1.5 max 2h
301 - summary: VerneMQ unsuccessful sent PUBREC
302 - info: Number of sent unsuccessful v5 PUBREC packets in the last minute
301 + summary: Node ${label:node} mqtt v5 unsuccessful sent PUBREC
302 + info: Node ${label:node} mqtt v5 unsuccessful sent PUBREC packets in the last minute
303 to: sysadmin
304
305 template: vernemq_mqtt_pubrec_invalid_error
306 - on: vernemq.mqtt_pubrec_invalid_error
306 + on: vernemq.node_mqtt_pubrec_invalid_error
307 class: Workload
308 type: Messaging
309 component: VerneMQ
@@ -312,72 +312,72 @@ component: VerneMQ
312 every: 1m
313 warn: $this > (($status >= $WARNING) ? (0) : (5))
314 delay: up 2m down 5m multiplier 1.5 max 2h
315 - summary: VerneMQ invalid received PUBREC
316 - info: Number of received invalid v3 PUBREC packets in the last minute
315 + summary: Node ${label:node} mqtt v${label:mqtt_version} received invalid PUBREC
316 + info: Node ${label:node} mqtt v${label:mqtt_version} received invalid PUBREC packets in the last minute
317 to: sysadmin
318
319 # Unsuccessful PUBREL
320
321 template: vernemq_mqtt_pubrel_received_reason_unsuccessful
322 - on: vernemq.mqtt_pubrel_received_reason
322 + on: vernemq.node_mqtt_pubrel_received_by_reason_code
323 class: Errors
324 type: Messaging
325 component: VerneMQ
326 - lookup: average -1m unaligned absolute match-names of !success,*
326 + lookup: average -1m unaligned absolute of !success,*
327 units: packets
328 every: 1m
329 warn: $this > (($status >= $WARNING) ? (0) : (5))
330 delay: up 2m down 5m multiplier 1.5 max 2h
331 - summary: VerneMQ unsuccessful received PUBREL
332 - info: Number of received unsuccessful v5 PUBREL packets in the last minute
331 + summary: Node ${label:node} mqtt v5 received unsuccessful PUBREL
332 + info: Node ${label:node} mqtt v5 received unsuccessful PUBREL packets in the last minute
333 to: sysadmin
334
335 template: vernemq_mqtt_pubrel_sent_reason_unsuccessful
336 - on: vernemq.mqtt_pubrel_sent_reason
336 + on: vernemq.node_mqtt_pubrel_sent_by_reason_code
337 class: Errors
338 type: Messaging
339 component: VerneMQ
340 - lookup: average -1m unaligned absolute match-names of !success,*
340 + lookup: average -1m unaligned absolute of !success,*
341 units: packets
342 every: 1m
343 warn: $this > (($status >= $WARNING) ? (0) : (5))
344 delay: up 2m down 5m multiplier 1.5 max 2h
345 - summary: VerneMQ unsuccessful sent PUBREL
346 - info: number of sent unsuccessful v5 PUBREL packets in the last minute
345 + summary: Node ${label:node} mqtt v5 unsuccessful sent PUBREL
346 + info: Node ${label:node} mqtt v5 unsuccessful sent PUBREL packets in the last minute
347 to: sysadmin
348
349 # Unsuccessful and unexpected PUBCOMP
350
351 template: vernemq_mqtt_pubcomp_received_reason_unsuccessful
352 - on: vernemq.mqtt_pubcomp_received_reason
352 + on: vernemq.node_mqtt_pubcomp_received_by_reason_code
353 class: Errors
354 type: Messaging
355 component: VerneMQ
356 - lookup: average -1m unaligned absolute match-names of !success,*
356 + lookup: average -1m unaligned absolute of !success,*
357 units: packets
358 every: 1m
359 warn: $this > (($status >= $WARNING) ? (0) : (5))
360 delay: up 2m down 5m multiplier 1.5 max 2h
361 - summary: VerneMQ unsuccessful received PUBCOMP
362 - info: Number of received unsuccessful v5 PUBCOMP packets in the last minute
361 + summary: Node ${label:node} mqtt v5 received unsuccessful PUBCOMP
362 + info: Node ${label:node} mqtt v5 received unsuccessful PUBCOMP packets in the last minute
363 to: sysadmin
364
365 template: vernemq_mqtt_pubcomp_sent_reason_unsuccessful
366 - on: vernemq.mqtt_pubcomp_sent_reason
366 + on: vernemq.node_mqtt_pubcomp_sent_by_reason_code
367 class: Errors
368 type: Messaging
369 component: VerneMQ
370 - lookup: average -1m unaligned absolute match-names of !success,*
370 + lookup: average -1m unaligned absolute of !success,*
371 units: packets
372 every: 1m
373 warn: $this > (($status >= $WARNING) ? (0) : (5))
374 delay: up 2m down 5m multiplier 1.5 max 2h
375 - summary: VerneMQ unsuccessful sent PUBCOMP
376 - info: number of sent unsuccessful v5 PUBCOMP packets in the last minute
375 + summary: Node ${label:node} mqtt v5 unsuccessful sent PUBCOMP
376 + info: Node ${label:node} mqtt v5 unsuccessful sent PUBCOMP packets in the last minute
377 to: sysadmin
378
379 template: vernemq_mqtt_pubcomp_unexpected
380 - on: vernemq.mqtt_pubcomp_invalid_error
380 + on: vernemq.node_mqtt_pubcomp_invalid_error
381 class: Workload
382 type: Messaging
383 component: VerneMQ
@@ -386,6 +386,6 @@ component: VerneMQ
386 every: 1m
387 warn: $this > (($status >= $WARNING) ? (0) : (5))
388 delay: up 2m down 5m multiplier 1.5 max 2h
389 - summary: VerneMQ unexpected received PUBCOMP
390 - info: number of received unexpected v3/v5 PUBCOMP packets in the last minute
389 + summary: Node ${label:node} mqtt v${label:mqtt_version} received unexpected PUBCOMP
390 + info: Node ${label:node} mqtt v${label:mqtt_version} received unexpected PUBCOMP packets in the last minute
391 to: sysadmin