From 25399eae4bfb7cbce61fb62fa27172172cd308cd Mon Sep 17 00:00:00 2001 From: cn Date: Fri, 4 May 2018 11:59:18 +0200 Subject: [PATCH] Use HTTP API of management plugin to lower CPU load --- README.rst | 33 ++++------------- rabbitmq_connections | 13 ++++--- rabbitmq_queue_consumers | 16 ++++----- rabbitmq_queue_disk | 76 ---------------------------------------- rabbitmq_queue_memory | 14 ++++---- rabbitmq_queue_messages | 28 +++++++-------- 6 files changed, 39 insertions(+), 141 deletions(-) delete mode 100755 rabbitmq_queue_disk diff --git a/README.rst b/README.rst index d9c3538..cfc2757 100644 --- a/README.rst +++ b/README.rst @@ -7,28 +7,6 @@ Installation Copy the plug-ins to the munin plugin directory, e.g ``/etc/munin/plugins/``. -Granting Permissions -==================== - -To use these plug-ins you have to tell munin-node to execute them as -root by changing the plug-in configuration file (on debian that is -``/etc/munin/plugin-conf.d``):: - - [rabbitmq_connections] - user root - - [rabbitmq_queue_consumers] - user root - - [rabbitmq_queue_disk] - user root - - [rabbitmq_queue_memory] - user root - - [rabbitmq_queue_messages] - user root - Using a Custom Virtual Host ============================ @@ -36,14 +14,17 @@ Using a Custom Virtual Host You can set the name of virtual host by changing the plug-in configuration file (on debian that is ``/etc/munin/plugin-conf.d``):: + [rabbitmq_connections] + env.url http://guest:guest@127.0.0.1:15672 + [rabbitmq_queue_consumers] - env.vhost vhostname + env.url http://guest:guest@127.0.0.1:15672 [rabbitmq_queue_disk] - env.vhost vhostname + env.url http://guest:guest@127.0.0.1:15672 [rabbitmq_queue_memory] - env.vhost vhostname + env.url http://guest:guest@127.0.0.1:15672 [rabbitmq_queue_messages] - env.vhost vhostname + env.url http://guest:guest@127.0.0.1:15672 diff --git a/rabbitmq_connections b/rabbitmq_connections index d040c7d..71f9b14 100755 --- a/rabbitmq_connections +++ b/rabbitmq_connections @@ -5,6 +5,7 @@ # Usage: Link or copy into /etc/munin/node.d/ # # Parameters +# env.url # env.conn_warn # env.conn_crit # @@ -24,14 +25,12 @@ if [ "$1" = "autoconf" ]; then exit 0 fi -HOME=/tmp/ - # If run with the "config"-parameter, give out information on how the # graphs should look. if [ "$1" = "config" ]; then - CONN_WARN=${queue_warn:-500} - CONN_CRIT=${queue_crit:-1000} + CONN_WARN=${conn_warn:-500} + CONN_CRIT=${conn_crit:-1000} # The host name this plugin is for. (Can be overridden to have # one machine answer for several) @@ -63,6 +62,6 @@ fi # real work - i.e. display the data. Almost always this will be # "value" subfield for every data field. -echo "total.value $(HOME=$HOME rabbitmqctl list_connections | grep -v "^Listing" | grep -v "done.$" | grep -v "\.\.\." | wc -l)" -echo "secure.value $(HOME=$HOME rabbitmqctl list_connections ssl | grep -v "^Listing" | grep -v "done.$" | grep -v "\.\.\." | grep "true" | wc -l)" -echo "insecure.value $(HOME=$HOME rabbitmqctl list_connections ssl | grep -v "^Listing" | grep -v "done.$" | grep -v "\.\.\." | grep "false" | wc -l)" +echo "total.value $(curl -sS $url/api/connections | jq -r '.[] | {}' | wc -l)" +echo "secure.value $(curl -sS $url/api/connections | jq -r '.[] | select(.ssl == true) | {}' | wc -l)" +echo "insecure.value $(curl -sS $url/api/connections | jq -r '.[] | select(.ssl == false or .ssl == null) | {}' | wc -l)" diff --git a/rabbitmq_queue_consumers b/rabbitmq_queue_consumers index 186c29c..2cbf76f 100755 --- a/rabbitmq_queue_consumers +++ b/rabbitmq_queue_consumers @@ -5,7 +5,7 @@ # Usage: Link or copy into /etc/munin/node.d/ # # Parameters -# env.vhost +# env.url # env.queue_warn # env.queue_crit # @@ -28,11 +28,9 @@ fi # If run with the "config"-parameter, give out information on how the # graphs should look. -HOME=/tmp/ -VHOST=${vhost:-"/"} -QUEUES=$(HOME=$HOME rabbitmqctl list_queues -p $VHOST name | grep -v '^Listing' | grep -v 'done\.$' | grep -v "\.\.\." | sed 's/[^a-z0-9]\+/_/g') - if [ "$1" = "config" ]; then + QUEUES=$(curl -sS $url/api/queues | jq -r '.[] | .name' | sed 's/[^a-z0-9]\+/_/g') + QUEUE_WARN=${queue_warn:-100} QUEUE_CRIT=${queue_crit:-500} @@ -40,7 +38,7 @@ if [ "$1" = "config" ]; then # one machine answer for several) # The title of the graph - echo "graph_title RabbitMQ $VHOST consumers" + echo "graph_title RabbitMQ consumers" # Arguments to "rrdtool graph". In this case, tell it that the # lower limit of the graph is '0', and that 1k=1000 (not 1024) echo 'graph_args --base 1000 -l 0' @@ -69,10 +67,10 @@ fi # "value" subfield for every data field. IFS=$'\n' -for line in $(HOME=$HOME rabbitmqctl list_queues -p $VHOST name consumers | grep -v "^Listing" | grep -v "done.$" | grep -v "\.\.\."); do - echo -n "$line" | cut -f1 | tr -d '\n' | sed 's/[^a-z0-9]\+/_/g' +for line in $(curl -sS $url/api/queues | jq -c -r '.[] | {name: .name, consumers: .consumers}'); do + echo -n "$line" | jq -j '.name' | sed 's/[^a-z0-9]\+/_/g' echo -n ".value " - echo -n "$line" | cut -f2 | tr -d '\n' + echo -n "$line" | jq -j '.consumers' echo "" done IFS=$' \t\n' diff --git a/rabbitmq_queue_disk b/rabbitmq_queue_disk deleted file mode 100755 index e2f698d..0000000 --- a/rabbitmq_queue_disk +++ /dev/null @@ -1,76 +0,0 @@ -#!/bin/bash -# -# Plugin to monitor the queues of a virtual_host in RabbitMQ -# -# Usage: Link or copy into /etc/munin/node.d/ -# -# Parameters -# env.vhost -# -# Magic markers (optional - only used by munin-config and some -# installation scripts): -# -#%# family=auto -#%# capabilities=autoconf - -# If run with the "autoconf"-parameter, give our opinion on wether we -# should be run on this system or not. This is optinal, and only used by -# munin-config. In the case of this plugin, we should most probably -# always be included. - -if [ "$1" = "autoconf" ]; then - echo yes - exit 0 -fi - -# If run with the "config"-parameter, give out information on how the -# graphs should look. - -HOME=/tmp/ -VHOST=${vhost:-"/"} -QUEUES=$(HOME=$HOME rabbitmqctl list_queues -p $VHOST name | grep -v '^Listing' | grep -v 'done\.$' | grep -v "\.\.\." | sed 's/[^a-z0-9]\+/_/g') - -if [ "$1" = "config" ]; then - # The host name this plugin is for. (Can be overridden to have - # one machine answer for several) - - # The title of the graph - echo "graph_title RabbitMQ $VHOST Disk activity by queue" - # Arguments to "rrdtool graph". In this case, tell it that the - # lower limit of the graph is '0', and that 1k=1000 (not 1024) - echo 'graph_args --base 1000 --vertical-label Messages -l 0' - # The Y-axis label - echo 'graph_vlabel disk' - # We want Cur/Min/Avg/Max unscaled (i.e. 0.42 load instead of - # 420 milliload) - #echo 'graph_scale no' - echo 'graph_category RabbitMQ' - - for queue in $QUEUES; do - echo "$queue.label $queue" - echo "$queue.info Memory used by $queue" - done - - echo 'graph_info Show disk activity by queue' - # Last, if run with the "config"-parameter, quit here (don't - # display any data) - exit 0 -fi - -# If not run with any parameters at all (or only unknown ones), do the -# real work - i.e. display the data. Almost always this will be -# "value" subfield for every data field. - -IFS=$'\n' -for line in $(HOME=$HOME rabbitmqctl list_queues -p $VHOST name disk_reads disk_writes | grep -v "^Listing" | grep -v "done.$" | grep -v "\.\.\."); do - echo -n "$line" | cut -f1 | tr -d '\n' | sed 's/[^a-z0-9]\+/_/g' - echo -n ".read_count.value " - echo -n "$line" | cut -f2 | tr -d '\n' - echo "" - - echo -n "$line" | cut -f1 | tr -d '\n' | sed 's/[^a-z0-9]\+/_/g' - echo -n ".write_count.value " - echo -n "$line" | cut -f3 | tr -d '\n' - echo "" -done -IFS=$' \t\n' diff --git a/rabbitmq_queue_memory b/rabbitmq_queue_memory index 1528f51..7d4fa44 100755 --- a/rabbitmq_queue_memory +++ b/rabbitmq_queue_memory @@ -5,7 +5,7 @@ # Usage: Link or copy into /etc/munin/node.d/ # # Parameters -# env.vhost +# env.url # env.queue_warn # env.queue_crit # @@ -28,11 +28,9 @@ fi # If run with the "config"-parameter, give out information on how the # graphs should look. -HOME=/tmp/ -VHOST=${vhost:-"/"} -QUEUES=$(HOME=$HOME rabbitmqctl list_queues -p $VHOST name | grep -v '^Listing' | grep -v 'done\.$' | grep -v "\.\.\." | sed 's/[^a-z0-9]\+/_/g') - if [ "$1" = "config" ]; then + QUEUES=$(curl -sS $url/api/queues | jq -r '.[] | .name' | sed 's/[^a-z0-9]\+/_/g') + QUEUE_WARN=${queue_warn:-10000} QUEUE_CRIT=${queue_crit:-20000} @@ -69,10 +67,10 @@ fi # "value" subfield for every data field. IFS=$'\n' -for line in $(HOME=$HOME rabbitmqctl list_queues -p $VHOST name memory | grep -v "^Listing" | grep -v "done.$" | grep -v "\.\.\."); do - echo -n "$line" | cut -f1 | tr -d '\n' | sed 's/[^a-z0-9]\+/_/g' +for line in $(curl -sS $url/api/queues | jq -c -r '.[] | {name: .name, memory: .memory}'); do + echo -n "$line" | jq -j '.name' | sed 's/[^a-z0-9]\+/_/g' echo -n ".used.value " - echo -n "$line" | cut -f2 | tr -d '\n' + echo -n "$line" | jq -j '.memory' echo "" done IFS=$' \t\n' diff --git a/rabbitmq_queue_messages b/rabbitmq_queue_messages index a8ee16b..1550a1b 100755 --- a/rabbitmq_queue_messages +++ b/rabbitmq_queue_messages @@ -5,7 +5,7 @@ # Usage: Link or copy into /etc/munin/node.d/ # # Parameters -# env.vhost +# env.url # env.queue_warn # env.queue_crit # @@ -28,11 +28,9 @@ fi # If run with the "config"-parameter, give out information on how the # graphs should look. -HOME=/tmp/ -VHOST=${vhost:-"/"} -QUEUES=$(HOME=$HOME rabbitmqctl list_queues -p $VHOST name | grep -v '^Listing' | grep -v 'done\.$' | grep -v "\.\.\." | sed 's/[^a-z0-9]\+/_/g') - if [ "$1" = "config" ]; then + QUEUES=$(curl -sS $url/api/queues | jq -r '.[] | .name' | sed 's/[^a-z0-9]\+/_/g') + QUEUE_WARN=${queue_warn:-10000} QUEUE_CRIT=${queue_crit:-20000} @@ -40,7 +38,7 @@ if [ "$1" = "config" ]; then # one machine answer for several) # The title of the graph - echo "graph_title RabbitMQ $VHOST list_queues" + echo "graph_title RabbitMQ list_queues" # Arguments to "rrdtool graph". In this case, tell it that the # lower limit of the graph is '0', and that 1k=1000 (not 1024) echo 'graph_args --base 1000 -l 0' @@ -69,25 +67,25 @@ fi # "value" subfield for every data field. IFS=$'\n' -for line in $(HOME=$HOME rabbitmqctl list_queues -p $VHOST name messages messages_ready messages_unacknowledged messages_persistent | grep -v "^Listing" | grep -v "done.$" | grep -v "\.\.\."); do - echo -n "$line" | cut -f1 | tr -d '\n' | sed 's/[^a-z0-9]\+/_/g' +for line in $(curl -sS $url/api/queues | jq -c -r '.[] | {name: .name, messages: .messages, messages_ready: .messages_ready, messages_unacknowledged: .messages_unacknowledged, messages_persistent: .messages_persistent}'); do + echo -n "$line" | jq -j '.name' | sed 's/[^a-z0-9]\+/_/g' echo -n ".total.value " - echo -n "$line" | cut -f2 | tr -d '\n' + echo -n "$line" | jq -j '.messages' echo "" - echo -n "$line" | cut -f1 | tr -d '\n' | sed 's/[^a-z0-9]\+/_/g' + echo -n "$line" | jq -j '.name' | sed 's/[^a-z0-9]\+/_/g' echo -n ".ready.value " - echo -n "$line" | cut -f3 | tr -d '\n' + echo -n "$line" | jq -j '.messages_ready' echo "" - echo -n "$line" | cut -f1 | tr -d '\n' | sed 's/[^a-z0-9]\+/_/g' + echo -n "$line" | jq -j '.name' | sed 's/[^a-z0-9]\+/_/g' echo -n ".unacknowledged.value " - echo -n "$line" | cut -f4 | tr -d '\n' + echo -n "$line" | jq -j '.messages_unacknowledged' echo "" - echo -n "$line" | cut -f1 | tr -d '\n' | sed 's/[^a-z0-9]\+/_/g' + echo -n "$line" | jq -j '.name' | sed 's/[^a-z0-9]\+/_/g' echo -n ".persistent.value " - echo -n "$line" | cut -f5 | tr -d '\n' + echo -n "$line" | jq -j '.messages_persistent' echo "" done IFS=$' \t\n'