diff --git a/plugins/other/jvm-thread-info b/plugins/other/jvm-thread-info new file mode 100755 index 00000000..1286e8fd --- /dev/null +++ b/plugins/other/jvm-thread-info @@ -0,0 +1,140 @@ +#!/bin/bash -e +# +# Plugin munin affichant le nombre de threads occupées, disponibles et maximales de la JVM de tomcat. +# +## Dépendances +# xmlstarlet +# wget +# +## Configuration +# +# Pour pouvoir lire le mot de passe automatiquement, le script doit tourner +# sous l'utilisateur tomcat55. Dans /etc/munin/plugin-conf.d/munin-node, +# ajouter : +# +# [tomcat_*] +# user tomcat55 +# +# Autres options disponibles : +# +# env.status_url : URL vers la page « status » en XML du manager +# env.http_username : Utilisateur HTTP +# env.users_filename : Chemin vers le fichier tomcat-users.xml +# +## + +TOMCAT_USERS=${users_filename:-'/etc/tomcat5.5/tomcat-users.xml'} +USER=${http_username:-'munin'} +URLS=( ${status_url:-'http://localhost/manager/status?XML=true https://localhost/manager/status?XML=true http://localhost/manager/status?XML=true'} ) + +WARNING=80 +CRITICAL=90 + +#///////////////////////////////////////////////////////////////////////////////// +# Affiche un message d'erreur et termine le script en renvoyant le code d'erreur 1 +# +# @param Message à afficher +#///////////////////////////////////////////////////////////////////////////////// +die(){ + echo "$1" >&2 + exit 1 +} + +#//////////////////////////////////////////////////////////////////////////// +# Récupère le mot de passe de l'utilisateur $1 contenu dans le fichier XML $2 +# +# @param in $1 Nom de l'utilisateur +# @param in $2 Fichier XML contenant les utilisateurs Tomcat +# @stdout Mot de passe de l'utilisateur +#//////////////////////////////////////////////////////////////////////////// +getPassword(){ + local PASSWORD=$(xmlstarlet sel -t -m "tomcat-users/user[@username='$1']" -v "@password" "$2" 2> /dev/null) + [[ -z $PASSWORD ]] && die "Aucun mot de passe trouvé dans le fichier « $2 » pour le compte « $1 » !" + echo $PASSWORD +} + +#////////////////////////////////////////////////////// +# Récupère la page en XML contenant le statut de la JVM +# +# @param in $1 Login pour accéder à la page de statut +# @param in $2 Mot de passe +# @param in $3..$n URL à tester +#////////////////////////////////////////////////////// +getStatusPage(){ + local USER="$1" + local PASSWORD="$2" + while [[ $# -gt 2 ]]; do + local STATUS=$(wget -O- -q --no-check-certificate --http-user "$USER" --http-password "$PASSWORD" "$3") + [[ -n $STATUS ]] && { + echo $STATUS + return + } + shift + done +} + +#/////////////////////////////////////// +# Affiche le nombre maximal de threads +# +# @param in $1 Page de statut de la JVM +# @stdout Nombre maximal de threads +#/////////////////////////////////////// +getMaxThreads(){ + local MAX_THREADS=$(xmlstarlet sel -t -m "status/connector/threadInfo" -v "@maxThreads" <<< "$1" 2> /dev/null) + [[ -z $MAX_THREADS ]] && die "Impossible de trouver le nombre maximal de threads !" + echo $MAX_THREADS +} + +#/////////////////////////////////////////////////////////////////////////// +# Affiche la configuration du plugin +# +# @param in $1 Nombre maximal de threads +# @param in $2 Pourcentage à utiliser pour définir les « warnings » [0-100] +# @param in $3 Pourcentage à utiliser pour définir les « criticals » [0-100] +# @stdout Configuration du plugin +#/////////////////////////////////////////////////////////////////////////// +showConfig(){ + local TMP=$(echo -e {maxThreads,currentThreadCount,currentThreadsBusy}.{'type GAUGE','min 0','draw AREA'}"\n") + echo "graph_category Tomcat + graph_title Tomcat Threads + graph_info nombre de threads occupées, disponibles et maximales de la JVM de tomcat + graph_vlabel Threads + $TMP + maxThreads.label maxThreads + currentThreadCount.label currentThreadCount + currentThreadsBusy.label currentThreadsBusy + currentThreadCount.warning $(($1 * $2 / 100)) + currentThreadCount.critical $(($1 * $3 / 100)) + " | sed -r 's/^\s+//' + exit 0 +} + +#//////////////////////////////////////////////////////////////////////////////////////////////////// +# Affiche les données sur le nombre de threads occupées, disponibles et maximales de la JVM de tomcat +# +# @param in $1 Page de statut de la JVM +# @stdout Données sur le nombre de threads occupées, disponibles et maximales de la JVM de tomcat +#//////////////////////////////////////////////////////////////////////////////////////////////////// +showData(){ + xmlstarlet sel -t -m "status/connector/threadInfo" \ + -o "currentThreadCount.value " -v "@currentThreadCount" -n \ + -o "currentThreadsBusy.value " -v "@currentThreadsBusy" -n \ + -o "maxThreads.value " -v "@maxThreads" \ + <<< "$1" #2> /dev/null +} + +# Le fichier $TOMCAT_USERS n'est pas lisible => on quitte +[[ ! -r $TOMCAT_USERS ]] && die "Impossible de lire le fichier $TOMCAT_USERS !" + +# On récupère le mot de passe de l'utilisateur $USER +PASSWORD=$(getPassword $USER $TOMCAT_USERS) + +# On récupère la page de statut de la JVM de tomcat +STATUS_PAGE=$(getStatusPage $USER $PASSWORD $URLS) +[[ -z $STATUS_PAGE ]] && die 'Erreur : impossible de récupérer la page de statut de Tomcat !' ; + +# On affiche la configuration du plugin +[[ $1 == 'config' ]] && showConfig $(getMaxThreads "$STATUS_PAGE") $WARNING $CRITICAL + +# On affiche les données du plugin +showData "$STATUS_PAGE"