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