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