github.com/netdata/go.d.plugin@v0.58.1/modules/rabbitmq/charts.go (about) 1 // SPDX-License-Identifier: GPL-3.0-or-later 2 3 package rabbitmq 4 5 import ( 6 "fmt" 7 "strings" 8 9 "github.com/netdata/go.d.plugin/agent/module" 10 ) 11 12 const ( 13 prioMessagesCount = module.Priority + iota 14 prioMessagesRate 15 16 prioObjectsCount 17 18 prioConnectionChurnRate 19 prioChannelChurnRate 20 prioQueueChurnRate 21 22 prioFileDescriptorsCount 23 prioSocketsCount 24 prioErlangProcessesCount 25 prioErlangRunQueueProcessesCount 26 prioMemoryUsage 27 prioDiskSpaceFreeSize 28 29 prioVhostMessagesCount 30 prioVhostMessagesRate 31 32 prioQueueMessagesCount 33 prioQueueMessagesRate 34 ) 35 36 var baseCharts = module.Charts{ 37 chartMessagesCount.Copy(), 38 chartMessagesRate.Copy(), 39 40 chartObjectsCount.Copy(), 41 42 chartConnectionChurnRate.Copy(), 43 chartChannelChurnRate.Copy(), 44 chartQueueChurnRate.Copy(), 45 46 chartFileDescriptorsCount.Copy(), 47 chartSocketsCount.Copy(), 48 chartErlangProcessesCount.Copy(), 49 chartErlangRunQueueProcessesCount.Copy(), 50 chartMemoryUsage.Copy(), 51 chartDiskSpaceFreeSize.Copy(), 52 } 53 54 var chartsTmplVhost = module.Charts{ 55 chartTmplVhostMessagesCount.Copy(), 56 chartTmplVhostMessagesRate.Copy(), 57 } 58 59 var chartsTmplQueue = module.Charts{ 60 chartTmplQueueMessagesCount.Copy(), 61 chartTmplQueueMessagesRate.Copy(), 62 } 63 64 var ( 65 chartMessagesCount = module.Chart{ 66 ID: "messages_count", 67 Title: "Messages", 68 Units: "messages", 69 Fam: "messages", 70 Ctx: "rabbitmq.messages_count", 71 Type: module.Stacked, 72 Priority: prioMessagesCount, 73 Dims: module.Dims{ 74 {ID: "queue_totals_messages_ready", Name: "ready"}, 75 {ID: "queue_totals_messages_unacknowledged", Name: "unacknowledged"}, 76 }, 77 } 78 chartMessagesRate = module.Chart{ 79 ID: "messages_rate", 80 Title: "Messages", 81 Units: "messages/s", 82 Fam: "messages", 83 Ctx: "rabbitmq.messages_rate", 84 Priority: prioMessagesRate, 85 Dims: module.Dims{ 86 {ID: "message_stats_ack", Name: "ack", Algo: module.Incremental}, 87 {ID: "message_stats_publish", Name: "publish", Algo: module.Incremental}, 88 {ID: "message_stats_publish_in", Name: "publish_in", Algo: module.Incremental}, 89 {ID: "message_stats_publish_out", Name: "publish_out", Algo: module.Incremental}, 90 {ID: "message_stats_confirm", Name: "confirm", Algo: module.Incremental}, 91 {ID: "message_stats_deliver", Name: "deliver", Algo: module.Incremental}, 92 {ID: "message_stats_deliver_no_ack", Name: "deliver_no_ack", Algo: module.Incremental}, 93 {ID: "message_stats_get", Name: "get", Algo: module.Incremental}, 94 {ID: "message_stats_get_no_ack", Name: "get_no_ack", Algo: module.Incremental}, 95 {ID: "message_stats_deliver_get", Name: "deliver_get", Algo: module.Incremental}, 96 {ID: "message_stats_redeliver", Name: "redeliver", Algo: module.Incremental}, 97 {ID: "message_stats_return_unroutable", Name: "return_unroutable", Algo: module.Incremental}, 98 }, 99 } 100 chartObjectsCount = module.Chart{ 101 ID: "objects_count", 102 Title: "Objects", 103 Units: "objects", 104 Fam: "objects", 105 Ctx: "rabbitmq.objects_count", 106 Priority: prioObjectsCount, 107 Dims: module.Dims{ 108 {ID: "object_totals_channels", Name: "channels"}, 109 {ID: "object_totals_consumers", Name: "consumers"}, 110 {ID: "object_totals_connections", Name: "connections"}, 111 {ID: "object_totals_queues", Name: "queues"}, 112 {ID: "object_totals_exchanges", Name: "exchanges"}, 113 }, 114 } 115 116 chartConnectionChurnRate = module.Chart{ 117 ID: "connection_churn_rate", 118 Title: "Connection churn", 119 Units: "operations/s", 120 Fam: "churn", 121 Ctx: "rabbitmq.connection_churn_rate", 122 Priority: prioConnectionChurnRate, 123 Dims: module.Dims{ 124 {ID: "churn_rates_connection_created", Name: "created", Algo: module.Incremental}, 125 {ID: "churn_rates_connection_closed", Name: "closed", Algo: module.Incremental}, 126 }, 127 } 128 chartChannelChurnRate = module.Chart{ 129 ID: "channel_churn_rate", 130 Title: "Channel churn", 131 Units: "operations/s", 132 Fam: "churn", 133 Ctx: "rabbitmq.channel_churn_rate", 134 Priority: prioChannelChurnRate, 135 Dims: module.Dims{ 136 {ID: "churn_rates_channel_created", Name: "created", Algo: module.Incremental}, 137 {ID: "churn_rates_channel_closed", Name: "closed", Algo: module.Incremental}, 138 }, 139 } 140 chartQueueChurnRate = module.Chart{ 141 ID: "queue_churn_rate", 142 Title: "Queue churn", 143 Units: "operations/s", 144 Fam: "churn", 145 Ctx: "rabbitmq.queue_churn_rate", 146 Priority: prioQueueChurnRate, 147 Dims: module.Dims{ 148 {ID: "churn_rates_queue_created", Name: "created", Algo: module.Incremental}, 149 {ID: "churn_rates_queue_deleted", Name: "deleted", Algo: module.Incremental}, 150 {ID: "churn_rates_queue_declared", Name: "declared", Algo: module.Incremental}, 151 }, 152 } 153 ) 154 155 var ( 156 chartFileDescriptorsCount = module.Chart{ 157 ID: "file_descriptors_count", 158 Title: "File descriptors", 159 Units: "fd", 160 Fam: "node stats", 161 Ctx: "rabbitmq.file_descriptors_count", 162 Type: module.Stacked, 163 Priority: prioFileDescriptorsCount, 164 Dims: module.Dims{ 165 {ID: "fd_total", Name: "available"}, 166 {ID: "fd_used", Name: "used"}, 167 }, 168 } 169 chartSocketsCount = module.Chart{ 170 ID: "sockets_used_count", 171 Title: "Used sockets", 172 Units: "sockets", 173 Fam: "node stats", 174 Ctx: "rabbitmq.sockets_count", 175 Type: module.Stacked, 176 Priority: prioSocketsCount, 177 Dims: module.Dims{ 178 {ID: "sockets_total", Name: "available"}, 179 {ID: "sockets_used", Name: "used"}, 180 }, 181 } 182 chartErlangProcessesCount = module.Chart{ 183 ID: "erlang_processes_count", 184 Title: "Erlang processes", 185 Units: "processes", 186 Fam: "node stats", 187 Ctx: "rabbitmq.erlang_processes_count", 188 Type: module.Stacked, 189 Priority: prioErlangProcessesCount, 190 Dims: module.Dims{ 191 {ID: "proc_available", Name: "available"}, 192 {ID: "proc_used", Name: "used"}, 193 }, 194 } 195 chartErlangRunQueueProcessesCount = module.Chart{ 196 ID: "erlang_run_queue_processes_count", 197 Title: "Erlang run queue", 198 Units: "processes", 199 Fam: "node stats", 200 Ctx: "rabbitmq.erlang_run_queue_processes_count", 201 Priority: prioErlangRunQueueProcessesCount, 202 Dims: module.Dims{ 203 {ID: "run_queue", Name: "length"}, 204 }, 205 } 206 chartMemoryUsage = module.Chart{ 207 ID: "memory_usage", 208 Title: "Memory", 209 Units: "bytes", 210 Fam: "node stats", 211 Ctx: "rabbitmq.memory_usage", 212 Priority: prioMemoryUsage, 213 Dims: module.Dims{ 214 {ID: "mem_used", Name: "used"}, 215 }, 216 } 217 chartDiskSpaceFreeSize = module.Chart{ 218 ID: "disk_space_free_size", 219 Title: "Free disk space", 220 Units: "bytes", 221 Fam: "node stats", 222 Ctx: "rabbitmq.disk_space_free_size", 223 Type: module.Area, 224 Priority: prioDiskSpaceFreeSize, 225 Dims: module.Dims{ 226 {ID: "disk_free", Name: "free"}, 227 }, 228 } 229 ) 230 231 var ( 232 chartTmplVhostMessagesCount = module.Chart{ 233 ID: "vhost_%s_message_count", 234 Title: "Vhost messages", 235 Units: "messages", 236 Fam: "vhost messages", 237 Ctx: "rabbitmq.vhost_messages_count", 238 Type: module.Stacked, 239 Priority: prioVhostMessagesCount, 240 Dims: module.Dims{ 241 {ID: "vhost_%s_messages_ready", Name: "ready"}, 242 {ID: "vhost_%s_messages_unacknowledged", Name: "unacknowledged"}, 243 }, 244 } 245 chartTmplVhostMessagesRate = module.Chart{ 246 ID: "vhost_%s_message_stats", 247 Title: "Vhost messages rate", 248 Units: "messages/s", 249 Fam: "vhost messages", 250 Ctx: "rabbitmq.vhost_messages_rate", 251 Type: module.Stacked, 252 Priority: prioVhostMessagesRate, 253 Dims: module.Dims{ 254 {ID: "vhost_%s_message_stats_ack", Name: "ack", Algo: module.Incremental}, 255 {ID: "vhost_%s_message_stats_confirm", Name: "confirm", Algo: module.Incremental}, 256 {ID: "vhost_%s_message_stats_deliver", Name: "deliver", Algo: module.Incremental}, 257 {ID: "vhost_%s_message_stats_get", Name: "get", Algo: module.Incremental}, 258 {ID: "vhost_%s_message_stats_get_no_ack", Name: "get_no_ack", Algo: module.Incremental}, 259 {ID: "vhost_%s_message_stats_publish", Name: "publish", Algo: module.Incremental}, 260 {ID: "vhost_%s_message_stats_redeliver", Name: "redeliver", Algo: module.Incremental}, 261 {ID: "vhost_%s_message_stats_return_unroutable", Name: "return_unroutable", Algo: module.Incremental}, 262 }, 263 } 264 ) 265 266 var ( 267 chartTmplQueueMessagesCount = module.Chart{ 268 ID: "queue_%s_vhost_%s_message_count", 269 Title: "Queue messages", 270 Units: "messages", 271 Fam: "queue messages", 272 Ctx: "rabbitmq.queue_messages_count", 273 Type: module.Stacked, 274 Priority: prioQueueMessagesCount, 275 Dims: module.Dims{ 276 {ID: "queue_%s_vhost_%s_messages_ready", Name: "ready"}, 277 {ID: "queue_%s_vhost_%s_messages_unacknowledged", Name: "unacknowledged"}, 278 {ID: "queue_%s_vhost_%s_messages_paged_out", Name: "paged_out"}, 279 {ID: "queue_%s_vhost_%s_messages_persistent", Name: "persistent"}, 280 }, 281 } 282 chartTmplQueueMessagesRate = module.Chart{ 283 ID: "queue_%s_vhost_%s_message_stats", 284 Title: "Queue messages rate", 285 Units: "messages/s", 286 Fam: "queue messages", 287 Ctx: "rabbitmq.queue_messages_rate", 288 Type: module.Stacked, 289 Priority: prioQueueMessagesRate, 290 Dims: module.Dims{ 291 {ID: "queue_%s_vhost_%s_message_stats_ack", Name: "ack", Algo: module.Incremental}, 292 {ID: "queue_%s_vhost_%s_message_stats_confirm", Name: "confirm", Algo: module.Incremental}, 293 {ID: "queue_%s_vhost_%s_message_stats_deliver", Name: "deliver", Algo: module.Incremental}, 294 {ID: "queue_%s_vhost_%s_message_stats_get", Name: "get", Algo: module.Incremental}, 295 {ID: "queue_%s_vhost_%s_message_stats_get_no_ack", Name: "get_no_ack", Algo: module.Incremental}, 296 {ID: "queue_%s_vhost_%s_message_stats_publish", Name: "publish", Algo: module.Incremental}, 297 {ID: "queue_%s_vhost_%s_message_stats_redeliver", Name: "redeliver", Algo: module.Incremental}, 298 {ID: "queue_%s_vhost_%s_message_stats_return_unroutable", Name: "return_unroutable", Algo: module.Incremental}, 299 }, 300 } 301 ) 302 303 func (r *RabbitMQ) addVhostCharts(name string) { 304 charts := chartsTmplVhost.Copy() 305 306 for _, chart := range *charts { 307 chart.ID = fmt.Sprintf(chart.ID, forbiddenCharsReplacer.Replace(name)) 308 chart.Labels = []module.Label{ 309 {Key: "vhost", Value: name}, 310 } 311 for _, dim := range chart.Dims { 312 dim.ID = fmt.Sprintf(dim.ID, name) 313 } 314 } 315 316 if err := r.Charts().Add(*charts...); err != nil { 317 r.Warning(err) 318 } 319 } 320 321 func (r *RabbitMQ) removeVhostCharts(vhost string) { 322 px := fmt.Sprintf("vhost_%s_", forbiddenCharsReplacer.Replace(vhost)) 323 for _, chart := range *r.Charts() { 324 if strings.HasPrefix(chart.ID, px) { 325 chart.MarkRemove() 326 chart.MarkNotCreated() 327 } 328 } 329 } 330 331 func (r *RabbitMQ) addQueueCharts(queue, vhost string) { 332 charts := chartsTmplQueue.Copy() 333 334 for _, chart := range *charts { 335 chart.ID = fmt.Sprintf(chart.ID, forbiddenCharsReplacer.Replace(queue), forbiddenCharsReplacer.Replace(vhost)) 336 chart.Labels = []module.Label{ 337 {Key: "queue", Value: queue}, 338 {Key: "vhost", Value: vhost}, 339 } 340 for _, dim := range chart.Dims { 341 dim.ID = fmt.Sprintf(dim.ID, queue, vhost) 342 } 343 } 344 345 if err := r.Charts().Add(*charts...); err != nil { 346 r.Warning(err) 347 } 348 } 349 350 func (r *RabbitMQ) removeQueueCharts(queue, vhost string) { 351 px := fmt.Sprintf("queue_%s_vhost_%s_", forbiddenCharsReplacer.Replace(queue), forbiddenCharsReplacer.Replace(vhost)) 352 for _, chart := range *r.Charts() { 353 if strings.HasPrefix(chart.ID, px) { 354 chart.MarkRemove() 355 chart.MarkNotCreated() 356 } 357 } 358 } 359 360 var forbiddenCharsReplacer = strings.NewReplacer(" ", "_", ".", "_")