mardi 20 septembre 2011

Template wlsagent pour PNP4Nagios

Il y a de ça peu de temps, j'ai présenté l'utilisation de wlsagent pour le suivi sous nagios d'instance WebLogic. J'avais également donné quelques exemples de graphique sous PNP4Nagios mais sans donner le template de présentation :



Le template est maintenant disponible à l'adresse suivante : http://docs.pnp4nagios.org/templates/check_wlsagent

Il faut copier-coller ce fichier dans le répertoire template de PNP4Nagios (en principe, quelque chose comme /usr/local/pnp4nagios/share/templates/) et se débrouiller pour que PNP4Nagios arrive à faire le lien entre le plugin de lancement et le template.

Personnellement, comme j'appelle tout au travers de NRPE, j'ai simplement créé un doublon de la commande check_nrpe en l'appelant check_wlsagent :
# 'check_wlsagent' command definition
define command{
  command_name check_wlsagent
  command_line $USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$
}
J'appelle ensuite mes surveillances à l'aide de commande de ce genre :
# Application WebLogic à surveiller
define service{
  use generic-service
  host_name remotehost
  service_description Application hyperimportante
check_command check_wlsagent!check_application_hyperimportante
}

mardi 13 septembre 2011

Optimisation du couple nagios/PNP4Nagios

Description de l'installation

J'utilise depuis maintenant plusieurs années un moteur nagios sur notre infra pour avoir un suivi de ce qu'il se passe sur nos serveurs.

Au début, nous avions axé notre déploiement sur la partie serveur d'application Java (à base de WebLogic). Nous avons très rapidement activé l'utilisation du moteur de base de données ndo2db. Par la suite nous avons intégré environ 60 serveurs sous cette surveillance pour un total d'environ 600 services. Les choses sont restés en l'état en raison de la machine que nous utilisions qui était particulièrement lente et pauvre en IO disque (pour les plus curieux, il s'agissait d'un Sunfire V210 avec un bi-processeur Ultrasparc III@1Ghz et 2 Go de mémoire).

Il y'a de ça un an et demi, nous avons échangé notre vieille machine poussive contre une machine Solaris flambant neuve (à base de M5000). De là, j'ai profité pour changer nos outils d'autant que je n'étais pas particulièrement content de ndo2db. C'est à cette occasion que j'ai mis en place la toute dernière version de PNP4Nagios en version 0.6 (que j'avais testé en version béta quelques temps auparavant).

De là, j'ai découvert le super système de template de PNP4nagios (cf cet article) et j'ai commencé à mettre ça en oeuvre sur tous nos éléments vitaux d'infrastructure (apache, oracle, MySQL etc.).

Le mode synchrone de PNP4Nagios étant particulièrement lent, j'ai très vite déployé PNP4Nagios en mode bulk lancé par nagios. Mais, le succès aidant, je suis rapidement passé de 60 à 100 machines puis 200. Comme un SI ne diminue jamais, dernièrement nous sommes arrivé à environ 300 machines pour environ 3000 services. Loin d'être énorme (en tunant la configuration de nagios, on parle de configuration montant à 30000 services et plus), les performances du moteur nagios avaient tout de même tendance à se dégrader comme on peut le voir sur le graphique ci-dessous des temps de latence maximum :


On voit ici des temps de latence maximum qui monté à plus de 60 secondes. Même si c'est loin d'être complètement bloquant, ça indique une réactivité beaucoup moins bonne qu'au début du fonctionnement de la plateforme.

C'est donc à ce moment là que j'ai commencé à regarder les optimisations qu'il était possible de faire et notamment l'utilisation de NPCD. J'ai également mis en place le démon de cache RRD. Pour ce dernier j'essaierai d'en parler dans un autre article.

Mise en place de NPCD

La mise en place de NPCD se fait en deux temps : mise en place du démon puis modification de la commande d'insertion des données de performance dans PNP4Nagios. Ci-dessous un schéma extrait du site de PNP4Nagios expliquant le fonctionnement du démon NPCD :

Pour le lancement du démon NPCD, rien d'extraordinaire, il suffit simplement de lancer la commande suivante :
/usr/local/pnp4nagios/bin/npcd
On peut ensuite vérifier sa présence sur le serveur :
ps -ef | grep npcd
Le démon se lance en s'appuyant sur le fichier /usr/local/pnp4nagios/etc/npcd.cfg. Ce dernier va contenir toutes les informations sur le comportement que devra adopter le démon. Vous pouvez notamment tuner les éléments suivants :
  • Le temps de pause entre deux checks dans le répertoire de spool ;
  • Le nombre max de process perfdata à lancer en parallèle ;
  • La verbosité de la log.
Une fois NPCD, nous allons maintenant pouvoir basculer l'insertion des données en utilisant un répertoire de spool. Pour se faire, nous allons changer les commandes process-service-perfdata-file et process-host-perfdata-file (en principe dans le fichier /usr/local/etc/nagios/template/commands.cfg). Ces dernières ressemblaient aux lignes suivantes :
define command {
       command_name    process-service-perfdata-file
       command_line    /usr/local/pnp4nagios/libexec/process_perfdata.pl --bulk=/usr/local/pnp4nagios/var/service-perfdata
}

define command {
       command_name    process-host-perfdata-file
       command_line    /usr/local/pnp4nagios/libexec/process_perfdata.pl --bulk=/usr/local/pnp4nagios/var/host-perfdata
}
Nous les avons remplacé par les lignes suivantes :
define command {
       command_name    process-service-perfdata-file
       command_line    /bin/mv /usr/local/pnp4nagios/var/service-perfdata /usr/local/pnp4nagios/var/spool/service-perfdata.$TIMET$
}

define command {
       command_name    process-host-perfdata-file
       command_line    /bin/mv /usr/local/pnp4nagios/var/host-perfdata /usr/local/pnp4nagios/var/spool/host-perfdata.$TIMET$
}
Il s'agit simplement de substituer l'appel direct à la commande process_perfdata.pl de PNP4Nagios par un déplacement de fichier dans un répertoire. Pas grand chose me direz-vous mais nous allons vite voir que ce petit changement aura des conséquences très intéressante au niveau de nagios.

Résultat de l'optimisation

Et il se trouve que cette modification a eu un énorme impact sur les performances. Pour preuve un état du temps de latence moyen maximum :

On peut voir que nous avons gagné en stabilité au niveau des temps de réponse max et surtout que ces derniers restent largement en dessous les 5 secondes (sauf exceptionnellement mais rien à voir avec le comportement précédent).

dimanche 11 septembre 2011

Création d'un timelapse

Depuis tout petit, j'ai toujours été intéressé par les étoiles et notamment les superbes images nous faisant découvrir les galaxies, les étoiles mortes, les nébuleuses etc. Paradoxalement, je ne m'étais jamais trop posé la question de faire ces observations par moi même puisque bien d'autre avant moi l'avait fait et - de mon point de vue - l'avait très bien fait.

Mais voilà, par un bel été il y a quelques années, ma mère m'a fait découvrir les anneaux de Saturne directement à l'aide de son petit télescope. C'est à ce moment que j'ai réalisé qu'il serait intéressant de contempler par moi même certain phénomène. Pour toute ces raisons (et pour d'autre comme par exemple la naissance de mon petit dernier), je me suis intéressé dans l'achat d'un appareil photo réflex et les techniques de photographie de type timelapse.

Ah, j'oubliais de vous préciser un truc : je n'utilise que des logiciels libre et ma machine principale héberge un Linux depuis des années. Pour ces raisons, j'essaye de faire partager ma petite expérience sur le sujet avec d'autre. Par la suite, nous utiliserons les logiciels suivant :
  • gphoto : il nous aidera à faire nos prises de vue à espace régulier. Je recommande néanmoins l'utilisation d'un intervalomètre pour éviter de se traîner un portable pendant une séance de photo ;
  • convert : outil de convertion d'image en ligne de commande ;
  • mencoder : outil de création de fichier vidéo.

Prendre des photos à intervalle régulier

Première chose, il faut utiliser un trépied afin que le cadre de vos photos reste identique de bout en bout. Il faut également désactiver l'autofocus de l'appareil ainsi que le stabilisateur d'image si vous en avez un. Fixer maintenant un élément qui vous intéresse et commencez à prendre vos photos à intervalle régulier. Pour se faire vous pouvez soit passer par un intervalomètre soit par le logiciel gphoto. En effet, ce dernier vous permet de prendre des photos directement à l'aide d'un ordinateur. Ci-dessous un exemple de ligne de commande :
gphoto2  --auto-detect --capture-image-and-download -I 1
Ci-dessous une petite explication des options présentes :
  • L'option --auto-detect à pour rôle d'inviter gphoto à utiliser le premier appareil détecté ;
  • L'option --capture-image-and-download invite gphoto à prendre une photo et à la télécharger automatiquement sur le PC ;
  • Enfin, l'option -I 1 indique le temps de pause entre chaque photo.
A la fin de votre séance de photo, vous devriez obtenir quelques centaines d'image que nous allons mettre maintenant bout à bout dans une vidéo.

Création de la vidéo

Nous allons procéder en deux étapes :
  • Retailler les photos ;
  • Assembler les photos dans une vidéo.
Pour la première étape nous allons utiliser l'outil convert de imagemagick. Nous allons également utiliser un petit bout de shell pour lancer cette convertion en boucle :
yannig@portable:~/Images/2011-09/timelapse/resize$ for i in ../*.JPG
do
  echo $i
  convert -resize 1440 $i $(basename $i)
done
L'option -resize 1440 indique à l'outil convert la taille désiré pour le fichier de résultat. Par défaut, la retaille se fait en préservant l'aspect de la photo.

NB : Pour éviter de tout mélanger, j'ai mis le résultat de la conversion dans un sous-répertoire resize.

Passons maintenant à la création de la vidéo à l'aide de mencoder (à lancer dans le répertoire contenant les fichiers retaillés) :
mencoder "mf://*.JPG" -mf fps=15:type=jpg -ovc x264 -x264encopts bitrate=3000 -o video-resultat.flv
Encore une fois, étudions ensemble les options de mencoder :
  • "mf://*.JPG" : donne le patron des fichiers à prendre en compte pour créer la vidéo ;
  • -mf fps=15:type=jpg : donne des informations sur la cadence désirée pour la vidéo ;
  • ovc x264 -x264encopts bitrate=3000 : information sur les paramètres d'encodage de la vidéo ;
  • -o video-resultat.flv : explicite le nom du fichier résultat.

Vidéo de résultat

Ci-dessous un petit exemple de ce que peu donner une vidéo réalisé avec ces outils :



Pour informations, cette vidéo à été réalisé avec 382 photos. Ces dernières ont été assemblées à une cadence de 25 images par secondes. Chaque image a été prise en mode automatique sur un Canon EOS 550D avec un intervalle de 10 secondes entre chaque prise de vue.

En espérant que tout ceci vous inspire !

mercredi 7 septembre 2011

Mise en place de wlsagent

J'ai déjà parlé sur ce blog d'intégrer une surveillance des indicateurs interne de WebLogic sous nagios. Nous allons voir ensemble un nouvel exemple de plugin particulièrement intéressant que j'ai eu l'occasion de déployer : wlsagent.

Installation de l'agent wlsagent

Il nous tout d'abord récupérer une version récente de notre plugin :
yannig@portable:~/wlsagent$ svn checkout http://wlsagent.googlecode.com/svn/trunk/src src
Procédons maintenant à la récupération des librairies nécessaires au fonctionnement de wlsagent :

  • jetty-continuation-7.3.1.v20110307.jar
  • jetty-http-7.3.1.v20110307.jar
  • jetty-io-7.3.1.v20110307.jar
  • jetty-security-7.3.1.v20110307.jar
  • jetty-server-7.3.1.v20110307.jar
  • jetty-servlet-7.3.1.v20110307.jar
  • jetty-util-7.3.1.v20110307.jar
  • servlet-api-2.5.jar
  • wlclient.jar
  • wljmxclient.jar

Tous les jars de type jetty et servlet-api font partie du package jetty que vous pouvez récupérer à l'addresse suivante : http://www.eclipse.org/jetty/downloads.php

Déposons maintenant ces fichiers dans le répertoire lib, à la même hauteur que le répertoire src des fichiers sources de wlsagent. Concernant les fichiers wlclient.jar et wljmxclient.jar, vous les trouverez dans les binaires de WebLogic.

Récupérons ensuite le fichier de build ant suivant :


 name="wlsagent" basedir="." default="build">

     name="src.dir"     value="src"/>
     name="build.dir"   value="build"/>
     name="classes.dir" value="${build.dir}/classes"/>
     name="jar.dir"     value="${build.dir}/jar"/>
     name="lib.dir"     value="lib"/>
     name="main-class"  value="net.wait4it.wlsagent.WlsAgent"/>

     id="classpath">
         dir="${lib.dir}" includes="**/*.jar"/>
    

     name="clean">
         dir="${build.dir}"/>
    

     name="compile">
         dir="${classes.dir}"/>
         srcdir="${src.dir}" destdir="${classes.dir}" classpathref="classpath" includeantruntime="true"/>
    

     name="jar" depends="compile">
         dir="${jar.dir}"/>
         destfile="${jar.dir}/${ant.project.name}.jar" basedir="${classes.dir}">
            
                 name="Main-Class" value="${main-class}"/>
            
        
    

     name="build" depends="clean,jar"/>

Lançons ensuite le build avec ant, vous devriez obtenir le fichier wlsagent.jar dans le répertoire build/jar.

Passons maintenant à la création du fichier de démarrage de wlsagent :

#!/bin/bash
JAVA_HOME="/usr/lib/jvm/java-6-openjdk"
CURRENT_PATH=$(dirname $0)
LIB_PATH=${CURRENT_PATH}/lib
CLASSPATH=${CURRENT_PATH}/wlsagent.jar

for jar in $(find ${LIB_PATH} -name '*.jar'); do
  CLASSPATH=${CLASSPATH}:${jar};
done

start()
{
  ${JAVA_HOME}/bin/java -Xmx32m -cp ${CLASSPATH} net.wait4it.wlsagent.WlsAgent "9090" > $CURRENT_PATH/wlsagent.log 2>&1 &  echo $! > $CURRENT_PATH/wlsagent.pid
}

stop()
{
  kill $(< $CURRENT_PATH/wlsagent.pid)
}

case $1 in
  stop) stop ;;
  start) start ;;
  restart) stop ; sleep 1 ; start ;;
  status) ps -fp $(< $CURRENT_PATH/wlsagent.pid) ;;
  *) echo "Expected : start/stop/restart/status" ;;
esac
Il ne nous reste plus qu'à lancer le tout et de vérifier le bon démarrage de l'agent :
yannig@portable:~/wlsagent$ ./wlsagent.sh start
yannig@portable-ots:~/wlsagent$ ps -ef | grep wlsagent | grep -v grep
yannig    3922     1  0 10:45 pts/2    00:00:04 /usr/lib/jvm/java-6-openjdk/bin/java -Xmx32m -cp ./wlsagent.jar:.[...]servlet-api-2.5.jar net.wait4it.wlsagent.WlsAgent 9090
Un coup d'oeil dans la log pour vérifier le bon démarrage de l'agent :
yannig@portable:~/wlsagent$ more wlsagent.log 
2011-09-03 10:45:49.961:INFO::jetty-7.3.1.v20110307
2011-09-03 10:45:50.069:INFO::started o.e.j.s.ServletContextHandler{/wlsagent,null}
2011-09-03 10:45:50.222:INFO::Started SelectChannelConnector@0.0.0.0:9090
Tout est prêt ! Nous allons maintenant pouvoir lancer nos tests de communication.

Utilisation du plugin wlsagent

Avant toute chose il faut créer un utilisateur nagios faisant parti du groupe Monitors dans le domaine WebLogic.

On lance ensuite une requête sur l'agent à l'aide d'un wget :
wget -q -O - "http://localhost:9090/wlsagent/WlsAgent?hostname=$(hostname)&port=7028&username=nagios&password=xxx&jvm=UsedMemory;80;90"
0|AdminServer: status OK|HeapSize=370M;;;0;910 UsedMemory=210M;;;0;910

Ici, pas de problème la communication se passe bien. Il suffit ensuite d'intégrer cette surveillance dans nagios pour obtenir une collecte. Pour se faire, vous pouvez récupérer un script d'invocation à l'emplacement suivant : http://code.google.com/p/wlsagent/wiki/Invocation 

Il vous faudra également un outil de collecte des données de performance comme PNP4Nagios. Ci-dessous un exemple de résultat d'intégration à la suite de 2 semaines de collecte :


Pour info, il est possible de remonter les éléments suivants :
  • Threads sur la JVM ;
  • Nombre de transactions en cours sur la JVM ;
  • Nombre de requête / seconde (throughput) ;
  • État des connexion JDBC ;
  • Nombre de session utilisateur ;
  • Et enfin, l'utilisation des queues JMS.
Activité datasource de l'application
Pour gérer ces surveillances, il est nécessaire de rajouter des options pour préciser les éléments à surveiller dans nagios. Pour plus de détail, se reporter à la page suivante : http://code.google.com/p/wlsagent/