183 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			183 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/bin/bash
 | |
| # -*- sh -*-
 | |
| 
 | |
| : << =cut
 | |
| 
 | |
| =head1 NAME
 | |
| 
 | |
| pvc - Plugin to monitor a PVC cluster.
 | |
| 
 | |
| =head1 AUTHOR
 | |
| 
 | |
| Joshua Boniface <joshua@boniface.me>
 | |
| 
 | |
| =head1 LICENSE
 | |
| 
 | |
| GPLv3
 | |
| 
 | |
| =head1 BUGS
 | |
| 
 | |
| =back
 | |
| 
 | |
| =head1 MAGIC MARKERS
 | |
| 
 | |
|  #%# family=auto
 | |
|  #%# capabilities=autoconf
 | |
| 
 | |
| =cut
 | |
| 
 | |
| . "$MUNIN_LIBDIR/plugins/plugin.sh"
 | |
| 
 | |
| is_multigraph
 | |
| 
 | |
| warning=0.99
 | |
| critical=1.99
 | |
| 
 | |
| export PVC_CLIENT_DIR="/run/shm/munin-pvc"
 | |
| PVC_CMD="/usr/bin/pvc --quiet --cluster local status --format json-pretty"
 | |
| JQ_CMD="/usr/bin/jq"
 | |
| 
 | |
| output_usage() {
 | |
|     echo "This plugin outputs information about a PVC cluster and node"
 | |
|     exit 0
 | |
| }
 | |
| 
 | |
| output_autoconf() {
 | |
|     $PVC_CMD &>/dev/null
 | |
|     pvc_ret=$?
 | |
|     $JQ_CMD --version &>/dev/null
 | |
|     jq_ret=$?
 | |
| 
 | |
|     if [[ ${pvc_ret} -eq 0 && ${jq_ret} -eq 0 ]]; then
 | |
|         echo "yes"
 | |
|     elif [[ ${pvc_ret} -ne 0 ]]; then
 | |
|         echo "no (no 'pvc' command found or local cluster not usable)"
 | |
|     elif [[ ${jq_ret} -ne 0 ]]; then
 | |
|         echo "no (no 'jq' command found)"
 | |
|     else
 | |
|         echo "no (generic failure)"
 | |
|     fi
 | |
| }
 | |
| 
 | |
| output_config() {
 | |
|     echo 'multigraph pvc_cluster_health'
 | |
|     echo 'graph_title PVC Cluster Health'
 | |
|     echo 'graph_args --base 1000'
 | |
|     echo 'graph_vlabel Health%'
 | |
|     echo 'graph_category pvc'
 | |
|     echo 'graph_info Health of the PVC cluster'
 | |
| 
 | |
|     echo 'pvc_cluster_health.label Cluster Health'
 | |
|     echo 'pvc_cluster_health.type GAUGE'
 | |
|     echo 'pvc_cluster_health.max 100'
 | |
|     echo 'pvc_cluster_health.min 0'
 | |
|     echo 'pvc_cluster_health.info Health of the PVC cluster in %'
 | |
| 
 | |
|     echo 'multigraph pvc_cluster_alert'
 | |
|     echo 'graph_title PVC Cluster Alerting'
 | |
|     echo 'graph_args --base 1000'
 | |
|     echo 'graph_vlabel State'
 | |
|     echo 'graph_category pvc'
 | |
|     echo 'graph_info Alerting state of the PVC cluster health'
 | |
| 
 | |
|     echo 'pvc_cluster_alert.label Cluster Health State'
 | |
|     echo 'pvc_cluster_alert.type GAUGE'
 | |
|     echo 'pvc_cluster_alert.max 2'
 | |
|     echo 'pvc_cluster_alert.min 0'
 | |
|     echo 'pvc_cluster_alert.info Alerting state of the PVC cluster health'
 | |
|     print_warning pvc_cluster_alert
 | |
|     print_critical pvc_cluster_alert
 | |
| 
 | |
|     echo 'multigraph pvc_node_health'
 | |
|     echo 'graph_title PVC Node Health'
 | |
|     echo 'graph_args --base 1000'
 | |
|     echo 'graph_vlabel Health%'
 | |
|     echo 'graph_category pvc'
 | |
|     echo 'graph_info Health of the PVC node'
 | |
| 
 | |
|     echo 'pvc_node_health.label Node Health'
 | |
|     echo 'pvc_node_health.type GAUGE'
 | |
|     echo 'pvc_node_health.max 100'
 | |
|     echo 'pvc_node_health.min 0'
 | |
|     echo 'pvc_node_health.info Health of the PVC node in %'
 | |
| 
 | |
|     echo 'multigraph pvc_node_alert'
 | |
|     echo 'graph_title PVC Node Alerting'
 | |
|     echo 'graph_args --base 1000'
 | |
|     echo 'graph_vlabel State'
 | |
|     echo 'graph_category pvc'
 | |
|     echo 'graph_info Alerting state of the PVC node health'
 | |
| 
 | |
|     echo 'pvc_node_alert.label Node Health State'
 | |
|     echo 'pvc_node_alert.type GAUGE'
 | |
|     echo 'pvc_node_alert.max 2'
 | |
|     echo 'pvc_node_alert.min 0'
 | |
|     echo 'pvc_node_alert.info Alerting state of the PVC node health'
 | |
|     print_warning pvc_node_alert
 | |
|     print_critical pvc_node_alert
 | |
| 
 | |
|     exit 0
 | |
| }
 | |
| 
 | |
| output_values() {
 | |
|     PVC_OUTPUT="$( $PVC_CMD )"
 | |
|     HOST="$( hostname --short )"
 | |
| 
 | |
|     is_maintenance="$( $JQ_CMD ".maintenance" <<<"${PVC_OUTPUT}" | tr -d '"' )"
 | |
| 
 | |
|     cluster_health="$( $JQ_CMD ".cluster_health.health" <<<"${PVC_OUTPUT}" | tr -d '"' )"
 | |
|     cluster_health_messages="$( $JQ_CMD -r ".cluster_health.messages | @csv" <<<"${PVC_OUTPUT}" | tr -d '"' | sed 's/,/, /g' )"
 | |
|     echo 'multigraph pvc_cluster_health'
 | |
|     echo "pvc_cluster_health.value ${cluster_health}"
 | |
|     echo "pvc_cluster_health.extinfo ${cluster_health_messages}"
 | |
| 
 | |
|     if [[ ${cluster_health} -le 50 && ${is_maintenance} == "false" ]]; then
 | |
|         cluster_health_alert=2
 | |
|     elif [[ ${cluster_health} -le 90 && ${is_maintenance} == "false" ]]; then
 | |
|         cluster_health_alert=1
 | |
|     else
 | |
|         cluster_health_alert=0
 | |
|     fi
 | |
|     echo 'multigraph pvc_cluster_alert'
 | |
|     echo "pvc_cluster_alert.value ${cluster_health_alert}"
 | |
| 
 | |
|     node_health="$( $JQ_CMD ".node_health.${HOST}.health" <<<"${PVC_OUTPUT}" | tr -d '"' )"
 | |
|     node_health_messages="$( $JQ_CMD -r ".node_health.${HOST}.messages | @csv" <<<"${PVC_OUTPUT}" | tr -d '"' | sed 's/,/, /g' )"
 | |
|     echo 'multigraph pvc_node_health'
 | |
|     echo "pvc_node_health.value ${node_health}"
 | |
|     echo "pvc_node_health.extinfo ${node_health_messages}"
 | |
| 
 | |
|     if [[ ${node_health} -le 50 && ${is_maintenance} != "true" ]]; then
 | |
|         node_health_alert=2
 | |
|     elif [[ ${node_health} -le 90 && ${is_maintenance} != "true" ]]; then
 | |
|         node_health_alert=1
 | |
|     else
 | |
|         node_health_alert=0
 | |
|     fi
 | |
|     echo 'multigraph pvc_node_alert'
 | |
|     echo "pvc_node_alert.value ${node_health_alert}"
 | |
| }
 | |
| 
 | |
| case $# in
 | |
|     0)
 | |
|         output_values
 | |
|         ;;
 | |
|     1)
 | |
|         case $1 in
 | |
|             autoconf)
 | |
|                 output_autoconf
 | |
|                 ;;
 | |
|             config)
 | |
|                 output_config
 | |
|                 ;;
 | |
|             *)
 | |
|                 output_usage
 | |
|                 exit 1
 | |
|                 ;;
 | |
|         esac
 | |
|         ;;
 | |
|     *)
 | |
|         output_usage
 | |
|         exit 1
 | |
| esac
 |