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(" ", "_", ".", "_")