<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3536118107392327686</id><updated>2012-02-12T19:56:10.472+01:00</updated><category term='linux'/><category term='apache'/><category term='Thruk'/><category term='SDS'/><category term='grub'/><category term='npcd'/><category term='load-balancing'/><category term='java'/><category term='fail-over'/><category term='gphoto'/><category term='convert'/><category term='HAProxy'/><category term='perl'/><category term='robot'/><category term='rrdcached'/><category term='nagios'/><category term='Mediawiki'/><category term='mencoder'/><category term='nrpe'/><category term='pnp4nagios'/><category term='http'/><category term='WebLogic'/><category term='RRD'/><category term='PHP'/><category term='wlagent'/><category term='shinken'/><category term='compilation'/><category term='Photographie'/><category term='script'/><category term='debian'/><category term='snmp'/><category term='performance'/><category term='SSL'/><category term='ubuntu'/><category term='solaris'/><category term='ipmi'/><category term='ndoutils'/><category term='AIX'/><category term='ZFS'/><category term='patch'/><title type='text'>Les aventures d'un Geek Unixien</title><subtitle type='html'>Les trucs sur lesquels je bosse en tant qu'ingénieur Unix et mes lubies du moment.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://lesaventuresdeyannigdanslemondeit.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3536118107392327686/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://lesaventuresdeyannigdanslemondeit.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Yannig Perre</name><uri>https://profiles.google.com/104797199411947382593</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-6bgdo630G7s/AAAAAAAAAAI/AAAAAAAAAhc/P4yM7287fOg/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>27</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3536118107392327686.post-4746501439078576410</id><published>2011-12-19T17:20:00.000+01:00</published><updated>2011-12-19T17:20:27.465+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='nrpe'/><category scheme='http://www.blogger.com/atom/ns#' term='patch'/><category scheme='http://www.blogger.com/atom/ns#' term='nagios'/><title type='text'>Patch multi packet pour NRPE 2.13</title><content type='html'>&lt;p&gt;Malgré le faible intérêt de la sortie de nrpe 2.13, je vais tout de même le déployer pour la simple et bonne raison que nous allons bientôt migrer notre infrastructure nagios de Solaris à Linux. C'est donc dans ce cadre que j'ai voulu changer de version et surtout réappliquer le patch que j'utilise depuis pas mal de temps permettant de gérer des sorties longues.&lt;/p&gt;&lt;p&gt;Problème, le patch de tonvoon (dont je parle &lt;a href='http://lesaventuresdeyannigdanslemondeit.blogspot.com/2011/03/patch-du-jour-nrpe-et-les-sorties.html'&gt;ici&lt;/a&gt;) n'est plus utilisable en l'état. Comme de toute façon le code source a très peu été retouché (juste l'ajout d'une fonction dans le démon nrpe), nous allons voir comment faire pour récupérer ce patch et forcer son application.&lt;/p&gt;&lt;p&gt;Tout d'abord, il nous faut récupérer une copie de notre patch sur notre machine :&lt;/p&gt;&lt;pre&gt;wget https://dev.icinga.org/attachments/download/113/nrpe_multiline.patch&lt;/pre&gt;&lt;p&gt;Passons maintenant à la transformation de notre patch au format Windows (eurk !) :&lt;/p&gt;&lt;pre&gt;unix2dos ./nrpe_multiline.patch&lt;/pre&gt;&lt;p&gt;Il ne nous reste plus qu'à passer le patch en indiquant la ligne de commande &lt;b&gt;patch --binary -l -p1&lt;/b&gt;. Si tout se passe bien, la sortie devrait ressembler à ce qui suit :&lt;/p&gt;&lt;pre&gt;&lt;br /&gt;nous@roulette:~/nagios/nrpe-2.13$ patch --binary -l -p1 &lt; ../nrpe_multiline.patc&lt;br /&gt;h &lt;br /&gt;patching file include/common.h&lt;br /&gt;patching file src/check_nrpe.c&lt;br /&gt;patching file src/nrpe.c&lt;br /&gt;Hunk #1 succeeded at 972 (offset -57 lines).&lt;br /&gt;Hunk #2 succeeded at 1190 (offset -57 lines).&lt;br /&gt;Hunk #3 succeeded at 1206 (offset -57 lines).&lt;br /&gt;Hunk #4 succeeded at 1235 (offset -57 lines).&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Lançons maintenant la configuration et la compilation. Tout devrait bien se passer.&lt;/p&gt;&lt;p&gt;Nous allons maintenant nous assurer qu'il n'y a pas eu de régression. Tout d'abord créons un fichier &lt;b&gt;nrpe.cfg&lt;/b&gt; avec le contenu suivant :&lt;/p&gt;&lt;pre&gt;&lt;br /&gt;log_facility=daemon&lt;br /&gt;pid_file=./nrpe.pid&lt;br /&gt;server_port=5666&lt;br /&gt;server_address=127.0.0.1&lt;br /&gt;nrpe_user=nagios&lt;br /&gt;nrpe_group=nagios&lt;br /&gt;allowed_hosts=127.0.0.1&lt;br /&gt;dont_blame_nrpe=0&lt;br /&gt;debug=0&lt;br /&gt;command_timeout=60&lt;br /&gt;connection_timeout=300&lt;br /&gt;&lt;br /&gt;command[short_output]=echo coucou&lt;br /&gt;command[long_output]=/bin/cat /etc/wgetrc&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;La première commande affiche un simple coucou et la seconde affiche le contenu du fichier &lt;b&gt;/etc/wgetrc&lt;/b&gt;.&lt;p&gt;Mais trêve de bavardage et lançons séance tenante notre démon :&lt;/p&gt;&lt;pre&gt;&lt;br /&gt;nous@roulette:~/nagios/nrpe-2.13$ ./src/nrpe -c ./nrpe.cfg -d&lt;br /&gt;nous@roulette:~/nagios/nrpe-2.13$ ps -ef | grep nrpe&lt;br /&gt;nous      9374     1  0 17:04 ?        00:00:00 ./src/nrpe -c ./nrpe.cfg -d&lt;br /&gt;nous      9376  5769  0 17:04 pts/0    00:00:00 grep --color=auto nrpe&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Tout semble parfait. Lançons un test de notre première commande :&lt;/p&gt;&lt;pre&gt;&lt;br /&gt;./src/check_nrpe -H localhost -c short_output&lt;br /&gt;coucou&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Ça semble plutôt pas mal. Regardons maintenant la taille de la sortie de notre commande longue et comparons cela au fichier d'origine :&lt;/p&gt;&lt;pre&gt;&lt;br /&gt;nous@roulette:~/nagios/nrpe-2.13$ ./src/check_nrpe -H localhost -c long_output | wc&lt;br /&gt;    126     797    4496&lt;br /&gt;nous@roulette:~/nagios/nrpe-2.13$ wc /etc/wgetrc&lt;br /&gt; 126  797 4496 /etc/wgetrc&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;C'est parfait ! Notre NRPE en version 2.13 avec patch sortie longue est prêt à fonctionner !&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3536118107392327686-4746501439078576410?l=lesaventuresdeyannigdanslemondeit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lesaventuresdeyannigdanslemondeit.blogspot.com/feeds/4746501439078576410/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3536118107392327686&amp;postID=4746501439078576410' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3536118107392327686/posts/default/4746501439078576410'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3536118107392327686/posts/default/4746501439078576410'/><link rel='alternate' type='text/html' href='http://lesaventuresdeyannigdanslemondeit.blogspot.com/2011/12/patch-multi-packet-pour-nrpe-213.html' title='Patch multi packet pour NRPE 2.13'/><author><name>Yannig Perre</name><uri>https://profiles.google.com/104797199411947382593</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-6bgdo630G7s/AAAAAAAAAAI/AAAAAAAAAhc/P4yM7287fOg/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3536118107392327686.post-2530789725964962551</id><published>2011-11-26T12:28:00.001+01:00</published><updated>2011-11-26T12:47:44.235+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='nrpe'/><category scheme='http://www.blogger.com/atom/ns#' term='patch'/><category scheme='http://www.blogger.com/atom/ns#' term='nagios'/><title type='text'>Sortie de NRPE 2.13</title><content type='html'>Il y'a peu de temps, &lt;a href='http://labs.nagios.com/2011/11/11/nrpe-2-13-available/'&gt;la version 2.13 de NRPE est sortie&lt;/a&gt;. Autant dire que je suis assez déçu sur le contenu de cette nouvelle version puisque nous n'avons qu'un seul changement pour définir qui a le droit de se connecter sur l'agent NRPE dans le fichier nrpe.cfg (ainsi que la compilation sous Solaris 10). En gros, auparavant, vous étiez obliger de donner explicitement l'IP de votre serveur nagios pour pouvoir vous connecter. Dorénavant, vous pouvez préciser un réseau avec un masque. Ci-dessous un exemple de fichier nrpe.cfg faisant appel à ce mécanisme :&lt;pre&gt;&lt;br /&gt;log_facility=daemon&lt;br /&gt;pid_file=/var/run/nagios/nrpe.pid&lt;br /&gt;server_port=6666&lt;br /&gt;nrpe_user=nagios&lt;br /&gt;nrpe_group=nagios&lt;br /&gt;# allowed_hosts=127.0.0.1&lt;br /&gt;allowed_hosts=192.168.0.0/24&lt;br /&gt;&lt;br /&gt;dont_blame_nrpe=0&lt;br /&gt;debug=0&lt;br /&gt;command_timeout=60&lt;br /&gt;connection_timeout=300&lt;br /&gt;command[check_users]=/usr/lib/nagios/plugins/check_users -w 5 -c 10&lt;br /&gt;command[check_load]=/usr/lib/nagios/plugins/check_load -w 15,10,5 -c 30,25,20&lt;br /&gt;command[check_hda1]=/usr/lib/nagios/plugins/check_disk -w 20% -c 10% -p /dev/hda1&lt;br /&gt;command[check_zombie_procs]=/usr/lib/nagios/plugins/check_procs -w 5 -c 10 -s Z&lt;br /&gt;command[check_total_procs]=/usr/lib/nagios/plugins/check_procs -w 150 -c 200 &lt;br /&gt;&lt;/pre&gt;NB: ce démon tourne sur le port 6666 pour des besoins de test. La commande check_nrpe ci-dessous utilisera l'option -p 6666 pour pouvoir s'y connecter.&lt;br/&gt;On va essayer de se connecter sur notre agent NRPE. Ci-dessous l'adresse de mon poste :&lt;pre&gt;&lt;br /&gt;drayan@robert:~/dev/nrpe-2.13$ ifconfig eth0&lt;br /&gt;eth0      Link encap:Ethernet  HWaddr 1c:6f:65:21:7b:c0  &lt;br /&gt;          inet adr:192.168.0.17  Bcast:192.168.0.255  Masque:255.255.255.0&lt;br /&gt;[...]&lt;br /&gt;&lt;/pre&gt;Lançons un test en tant que localhost (qui devrait nous jeter du fait qu'on se présente avec l'adresse IP 127.0.0.1) :&lt;pre&gt;&lt;br /&gt;drayan@robert:~/dev/nrpe-2.13$ ./src/check_nrpe -H localhost -c check_load -p 6666&lt;br /&gt;CHECK_NRPE: Error - Could not complete SSL handshake.&lt;br /&gt;&lt;/pre&gt;Parfait ! Lançons maintenant la même chose en utilisant notre adresse IP :&lt;pre&gt;&lt;br /&gt;drayan@robert:~/dev/nrpe-2.13$ ./src/check_nrpe -H 192.168.0.17 -c check_load -p 6666&lt;br /&gt;OK - Charge moyenne: 0.03, 0.06, 0.09|load1=0.030;15.000;30.000;0; load5=0.060;10.000;25.000;0; load15=0.090;5.000;20.000;0;&lt;br /&gt;&lt;/pre&gt;Voilà, c'est tout ... Je suis notamment assez déçu que le patch pour gérer les sorties longues (&lt;a href='http://lesaventuresdeyannigdanslemondeit.blogspot.com/2011/03/patch-du-jour-nrpe-et-les-sorties.html'&gt;dont j'avais parlé ici il y'a quelque temps&lt;/a&gt;) ne fasse pas partie de cette release.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3536118107392327686-2530789725964962551?l=lesaventuresdeyannigdanslemondeit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lesaventuresdeyannigdanslemondeit.blogspot.com/feeds/2530789725964962551/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3536118107392327686&amp;postID=2530789725964962551' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3536118107392327686/posts/default/2530789725964962551'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3536118107392327686/posts/default/2530789725964962551'/><link rel='alternate' type='text/html' href='http://lesaventuresdeyannigdanslemondeit.blogspot.com/2011/11/sortie-de-nrpe-213.html' title='Sortie de NRPE 2.13'/><author><name>Yannig Perre</name><uri>https://profiles.google.com/104797199411947382593</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-6bgdo630G7s/AAAAAAAAAAI/AAAAAAAAAhc/P4yM7287fOg/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3536118107392327686.post-3316843574033746818</id><published>2011-11-26T10:38:00.001+01:00</published><updated>2011-11-26T11:08:14.345+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='nrpe'/><category scheme='http://www.blogger.com/atom/ns#' term='compilation'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Compilation de NRPE 2.13 sous Ubuntu 11.10</title><content type='html'>&lt;br /&gt;Si comme moi vous voulez compiler votre démon NRPE 2.13 sous Ubuntu oneiric, vous avez dû tomber sur un bien beau message d'erreur :&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;drayan@robert:~/dev/nrpe-2.12$ ./configure&lt;br /&gt;checking for a BSD-compatible install... /usr/bin/install -c&lt;br /&gt;checking build system type... x86_64-unknown-linux-gnu&lt;br /&gt;checking host system type... x86_64-unknown-linux-gnu&lt;br /&gt;[...]&lt;br /&gt;checking for type of socket size... size_t&lt;br /&gt;checking for SSL headers... SSL headers found in /usr&lt;br /&gt;checking for SSL libraries... configure: error: Cannot find ssl libraries&lt;br /&gt;drayan@robert:~/dev/nrpe-2.12$&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Autant dire qu'avec ça, je suis bien avancé. Après quelque recherche, je tombe sur un bug référencé sur launchpad : &lt;a href='https://launchpad.net/ubuntu/oneiric/+source/nagios-nrpe/2.12-4ubuntu3'&gt;https://launchpad.net/ubuntu/oneiric/+source/nagios-nrpe/2.12-4ubuntu3&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Dans le bug, le mainteneur du paquet nous fait part d'un laconique message invitant à rajouter l'option --with-ssl-lib=&amp;lt;multiarch dir&amp;gt;. N'ayant pas trop d'idée de ce que ça pouvait bien vouloir dire, j'ai donc tâtonné avant de tomber sur un configure qui passait. Dans l'espoir de faire gagner du temps à d'autre, je vous fais donc part de cette merveilleuse option (dans le cas d'une machine avec un kernel x86_64) :&lt;pre&gt;&lt;br /&gt;drayan@robert:~/dev/nrpe-2.13$ ./configure --with-ssl-lib=/usr/lib/x86_64-linux-gnu&lt;br /&gt;checking for a BSD-compatible install... /usr/bin/install -c&lt;br /&gt;checking build system type... x86_64-unknown-linux-gnu&lt;br /&gt;checking host system type... x86_64-unknown-linux-gnu&lt;br /&gt;[...]&lt;br /&gt;checking for SSL headers... SSL headers found in /usr&lt;br /&gt;checking for SSL libraries... SSL libraries found in /usr/lib/x86_64-linux-gnu&lt;br /&gt;&lt;br /&gt;*** Generating DH Parameters for SSL/TLS ***&lt;br /&gt;Generating DH parameters, 512 bit long safe prime, generator 2&lt;br /&gt;This is going to take a long time&lt;br /&gt;.+......................[...].....++*++*++*++*++*++*&lt;br /&gt;checking for Kerberos include files... could not find include files&lt;br /&gt;checking for perl... /usr/bin/perl&lt;br /&gt;configure: creating ./config.status&lt;br /&gt;config.status: creating Makefile&lt;br /&gt;config.status: creating src/Makefile&lt;br /&gt;config.status: creating subst&lt;br /&gt;config.status: creating include/config.h&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;*** Configuration summary for nrpe 2.13 11-11-2011 ***:&lt;br /&gt;&lt;br /&gt; General Options:&lt;br /&gt; -------------------------&lt;br /&gt; NRPE port:    5666&lt;br /&gt; NRPE user:    nagios&lt;br /&gt; NRPE group:   nagios&lt;br /&gt; Nagios user:  nagios&lt;br /&gt; Nagios group: nagios&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Review the options above for accuracy.  If they look okay,&lt;br /&gt;type 'make all' to compile the NRPE daemon and client.&lt;br /&gt;&lt;/pre&gt;Bref, maintenant, je vais pouvoir me battre avec le patch &lt;a href='http://lesaventuresdeyannigdanslemondeit.blogspot.com/2011/03/patch-du-jour-nrpe-et-les-sorties.html'&gt;long output pour NRPE&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3536118107392327686-3316843574033746818?l=lesaventuresdeyannigdanslemondeit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lesaventuresdeyannigdanslemondeit.blogspot.com/feeds/3316843574033746818/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3536118107392327686&amp;postID=3316843574033746818' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3536118107392327686/posts/default/3316843574033746818'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3536118107392327686/posts/default/3316843574033746818'/><link rel='alternate' type='text/html' href='http://lesaventuresdeyannigdanslemondeit.blogspot.com/2011/11/compilation-de-nrpe-213-sous-ubuntu.html' title='Compilation de NRPE 2.13 sous Ubuntu 11.10'/><author><name>Yannig Perre</name><uri>https://profiles.google.com/104797199411947382593</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-6bgdo630G7s/AAAAAAAAAAI/AAAAAAAAAhc/P4yM7287fOg/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3536118107392327686.post-412684136198651464</id><published>2011-11-09T19:04:00.001+01:00</published><updated>2011-11-09T19:19:52.499+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='rrdcached'/><category scheme='http://www.blogger.com/atom/ns#' term='pnp4nagios'/><category scheme='http://www.blogger.com/atom/ns#' term='nagios'/><title type='text'>Optimisation de PNP4Nagios avec RRDcached</title><content type='html'>Suite à l'article sur l'utilisation du démon NPCD, j'ai voulu voir quel pourrait être l'impact de la mise en place du démon RRDCached sur le fonctionnement de PNP4Nagios. Pour se faire, il faut bien comprendre à quoi sert ce fameux démon.&lt;br /&gt;&lt;br /&gt;Pour cela, il faut revenir sur le fonctionnement de PNP4Nagios à savoir de prendre un grand nombre de métrique et d'alimenter au fur et à mesure un grand nombre de petit fichier : les fichiers RRD. Au delà d'un certain nombre de service, nous pouvons nous retrouver avec une machine qui fait énormément d'IO et qui du coup n'a plus le temps de mettre à jour certaines métriques (mécanisme de timeout de PNP4Nagios). Nous voyons donc qu'au delà un certain seuil, PNP4Nagios peut retomber sur tous les travers classiques des infrastructures de surveillance : consommer de la puissance CPU et être lent (qui a soufflé le nom de NDO utils ?).&amp;nbsp;Le démon RRDCached prend ici tout son sens. En effet, ce dernier va buffuriser les mises à jours RRD au lieu de les faire unitairement réduisant grandement les IO sur notre serveur nagios.&lt;br /&gt;&lt;br /&gt;Pour mieux comprendre, prenons le cas d'un serveur nagios remontant en moyenne 10 métriques par services. Si vous êtes comme moi et que vous avez explosé vos fichiers RRD en n fichiers pour chaque services, vous aurez un fichier par métrique. Si nous scruptons toutes les 5 minutes nos différents services (toujours en moyenne), nous nous retrouvons à mettre à jour 10 fichiers pour chaque test de service nagios. Si on reporte ce chiffre sur 1 heure, nous aurons donc environ 120 écritures sur une heure. Si vous multipliez tout ceci par le nombre de service présent sur vos machines (on va dire 5000), vous vous retrouvez à faire environ 600000 écritures par heure. Si vous ajoutez à cela que votre serveur faire appel à des métriques qui sont plus régulière (toutes les 2 minutes voir toute les minutes), vous pouvez commencer à avoir des problèmes.&lt;br /&gt;&lt;br /&gt;RRDCached, en s'intercallant entre les outils RRD et les écritures sur le disque, va regrouper ces dernières et ainsi mieux exploiter les capacités de la machine. Imaginons que ce dernier procéde à une buffurisation des écritures sur 1/2 heure, vous diviserez par 6 vos IOs pour des services scruptant toutes les 5 minutes. Ce chiffre pouvant monter à 30 pour des services remontant des métriques toutes les minutes.&lt;br /&gt;&lt;br /&gt;Voyons maintenant comment mettre en oeuvre ce démon.&lt;br /&gt;&lt;br /&gt;NB : Par la suite, il est évident que je considérerai que PNP4Nagios sera configuré en mode NPCD (cf mon article sur la &lt;a href="http://lesaventuresdeyannigdanslemondeit.blogspot.com/2011/09/optimisation-du-couple-nagiospnp4nagios.html"&gt;configuration de PNP4Nagios en mode NPCD&lt;/a&gt;) et surtout qu'il utilisera le module RRDs de perl pour faire ses mise à jour (cf &lt;a href="http://lesaventuresdeyannigdanslemondeit.blogspot.com/2010/05/test-du-module-rrd-perl.html"&gt;mon article sur le sujet&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Installons&amp;nbsp;tout d'abord notre démon rrdcached (sous Debian ou ubuntu) :&lt;br /&gt;&lt;pre&gt;sudo apt-get install rrdcached&lt;br /&gt;&lt;/pre&gt;Et regardons si ce dernier est bien lancé :&lt;br /&gt;&lt;pre&gt;$ /etc/init.d/rrdcached status&lt;br /&gt;rrdcached (1262) is running.&lt;br /&gt;$ ps -fp 1262&lt;br /&gt;UID &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;PID &amp;nbsp;PPID &amp;nbsp;C STIME TTY &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;TIME CMD&lt;br /&gt;root &amp;nbsp; &amp;nbsp; &amp;nbsp;1262 &amp;nbsp; &amp;nbsp; 1 &amp;nbsp;0 18:46 ? &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;00:00:00 /usr/bin/rrdcached -l unix:/var/run/rrdcached.sock -j /var/lib/rrdcached/journal&lt;/pre&gt;Tout semble aller pour le mieux. Nous allons maintenant configurer le script &lt;b&gt;process_perfdata.pl&lt;/b&gt; afin qu'il passe par ce démon pour la mise à jour des fichiers RRD. Pour se faire, nous allons modifier le fichier&amp;nbsp;&lt;b&gt;process_perfdata.cfg &lt;/b&gt;et notamment la ligne suivante :&lt;br /&gt;&lt;pre&gt;RRD_DAEMON_OPTS = unix:/var/run/rrdcached.sock&lt;/pre&gt;Attendons un petit peu et allons consulter l'interface de PNP4Nagios. Cette dernière ne devrait plus nous remonter de statistique sur notre moteur PNP4Nagios. Ce comportement est tout à fait normal étant donné que l'interface PHP de PNP4Nagios n'a aucune connaissance de ce nouveau démon. Ce dernier continue donc de s'appuyer sur les fichiers RRD présent alors que ces derniers ne sont plus mis à jour en temps réel.&lt;br /&gt;&lt;br /&gt;Modifions maintenant la configuration de PNP4Nagios (fichier &lt;b&gt;config_local.php&lt;/b&gt; qu'il faudra créer s'il n'existe pas) afin de lui préciser le pipe nommé de notre démon de cache :&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;$conf['RRD_DAEMON_OPTS'] = 'unix:/var/run/rrdcached.sock';&lt;/pre&gt;Dorénavant, le graphique se met bien à jour en temps réel. En effet, en précisant au binaire RRDTool que nous avons un démon de cache, ce dernier va simplement dire au démon de vider ses buffers sur les fichiers RRDs que nous sommes en train de consulter afin qu'il nous fasse profiter des dernières valeurs que ce dernier avait emmagasiné.&lt;br /&gt;&lt;br /&gt;Vous pourriez vous dire que le fait de vider le cache de notre démon avant de pouvoir consulter nos graphiques est une perte de temps. Effectivement, ce comportement sera peu avantageux pour les fichiers RRDs que nous voudrons consulter. En revanche, il sera avantageux pour les milliers d'autres qui pourront continuer à être buffurisé.&lt;br /&gt;&lt;br /&gt;ATTENTION !!! Dorénavant, votre démon RRDcached est un élément vitale de votre infrastructure. Je vous recommande chaudement de le surveiller avec votre moteur nagios sous peine de ne plus avoir de mise à jour si ce dernier devait tomber.&lt;br /&gt;&lt;br /&gt;Vous allez me dire que tout ça c'est très bien mais vous voudriez savoir si le jeu en vaut la chandelle. Comme généralement les graphiques parlent plus que les chiffres, voici les résultats des temps de réponse moyen de PNP4Nagios suite à la mise en place de ce merveilleux plugin (ici sur 1 mois) :&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-s_XI3B51XDY/Tq7FUUYUt5I/AAAAAAAAAk8/_xvX6RjUw1s/s1600/activation_rrdcached.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="161" src="http://3.bp.blogspot.com/-s_XI3B51XDY/Tq7FUUYUt5I/AAAAAAAAAk8/_xvX6RjUw1s/s320/activation_rrdcached.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Comme vous pouvez le constater, du jour où le démon a été mis en place, j'ai vu une grosse diminution de l'effet yoyo et surtout une baisse assez importante du temps moyen pour les mise à jour de PNP4Nagios (passage de 9 secondes avec pointe à 70 secondes à une moyenne sans pique autour de 5 secondes). Autant vous dire que tout ceci est une très bonne nouvelle et que je vais pouvoir continuer mon travail de big brother !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3536118107392327686-412684136198651464?l=lesaventuresdeyannigdanslemondeit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lesaventuresdeyannigdanslemondeit.blogspot.com/feeds/412684136198651464/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3536118107392327686&amp;postID=412684136198651464' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3536118107392327686/posts/default/412684136198651464'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3536118107392327686/posts/default/412684136198651464'/><link rel='alternate' type='text/html' href='http://lesaventuresdeyannigdanslemondeit.blogspot.com/2011/11/optimisation-de-pnp4nagios-avec.html' title='Optimisation de PNP4Nagios avec RRDcached'/><author><name>Yannig Perre</name><uri>https://profiles.google.com/104797199411947382593</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-6bgdo630G7s/AAAAAAAAAAI/AAAAAAAAAhc/P4yM7287fOg/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-s_XI3B51XDY/Tq7FUUYUt5I/AAAAAAAAAk8/_xvX6RjUw1s/s72-c/activation_rrdcached.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3536118107392327686.post-8141425387791729343</id><published>2011-09-20T00:00:00.001+02:00</published><updated>2011-09-29T07:57:52.573+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WebLogic'/><category scheme='http://www.blogger.com/atom/ns#' term='pnp4nagios'/><category scheme='http://www.blogger.com/atom/ns#' term='nagios'/><title type='text'>Template wlsagent pour PNP4Nagios</title><content type='html'>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 :&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-1gmCzgdqLl8/TmfQ4XyzSgI/AAAAAAAAAhs/kMmE1VunNHM/s1600/wlsagent-003.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="191" src="http://4.bp.blogspot.com/-1gmCzgdqLl8/TmfQ4XyzSgI/AAAAAAAAAhs/kMmE1VunNHM/s320/wlsagent-003.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Le template est maintenant disponible à l'adresse suivante : &lt;a href="http://docs.pnp4nagios.org/templates/check_wlsagent"&gt;http://docs.pnp4nagios.org/templates/check_wlsagent&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;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 :&lt;br /&gt;&lt;pre&gt;# 'check_wlsagent' command definition&lt;br /&gt;define command{&lt;br /&gt;  command_name check_wlsagent&lt;br /&gt;  command_line $USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$&lt;br /&gt;}&lt;/pre&gt;J'appelle ensuite mes surveillances à l'aide de commande de ce genre :&lt;br /&gt;&lt;pre&gt;# Application WebLogic à surveiller&lt;br /&gt;define service{&lt;br /&gt;  use generic-service&lt;br /&gt;  host_name remotehost&lt;br /&gt;  service_description Application hyperimportante&lt;br /&gt;check_command check_wlsagent!check_application_hyperimportante&lt;br /&gt;}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3536118107392327686-8141425387791729343?l=lesaventuresdeyannigdanslemondeit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lesaventuresdeyannigdanslemondeit.blogspot.com/feeds/8141425387791729343/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3536118107392327686&amp;postID=8141425387791729343' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3536118107392327686/posts/default/8141425387791729343'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3536118107392327686/posts/default/8141425387791729343'/><link rel='alternate' type='text/html' href='http://lesaventuresdeyannigdanslemondeit.blogspot.com/2011/09/template-wlsagent-pour-pnp4nagios.html' title='Template wlsagent pour PNP4Nagios'/><author><name>Yannig Perre</name><uri>https://profiles.google.com/104797199411947382593</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-6bgdo630G7s/AAAAAAAAAAI/AAAAAAAAAhc/P4yM7287fOg/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-1gmCzgdqLl8/TmfQ4XyzSgI/AAAAAAAAAhs/kMmE1VunNHM/s72-c/wlsagent-003.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3536118107392327686.post-7356690021853132059</id><published>2011-09-13T23:44:00.000+02:00</published><updated>2011-11-10T08:02:29.896+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='pnp4nagios'/><category scheme='http://www.blogger.com/atom/ns#' term='npcd'/><category scheme='http://www.blogger.com/atom/ns#' term='nagios'/><category scheme='http://www.blogger.com/atom/ns#' term='RRD'/><title type='text'>Optimisation du couple nagios/PNP4Nagios</title><content type='html'>&lt;h2&gt;Description de l'installation&lt;/h2&gt;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.&lt;br /&gt;&lt;br /&gt;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).&lt;br /&gt;&lt;br /&gt;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).&lt;br /&gt;&lt;br /&gt;De là, j'ai découvert le super système de template de PNP4nagios (cf &lt;a href="http://www.blogger.com/2010/05/personnalisation-de-pnp4nagios-ecriture.html"&gt;cet article&lt;/a&gt;) et j'ai commencé à mettre ça en oeuvre sur tous nos éléments vitaux d'infrastructure (apache, oracle, MySQL etc.).&lt;br /&gt;&lt;br /&gt;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 :&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-Wn-F6BtPbH0/Tm_FENzwhwI/AAAAAAAAAkI/3UJT1vYUqyU/s1600/temps-de-reponse-nagios.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="173" src="http://3.bp.blogspot.com/-Wn-F6BtPbH0/Tm_FENzwhwI/AAAAAAAAAkI/3UJT1vYUqyU/s320/temps-de-reponse-nagios.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;h2&gt;Mise en place de NPCD&lt;/h2&gt;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 :&lt;br /&gt;&lt;a href="http://docs.pnp4nagios.org/_detail/bulk-npcdmod.png?id=pnp-0.6%3Amodes"&gt;&lt;img src="http://docs.pnp4nagios.org/_media/bulk-npcdmod.png?w=400" /&gt;&lt;/a&gt;&lt;br /&gt;Pour le lancement du démon NPCD, rien d'extraordinaire, il suffit simplement de lancer la commande suivante :&lt;br /&gt;&lt;pre&gt;/usr/local/pnp4nagios/bin/npcd&lt;/pre&gt;On peut ensuite vérifier sa présence sur le serveur :&lt;br /&gt;&lt;pre&gt;ps -ef | grep npcd&lt;/pre&gt;Le démon se lance en s'appuyant sur le fichier &lt;strong&gt;/usr/local/pnp4nagios/etc/npcd.cfg&lt;/strong&gt;. Ce dernier va contenir toutes les informations sur le comportement que devra adopter le démon. Vous pouvez notamment tuner les éléments suivants :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Le temps de pause entre deux checks dans le répertoire de spool ;&lt;/li&gt;&lt;li&gt;Le nombre max de process perfdata à lancer en parallèle ;&lt;/li&gt;&lt;li&gt;La verbosité de la log.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;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 &lt;b&gt;process-service-perfdata-file&lt;/b&gt; et &lt;b&gt;process-host-perfdata-file&lt;/b&gt; (en principe dans le fichier &lt;b&gt;/usr/local/etc/nagios/template/commands.cfg&lt;/b&gt;). Ces dernières ressemblaient aux lignes suivantes :&lt;/div&gt;&lt;div&gt;&lt;pre&gt;define command {&lt;br /&gt;       command_name    process-service-perfdata-file&lt;br /&gt;       command_line    /usr/local/pnp4nagios/libexec/process_perfdata.pl --bulk=/usr/local/pnp4nagios/var/service-perfdata&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;define command {&lt;br /&gt;       command_name    process-host-perfdata-file&lt;br /&gt;       command_line    /usr/local/pnp4nagios/libexec/process_perfdata.pl --bulk=/usr/local/pnp4nagios/var/host-perfdata&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Nous les avons remplacé par les lignes suivantes :&lt;br /&gt;&lt;pre&gt;define command {&lt;br /&gt;       command_name    process-service-perfdata-file&lt;br /&gt;       command_line    /bin/mv /usr/local/pnp4nagios/var/service-perfdata /usr/local/pnp4nagios/var/spool/service-perfdata.$TIMET$&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;define command {&lt;br /&gt;       command_name    process-host-perfdata-file&lt;br /&gt;       command_line    /bin/mv /usr/local/pnp4nagios/var/host-perfdata /usr/local/pnp4nagios/var/spool/host-perfdata.$TIMET$&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Il s'agit simplement de substituer l'appel direct à la commande &lt;b&gt;process_perfdata.pl&lt;/b&gt; 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.&lt;/div&gt;&lt;h2&gt;Résultat de l'optimisation&lt;/h2&gt;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 :&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-_WKll1Z2KT8/Tm_FV25GXuI/AAAAAAAAAkM/jU6aUi6I_So/s1600/surveillance-nagios-apres-npcd.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="173" src="http://4.bp.blogspot.com/-_WKll1Z2KT8/Tm_FV25GXuI/AAAAAAAAAkM/jU6aUi6I_So/s320/surveillance-nagios-apres-npcd.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;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).&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3536118107392327686-7356690021853132059?l=lesaventuresdeyannigdanslemondeit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lesaventuresdeyannigdanslemondeit.blogspot.com/feeds/7356690021853132059/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3536118107392327686&amp;postID=7356690021853132059' title='4 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3536118107392327686/posts/default/7356690021853132059'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3536118107392327686/posts/default/7356690021853132059'/><link rel='alternate' type='text/html' href='http://lesaventuresdeyannigdanslemondeit.blogspot.com/2011/09/optimisation-du-couple-nagiospnp4nagios.html' title='Optimisation du couple nagios/PNP4Nagios'/><author><name>Yannig Perre</name><uri>https://profiles.google.com/104797199411947382593</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-6bgdo630G7s/AAAAAAAAAAI/AAAAAAAAAhc/P4yM7287fOg/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-Wn-F6BtPbH0/Tm_FENzwhwI/AAAAAAAAAkI/3UJT1vYUqyU/s72-c/temps-de-reponse-nagios.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3536118107392327686.post-4422892215057792081</id><published>2011-09-11T23:59:00.001+02:00</published><updated>2011-09-12T21:34:06.322+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mencoder'/><category scheme='http://www.blogger.com/atom/ns#' term='gphoto'/><category scheme='http://www.blogger.com/atom/ns#' term='Photographie'/><category scheme='http://www.blogger.com/atom/ns#' term='script'/><category scheme='http://www.blogger.com/atom/ns#' term='convert'/><title type='text'>Création d'un timelapse</title><content type='html'>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.&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;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 :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;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&amp;nbsp;traîner&amp;nbsp;un portable pendant une séance de photo ;&lt;/li&gt;&lt;li&gt;convert : outil de convertion d'image en ligne de commande ;&lt;/li&gt;&lt;li&gt;mencoder : outil de création de fichier vidéo.&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;Prendre des photos à intervalle régulier&lt;/h2&gt;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 &lt;b&gt;gphoto&lt;/b&gt;. En effet, ce dernier vous permet de prendre des photos directement à l'aide d'un ordinateur. Ci-dessous un exemple de ligne de commande :&lt;br /&gt;&lt;pre&gt;gphoto2  --auto-detect --capture-image-and-download -I 1&lt;/pre&gt;Ci-dessous une petite explication des options présentes :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;L'option --auto-detect à pour rôle d'inviter gphoto à utiliser le premier appareil détecté ;&lt;/li&gt;&lt;li&gt;L'option --capture-image-and-download invite gphoto à prendre une photo et à la télécharger automatiquement sur le PC ;&lt;/li&gt;&lt;li&gt;Enfin, l'option -I 1 indique le temps de pause entre chaque photo.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;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.&lt;br /&gt;&lt;h2&gt;Création de la vidéo&lt;/h2&gt;Nous allons procéder en deux étapes :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Retailler les photos ;&lt;/li&gt;&lt;li&gt;Assembler les photos dans une vidéo.&lt;/li&gt;&lt;/ul&gt;Pour la première étape nous allons utiliser l'outil convert de &lt;a href="http://www.imagemagick.org/script/convert.php"&gt;imagemagick&lt;/a&gt;. Nous allons également utiliser un petit bout de shell pour lancer cette convertion en boucle :&lt;br /&gt;&lt;pre&gt;yannig@portable:~/Images/2011-09/timelapse/resize$ for i in ../*.JPG&lt;br /&gt;do&lt;br /&gt;  echo $i&lt;br /&gt;  convert -resize 1440 $i $(basename $i)&lt;br /&gt;done&lt;/pre&gt;&lt;div&gt;L'option -resize 1440 indique à l'outil &lt;b&gt;convert&lt;/b&gt; 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.&lt;br /&gt;&lt;br /&gt;NB : Pour éviter de tout mélanger, j'ai mis le résultat de la conversion dans un sous-répertoire resize.&lt;br /&gt;&lt;br /&gt;Passons maintenant à la création de la vidéo à l'aide de &lt;b&gt;mencoder&lt;/b&gt; (à lancer dans le répertoire contenant les fichiers retaillés) :&lt;br /&gt;&lt;pre&gt;mencoder "mf://*.JPG" -mf fps=15:type=jpg -ovc x264 -x264encopts bitrate=3000 -o video-resultat.flv&lt;/pre&gt;Encore une fois, étudions ensemble les options de mencoder :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;"mf://*.JPG" : donne le patron des fichiers à prendre en compte pour créer la vidéo ;&lt;/li&gt;&lt;li&gt;-mf fps=15:type=jpg : donne des informations sur la cadence désirée pour la vidéo ;&lt;/li&gt;&lt;li&gt;ovc x264 -x264encopts bitrate=3000 : information sur les paramètres d'encodage de la vidéo ;&lt;/li&gt;&lt;li&gt;-o video-resultat.flv : explicite le nom du fichier résultat.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;h2&gt;Vidéo de résultat&lt;/h2&gt;Ci-dessous un petit exemple de ce que peu donner une vidéo réalisé avec ces outils :&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;iframe allowfullscreen="" frameborder="0" height="349" src="http://www.youtube.com/embed/ruBXCtJUqn4?hl=fr&amp;amp;fs=1" width="425"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;En espérant que tout ceci vous inspire !&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3536118107392327686-4422892215057792081?l=lesaventuresdeyannigdanslemondeit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lesaventuresdeyannigdanslemondeit.blogspot.com/feeds/4422892215057792081/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3536118107392327686&amp;postID=4422892215057792081' title='3 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3536118107392327686/posts/default/4422892215057792081'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3536118107392327686/posts/default/4422892215057792081'/><link rel='alternate' type='text/html' href='http://lesaventuresdeyannigdanslemondeit.blogspot.com/2011/09/creation-dun-timelapse.html' title='Création d&apos;un timelapse'/><author><name>Yannig Perre</name><uri>https://profiles.google.com/104797199411947382593</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-6bgdo630G7s/AAAAAAAAAAI/AAAAAAAAAhc/P4yM7287fOg/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/ruBXCtJUqn4/default.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3536118107392327686.post-1261079924227343850</id><published>2011-09-07T22:50:00.000+02:00</published><updated>2011-09-07T22:50:17.334+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WebLogic'/><category scheme='http://www.blogger.com/atom/ns#' term='pnp4nagios'/><category scheme='http://www.blogger.com/atom/ns#' term='wlagent'/><category scheme='http://www.blogger.com/atom/ns#' term='RRD'/><title type='text'>Mise en place de wlsagent</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: justify;"&gt;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.&lt;/div&gt;&lt;h2 style="text-align: justify;"&gt;Installation de l'agent wlsagent&lt;/h2&gt;&lt;div style="text-align: justify;"&gt;Il nous tout d'abord récupérer une version récente de notre plugin :&lt;/div&gt;&lt;pre style="text-align: justify;"&gt;yannig@portable:~/wlsagent$ svn checkout http://wlsagent.googlecode.com/svn/trunk/src src&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;Procédons maintenant à la récupération des librairies nécessaires au fonctionnement de wlsagent :&lt;/div&gt;&lt;br /&gt;&lt;ul&gt;&lt;li style="text-align: justify;"&gt;jetty-continuation-7.3.1.v20110307.jar&lt;/li&gt;&lt;li style="text-align: justify;"&gt;jetty-http-7.3.1.v20110307.jar&lt;/li&gt;&lt;li style="text-align: justify;"&gt;jetty-io-7.3.1.v20110307.jar&lt;/li&gt;&lt;li style="text-align: justify;"&gt;jetty-security-7.3.1.v20110307.jar&lt;/li&gt;&lt;li style="text-align: justify;"&gt;jetty-server-7.3.1.v20110307.jar&lt;/li&gt;&lt;li style="text-align: justify;"&gt;jetty-servlet-7.3.1.v20110307.jar&lt;/li&gt;&lt;li style="text-align: justify;"&gt;jetty-util-7.3.1.v20110307.jar&lt;/li&gt;&lt;li style="text-align: justify;"&gt;servlet-api-2.5.jar&lt;/li&gt;&lt;li style="text-align: justify;"&gt;wlclient.jar&lt;/li&gt;&lt;li style="text-align: justify;"&gt;wljmxclient.jar&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Tous les jars de type jetty et servlet-api font partie du package jetty que vous pouvez récupérer à l'addresse suivante : &lt;a href="http://www.eclipse.org/jetty/downloads.php"&gt;http://www.eclipse.org/jetty/downloads.php&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Déposons maintenant ces fichiers dans le répertoire lib, à la même hauteur que le répertoire &lt;strong&gt;src&lt;/strong&gt; des fichiers sources de wlsagent. Concernant les fichiers wlclient.jar et wljmxclient.jar, vous les trouverez dans les binaires de WebLogic.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Récupérons ensuite le fichier de build ant suivant :&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="background-color: white; font-family: arial, sans-serif; font-size: 13px; font-weight: normal; white-space: normal;"&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint" style="background-color: #eeeeee; font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; font-size: 12px; max-width: 70em; overflow-x: auto; overflow-y: auto; padding-bottom: 0.5em; padding-left: 0.5em; padding-right: 0.5em; padding-top: 0.5em;"&gt;&lt;b&gt;&lt;span class="tag" style="color: #000088;"&gt;&lt;project&lt; span=""&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="atn" style="color: #660066;"&gt;name&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;=&lt;/span&gt;&lt;span class="atv" style="color: #008800;"&gt;"wlsagent"&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="atn" style="color: #660066;"&gt;basedir&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;=&lt;/span&gt;&lt;span class="atv" style="color: #008800;"&gt;"."&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="atn" style="color: #660066;"&gt;default&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;=&lt;/span&gt;&lt;span class="atv" style="color: #008800;"&gt;"build"&lt;/span&gt;&lt;span class="tag" style="color: #000088;"&gt;&amp;gt;&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="tag" style="color: #000088;"&gt;&lt;property&lt; span=""&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="atn" style="color: #660066;"&gt;name&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;=&lt;/span&gt;&lt;span class="atv" style="color: #008800;"&gt;"src.dir"&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="atn" style="color: #660066;"&gt;value&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;=&lt;/span&gt;&lt;span class="atv" style="color: #008800;"&gt;"src"&lt;/span&gt;&lt;span class="tag" style="color: #000088;"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="tag" style="color: #000088;"&gt;&lt;property&lt; span=""&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="atn" style="color: #660066;"&gt;name&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;=&lt;/span&gt;&lt;span class="atv" style="color: #008800;"&gt;"build.dir"&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &amp;nbsp; &lt;/span&gt;&lt;span class="atn" style="color: #660066;"&gt;value&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;=&lt;/span&gt;&lt;span class="atv" style="color: #008800;"&gt;"build"&lt;/span&gt;&lt;span class="tag" style="color: #000088;"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="tag" style="color: #000088;"&gt;&lt;property&lt; span=""&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="atn" style="color: #660066;"&gt;name&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;=&lt;/span&gt;&lt;span class="atv" style="color: #008800;"&gt;"classes.dir"&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="atn" style="color: #660066;"&gt;value&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;=&lt;/span&gt;&lt;span class="atv" style="color: #008800;"&gt;"${build.dir}/classes"&lt;/span&gt;&lt;span class="tag" style="color: #000088;"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="tag" style="color: #000088;"&gt;&lt;property&lt; span=""&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="atn" style="color: #660066;"&gt;name&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;=&lt;/span&gt;&lt;span class="atv" style="color: #008800;"&gt;"jar.dir"&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="atn" style="color: #660066;"&gt;value&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;=&lt;/span&gt;&lt;span class="atv" style="color: #008800;"&gt;"${build.dir}/jar"&lt;/span&gt;&lt;span class="tag" style="color: #000088;"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="tag" style="color: #000088;"&gt;&lt;property&lt; span=""&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="atn" style="color: #660066;"&gt;name&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;=&lt;/span&gt;&lt;span class="atv" style="color: #008800;"&gt;"lib.dir"&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="atn" style="color: #660066;"&gt;value&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;=&lt;/span&gt;&lt;span class="atv" style="color: #008800;"&gt;"lib"&lt;/span&gt;&lt;span class="tag" style="color: #000088;"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="tag" style="color: #000088;"&gt;&lt;property&lt; span=""&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="atn" style="color: #660066;"&gt;name&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;=&lt;/span&gt;&lt;span class="atv" style="color: #008800;"&gt;"main-class"&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &amp;nbsp;&lt;/span&gt;&lt;span class="atn" style="color: #660066;"&gt;value&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;=&lt;/span&gt;&lt;span class="atv" style="color: #008800;"&gt;"net.wait4it.wlsagent.WlsAgent"&lt;/span&gt;&lt;span class="tag" style="color: #000088;"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="tag" style="color: #000088;"&gt;&lt;path&lt; span=""&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="atn" style="color: #660066;"&gt;id&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;=&lt;/span&gt;&lt;span class="atv" style="color: #008800;"&gt;"classpath"&lt;/span&gt;&lt;span class="tag" style="color: #000088;"&gt;&amp;gt;&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="tag" style="color: #000088;"&gt;&lt;fileset&lt; span=""&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="atn" style="color: #660066;"&gt;dir&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;=&lt;/span&gt;&lt;span class="atv" style="color: #008800;"&gt;"${lib.dir}"&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="atn" style="color: #660066;"&gt;includes&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;=&lt;/span&gt;&lt;span class="atv" style="color: #008800;"&gt;"**/*.jar"&lt;/span&gt;&lt;span class="tag" style="color: #000088;"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="tag" style="color: #000088;"&gt;&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="tag" style="color: #000088;"&gt;&lt;target&lt; span=""&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="atn" style="color: #660066;"&gt;name&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;=&lt;/span&gt;&lt;span class="atv" style="color: #008800;"&gt;"clean"&lt;/span&gt;&lt;span class="tag" style="color: #000088;"&gt;&amp;gt;&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="tag" style="color: #000088;"&gt;&lt;delete&lt; span=""&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="atn" style="color: #660066;"&gt;dir&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;=&lt;/span&gt;&lt;span class="atv" style="color: #008800;"&gt;"${build.dir}"&lt;/span&gt;&lt;span class="tag" style="color: #000088;"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="tag" style="color: #000088;"&gt;&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="tag" style="color: #000088;"&gt;&lt;target&lt; span=""&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="atn" style="color: #660066;"&gt;name&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;=&lt;/span&gt;&lt;span class="atv" style="color: #008800;"&gt;"compile"&lt;/span&gt;&lt;span class="tag" style="color: #000088;"&gt;&amp;gt;&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="tag" style="color: #000088;"&gt;&lt;mkdir&lt; span=""&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="atn" style="color: #660066;"&gt;dir&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;=&lt;/span&gt;&lt;span class="atv" style="color: #008800;"&gt;"${classes.dir}"&lt;/span&gt;&lt;span class="tag" style="color: #000088;"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="tag" style="color: #000088;"&gt;&lt;javac&lt; span=""&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="atn" style="color: #660066;"&gt;srcdir&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;=&lt;/span&gt;&lt;span class="atv" style="color: #008800;"&gt;"${src.dir}"&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="atn" style="color: #660066;"&gt;destdir&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;=&lt;/span&gt;&lt;span class="atv" style="color: #008800;"&gt;"${classes.dir}"&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="atn" style="color: #660066;"&gt;classpathref&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;=&lt;/span&gt;&lt;span class="atv" style="color: #008800;"&gt;"classpath"&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="atn" style="color: #660066;"&gt;includeantruntime&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;=&lt;/span&gt;&lt;span class="atv" style="color: #008800;"&gt;"true"&lt;/span&gt;&lt;span class="tag" style="color: #000088;"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="tag" style="color: #000088;"&gt;&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="tag" style="color: #000088;"&gt;&lt;target&lt; span=""&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="atn" style="color: #660066;"&gt;name&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;=&lt;/span&gt;&lt;span class="atv" style="color: #008800;"&gt;"jar"&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="atn" style="color: #660066;"&gt;depends&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;=&lt;/span&gt;&lt;span class="atv" style="color: #008800;"&gt;"compile"&lt;/span&gt;&lt;span class="tag" style="color: #000088;"&gt;&amp;gt;&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="tag" style="color: #000088;"&gt;&lt;mkdir&lt; span=""&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="atn" style="color: #660066;"&gt;dir&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;=&lt;/span&gt;&lt;span class="atv" style="color: #008800;"&gt;"${jar.dir}"&lt;/span&gt;&lt;span class="tag" style="color: #000088;"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="tag" style="color: #000088;"&gt;&lt;jar&lt; span=""&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="atn" style="color: #660066;"&gt;destfile&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;=&lt;/span&gt;&lt;span class="atv" style="color: #008800;"&gt;"${jar.dir}/${ant.project.name}.jar"&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="atn" style="color: #660066;"&gt;basedir&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;=&lt;/span&gt;&lt;span class="atv" style="color: #008800;"&gt;"${classes.dir}"&lt;/span&gt;&lt;span class="tag" style="color: #000088;"&gt;&amp;gt;&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="tag" style="color: #000088;"&gt;&lt;manifest&gt;&lt;/manifest&gt;&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="tag" style="color: #000088;"&gt;&lt;attribute&lt; span=""&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="atn" style="color: #660066;"&gt;name&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;=&lt;/span&gt;&lt;span class="atv" style="color: #008800;"&gt;"Main-Class"&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="atn" style="color: #660066;"&gt;value&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;=&lt;/span&gt;&lt;span class="atv" style="color: #008800;"&gt;"${main-class}"&lt;/span&gt;&lt;span class="tag" style="color: #000088;"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="tag" style="color: #000088;"&gt;&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="tag" style="color: #000088;"&gt;&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="tag" style="color: #000088;"&gt;&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="tag" style="color: #000088;"&gt;&lt;target&lt; span=""&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="atn" style="color: #660066;"&gt;name&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;=&lt;/span&gt;&lt;span class="atv" style="color: #008800;"&gt;"build"&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="atn" style="color: #660066;"&gt;depends&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;=&lt;/span&gt;&lt;span class="atv" style="color: #008800;"&gt;"clean,jar"&lt;/span&gt;&lt;span class="tag" style="color: #000088;"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="tag" style="color: #000088;"&gt;&lt;/span&gt;&lt;/target&lt;&gt;&lt;/span&gt;&lt;/attribute&lt;&gt;&lt;/span&gt;&lt;/jar&lt;&gt;&lt;/span&gt;&lt;/mkdir&lt;&gt;&lt;/span&gt;&lt;/target&lt;&gt;&lt;/span&gt;&lt;/javac&lt;&gt;&lt;/span&gt;&lt;/mkdir&lt;&gt;&lt;/span&gt;&lt;/target&lt;&gt;&lt;/span&gt;&lt;/delete&lt;&gt;&lt;/span&gt;&lt;/target&lt;&gt;&lt;/span&gt;&lt;/fileset&lt;&gt;&lt;/span&gt;&lt;/path&lt;&gt;&lt;/span&gt;&lt;/property&lt;&gt;&lt;/span&gt;&lt;/property&lt;&gt;&lt;/span&gt;&lt;/property&lt;&gt;&lt;/span&gt;&lt;/property&lt;&gt;&lt;/span&gt;&lt;/property&lt;&gt;&lt;/span&gt;&lt;/property&lt;&gt;&lt;/span&gt;&lt;/project&lt;&gt;&lt;/span&gt;&lt;/b&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Lançons ensuite le build avec ant, vous devriez obtenir le fichier &lt;strong&gt;wlsagent.jar&lt;/strong&gt; dans le répertoire &lt;strong&gt;build/jar&lt;/strong&gt;.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Passons maintenant à la création du fichier de démarrage de wlsagent :&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: white; color: #1f1c1b;"&gt;&lt;i&gt;&lt;span style="color: #898887;"&gt;#!/bin/bash&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;span style="color: #006e28;"&gt;JAVA_HOME=&lt;/span&gt;&lt;span style="color: #bf0303;"&gt;"/usr/lib/jvm/java-6-openjdk"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #006e28;"&gt;CURRENT_PATH=$(&lt;/span&gt;&lt;b&gt;&lt;span style="color: #cc00cc;"&gt;dirname&lt;/span&gt;&lt;/b&gt; &lt;span style="color: #006e28;"&gt;$0)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #006e28;"&gt;LIB_PATH=${CURRENT_PATH}&lt;/span&gt;/lib&lt;br /&gt;&lt;span style="color: #006e28;"&gt;CLASSPATH=${CURRENT_PATH}&lt;/span&gt;/wlsagent.jar&lt;br /&gt;&lt;br /&gt;&lt;b&gt;for&lt;/b&gt; jar &lt;b&gt;in&lt;/b&gt; &lt;span style="color: #006e28;"&gt;$(&lt;/span&gt;&lt;b&gt;&lt;span style="color: #cc00cc;"&gt;find&lt;/span&gt;&lt;/b&gt; &lt;span style="color: #006e28;"&gt;${LIB_PATH}&lt;/span&gt; -name &lt;span style="color: #bf0303;"&gt;'*.jar'&lt;/span&gt;&lt;span style="color: #006e28;"&gt;)&lt;/span&gt;; &lt;b&gt;do&lt;/b&gt;&lt;br /&gt;  &lt;span style="color: #006e28;"&gt;CLASSPATH=${CLASSPATH}&lt;/span&gt;:&lt;span style="color: #006e28;"&gt;${jar}&lt;/span&gt;;&lt;br /&gt;&lt;b&gt;done&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #644a9b;"&gt;start()&lt;/span&gt;&lt;br /&gt;&lt;b&gt;{&lt;/b&gt;&lt;br /&gt;  &lt;span style="color: #006e28;"&gt;${JAVA_HOME}&lt;/span&gt;/bin/java -Xmx32m -cp &lt;span style="color: #006e28;"&gt;${CLASSPATH}&lt;/span&gt; net.wait4it.wlsagent.WlsAgent &lt;span style="color: #bf0303;"&gt;"9090"&lt;/span&gt; &lt;b&gt;&lt;span style="color: #223388;"&gt;&amp;gt;&lt;/span&gt;&lt;/b&gt; &lt;span style="color: #006e28;"&gt;$CURRENT_PATH&lt;/span&gt;/wlsagent.log &lt;b&gt;&lt;span style="color: #223388;"&gt;2&amp;gt;&amp;amp;1&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&amp;amp;&lt;/b&gt;  &lt;b&gt;&lt;span style="color: #880088;"&gt;echo&lt;/span&gt;&lt;/b&gt; &lt;span style="color: #006e28;"&gt;$!&lt;/span&gt; &lt;b&gt;&lt;span style="color: #223388;"&gt;&amp;gt;&lt;/span&gt;&lt;/b&gt; &lt;span style="color: #006e28;"&gt;$CURRENT_PATH&lt;/span&gt;/wlsagent.pid&lt;br /&gt;&lt;b&gt;}&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #644a9b;"&gt;stop()&lt;/span&gt;&lt;br /&gt;&lt;b&gt;{&lt;/b&gt;&lt;br /&gt;  &lt;b&gt;&lt;span style="color: #880088;"&gt;kill&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: #223388;"&gt;$(&amp;lt;&lt;/span&gt;&lt;/b&gt; &lt;span style="color: #006e28;"&gt;$CURRENT_PATH&lt;/span&gt;/wlsagent.pid&lt;b&gt;&lt;span style="color: #223388;"&gt;)&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;}&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;case&lt;/b&gt; &lt;span style="color: #006e28;"&gt;$1&lt;/span&gt;&lt;b&gt; in&lt;/b&gt;&lt;br /&gt;  stop&lt;b&gt;)&lt;/b&gt; stop &lt;b&gt;;;&lt;/b&gt;&lt;br /&gt;  start&lt;b&gt;)&lt;/b&gt; start &lt;b&gt;;;&lt;/b&gt;&lt;br /&gt;  restart&lt;b&gt;)&lt;/b&gt; stop ; &lt;b&gt;&lt;span style="color: #cc00cc;"&gt;sleep&lt;/span&gt;&lt;/b&gt; 1 ; start &lt;b&gt;;;&lt;/b&gt;&lt;br /&gt;  status&lt;b&gt;)&lt;/b&gt; &lt;b&gt;&lt;span style="color: #cc00cc;"&gt;ps&lt;/span&gt;&lt;/b&gt; -fp &lt;b&gt;&lt;span style="color: #223388;"&gt;$(&amp;lt;&lt;/span&gt;&lt;/b&gt; &lt;span style="color: #006e28;"&gt;$CURRENT_PATH&lt;/span&gt;/wlsagent.pid&lt;b&gt;&lt;span style="color: #223388;"&gt;)&lt;/span&gt;&lt;/b&gt; &lt;b&gt;;;&lt;/b&gt;&lt;br /&gt;  *&lt;b&gt;)&lt;/b&gt; &lt;b&gt;&lt;span style="color: #880088;"&gt;echo&lt;/span&gt;&lt;/b&gt; &lt;span style="color: #bf0303;"&gt;"Expected : start/stop/restart/status"&lt;/span&gt; &lt;b&gt;;;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;esac&lt;/b&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Il ne nous reste plus qu'à lancer le tout et de vérifier le bon démarrage de l'agent :&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;yannig@portable:~/wlsagent$ ./wlsagent.sh start&lt;br /&gt;yannig@portable-ots:~/wlsagent$ ps -ef | grep wlsagent | grep -v grep&lt;br /&gt;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&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Un coup d'oeil dans la log pour vérifier le bon démarrage de l'agent :&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;yannig@portable:~/wlsagent$ more wlsagent.log &lt;br /&gt;2011-09-03 10:45:49.961:INFO::jetty-7.3.1.v20110307&lt;br /&gt;2011-09-03 10:45:50.069:INFO::started o.e.j.s.ServletContextHandler{/wlsagent,null}&lt;br /&gt;2011-09-03 10:45:50.222:INFO::Started SelectChannelConnector@0.0.0.0:9090&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Tout est prêt ! Nous allons maintenant pouvoir lancer nos tests de communication.&lt;/div&gt;&lt;h1 style="text-align: justify;"&gt;Utilisation du plugin wlsagent&lt;/h1&gt;&lt;div style="text-align: justify;"&gt;Avant toute chose il faut créer un utilisateur nagios faisant parti du groupe Monitors dans le domaine WebLogic.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;On lance ensuite une requête sur l'agent à l'aide d'un wget :&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;wget -q -O - "http://localhost:9090/wlsagent/WlsAgent?hostname=$(hostname)&amp;amp;port=7028&amp;amp;username=nagios&amp;amp;password=xxx&amp;amp;jvm=UsedMemory;80;90"&lt;br /&gt;0|AdminServer: status OK|HeapSize=370M;;;0;910 UsedMemory=210M;;;0;910&lt;br /&gt;&lt;/pre&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;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 :&amp;nbsp;&lt;a href="http://code.google.com/p/wlsagent/wiki/Invocation"&gt;http://code.google.com/p/wlsagent/wiki/Invocation&lt;/a&gt;&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Il vous faudra également un outil de collecte des données de performance comme PNP4Nagios.&amp;nbsp;Ci-dessous un exemple de résultat d'intégration à la suite de 2 semaines de collecte :&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-1gmCzgdqLl8/TmfQ4XyzSgI/AAAAAAAAAhs/kMmE1VunNHM/s1600/wlsagent-003.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="191" src="http://4.bp.blogspot.com/-1gmCzgdqLl8/TmfQ4XyzSgI/AAAAAAAAAhs/kMmE1VunNHM/s320/wlsagent-003.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;Pour info, il est possible de remonter les éléments suivants :&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li style="text-align: justify;"&gt;Threads sur la JVM ;&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Nombre de transactions en cours sur la JVM ;&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Nombre de requête / seconde (throughput) ;&lt;/li&gt;&lt;li style="text-align: justify;"&gt;État des connexion JDBC ;&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Nombre de session utilisateur ;&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Et enfin, l'utilisation des queues JMS.&lt;/li&gt;&lt;/ul&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: justify;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-7bd1nvgIxjM/TmfR8YYCsBI/AAAAAAAAAh8/YVhIqJFaZeQ/s1600/wlsagent-013.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="197" src="http://3.bp.blogspot.com/-7bd1nvgIxjM/TmfR8YYCsBI/AAAAAAAAAh8/YVhIqJFaZeQ/s320/wlsagent-013.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Activité datasource de l'application&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="text-align: justify;"&gt;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 :&amp;nbsp;&lt;a href="http://code.google.com/p/wlsagent/"&gt;http://code.google.com/p/wlsagent/&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3536118107392327686-1261079924227343850?l=lesaventuresdeyannigdanslemondeit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lesaventuresdeyannigdanslemondeit.blogspot.com/feeds/1261079924227343850/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3536118107392327686&amp;postID=1261079924227343850' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3536118107392327686/posts/default/1261079924227343850'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3536118107392327686/posts/default/1261079924227343850'/><link rel='alternate' type='text/html' href='http://lesaventuresdeyannigdanslemondeit.blogspot.com/2011/09/mise-en-place-de-wlsagent.html' title='Mise en place de wlsagent'/><author><name>Yannig Perre</name><uri>https://profiles.google.com/104797199411947382593</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-6bgdo630G7s/AAAAAAAAAAI/AAAAAAAAAhc/P4yM7287fOg/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-1gmCzgdqLl8/TmfQ4XyzSgI/AAAAAAAAAhs/kMmE1VunNHM/s72-c/wlsagent-003.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3536118107392327686.post-2637019896843048492</id><published>2011-04-11T20:18:00.001+02:00</published><updated>2011-04-11T20:18:32.339+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='http'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='apache'/><category scheme='http://www.blogger.com/atom/ns#' term='load-balancing'/><category scheme='http://www.blogger.com/atom/ns#' term='fail-over'/><title type='text'>mod_proxy_http Apache et console de gestion du load-balancer</title><content type='html'>J'ai eu à faire une petite étude entre deux type de load-balancing HTTP sur des serveurs d'application WebLogic et c'est à cette occasion que j'ai découvert une perle : la console apache de load-balancing.&lt;br /&gt;&lt;br /&gt;Je vous propose de voir ensemble comment l'activer et ce qu'elle vous apporte.&lt;br /&gt;&lt;br /&gt;Par la suite je travaillerai avec une RedHat Enterprise 5.3 mais le principe reste le même pour n'importe quelle distribution.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Activation du module mod_proxy_http&lt;/h2&gt;&lt;br /&gt;Premier point, il vous faut installer une version récente de apache 2.2 et vérifier que la conf de ce dernier fait bien référence au module mod_proxy_http :&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;[root@myserver conf]# pwd&lt;br /&gt;/etc/httpd/conf&lt;br /&gt;[root@myserver conf]# grep mod_proxy_http.so httpd.conf&lt;br /&gt;LoadModule proxy_http_module modules/mod_proxy_http.so&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Un petit coup de apachectl configtest nous assurera que nous n'avons rien oublié.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Création d'une boucle de charge&lt;/h2&gt;&lt;br /&gt;Placez-vous ensuite dans le répertoire conf de votre serveur apache et créez-y un nouveau fichier de configuration contenant les lignes suivantes (à adapter suivant vos besoins) :&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;Proxy balancer://lb-http&amp;gt;&lt;br /&gt;  BalancerMember http://127.0.0.1:7002&lt;br /&gt;  BalancerMember http://127.0.0.1:7004&lt;br /&gt;&amp;lt;/Proxy&amp;gt;&lt;br /&gt;&lt;br /&gt;ProxyPass        /sample/ balancer://lb-http/sample/&lt;br /&gt;ProxyPassReverse /sample/ balancer://lb-http/sample/&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Ici, les URLs sous le contexte &lt;b&gt;/sample/&lt;/b&gt; seront envoyées systématiquement vers nos deux serveurs d'applications Java hébergeant l'application sample.war.&lt;br /&gt;&lt;br /&gt;Un arrêt/relance à l'aide de la commande &lt;b&gt;apachectl restart&lt;/b&gt; et voici notre configuration pris en compte.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Activation de la console du load-balancer&lt;/h2&gt;&lt;br /&gt;Activons maintenant la console du load-balancer en ajoutant les lignes suivantes :&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;Location /balancer-manager&amp;gt;&lt;br /&gt;  SetHandler balancer-manager&lt;br /&gt;  Order Deny,Allow&lt;br /&gt;  # Deny from all    &amp;lt;- Decommenter ici pour bloquer les accès&lt;br /&gt;  Allow from all #   &amp;lt;- lister les IPs autorisées en les séparant par des virgules&lt;br /&gt;&amp;lt;/Location&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Un arrêt/relance sera bien sûr nécessaire pour en profiter.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Utilisation de la console du load-balancer&lt;/h2&gt;&lt;br /&gt;Il suffit maintenant de rentrer l'URL de notre serveur apache suivi de &lt;b&gt;/balancer-manager&lt;/b&gt; pour obtenir l'écran suivant :&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-offYeuKQD78/TaNCb8XV4bI/AAAAAAAAAfQ/OskARJeFA-Q/s1600/root_screen_balancer_manager.png" imageanchor="1" style=""&gt;&lt;img border="0" height="319" width="320" src="http://2.bp.blogspot.com/-offYeuKQD78/TaNCb8XV4bI/AAAAAAAAAfQ/OskARJeFA-Q/s320/root_screen_balancer_manager.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;De là, vous pourrez désactiver ou réactiver une instance en cliquant sur l'instance à modifier. L'écran en question est le suivant :&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-l9SWw2YXAuc/TaNDZI0gGzI/AAAAAAAAAfY/MFwE61UKh3A/s1600/edit_balancer_member.png" imageanchor="1" style=""&gt;&lt;img border="0" height="320" width="230" src="http://2.bp.blogspot.com/-l9SWw2YXAuc/TaNDZI0gGzI/AAAAAAAAAfY/MFwE61UKh3A/s320/edit_balancer_member.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Il vous permettra également de modifier certains paramètres de poids sur vos serveurs HTTP/Java.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Pour finir ...&lt;/h2&gt;&lt;br /&gt;Le gros avantage de ce mécanisme est que vous pourrez ainsi désactiver une instance à la demande et pouvoir ainsi procéder à une maintenance, une mise à jour etc. en limitant au maximum les perturbations.&lt;br /&gt;&lt;br /&gt;Pour les plus curieux, je n'ai pas d'autres conseils que d'aller consulter la documentation apache de ce module disponible à l'adresse suivante : &lt;a href='http://httpd.apache.org/docs/current/mod/mod_proxy.html'&gt;http://httpd.apache.org/docs/current/mod/mod_proxy.html&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3536118107392327686-2637019896843048492?l=lesaventuresdeyannigdanslemondeit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lesaventuresdeyannigdanslemondeit.blogspot.com/feeds/2637019896843048492/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3536118107392327686&amp;postID=2637019896843048492' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3536118107392327686/posts/default/2637019896843048492'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3536118107392327686/posts/default/2637019896843048492'/><link rel='alternate' type='text/html' href='http://lesaventuresdeyannigdanslemondeit.blogspot.com/2011/04/modproxyhttp-apache-et-console-de.html' title='mod_proxy_http Apache et console de gestion du load-balancer'/><author><name>Yannig Perre</name><uri>https://profiles.google.com/104797199411947382593</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-6bgdo630G7s/AAAAAAAAAAI/AAAAAAAAAhc/P4yM7287fOg/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-offYeuKQD78/TaNCb8XV4bI/AAAAAAAAAfQ/OskARJeFA-Q/s72-c/root_screen_balancer_manager.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3536118107392327686.post-8412284837094595981</id><published>2011-03-09T22:22:00.009+01:00</published><updated>2011-03-09T23:07:00.037+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='nrpe'/><category scheme='http://www.blogger.com/atom/ns#' term='compilation'/><category scheme='http://www.blogger.com/atom/ns#' term='patch'/><category scheme='http://www.blogger.com/atom/ns#' term='nagios'/><title type='text'>Patch du jour : NRPE et les sorties longues</title><content type='html'>NRPE est vraiment un compagnon inséparable de nagios : lancer des plugins à distance sur un serveur et récupérer leurs résultats au travers d'une simple commande check_nrpe.&lt;br /&gt;&lt;br /&gt;Pour l'illustrer, lançons un démon NRPE avec le fichier de configuration suivant :&lt;br /&gt;&lt;br /&gt;&lt;pre style='color:#181615;background-color:#ffffff;'&gt;&lt;br /&gt;&lt;span style='color:#0057ae;'&gt;log_facility&lt;/span&gt;=daemon&lt;br /&gt;&lt;span style='color:#0057ae;'&gt;pid_file&lt;/span&gt;=./nrpe.pid&lt;br /&gt;&lt;span style='color:#0057ae;'&gt;server_port&lt;/span&gt;=5666&lt;br /&gt;&lt;span style='color:#0057ae;'&gt;server_address&lt;/span&gt;=127.0.0.1&lt;br /&gt;&lt;span style='color:#0057ae;'&gt;nrpe_user&lt;/span&gt;=nagios&lt;br /&gt;&lt;span style='color:#0057ae;'&gt;nrpe_group&lt;/span&gt;=nagios&lt;br /&gt;&lt;span style='color:#0057ae;'&gt;allowed_hosts&lt;/span&gt;=127.0.0.1&lt;br /&gt;&lt;span style='color:#0057ae;'&gt;dont_blame_nrpe&lt;/span&gt;=0&lt;br /&gt;&lt;span style='color:#0057ae;'&gt;debug&lt;/span&gt;=0&lt;br /&gt;&lt;span style='color:#0057ae;'&gt;command_timeout&lt;/span&gt;=60&lt;br /&gt;&lt;span style='color:#0057ae;'&gt;connection_timeout&lt;/span&gt;=300&lt;br /&gt;&lt;br /&gt;command&lt;b&gt;[short_output]&lt;/b&gt;=/bin/cat /tmp/test&lt;br /&gt;command&lt;b&gt;[long_output]&lt;/b&gt;=/bin/cat /etc/screenrc&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Nous y avons défini deux commandes (short_output et long_output) et nous l'avons fait écouter sur l'adresse localhost. Lançons maintenant notre process :&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# ./nrpe -c ./nrpe.cfg -d&lt;br /&gt;# ps -ef | grep nrpe&lt;br /&gt;nagios   11411     1  0 22:39 ?        00:00:00 ./nrpe -c ./nrpe.cfg -d&lt;br /&gt;root     11417  6370  0 22:39 pts/4    00:00:00 grep --color=auto nrpe&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Essayons maintenant de récupérer le résultat d'une de nos commandes :&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$ ./check_nrpe -H localhost -c short_output&lt;br /&gt;Retour NRPE|Short_output=1&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Tout semble fonctionner au mieux mais malheureusement dans le cas d'une sortie trop grande, tout ce qui dépasse 1024 ieme octet est ignoré :&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$ ./check_nrpe -H localhost -c long_ouput | wc &lt;br /&gt;     34     160    1024&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;En creusant un peu, cette limitation vient de la définition d'une constante C dans le fichier include/common.h :&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;#define MAX_PACKETBUFFER_LENGTH 1024&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Ici, la solution qui vient immédiatement à l'esprit est de simplement changer cette valeur et relancer la compilation. Une fois la recompilation terminée, nous obtenons un binaire check_nrpe et un binaire nrpe.&lt;br /&gt;&lt;br /&gt;En lançant notre nrpe patché, nous avons effectivement le résultat attendu. Petit soucis, si vous avez déjà des agents NRPE et que vous voulez lancer votre commande check_nrpe sur un ancien serveur, vous obtiendrez une belle erreur vous indiquant un soucis de communication :&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$ ./check_nrpe -H localhost -c short_output&lt;br /&gt;CHECK_NRPE: Received 0 bytes from daemon.  Check the remote server logs for error messages.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Si vous êtes comme moi avec environ 300 agents NRPE déjà existant, vous aurez quelques hésitations à les redéployer tous. Heureusement, &lt;a href="http://labs.opsview.com/2008/08/enhancing-nrpe-for-large-output/"&gt;tonvoon a écrit un patch assez astucieux à ce sujet&lt;/a&gt; il y a déjà quelques temps. Le principe est d'utiliser le champ packet_type pour indiquer un nouveau type RESPONSE_PACKET_WITH_MORE en plus des types RESPONSE_PACKET et QUERY_PACKET. Lorsque le plugin check_nrpe détecte ce type de paquet, au lieu de terminer la communication, le client récupère les packets suivants pour les concaténer jusqu'au maximum de 16ko. Et cerise sur le gateau : le plugin check_nrpe reste compatible avec les anciens clients NRPE !&lt;br /&gt;&lt;br /&gt;Vous pouvez donc mettre votre plugin check_nrpe à jour et faire la mise à jour au fil de l'eau pour vos agents NRPE voir - si vous êtes vraiment un gros feignant - ne le faire que là où vous en avez besoin. &lt;br /&gt;&lt;br /&gt;Pour appliquer le patch, récupérer une copie de NRPE en version 2.12, patcher là avec le fichier &lt;a href='http://altinity.blogs.com/dotorg/nrpe_multiline.patch'&gt;suivant&lt;/a&gt; puis lancer le classique &lt;span style="font-weight:bold;"&gt;configure ; make ; make install&lt;/span&gt;. Vous obtiendrez alors vos deux binaires à utiliser.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3536118107392327686-8412284837094595981?l=lesaventuresdeyannigdanslemondeit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lesaventuresdeyannigdanslemondeit.blogspot.com/feeds/8412284837094595981/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3536118107392327686&amp;postID=8412284837094595981' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3536118107392327686/posts/default/8412284837094595981'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3536118107392327686/posts/default/8412284837094595981'/><link rel='alternate' type='text/html' href='http://lesaventuresdeyannigdanslemondeit.blogspot.com/2011/03/patch-du-jour-nrpe-et-les-sorties.html' title='Patch du jour : NRPE et les sorties longues'/><author><name>Yannig Perre</name><uri>https://profiles.google.com/104797199411947382593</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-6bgdo630G7s/AAAAAAAAAAI/AAAAAAAAAhc/P4yM7287fOg/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3536118107392327686.post-6219100651786674133</id><published>2011-02-20T18:08:00.005+01:00</published><updated>2011-02-20T22:34:36.034+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WebLogic'/><category scheme='http://www.blogger.com/atom/ns#' term='HAProxy'/><title type='text'>Exemple d'utilisation du répartiteur de charge Haproxy</title><content type='html'>Il y a de ça quelques années, j'ai eu l'occasion de travailler sur le répartiteur de charge HAProxy. Le point fort de cet outil est qu'il est très simple à mettre en oeuvre. Nous l'avions à l'époque mis en place pour une boucle de charge avec des serveurs d'applications Java WebLogic.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;L'architecture&lt;/h2&gt;&lt;br /&gt;L'application pour laquelle nous devions mettre en place cette solution était un Webservice hébergé sur des serveurs d'application Weblogic. Il est important de souligner que cette application n'avait pas de notion de session et la persistance s'appuyait sur la librairie hibernate.&lt;br /&gt;&lt;br /&gt;Afin de faire face au trafic (supérieur à 300 transactions/secondes), il avait été décidé d'héberger cette application sur 32 d'instances Weblogics réparties sur 4 machines. Nous devions trouver une solution permettant de répartir la charge tout en offrant des possibilités de maintenance de certains noeuds de la boucle de charge. Ceci nous permettait également de faire des évolutions applicatives en pleine journée.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Pourquoi utiliser ce type de répartiteur de charge&lt;/h2&gt;&lt;br /&gt;Nous disposions de matériel dédié à la répartition de charge (type Alteon) qui ne gère que la répartition de charge au niveau TCP. Cette situation n'était pas satisfaisante puisque nous avions besoin de pouvoir gérer certaines informations au niveau du HTTP (Keepalive et gestion boucle de charge). De plus, les applications venant consulter ce webservice avaient tendance à garder leur connexion HTTP ouverte empêchant la sortie d'instance Weblogic de la boucle de charge.&lt;br /&gt;&lt;br /&gt;C'est là où intervient le HAProxy puisque cet outil de répartition de charge comprend le HTTP. Nous pouvions donc nous en servir pour désactiver le Keepalive et garantir qu'à chaque requête, nos clients passe par une nouvelle connexion.&lt;br /&gt;&lt;br /&gt;A noter que la désactivation du Keepalive avait un surcoût au niveau CPU : 1 à 2% (sur un V890 équipé de 8 Ultra IV à 1.3 Ghz). Il est important de qualifier ce coût supplémentaire avec des benchs pour ne pas avoir de mauvaise surprise.&lt;br /&gt;&lt;br /&gt;Le HAProxy était capable de scrupter une page présente sur le serveur WebLogic lui indiquant s'il doit le prendre en compte où non. Pour cela nous avions créé une page Web (page JSP dans une WAR) nous permettant de débrayer automatiquement une instance via le dépot d'un fichier dans le répertoire properties de nos instances Weblogic.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Création d'une application Web pour gérer la validité d'une instance&lt;/h2&gt;&lt;br /&gt;Nous allons tout d'abord créer un petit programme java qui va gérer un état d'une page en fonction d'un fichier properties :&lt;br /&gt;&lt;pre style='color:#181615;background-color:#ffffff;'&gt;&lt;br /&gt;&lt;b&gt;package&lt;/b&gt;&lt;span style='color:#808000;'&gt; haproxy;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;import&lt;/b&gt;&lt;span style='color:#808000;'&gt; java.io.File;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;import&lt;/b&gt;&lt;span style='color:#808000;'&gt; java.io.IOException;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;import&lt;/b&gt;&lt;span style='color:#808000;'&gt; java.net.URL;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;import&lt;/b&gt;&lt;span style='color:#808000;'&gt; java.util.ResourceBundle;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;import&lt;/b&gt;&lt;span style='color:#808000;'&gt; javax.servlet.Servlet;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;import&lt;/b&gt;&lt;span style='color:#808000;'&gt; javax.servlet.ServletException;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;import&lt;/b&gt;&lt;span style='color:#808000;'&gt; javax.servlet.http.HttpServlet;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;import&lt;/b&gt;&lt;span style='color:#808000;'&gt; javax.servlet.http.HttpServletRequest;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;import&lt;/b&gt;&lt;span style='color:#808000;'&gt; javax.servlet.http.HttpServletResponse;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;public&lt;/b&gt; &lt;b&gt;class&lt;/b&gt; HaproxyTestServlet &lt;b&gt;extends&lt;/b&gt; HttpServlet {&lt;br /&gt; &lt;b&gt;public&lt;/b&gt; &lt;span style='color:#0057ae;'&gt;void&lt;/span&gt; &lt;span style='color:#644a9b;'&gt;doGet&lt;/span&gt;(HttpServletRequest req, HttpServletResponse resp)&lt;br /&gt;  &lt;b&gt;throws&lt;/b&gt; ServletException, &lt;b&gt;&lt;span style='color:#0095ff;'&gt;IOException&lt;/span&gt;&lt;/b&gt; {&lt;br /&gt;   &lt;b&gt;if&lt;/b&gt; (&lt;span style='color:#644a9b;'&gt;isAlive&lt;/span&gt;()) {&lt;br /&gt;    resp.&lt;span style='color:#644a9b;'&gt;setStatus&lt;/span&gt;(HttpServletResponse.&lt;span style='color:#644a9b;'&gt;SC_OK&lt;/span&gt;);&lt;br /&gt;    resp.&lt;span style='color:#644a9b;'&gt;getWriter&lt;/span&gt;().&lt;span style='color:#644a9b;'&gt;print&lt;/span&gt;(&lt;span style='color:#bf0303;'&gt;&amp;quot;OK&amp;quot;&lt;/span&gt;);&lt;br /&gt;    &lt;b&gt;return&lt;/b&gt;;&lt;br /&gt;   } &lt;b&gt;else&lt;/b&gt; {&lt;br /&gt;    resp.&lt;span style='color:#644a9b;'&gt;sendError&lt;/span&gt;(HttpServletResponse.&lt;span style='color:#644a9b;'&gt;SC_SERVICE_UNAVAILABLE&lt;/span&gt;,&lt;span style='color:#bf0303;'&gt;&amp;quot;Service non disponible&amp;quot;&lt;/span&gt;);&lt;br /&gt;   }&lt;br /&gt; }&lt;br /&gt; &lt;b&gt;protected&lt;/b&gt; &lt;span style='color:#0057ae;'&gt;void&lt;/span&gt; &lt;span style='color:#644a9b;'&gt;doHead&lt;/span&gt;(HttpServletRequest req, HttpServletResponse resp)&lt;br /&gt;  &lt;b&gt;throws&lt;/b&gt; ServletException, &lt;b&gt;&lt;span style='color:#0095ff;'&gt;IOException&lt;/span&gt;&lt;/b&gt; {&lt;br /&gt;  &lt;b&gt;if&lt;/b&gt; (&lt;span style='color:#644a9b;'&gt;isAlive&lt;/span&gt;()) {&lt;br /&gt;   resp.&lt;span style='color:#644a9b;'&gt;setStatus&lt;/span&gt;(HttpServletResponse.&lt;span style='color:#644a9b;'&gt;SC_OK&lt;/span&gt;);&lt;br /&gt;  } &lt;b&gt;else&lt;/b&gt; {&lt;br /&gt;   resp.&lt;span style='color:#644a9b;'&gt;setStatus&lt;/span&gt;(HttpServletResponse.&lt;span style='color:#644a9b;'&gt;SC_SERVICE_UNAVAILABLE&lt;/span&gt;);&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; &lt;b&gt;private&lt;/b&gt; &lt;span style='color:#0057ae;'&gt;boolean&lt;/span&gt; &lt;span style='color:#644a9b;'&gt;isAlive&lt;/span&gt;() {&lt;br /&gt;  &lt;b&gt;&lt;span style='color:#0095ff;'&gt;URL&lt;/span&gt;&lt;/b&gt; url = &lt;b&gt;this&lt;/b&gt;.&lt;span style='color:#644a9b;'&gt;getClass&lt;/span&gt;().&lt;span style='color:#644a9b;'&gt;getResource&lt;/span&gt;(&lt;span style='color:#bf0303;'&gt;&amp;quot;/haproxy.down&amp;quot;&lt;/span&gt;);&lt;br /&gt;  &lt;b&gt;if&lt;/b&gt; (url != &lt;b&gt;null&lt;/b&gt;) {&lt;br /&gt;    &lt;b&gt;return&lt;/b&gt; &lt;b&gt;false&lt;/b&gt;;&lt;br /&gt;  }&lt;br /&gt;  &lt;b&gt;return&lt;/b&gt; &lt;b&gt;true&lt;/b&gt;;&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Il nous faut maintenant mapper cette applet au niveau de l'application Web en alimentant le fichier web.xml avec le contenu suivant :&lt;br /&gt;&lt;pre style='color:#181615;background-color:#ffffff;'&gt;&lt;br /&gt;&lt;b&gt;&amp;lt;?xml&lt;/b&gt; version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;&lt;b&gt;?&amp;gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;lt;web-app&lt;/b&gt;&lt;span style='color:#006e28;'&gt; id=&lt;/span&gt;&lt;span style='color:#aa0000;'&gt;&amp;quot;WebApp&amp;quot;&lt;/span&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;br /&gt;  &lt;b&gt;&amp;lt;display-name&amp;gt;&lt;/b&gt;TestHaproxy&lt;b&gt;&amp;lt;/display-name&amp;gt;&lt;/b&gt;&lt;br /&gt;  &lt;b&gt;&amp;lt;servlet&amp;gt;&lt;/b&gt;&lt;br /&gt;    &lt;b&gt;&amp;lt;servlet-name&amp;gt;&lt;/b&gt;HaproxyTestServlet&lt;b&gt;&amp;lt;/servlet-name&amp;gt;&lt;/b&gt;&lt;br /&gt;    &lt;b&gt;&amp;lt;display-name&amp;gt;&lt;/b&gt;HaproxyTestServlet&lt;b&gt;&amp;lt;/display-name&amp;gt;&lt;/b&gt;&lt;br /&gt;    &lt;b&gt;&amp;lt;servlet-class&amp;gt;&lt;/b&gt;haproxy.HaproxyTestServlet&lt;b&gt;&amp;lt;/servlet-class&amp;gt;&lt;/b&gt;&lt;br /&gt;  &lt;b&gt;&amp;lt;/servlet&amp;gt;&lt;/b&gt;&lt;br /&gt;  &lt;b&gt;&amp;lt;servlet-mapping&amp;gt;&lt;/b&gt;&lt;br /&gt;    &lt;b&gt;&amp;lt;servlet-name&amp;gt;&lt;/b&gt;HaproxyTestServlet&lt;b&gt;&amp;lt;/servlet-name&amp;gt;&lt;/b&gt;&lt;br /&gt;    &lt;b&gt;&amp;lt;url-pattern&amp;gt;&lt;/b&gt;/HaproxyTestServlet&lt;b&gt;&amp;lt;/url-pattern&amp;gt;&lt;/b&gt;&lt;br /&gt;  &lt;b&gt;&amp;lt;/servlet-mapping&amp;gt;&lt;/b&gt;&lt;br /&gt;  &lt;b&gt;&amp;lt;welcome-file-list&amp;gt;&lt;/b&gt;&lt;br /&gt;    &lt;b&gt;&amp;lt;welcome-file&amp;gt;&lt;/b&gt;index.html&lt;b&gt;&amp;lt;/welcome-file&amp;gt;&lt;/b&gt;&lt;br /&gt;    &lt;b&gt;&amp;lt;welcome-file&amp;gt;&lt;/b&gt;index.htm&lt;b&gt;&amp;lt;/welcome-file&amp;gt;&lt;/b&gt;&lt;br /&gt;    &lt;b&gt;&amp;lt;welcome-file&amp;gt;&lt;/b&gt;index.jsp&lt;b&gt;&amp;lt;/welcome-file&amp;gt;&lt;/b&gt;&lt;br /&gt;    &lt;b&gt;&amp;lt;welcome-file&amp;gt;&lt;/b&gt;default.html&lt;b&gt;&amp;lt;/welcome-file&amp;gt;&lt;/b&gt;&lt;br /&gt;    &lt;b&gt;&amp;lt;welcome-file&amp;gt;&lt;/b&gt;default.htm&lt;b&gt;&amp;lt;/welcome-file&amp;gt;&lt;/b&gt;&lt;br /&gt;    &lt;b&gt;&amp;lt;welcome-file&amp;gt;&lt;/b&gt;default.jsp&lt;b&gt;&amp;lt;/welcome-file&amp;gt;&lt;/b&gt;&lt;br /&gt;  &lt;b&gt;&amp;lt;/welcome-file-list&amp;gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;lt;/web-app&amp;gt;&lt;/b&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Reste à la mettre en place et de voir le résultat de son déploiement en consultant l'application en rentrant son URL (http://monserver:monport/haproxy/HaproxyTestServlet). Pour désactiver une instance ? Rien de plus simple : créer un fichier haproxy.down dans le répertoire des properties de l'instance. Remettre une instance dans la boucle ? Simplement en supprimant le fichier haproxy.down&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Mise en place de la solution&lt;/h2&gt;&lt;br /&gt;Il faut d'abord créer un fichier de configuration pour notre HAProxy (haproxy.cfg).&lt;br /&gt;&lt;br /&gt;Ce dernier contient l'adresse et le port d'écoute (ici host:8888) ainsi que de nombreux paramètres sur son fonctionnement. Ci-dessous un début de fichier de configuration intéressant :&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;global&lt;br /&gt; maxconn 4096&lt;br /&gt; daemon&lt;br /&gt; nbproc  2&lt;br /&gt; pidfile /var/run/haproxy-private.pid&lt;br /&gt;&lt;br /&gt;listen proxy host:8888&lt;br /&gt; log global&lt;br /&gt; mode http&lt;br /&gt; option httplog&lt;br /&gt; option dontlognull&lt;br /&gt; cookie COOKIEID insert indirect nocache&lt;br /&gt; balance  roundrobin&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;La liste des serveurs dans la boucle de répartition de charge est représenté par la liste de ligne commençant par server.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;        server inst11 web1:7011 check inter 2000 rise 2 fall 5&lt;br /&gt;        server inst21 web2:7021 check inter 2000 rise 2 fall 5&lt;br /&gt;        server inst31 web3:7031 check inter 2000 rise 2 fall 5&lt;br /&gt;        server inst41 web4:7041 check inter 2000 rise 2 fall 5&lt;br /&gt;[...]&lt;br /&gt;        server inst18 web1:7018 check inter 2000 rise 2 fall 5&lt;br /&gt;        server inst28 web2:7028 check inter 2000 rise 2 fall 5&lt;br /&gt;        server inst38 web3:7038 check inter 2000 rise 2 fall 5&lt;br /&gt;        server inst48 web4:7048 check inter 2000 rise 2 fall 5&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Indiquons également l'emplacement de notre page de test ainsi que nos paramètres de répartition de charge :&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; monitor-uri /haproxy/HaproxyTestServlet&lt;br /&gt; retries 3&lt;br /&gt; redispatch&lt;br /&gt; maxconn 2000&lt;br /&gt; contimeout 5000&lt;br /&gt; clitimeout 50000&lt;br /&gt; srvtimeout 50000&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Enfin, dans le cas où vous voudriez désactiver le Keepalive HTTP, rajoutez les lignes suivantes :&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; reqidel ^Connection:  # disable keep-alive&lt;br /&gt; reqadd  Connection:\ close&lt;br /&gt; rspidel ^Connection:&lt;br /&gt; rspadd  Connection:\ close&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Il ne nous reste plus qu'à lancer le démon haproxy à l'aide de la commande suivante :&lt;br /&gt;&lt;pre&gt;haproxy -D -f haproxy.cfg&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Conclusion&lt;/h2&gt;&lt;br /&gt;Dans cet article, nous n'avons vu qu'une toute petite partie des capacités de ce répartiteur de charge. Son auteur (Willy Tarreau) a également inclu des fonctionnalités très intéressantes comme :&lt;br /&gt; - la gestion d'IPV6 (v1.2)&lt;br /&gt; - la gestion des cookies applicatifs pour garder le contexte d'un client vers un seul serveur (v1.2)&lt;br /&gt; - la reconfiguration à chaud (v1.2)&lt;br /&gt; - la répartition de charge avec poids (v1.2)&lt;br /&gt; - la page de diagnostique (v1.2)&lt;br /&gt; - la gestion des contenus statiques/dynamiques (v1.3)&lt;br /&gt;&lt;br /&gt;Pour en savoir plus : http://haproxy.1wt.eu/#desc&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3536118107392327686-6219100651786674133?l=lesaventuresdeyannigdanslemondeit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lesaventuresdeyannigdanslemondeit.blogspot.com/feeds/6219100651786674133/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3536118107392327686&amp;postID=6219100651786674133' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3536118107392327686/posts/default/6219100651786674133'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3536118107392327686/posts/default/6219100651786674133'/><link rel='alternate' type='text/html' href='http://lesaventuresdeyannigdanslemondeit.blogspot.com/2011/02/exemple-dutilisation-du-repartiteur-de.html' title='Exemple d&apos;utilisation du répartiteur de charge Haproxy'/><author><name>Yannig Perre</name><uri>https://profiles.google.com/104797199411947382593</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-6bgdo630G7s/AAAAAAAAAAI/AAAAAAAAAhc/P4yM7287fOg/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3536118107392327686.post-5004465902901000632</id><published>2010-12-23T14:26:00.012+01:00</published><updated>2011-01-02T20:48:01.428+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Thruk'/><category scheme='http://www.blogger.com/atom/ns#' term='shinken'/><category scheme='http://www.blogger.com/atom/ns#' term='nagios'/><title type='text'>Installation de shinken et configuration de l'interface Thruk</title><content type='html'>J'utilise beaucoup nagios pour mon travail de tous les jours mais c'est un outil qui n'est pas parfait (loin de là! ). J'ai donc lu avec beaucoup d'intérêt le démarrage du projet shinken qui a comme gros avantage d'être beaucoup plus performant et d'être beaucoup plus modulable que son ainé.&lt;br /&gt;&lt;br /&gt;Voulant m'en faire une idée pour de vrai, j'ai donc procédé à une installation from scratch. Comme la documentation ne parle pas du tout de l'ajout de l'interface, je laisse donc ici quelques mots à ce sujet.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Installation de shinken&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;Tout d'abord créer un utilisateur shinken. Très important, il faut un home qui soit valide (sinon, l'arbitrer ne démarre pas !).&lt;br /&gt;&lt;br /&gt;Reste ensuite à procéder à l'installation. Ici, rien de plus simple, il faut simplement récupérer le package &lt;a href="http://shinken-monitoring.org/pub/shinken-0.4.tar.gz"&gt;shinken-0.4.tar.gz&lt;/a&gt; puis de le décompresser. Se rendre dans le répertoire shinken-0.4 puis lancer la commande suivante :&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;sudo python setup.py install --install-scripts=/usr/bin&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;De là, shinken va créer pas mal de répertoire (notamment /var/lib/shinken et /etc/shinken). Par convenance, j'ai créé un fichier shinken.sh qui me lance tous les éléments dans le bon ordre :&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;patrice@Enclume:~/tmp/shinken-0.4$ cat /etc/init.d/shinken.sh&lt;br /&gt;#!/bin/bash&lt;br /&gt;&lt;br /&gt;cd /etc/init.d&lt;br /&gt;&lt;br /&gt;for script in shinken-scheduler shinken-poller shinken-reactionner shinken-broker shinken-arbiter&lt;br /&gt;do&lt;br /&gt;./$script $1&lt;br /&gt;done&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;De là, il suffit de faire un /etc/init.d/shinken.sh start et c'est parti ! Pour vérifier que tout va bien, il faut s'assurer que les process suivants sont bien présents :&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;patrice@Enclume:~/tmp/shinken-0.4$ ps -u shinken&lt;br /&gt;PID TTY          TIME CMD&lt;br /&gt;4358 ?        00:00:09 shinken-schedul&lt;br /&gt;4367 ?        00:00:10 shinken-poller&lt;br /&gt;4372 ?        00:00:00 shinken-poller&lt;br /&gt;4380 ?        00:00:09 shinken-reactio&lt;br /&gt;4385 ?        00:00:00 shinken-reactio&lt;br /&gt;4949 ?        00:00:13 shinken-broker&lt;br /&gt;4989 ?        00:00:00 shinken-poller&lt;br /&gt;4990 ?        00:00:00 shinken-poller&lt;br /&gt;4993 ?        00:00:00 shinken-poller&lt;br /&gt;4996 ?        00:00:18 shinken-broker&lt;br /&gt;4997 ?        00:00:00 shinken-broker&lt;br /&gt;5001 ?        00:00:00 shinken-reactio&lt;br /&gt;5004 ?        00:00:00 shinken-poller&lt;br /&gt;5018 ?        00:00:10 shinken-arbiter&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Configuration de l'interface Thruk&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;Ici, il faut récupérer l'interface Thruk à l'emplacement &lt;a href="http://www.thruk.org/download.html"&gt;suivant&lt;/a&gt;. On la décompresse puis nous nous rendons dedans afin d'y créer un fichier thruk_local.conf. En voici le contenu :&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;~/tmp/Thruk-0.74$ cat thruk_local.conf&lt;br /&gt;######################################&lt;br /&gt;# Backend Configuration, enter your backends here&lt;br /&gt;&amp;lt;component Thruk::Backend&amp;gt;&lt;br /&gt;   &amp;lt;peer&amp;gt;&lt;br /&gt;       name   = Shinken&lt;br /&gt;       type   = livestatus&lt;br /&gt;       hidden = 0             # make this backend hidden by default&lt;br /&gt;       groups = admins        # make this backend only visible to the admin group&lt;br /&gt;       &amp;lt;options&amp;gt;&lt;br /&gt;           peer    = 127.0.0.1:50000&lt;br /&gt;           verbose = 0&lt;br /&gt;      &amp;lt;/options&amp;gt;&lt;br /&gt;   &amp;lt;/peer&amp;gt;&lt;br /&gt;&amp;lt;/component&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;De là, il ne nous reste plus qu'à lancer le démon Thruk :&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;~/tmp/Thruk-0.74/script$ ./thruk_server.pl&lt;br /&gt;You can connect to your server at http://enclume:3000&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;NB : Attention, il s'agit d'un test. Il est possible de lancer l'interface Thruk en utilisant un serveur apache mais ce n'est pas l'objet de cet article.&lt;br /&gt;&lt;br /&gt;De là, il ne nous reste plus qu'à accéder à l'interface http://localhost:3000 au travers un navigateur :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_3icrLvUmzZ4/TRNTGj_kiwI/AAAAAAAAAeM/FjzTWvVrXDE/s1600/thruk_vs_shinken.png"&gt;&lt;img style="cursor: pointer; width: 320px; height: 317px;" src="http://4.bp.blogspot.com/_3icrLvUmzZ4/TRNTGj_kiwI/AAAAAAAAAeM/FjzTWvVrXDE/s320/thruk_vs_shinken.png" alt="" id="BLOGGER_PHOTO_ID_5553874137684151042" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Bon, il va maintenant falloir que je configure correctement ma map :D Mais bon, ça c'est une autre histoire ;).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3536118107392327686-5004465902901000632?l=lesaventuresdeyannigdanslemondeit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lesaventuresdeyannigdanslemondeit.blogspot.com/feeds/5004465902901000632/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3536118107392327686&amp;postID=5004465902901000632' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3536118107392327686/posts/default/5004465902901000632'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3536118107392327686/posts/default/5004465902901000632'/><link rel='alternate' type='text/html' href='http://lesaventuresdeyannigdanslemondeit.blogspot.com/2010/12/installation-de-shinken-et.html' title='Installation de shinken et configuration de l&apos;interface Thruk'/><author><name>Yannig Perre</name><uri>https://profiles.google.com/104797199411947382593</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-6bgdo630G7s/AAAAAAAAAAI/AAAAAAAAAhc/P4yM7287fOg/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_3icrLvUmzZ4/TRNTGj_kiwI/AAAAAAAAAeM/FjzTWvVrXDE/s72-c/thruk_vs_shinken.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3536118107392327686.post-7408156093927657168</id><published>2010-10-06T22:04:00.004+02:00</published><updated>2010-10-06T22:10:43.627+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ndoutils'/><category scheme='http://www.blogger.com/atom/ns#' term='pnp4nagios'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><category scheme='http://www.blogger.com/atom/ns#' term='script'/><category scheme='http://www.blogger.com/atom/ns#' term='nagios'/><title type='text'>Import des données de ndoutils dans pnp4nagios</title><content type='html'>Il y a de ça 5 ou 6 mois, j'ai procédé à un refresh à notre infrastructure de suivi nagios. A l'époque nous utilisions un nagios couplé avec &lt;a href="http://fr.wikipedia.org/wiki/NDOUtils"&gt;NDOUtils&lt;/a&gt; pour faire notre suivi de tendance des machines. J'avais par ailleurs créé un plugin permettant de grapher tout ceci en me basant sur la bibliothéque &lt;a href="http://jpgraph.net/"&gt;JPGraph&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Malheureusement, entre les problèmes sur la base de données, le fait que je sois sur Solaris (chouette encore un truc à compiler), les problèmes liés au broker nagios (pourquoi ce foutu machin ne veut pas se reconnecter à la base !!!), les problèmes de performance de la base (j'avais mis en place un système de rotation de la table nagios_servicechecks pour m'affranchir des problèmes de dégradation des performances avec le temps), la taille de tout ceci (200 Mo de place par jour pour 600 services !) et le plugin de graph à maintenir, j'ai fini par péter un cable !&lt;br /&gt;&lt;br /&gt;Bref, à l'occasion d'un plan de refresh de ma machine, je suis tombé sur &lt;a href="http://docs.pnp4nagios.org/pnp-0.6/start"&gt;pnp4nagios&lt;/a&gt; et là, j'ai sérieusement réfléchi à me débarrasser de NDOUtils. En revanche, un point m'embêter : perdre mon historique de 100 jours de l'ancienne base MySQL. J'ai donc à ce moment pensé à utiliser les possibilités d'insertion en mode bulk de pnp4nagios afin de reconstituer mon historique.&lt;br /&gt;&lt;br /&gt;Au démarrage, j'ai procédé par une extraction via un ensemble de scripts shells. J'ai ensuite procédé à un refactoring de ce script afin de le réécrire en perl que j'ai ensuite proposé à l'équipe de pnp4nagios. Ils m'ont simplement proposé de le déposer sur leur wiki à &lt;a href="http://docs.pnp4nagios.org/pnp-0.6/ndo2pnp"&gt;l'emplacement suivant&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Le script en question s'appelle &lt;span style="font-weight:bold;"&gt;ndo2pnp.pl&lt;/span&gt; et vous trouverez ci-dessous l'aide en ligne disponible sur l'outil :&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$ ./ndo2pnp.pl --help&lt;br /&gt;Usage :&lt;br /&gt;-h  --help            Display this message.&lt;br /&gt;    --version         Display version then exit.&lt;br /&gt;-v  --verbose         Verbose run.&lt;br /&gt;-u  --user ndouser    Log on to database with ndouser (default root).&lt;br /&gt;-p  --pass passwd     Use passwd to logon (default gbu2kfe).&lt;br /&gt;-t  --type dbtype     Change database type (default mysql).&lt;br /&gt;    --host dbhost     Use dbhost (default localhost).&lt;br /&gt;    --dbname db       Use db for ndo database name (default ndoutils).&lt;br /&gt;    --list-machine    Display machine definition in ndo database.&lt;br /&gt;    --list-service    Show services defined.&lt;br /&gt;    --export-as-pnp   Export ndo content as a bulk file used by process_perfdata.pl.&lt;br /&gt;&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Globalement, pour procéder à votre export/import, il faut suivre les étapes suivantes :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Extraction du contenu de la base : &lt;span style="font-weight:bold;"&gt;./ndo2pnp.pl --user mysql_user -p mysql_pass --export-as-pnp &gt; /tmp/perfdata.bulk&lt;/span&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Import de l'extraction :&lt;span style="font-weight:bold;"&gt;/usr/share/pnp4nagios/libexec/process_perfdata.pl -b /tmp/perfdata.bulk --timeout 0&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Quoi ? C'est tout ! Euh, juste une petite précision : l'import a duré 4 jours sur ma machine de production :). Un conseil : essayez de faire des extracts machine par machine (avec l'option --machines MAMACHINEAEXTRAIRE ou --services MESSERVICESAEXTRAIRE que j'ai oublié de documenté d'ailleurs ... Pas beau !). Les imports seront du coup moins long à faire (et éventuellement en parallèle) et peuvent vous donner une idée du résultat final sans avoir à vous coltiner l'intégralité de l'import de vos données.&lt;br /&gt;&lt;br /&gt;Le résultat de tout ceci se trouve ci-dessous :&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_3icrLvUmzZ4/TKzUOxTminI/AAAAAAAAAeA/nCP-nbJkCtE/s1600/pi%C3%A8ce_jointe.1.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 166px;" src="http://4.bp.blogspot.com/_3icrLvUmzZ4/TKzUOxTminI/AAAAAAAAAeA/nCP-nbJkCtE/s320/pi%C3%A8ce_jointe.1.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5525024193095567986" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Toute la partie de décembre à février et le résultat de l'import (plus les quelques jours parasites d'octobre et novembre, date à laquelle nous avions eu des soucis avec la base MySQL). Vous remarquerez qu'entre temps, la base s'est alimentée avec de nouvelles valeurs.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3536118107392327686-7408156093927657168?l=lesaventuresdeyannigdanslemondeit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lesaventuresdeyannigdanslemondeit.blogspot.com/feeds/7408156093927657168/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3536118107392327686&amp;postID=7408156093927657168' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3536118107392327686/posts/default/7408156093927657168'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3536118107392327686/posts/default/7408156093927657168'/><link rel='alternate' type='text/html' href='http://lesaventuresdeyannigdanslemondeit.blogspot.com/2010/10/import-des-donnees-de-ndoutils-dans.html' title='Import des données de ndoutils dans pnp4nagios'/><author><name>Yannig Perre</name><uri>https://profiles.google.com/104797199411947382593</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-6bgdo630G7s/AAAAAAAAAAI/AAAAAAAAAhc/P4yM7287fOg/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_3icrLvUmzZ4/TKzUOxTminI/AAAAAAAAAeA/nCP-nbJkCtE/s72-c/pi%C3%A8ce_jointe.1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3536118107392327686.post-7164906123560389095</id><published>2010-09-05T10:15:00.000+02:00</published><updated>2010-09-05T12:45:31.319+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='robot'/><category scheme='http://www.blogger.com/atom/ns#' term='Mediawiki'/><category scheme='http://www.blogger.com/atom/ns#' term='script'/><title type='text'>Utilisation d'un robot avec Mediawiki</title><content type='html'>Il y a de ça quelques temps, j'ai eu l'occasion de travailler sur un robot de mise à jour automatique des populations sur les articles des communes de Charente-Maritime. Le principe est assez simple : les articles de commune utilisent tous un système de modèle afin de donner un aspect uniforme à tous les articles. Jetons un coup d'oeil au code source de l'article Wikipedia sur la ville de La Rochelle :&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;{{Infobox Communes de France&lt;br /&gt;| nomcommune         = La Rochelle&lt;br /&gt;| image              = La Rochelle Vieux-Port.JPG&lt;br /&gt;| image-desc         = Les tours du vieux-port de La Rochelle&lt;br /&gt;[...]&lt;br /&gt;| insee              = 17300&lt;br /&gt;| cp                 = 17000&lt;br /&gt;| maire              = [[Maxime Bono]]&lt;br /&gt;[...]&lt;br /&gt;| km²                = 28.43&lt;br /&gt;| sans               = 76848&lt;br /&gt;| date-sans          = 2007&lt;br /&gt;| aire-urbaine       = 186271&lt;br /&gt;| nomhab             = Rochelaise, Rochelais&lt;br /&gt;| siteweb            = http://www.ville-larochelle.fr/&lt;br /&gt;| géoloc-département = Charente-Maritime&lt;br /&gt;}}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Comme vous pouvez le constater, l'article utilise un modèle Mediawiki (ici le modèle Infobox Communes de France) et utilise des paramètres nommés (aire-urbaine=186271 par exemple). L'idée de l'automate est donc de venir modifier les paramètres sans et date-sans (respectivement la population et la date de ce recensement) à partir de fichier plat. Ceci bien sûr afin d'éviter de faire le travail de mise à jour des centaines de communes de France à la main.&lt;br /&gt;&lt;br /&gt;Pour les plus curieux, le code source du robot se trouve à l'adresse suivante : &lt;a href="http://code.google.com/p/droopigbot/source/browse/#svn/trunk/public_html"&gt;DroopigBot sur google code&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Bref, le robot a fonctionné sur les communes de Charente-Maritime (ainsi que sur une partie de la Vendée) et m'a donné une idée lumineuse : alimenter automatiquement notre wiki de documentation interne. En effet, nous avions tout un tas de site différent dispersé avec des fonctionnalités différentes :&lt;br /&gt;&lt;ul&gt;&lt;br /&gt; &lt;li&gt;Un inventaire de machine&lt;/li&gt;&lt;br /&gt; &lt;li&gt;Un spip de documentation (avec une version complètement obsolète)&lt;/li&gt;&lt;br /&gt; &lt;li&gt;Un inventaire par mail de nos instances de serveurs Java&lt;/li&gt;&lt;br /&gt; &lt;li&gt;Mais également plein de chose avec des fichiers plats dans plein d'endroit différent&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;J'ai donc récupéré le code que j'avais utilisé pour mes communes afin d'en faire quelque chose de plus simple sous la forme d'un script d'extraction et de mise à jour de contenu d'article.&lt;br /&gt;&lt;br /&gt;Je ne vais pas tout vous présenter mais juste l'utilitaire en ligne de commande qui me permet de faire cette mise à jour : update_article.sh. Vous pouvez le récupérer à l'adresse suivante : &lt;a href='http://code.google.com/p/droopigbot/source/browse/#svn/trunk/public_html'&gt;http://code.google.com/p/droopigbot/source/browse/#svn/trunk/public_html&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Pour le configurer, c'est assez simple : créer un utilisateur avec droit d'écriture sur votre mediawiki, créer un fichier robot_config.inc.php avec les informations de connexion. Ci-dessous un exemple pour ce fichier :&lt;br /&gt;&lt;pre&gt;&lt;?php&lt;br /&gt;$robot = new DroopigBot("Nomdubot", "passdubot", "http://addresse-du-serveur/wiki");&lt;br /&gt;?&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Une fois enregistré, votre robot est prêt à fonctionner. Faisons un test simple d'extraction :&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;drayan@robert:~/dev/droopigbot/public_html$ ./update_article.sh --name 'Page de test' --dump&lt;br /&gt;Un article de test.&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Alimentons maintenant un fichier pour mettre à jour cet article :&lt;br /&gt;&lt;pre&gt;drayan@robert:~/dev/droopigbot/public_html$ cat &gt; essai.txt&lt;br /&gt;Mon article a été mise à jour.&lt;br /&gt;&lt;br /&gt;Et j'en suis très content.&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Lançons la mise à jour :&lt;br /&gt;&lt;pre&gt;drayan@robert:~/dev/droopigbot/public_html$ ./update_article.sh --name 'Page de test' --update ./essai.txt --no-simulation --message 'Mise à jour par un robot'&lt;br /&gt;Updating 'Page de test' with './essai.txt' content&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Si on jette un coup d'oeil à l'article, nous voyons qu'il a été mis à jour :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_3icrLvUmzZ4/TINM2KA7M3I/AAAAAAAAAdk/Y1MeZoQ6vH8/s1600/resultat+MAJ.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 303px; height: 145px;" src="http://1.bp.blogspot.com/_3icrLvUmzZ4/TINM2KA7M3I/AAAAAAAAAdk/Y1MeZoQ6vH8/s320/resultat+MAJ.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5513334862116500338" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Allons maintenant voir l'historique :&lt;br /&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_3icrLvUmzZ4/TINNBaxluRI/AAAAAAAAAds/T9Z9iHKHlSU/s1600/historique+article.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5513335055594141970" /&gt;&lt;br /&gt;&lt;br /&gt;Reste maintenant plus qu'à faire vos scripts de mise à jour de votre wiki :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3536118107392327686-7164906123560389095?l=lesaventuresdeyannigdanslemondeit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lesaventuresdeyannigdanslemondeit.blogspot.com/feeds/7164906123560389095/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3536118107392327686&amp;postID=7164906123560389095' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3536118107392327686/posts/default/7164906123560389095'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3536118107392327686/posts/default/7164906123560389095'/><link rel='alternate' type='text/html' href='http://lesaventuresdeyannigdanslemondeit.blogspot.com/2010/09/utilisation-dun-robot-avec-mediawiki.html' title='Utilisation d&apos;un robot avec Mediawiki'/><author><name>Yannig Perre</name><uri>https://profiles.google.com/104797199411947382593</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-6bgdo630G7s/AAAAAAAAAAI/AAAAAAAAAhc/P4yM7287fOg/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_3icrLvUmzZ4/TINM2KA7M3I/AAAAAAAAAdk/Y1MeZoQ6vH8/s72-c/resultat+MAJ.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3536118107392327686.post-6261793560512878341</id><published>2010-07-11T11:55:00.007+02:00</published><updated>2010-07-11T12:21:03.557+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pnp4nagios'/><title type='text'>Sortie de pnp4nagios 0.6.5</title><content type='html'>Juste un petit billet pour signaler la sortie de pnp4nagios en version 0.6.5. Un rapide coup d'oeil sur le changelog nous donne les nouveautés suivantes (par rapport à la version 0.4.x) :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Interface Web se basant sur le moteur Kohana, thème jQuery et utilisation de plugin jQuery&lt;/li&gt;&lt;li&gt;process_perfdata.pl peut utiliser plusieurs bases RRD par source nagios&lt;/li&gt;&lt;li&gt;Nouvelle fonctionnalitée d'installation : possibilité de spécifier l'emplacement des fichiers layout (-–with-layout)&lt;/li&gt;&lt;li&gt;Lors d'une erreur de rendu, les erreurs sont affichées sous la forme d'image.&lt;/li&gt;&lt;li&gt;Les templates d'affichage ne peuvent plus changer la valeur des variables internes.&lt;/li&gt;&lt;li&gt;Possibilité d'utiliser les templates des versions 0.4.x.&lt;/li&gt;&lt;li&gt;Refonte du code PDF ainsi que pour les pages.&lt;/li&gt;&lt;li&gt;Optimisation du Template par défaut (default.php)&lt;/li&gt;&lt;li&gt;Export des bases RRD au format XML, CSV et JSON en utilisation la fonction RRDtool "xport"&lt;/li&gt;&lt;li&gt;Les erreurs font pointer sur la FAQ en ligne.&lt;/li&gt;&lt;li&gt;Plugin permettant d'afficher les graphiques dans un popup.&lt;/li&gt;&lt;li&gt;Support du rrdcached&lt;/li&gt;&lt;/ul&gt;Une fonctionnalité que je n'ai pas encore eu le loisir de tester est la partie "special template" qui permet apparemment de récupérer des informations sur plusieurs machines en même temps pour les afficher sur un même graphique. Une application de cette nouvelle fonction pourrait être de disposer d'un graphique indiquant le trafic en temps réel de 4 machines frontales Web.&lt;br /&gt;&lt;br /&gt;Autre fonctionnalité nouvelle sur la version 0.6.5, la présence de fonction d'aide à la création de template (voir la page suivante : http://docs.pnp4nagios.org/pnp-0.6/tpl_helper). Ces fonctions vous permettront de simplifier la prise en main des outils RRD. Quelques exemples d'utilisation :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Définir une nouvelle source de données RRD :&lt;span style="font-family:monospace;"&gt; $&lt;/span&gt;&lt;span class="re0"&gt;def&lt;/span&gt; &lt;span class="sy0"&gt;=&lt;/span&gt; rrd&lt;span class="sy0"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;def&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="st_h"&gt;'var1'&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; &lt;span class="re0"&gt;$RRDFILE&lt;/span&gt;&lt;span class="br0"&gt;[&lt;/span&gt;0&lt;span class="br0"&gt;]&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; &lt;span class="re0"&gt;$DS&lt;/span&gt;&lt;span class="br0"&gt;[&lt;/span&gt;&lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;]&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; &lt;span class="st_h"&gt;'MAX'&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="sy0"&gt;Définir un gradient : $def .= rrd::gradient('var1', '#ff0000', '#ffff00' );&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="sy0"&gt;Afficher une ligne : $def .= rrd::line1('var1', #ff00ff );&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;Autre point qui pourrait vous intéresser, j'ai reversé une traduction française de l'interface.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3536118107392327686-6261793560512878341?l=lesaventuresdeyannigdanslemondeit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lesaventuresdeyannigdanslemondeit.blogspot.com/feeds/6261793560512878341/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3536118107392327686&amp;postID=6261793560512878341' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3536118107392327686/posts/default/6261793560512878341'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3536118107392327686/posts/default/6261793560512878341'/><link rel='alternate' type='text/html' href='http://lesaventuresdeyannigdanslemondeit.blogspot.com/2010/07/sortie-de-pnp4nagios-065.html' title='Sortie de pnp4nagios 0.6.5'/><author><name>Yannig Perre</name><uri>https://profiles.google.com/104797199411947382593</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-6bgdo630G7s/AAAAAAAAAAI/AAAAAAAAAhc/P4yM7287fOg/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3536118107392327686.post-659974674876496631</id><published>2010-06-25T21:58:00.004+02:00</published><updated>2010-06-25T22:18:58.947+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SSL'/><category scheme='http://www.blogger.com/atom/ns#' term='nrpe'/><category scheme='http://www.blogger.com/atom/ns#' term='AIX'/><category scheme='http://www.blogger.com/atom/ns#' term='compilation'/><category scheme='http://www.blogger.com/atom/ns#' term='nagios'/><title type='text'>Compilation NRPE sous AIX 5.3 avec support du SSL</title><content type='html'>J'ai eu dernièrement besoin de compiler un agent nagios NRPE pour AIX 5.3. Malheureusement pour moi, cet OS est livré sans librairie dynamique openssl (ie libssl.so). J'ai donc du compiler nrpe en static.&lt;br /&gt;&lt;br /&gt;N'ayant pas trouver d'information intéressante sur le net (en dehors de désactiver le ssl), je me suis dit que ce genre d'information pourrait être utile à d'autre.&lt;br /&gt;&lt;br /&gt;Tout d'abord, modifier le fichier configure de la manière suivante (sur une version 2.12 de nrpe) :&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$ diff configure.orig configure&lt;br /&gt;&lt;span style='color:#800000;'&gt;6673c6673&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#ff0000;'&gt;&amp;lt;                       if test -f &amp;quot;$dir/libssl.so&amp;quot;; then&lt;/span&gt;&lt;br /&gt;&lt;b&gt;---&lt;/b&gt;&lt;br /&gt;&lt;span style='color:#0000ff;'&gt;&amp;gt;                       if test -f &amp;quot;$dir/libssl.a&amp;quot;; then&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#800000;'&gt;6687c6687&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#ff0000;'&gt;&amp;lt;                       LIBS=&amp;quot;$LIBS -lssl -lcrypto&amp;quot;;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;---&lt;/b&gt;&lt;br /&gt;&lt;span style='color:#0000ff;'&gt;&amp;gt;                       LIBS=&amp;quot;$LIBS $ssllibdir/libssl.a $ssllibdir/libcrypto.a&amp;quot;;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Le patch consiste à changer la nature du fichier recherché (libssl.a à la place de libssl.so) et remplacer les flags de compilation &lt;span style="font-weight:bold;"&gt;-lssl&lt;/span&gt; et &lt;span style="font-weight:bold;"&gt;-lcrypto&lt;/span&gt; par les fichiers des bibliothèques que l'on vient de trouver.&lt;br /&gt;&lt;br /&gt;Il ne reste plus qu'à lancer configure avec les options suivantes :  &lt;br /&gt;&lt;pre&gt;./configure --with-ssl=/opt/freeware --with-ssl-lib=/opt/freeware/lib --prefix=/opt/nagios&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Un coup de &lt;span style="font-weight:bold;"&gt;make ; make install&lt;/span&gt; et vous disposez maintenant des binaires &lt;span style="font-weight:bold;"&gt;nrpe&lt;/span&gt; et &lt;span style="font-weight:bold;"&gt;check_nrpe&lt;/span&gt; à la mode AIX et surtout avec le support du SSL.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3536118107392327686-659974674876496631?l=lesaventuresdeyannigdanslemondeit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lesaventuresdeyannigdanslemondeit.blogspot.com/feeds/659974674876496631/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3536118107392327686&amp;postID=659974674876496631' title='5 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3536118107392327686/posts/default/659974674876496631'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3536118107392327686/posts/default/659974674876496631'/><link rel='alternate' type='text/html' href='http://lesaventuresdeyannigdanslemondeit.blogspot.com/2010/06/compilation-nrpe-sous-aix-53-avec.html' title='Compilation NRPE sous AIX 5.3 avec support du SSL'/><author><name>Yannig Perre</name><uri>https://profiles.google.com/104797199411947382593</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-6bgdo630G7s/AAAAAAAAAAI/AAAAAAAAAhc/P4yM7287fOg/s512-c/photo.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3536118107392327686.post-3388153277678657551</id><published>2010-06-24T20:50:00.011+02:00</published><updated>2010-06-25T22:20:52.410+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ndoutils'/><category scheme='http://www.blogger.com/atom/ns#' term='pnp4nagios'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><category scheme='http://www.blogger.com/atom/ns#' term='solaris'/><category scheme='http://www.blogger.com/atom/ns#' term='nagios'/><category scheme='http://www.blogger.com/atom/ns#' term='RRD'/><title type='text'>Problème de performance avec pnp4nagios sous Solaris</title><content type='html'>Depuis quelques temps déjà, je devais mettre en place pnp4nagios combiné à un nagios 3.2 sur une nouvelle machine. Auparavant, je passais par une machine un peu vieillotte (un sunfire V210 avec 2 Go de mémoire) que je devais remplacer par une plus récente (à base de M5000 Sun). L'ancienne plateforme passait par un nagios combiné avec ndoutils (un backend de stockage des données de performance sous MySQL). Cette plateforme était très contraignante pour plusieurs raisons :&lt;div&gt;&lt;ul&gt;&lt;li&gt;Plugin de génération de graphique maison (c'est votre serviteur qui avait écrit ça)&lt;/li&gt;&lt;li&gt;Scripts de gestion du contenu de la table nagios_servicechecks : je découpais cette table en journée pour pouvoir supporté le volume de données (environ 200 Mo/jour et 17 Go d'historique)&lt;/li&gt;&lt;li&gt;Lenteur de la solution : nagios et le module de base de données (ndo2db) n'était pas très consommateur mais en revanche, la base MySQL était très consommatrice de ressource disque et CPU. &lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Bref, pour toutes ces raisons et après un rapide tour des solutions existantes, nous avions décidé de partir sur l'excellent plugin pnp4nagios pour l'historisation. Avec ce plugin, plus de serveur MySQL, moins d'IO, plus de script de maintenance. Bref, que du bonheur.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;C'est donc assez confiant qu'il y a quelques jours que nous avons procédé à la mise en production. Mais comme toujours, j'ai eu une mauvaise surprise lors de la migration. Lors de la fin de la bascule de tous nos anciens services sur la nouvelle (environ 900 services), j'ai commencé à voir des messages d'erreurs m'indiquant un time out lors du lancement du script &lt;b&gt;process_perfdata.pl&lt;/b&gt; au bout de 5 secondes. En y regardant de plus près, j'ai constaté que le timeout était fixé par la directive &lt;b&gt;perfdata_timeout=5&lt;/b&gt; et en urgence, j'ai donc fixé le timeout à 30 s.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Une fois ce contournement mis en place, j'ai pu regarder en détail le problème. J'ai notamment constaté que la machine passait énormément de temps à faire ses mises à jour. En rajoutant quelques traces, je me suis rendu compte que le script process_perfdata.pl n'utilisait pas la bibliothéque native perl RRD mais le binaire rrd ! Suite à quelques tests que j'avais pu faire il y a quelques temps sur &lt;a href="http://lesaventuresdeyannigdanslemondeit.blogspot.com/2010/05/test-du-module-rrd-perl.html"&gt;les deux modes de fonctionnement&lt;/a&gt;, j'ai essayé de voir si le problème ne pouvait pas venir de là.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Après un coup d'oeil à la configuration de nagios et je suis tombé sur cette partie :&lt;/div&gt;&lt;pre&gt;define command {&lt;br /&gt;  command_name    process-service-perfdata-file&lt;br /&gt;  command_line    /bin/perl /usr/share/pnp4nagios/libexec/process_perfdata.pl --bulk=/var/nagios/service-perfdata&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;define command {&lt;br /&gt;  command_name    process-host-perfdata-file&lt;br /&gt;  command_line    /bin/perl /usr/share/pnp4nagios/libexec/process_perfdata.pl -d HOSTPERFDATA --bulk=/var/nagios/host-perfdata&lt;br /&gt;}&lt;span class="Apple-style-span"   style="font-family:Georgia, serif;font-size:180%;"&gt;&lt;span class="Apple-style-span"  style=" white-space: normal;font-size:17px;"&gt;&lt;span class="Apple-style-span"   style="font-family:monospace;font-size:100%;"&gt;&lt;span class="Apple-style-span"  style=" white-space: pre;font-size:13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;Rien de bien choquant mais le problème est que sous Solaris la version de RRD venant de sunfreeware s'installe dans /usr/local. Problème, ce dernier est livré avec un binding perl prévu pour la version 5.8.8. Malheureusement, la version installée par défaut (ie dans le répertoire /usr/bin) est une version 5.8.4 et n'est pas en mesure d'utiliser la bibliothéque native perl de RRD.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Bref, j'ai donc changé la version de perl par celle se trouvant dans /usr/local/bin :&lt;/div&gt;&lt;pre&gt;define command {&lt;br /&gt;  command_name    process-service-perfdata-file&lt;br /&gt;  command_line    /usr/local/bin/perl /usr/share/pnp4nagios/libexec/process_perfdata.pl --bulk=/var/nagios/service-perfdata&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;define command {&lt;br /&gt;  command_name    process-host-perfdata-file&lt;br /&gt;  command_line    /usr/local/bin/perl /usr/share/pnp4nagios/libexec/process_perfdata.pl -d HOSTPERFDATA --bulk=/var/nagios/host-perfdata&lt;br /&gt;}&lt;/pre&gt;Un coup d'arrêt relance et après quelques temps, j'ai obtenu une nette diminution au niveau des temps de traitement de perfdata :&lt;br /&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_3icrLvUmzZ4/TCO0AFHuLvI/AAAAAAAAAcs/64_tuZIvqWg/s1600/perfstat_1jour.png"&gt;&lt;img src="http://4.bp.blogspot.com/_3icrLvUmzZ4/TCO0AFHuLvI/AAAAAAAAAcs/64_tuZIvqWg/s320/perfstat_1jour.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5486426684534959858" style="cursor: pointer; width: 320px; height: 151px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Zoom sur la partie basse :&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_3icrLvUmzZ4/TCO0vPyXz7I/AAAAAAAAAc0/ZBBRvgfDzXo/s1600/perfstat_apres.png"&gt;&lt;img src="http://1.bp.blogspot.com/_3icrLvUmzZ4/TCO0vPyXz7I/AAAAAAAAAc0/ZBBRvgfDzXo/s320/perfstat_apres.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5486427494852054962" style="cursor: pointer; width: 320px; height: 151px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;C'est ici qu'on constate tout l'intérêt de l'utilisation de la bibliothéque native RRD : on est passé à des temps de traitement d'environ 30s à des temps de traitement de l'ordre de la seconde.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3536118107392327686-3388153277678657551?l=lesaventuresdeyannigdanslemondeit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lesaventuresdeyannigdanslemondeit.blogspot.com/feeds/3388153277678657551/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3536118107392327686&amp;postID=3388153277678657551' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3536118107392327686/posts/default/3388153277678657551'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3536118107392327686/posts/default/3388153277678657551'/><link rel='alternate' type='text/html' href='http://lesaventuresdeyannigdanslemondeit.blogspot.com/2010/06/probleme-de-performance-avec-pnp4nagios.html' title='Problème de performance avec pnp4nagios sous Solaris'/><author><name>Yannig Perre</name><uri>https://profiles.google.com/104797199411947382593</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-6bgdo630G7s/AAAAAAAAAAI/AAAAAAAAAhc/P4yM7287fOg/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_3icrLvUmzZ4/TCO0AFHuLvI/AAAAAAAAAcs/64_tuZIvqWg/s72-c/perfstat_1jour.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3536118107392327686.post-7449107591579125869</id><published>2010-06-23T10:12:00.000+02:00</published><updated>2010-06-23T10:14:01.717+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WebLogic'/><category scheme='http://www.blogger.com/atom/ns#' term='pnp4nagios'/><category scheme='http://www.blogger.com/atom/ns#' term='snmp'/><category scheme='http://www.blogger.com/atom/ns#' term='nagios'/><title type='text'>Supervision de WebLogic à l'aide de nagios</title><content type='html'>Afin de surveiller la consommation mémoire de nos instances WebLogic, j'ai commencé à écrire un plugin se basant sur le protocole SNMP.&lt;br /&gt;&lt;br /&gt;Pour ceux qui ne le saurait pas, WebLogic est un serveur d'application Java propriétaire.&lt;br /&gt;&lt;br /&gt;Ce besoin de surveillance vient du fait que les serveurs les hébergeants (des Sun V890 avec 40 Go de mémoire) sont sur le point d'arriver à saturation mémoire. Pour cette raison, nous avons donc essayé de savoir quelles instances consommées et à quelle hauteur.&lt;br /&gt;&lt;br /&gt;Il faut dire que nous avons constaté que la mémoire allouée aux JVMs étaient le double de la mémoire physique ! Pour info, la machine héberge une centaine d'instance WebLogic en version 8.1 et Java 1.4. Comme vous vous en doutez, nous avons prévu de faire le ménage dans nos instances. Mais pour ça, il nous faudrait un petit état des lieux, d'où l'écriture d'un script.&lt;br /&gt;&lt;br /&gt;Passons maintenant à l'écriture du script.&lt;br /&gt;&lt;br /&gt;Premier point, il faut se débrouiller pour activer l'agent SNMP au niveau du domaine WebLogic. Nous pourrons ainsi interroger le serveur sans avoir à faire de couteuses interrogations à base de programme en java. Nous allons ensuite nous baser sur l'outil snmpwalk.&lt;br /&gt;&lt;br /&gt;Pour mémoire, une page de référence de la MIB de ce serveur d'application est disponible à l'adresse suivante : http://download.oracle.com/docs/cd/E13222_01/wls/docs90/snmp/index.html&lt;br /&gt;&lt;br /&gt;Commençons tout d'abord par interroger l'agent SNMP WebLogic en ligne de commande :&lt;pre&gt;drayan@robinet:~$ snmpwalk -m ./BEA-WEBLOGIC-MIB.mib -c public -v 1 192.168.0.10:7061 .1.3.6.1.4.1.140.625.180&lt;/pre&gt;La branche &lt;b&gt;.1.3.6.1.4.1.140.625.180&lt;/b&gt; correspond aux informations sur les threads Java actifs. Nous pouvons également interroger la branche &lt;b&gt;.1.3.6.1.4.1.140.625.340.1&lt;/b&gt;&lt;quelquechose&gt; pour récupérer la quantité de mémoire consommée (jvmRuntimeHeapSizeCurrent&lt;heapfree&gt;). A noter que pour connaître les instances présentes dans le domaine WebLogic, je fais appel à la branche &lt;b&gt;1.3.6.1.4.1.140.625.361.1&lt;/b&gt;.&lt;/heapfree&gt;&lt;/quelquechose&gt;&lt;div&gt;&lt;quelquechose&gt;&lt;heapfree&gt;&lt;br /&gt;&lt;/heapfree&gt;&lt;/quelquechose&gt;&lt;/div&gt;&lt;div&gt;&lt;quelquechose&gt;&lt;heapfree&gt;Une fois enrobé tout ceci j'obtiens le script suivant :&lt;span class="Apple-style-span"   style="font-family:monospace;font-size:100%;"&gt;&lt;span class="Apple-style-span"  style=" white-space: pre;font-size:13px;"&gt;&lt;span class="Apple-style-span"   style="font-family:Georgia, serif;font-size:130%;"&gt;&lt;span class="Apple-style-span"  style=" white-space: normal;font-size:16px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;pre&gt;&lt;b&gt;#!/usr/bin/perl&lt;/b&gt;&lt;br /&gt;&lt;b&gt;use&lt;/b&gt; &lt;b&gt;strict&lt;/b&gt;;&lt;br /&gt;&lt;b&gt;use&lt;/b&gt; &lt;span style="color:#000080;"&gt;File::Basename&lt;/span&gt;;&lt;br /&gt;&lt;b&gt;use&lt;/b&gt; &lt;span style="color:#000080;"&gt;Sys::Hostname&lt;/span&gt;;&lt;br /&gt;&lt;b&gt;use&lt;/b&gt; &lt;span style="color:#000080;"&gt;Getopt::Long&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;my&lt;/b&gt; &lt;span style="color:#800000;"&gt;$verbose&lt;/span&gt;      = &lt;span style="color:#0000ff;"&gt;0&lt;/span&gt;;&lt;br /&gt;&lt;b&gt;my&lt;/b&gt; &lt;span style="color:#800000;"&gt;$show_help&lt;/span&gt;    = &lt;span style="color:#0000ff;"&gt;0&lt;/span&gt;;&lt;br /&gt;&lt;b&gt;my&lt;/b&gt; &lt;span style="color:#800000;"&gt;$show_version&lt;/span&gt; = &lt;span style="color:#0000ff;"&gt;0&lt;/span&gt;;&lt;br /&gt;&lt;b&gt;my&lt;/b&gt; &lt;span style="color:#800000;"&gt;$snmp_address&lt;/span&gt; = &lt;span style="color:#0000ff;"&gt;0&lt;/span&gt;;&lt;br /&gt;&lt;b&gt;my&lt;/b&gt; &lt;span style="color:#800000;"&gt;$instance&lt;/span&gt;     = &lt;span style="color:#0000ff;"&gt;0&lt;/span&gt;;&lt;br /&gt;&lt;b&gt;my&lt;/b&gt; &lt;span style="color:#800000;"&gt;$snmp_cmd&lt;/span&gt;     = &lt;b&gt;&lt;span style="color:#008000;"&gt;"&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#dd0000;"&gt;snmpwalk -m &lt;/span&gt;&lt;b&gt;&lt;span style="color:#008000;"&gt;"&lt;/span&gt;&lt;/b&gt;.dirname(&lt;span style="color:#c00000;"&gt;$0&lt;/span&gt;).&lt;b&gt;&lt;span style="color:#008000;"&gt;"&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#dd0000;"&gt;/../share/BEA-WEBLOGIC-MIB.mib&lt;/span&gt;&lt;b&gt;&lt;span style="color:#008000;"&gt;"&lt;/span&gt;&lt;/b&gt;;&lt;br /&gt;&lt;b&gt;my&lt;/b&gt; &lt;span style="color:#800000;"&gt;$show_only&lt;/span&gt;    = &lt;b&gt;&lt;span style="color:#008000;"&gt;"&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#dd0000;"&gt;.*&lt;/span&gt;&lt;b&gt;&lt;span style="color:#008000;"&gt;"&lt;/span&gt;&lt;/b&gt;;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;sub &lt;/b&gt;&lt;span style="color:#000080;"&gt;usage&lt;/span&gt; {&lt;br /&gt;&lt;b&gt;my&lt;/b&gt; (&lt;span style="color:#800000;"&gt;$msg&lt;/span&gt;) = &lt;span style="color:#800000;"&gt;@_&lt;/span&gt;;&lt;br /&gt;&lt;span style="color:#800000;"&gt;$msg&lt;/span&gt; = &lt;b&gt;&lt;span style="color:#008000;"&gt;""&lt;/span&gt;&lt;/b&gt; &lt;b&gt;if&lt;/b&gt;(!&lt;span style="color:#800000;"&gt;$msg&lt;/span&gt;);&lt;br /&gt;&lt;b&gt;my&lt;/b&gt; &lt;span style="color:#800000;"&gt;$name&lt;/span&gt; = basename(&lt;span style="color:#c00000;"&gt;$0&lt;/span&gt;);&lt;br /&gt;&lt;span style="color:#000080;"&gt;print&lt;/span&gt; &lt;b&gt;&lt;span style="color:#008000;"&gt;"&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#dd0000;"&gt;Usage :&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#dd0000;"&gt;  \$ &lt;/span&gt;&lt;span style="color:#800000;"&gt;$name&lt;/span&gt;&lt;span style="color:#dd0000;"&gt; [OPTION]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#dd0000;"&gt;Get runtime information about  WebLogic instance&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#dd0000;"&gt;  -h  --help                   display this help and exit.&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#dd0000;"&gt;      --intance &amp;lt;SRVNAME&amp;gt;[,&amp;lt;&amp;gt;] name of the instances to check.&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#dd0000;"&gt;      --only &amp;lt;REGEXP&amp;gt;          show only instance corresponding to regexp.&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#dd0000;"&gt;      --snmp &amp;lt;HOST[:PORT]&amp;gt;     address (and port) of the snmp server.&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#dd0000;"&gt;  -v  --verbose                verbose.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#dd0000;"&gt;Examples:&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#dd0000;"&gt;  \$ &lt;/span&gt;&lt;span style="color:#800000;"&gt;$name&lt;/span&gt;&lt;span style="color:#dd0000;"&gt; --port 10861 --instance srvback11,srvback12,srvback13,srvback14&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color:#008000;"&gt;"&lt;/span&gt;&lt;/b&gt;.(&lt;span style="color:#800000;"&gt;$msg&lt;/span&gt; ? &lt;b&gt;&lt;span style="color:#008000;"&gt;"&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#ff00ff;"&gt;\n&lt;/span&gt;&lt;b&gt;&lt;span style="color:#008000;"&gt;"&lt;/span&gt;&lt;/b&gt;.&lt;span style="color:#800000;"&gt;$msg&lt;/span&gt;.&lt;b&gt;&lt;span style="color:#008000;"&gt;"&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#ff00ff;"&gt;\n&lt;/span&gt;&lt;b&gt;&lt;span style="color:#008000;"&gt;"&lt;/span&gt;&lt;/b&gt; : &lt;b&gt;&lt;span style="color:#008000;"&gt;""&lt;/span&gt;&lt;/b&gt;)&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;GetOptions(&lt;br /&gt;&lt;b&gt;&lt;span style="color:#008000;"&gt;"&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#dd0000;"&gt;V&lt;/span&gt;&lt;b&gt;&lt;span style="color:#008000;"&gt;"&lt;/span&gt;&lt;/b&gt;          =&amp;gt; \&lt;span style="color:#800000;"&gt;$show_version&lt;/span&gt;,&lt;br /&gt;&lt;b&gt;&lt;span style="color:#008000;"&gt;"&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#dd0000;"&gt;version&lt;/span&gt;&lt;b&gt;&lt;span style="color:#008000;"&gt;"&lt;/span&gt;&lt;/b&gt;    =&amp;gt; \&lt;span style="color:#800000;"&gt;$show_version&lt;/span&gt;,&lt;br /&gt;&lt;b&gt;&lt;span style="color:#008000;"&gt;"&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#dd0000;"&gt;h&lt;/span&gt;&lt;b&gt;&lt;span style="color:#008000;"&gt;"&lt;/span&gt;&lt;/b&gt;          =&amp;gt; \&lt;span style="color:#800000;"&gt;$show_help&lt;/span&gt;,&lt;br /&gt;&lt;b&gt;&lt;span style="color:#008000;"&gt;"&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#dd0000;"&gt;help&lt;/span&gt;&lt;b&gt;&lt;span style="color:#008000;"&gt;"&lt;/span&gt;&lt;/b&gt;       =&amp;gt; \&lt;span style="color:#800000;"&gt;$show_help&lt;/span&gt;,&lt;br /&gt;&lt;b&gt;&lt;span style="color:#008000;"&gt;"&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#dd0000;"&gt;v&lt;/span&gt;&lt;b&gt;&lt;span style="color:#008000;"&gt;"&lt;/span&gt;&lt;/b&gt;          =&amp;gt; \&lt;span style="color:#800000;"&gt;$verbose&lt;/span&gt;,&lt;br /&gt;&lt;b&gt;&lt;span style="color:#008000;"&gt;"&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#dd0000;"&gt;verbose&lt;/span&gt;&lt;b&gt;&lt;span style="color:#008000;"&gt;"&lt;/span&gt;&lt;/b&gt;    =&amp;gt; \&lt;span style="color:#800000;"&gt;$verbose&lt;/span&gt;,&lt;br /&gt;&lt;b&gt;&lt;span style="color:#008000;"&gt;"&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#dd0000;"&gt;snmp=s&lt;/span&gt;&lt;b&gt;&lt;span style="color:#008000;"&gt;"&lt;/span&gt;&lt;/b&gt;     =&amp;gt; \&lt;span style="color:#800000;"&gt;$snmp_address&lt;/span&gt;,&lt;br /&gt;&lt;b&gt;&lt;span style="color:#008000;"&gt;"&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#dd0000;"&gt;instance=s&lt;/span&gt;&lt;b&gt;&lt;span style="color:#008000;"&gt;"&lt;/span&gt;&lt;/b&gt; =&amp;gt; \&lt;span style="color:#800000;"&gt;$instance&lt;/span&gt;,&lt;br /&gt;&lt;b&gt;&lt;span style="color:#008000;"&gt;"&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#dd0000;"&gt;only=s&lt;/span&gt;&lt;b&gt;&lt;span style="color:#008000;"&gt;"&lt;/span&gt;&lt;/b&gt;     =&amp;gt; \&lt;span style="color:#800000;"&gt;$show_only&lt;/span&gt;,&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;&lt;b&gt;if&lt;/b&gt;(&lt;span style="color:#800000;"&gt;$show_help&lt;/span&gt;) { usage(); &lt;span style="color:#000080;"&gt;exit&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;0&lt;/span&gt;); }&lt;br /&gt;&lt;span style="color:#000080;"&gt;die&lt;/span&gt;(&lt;b&gt;&lt;span style="color:#008000;"&gt;"&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#dd0000;"&gt;Please specify snmp address (--snmp host:port)&lt;/span&gt;&lt;b&gt;&lt;span style="color:#008000;"&gt;"&lt;/span&gt;&lt;/b&gt;) &lt;b&gt;if&lt;/b&gt;(!&lt;span style="color:#800000;"&gt;$snmp_address&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&lt;b&gt;if&lt;/b&gt;(!&lt;span style="color:#800000;"&gt;$instance&lt;/span&gt;) {&lt;br /&gt;&lt;b&gt;my&lt;/b&gt;(&lt;span style="color:#800000;"&gt;%instance_name&lt;/span&gt;, &lt;span style="color:#800000;"&gt;%instance_state&lt;/span&gt;) = ((), ());&lt;br /&gt;&lt;b&gt;my&lt;/b&gt; &lt;span style="color:#800000;"&gt;@tmp&lt;/span&gt; = ();&lt;br /&gt;&lt;b&gt;my&lt;/b&gt; (&lt;span style="color:#800000;"&gt;$i&lt;/span&gt;, &lt;span style="color:#800000;"&gt;$j&lt;/span&gt;) = (&lt;span style="color:#0000ff;"&gt;0&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;0&lt;/span&gt;);&lt;br /&gt;&lt;b&gt;foreach&lt;/b&gt;(&lt;b&gt;&lt;span style="color:#008000;"&gt;`&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#800000;"&gt;$snmp_cmd&lt;/span&gt;&lt;span style="color:#dd0000;"&gt; -c public -v 1 &lt;/span&gt;&lt;span style="color:#800000;"&gt;$snmp_address&lt;/span&gt;&lt;span style="color:#dd0000;"&gt; 1.3.6.1.4.1.140.625.361.1 2&amp;gt; /dev/null&lt;/span&gt;&lt;b&gt;&lt;span style="color:#008000;"&gt;`&lt;/span&gt;&lt;/b&gt;) {&lt;br /&gt;&lt;b&gt;if&lt;/b&gt;(&lt;b&gt;&lt;span style="color:#008000;"&gt;/&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#008000;"&gt;BEA-WEBLOGIC-MIB::serverLifeCycleRuntimeName.&lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;*&lt;/span&gt;&lt;span style="color:#008000;"&gt;STRING: "&lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;(&lt;/span&gt;&lt;span style="color:#008080;"&gt;\w&lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;+)&lt;/span&gt;&lt;span style="color:#008000;"&gt;"&lt;/span&gt;&lt;b&gt;&lt;span style="color:#008000;"&gt;/&lt;/span&gt;&lt;/b&gt;) {&lt;br /&gt; &lt;span style="color:#800000;"&gt;$instance_name&lt;/span&gt;{&lt;span style="color:#800000;"&gt;$i&lt;/span&gt;++} = &lt;span style="color:#c00000;"&gt;$1&lt;/span&gt;;&lt;br /&gt;} &lt;b&gt;elsif&lt;/b&gt;(&lt;b&gt;&lt;span style="color:#008000;"&gt;/&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#008000;"&gt;BEA-WEBLOGIC-MIB::serverLifeCycleRuntimeState.&lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;*&lt;/span&gt;&lt;span style="color:#008000;"&gt;STRING: "&lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;(&lt;/span&gt;&lt;span style="color:#008080;"&gt;\w&lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;+)&lt;/span&gt;&lt;span style="color:#008000;"&gt;"&lt;/span&gt;&lt;b&gt;&lt;span style="color:#008000;"&gt;/&lt;/span&gt;&lt;/b&gt;) {&lt;br /&gt; &lt;b&gt;my&lt;/b&gt; &lt;span style="color:#800000;"&gt;$label&lt;/span&gt; = &lt;span style="color:#800000;"&gt;$instance_name&lt;/span&gt;{&lt;span style="color:#800000;"&gt;$j&lt;/span&gt;++};&lt;br /&gt; &lt;span style="color:#800000;"&gt;$instance_state&lt;/span&gt;{&lt;span style="color:#800000;"&gt;$label&lt;/span&gt;} = &lt;span style="color:#c00000;"&gt;$1&lt;/span&gt;;&lt;br /&gt; &lt;b&gt;if&lt;/b&gt;(&lt;span style="color:#c00000;"&gt;$1&lt;/span&gt; =~ &lt;b&gt;&lt;span style="color:#008000;"&gt;/&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#008000;"&gt;RUNNING&lt;/span&gt;&lt;b&gt;&lt;span style="color:#008000;"&gt;/&lt;/span&gt;&lt;/b&gt;) {&lt;br /&gt;   &lt;span style="color:#000080;"&gt;print&lt;/span&gt; &lt;b&gt;&lt;span style="color:#008000;"&gt;"&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#800000;"&gt;$label&lt;/span&gt;&lt;span style="color:#dd0000;"&gt; is RUNNING&lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;\n&lt;/span&gt;&lt;b&gt;&lt;span style="color:#008000;"&gt;"&lt;/span&gt;&lt;/b&gt; &lt;b&gt;if&lt;/b&gt;(&lt;span style="color:#800000;"&gt;$verbose&lt;/span&gt;);&lt;br /&gt;   &lt;span style="color:#000080;"&gt;push&lt;/span&gt;(&lt;span style="color:#800000;"&gt;@tmp&lt;/span&gt;, &lt;span style="color:#800000;"&gt;$label&lt;/span&gt;);&lt;br /&gt; } &lt;b&gt;else&lt;/b&gt; {&lt;br /&gt;   &lt;span style="color:#000080;"&gt;print&lt;/span&gt; &lt;b&gt;&lt;span style="color:#008000;"&gt;"&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#dd0000;"&gt;Ignoring &lt;/span&gt;&lt;span style="color:#800000;"&gt;$label&lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;\n&lt;/span&gt;&lt;b&gt;&lt;span style="color:#008000;"&gt;"&lt;/span&gt;&lt;/b&gt; &lt;b&gt;if&lt;/b&gt;(&lt;span style="color:#800000;"&gt;$verbose&lt;/span&gt;);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;span style="color:#800000;"&gt;$instance&lt;/span&gt; = &lt;span style="color:#000080;"&gt;join&lt;/span&gt;(&lt;b&gt;&lt;span style="color:#008000;"&gt;"&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#dd0000;"&gt;,&lt;/span&gt;&lt;b&gt;&lt;span style="color:#008000;"&gt;"&lt;/span&gt;&lt;/b&gt;, &lt;span style="color:#800000;"&gt;@tmp&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;b&gt;my&lt;/b&gt; &lt;span style="color:#800000;"&gt;$perfdata&lt;/span&gt; = &lt;b&gt;&lt;span style="color:#008000;"&gt;""&lt;/span&gt;&lt;/b&gt;;&lt;br /&gt;&lt;b&gt;foreach&lt;/b&gt; &lt;b&gt;my&lt;/b&gt; &lt;span style="color:#800000;"&gt;$srv&lt;/span&gt;(&lt;span style="color:#000080;"&gt;sort&lt;/span&gt;(&lt;span style="color:#000080;"&gt;split&lt;/span&gt;(&lt;b&gt;&lt;span style="color:#008000;"&gt;/&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#008000;"&gt;,&lt;/span&gt;&lt;b&gt;&lt;span style="color:#008000;"&gt;/&lt;/span&gt;&lt;/b&gt;, &lt;span style="color:#800000;"&gt;$instance&lt;/span&gt;))) {&lt;br /&gt;&lt;b&gt;next&lt;/b&gt; &lt;b&gt;if&lt;/b&gt;(!(&lt;span style="color:#800000;"&gt;$srv&lt;/span&gt; =~ &lt;b&gt;&lt;span style="color:#008000;"&gt;/&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#800000;"&gt;$show_only&lt;/span&gt;&lt;b&gt;&lt;span style="color:#008000;"&gt;/&lt;/span&gt;&lt;/b&gt;));&lt;br /&gt;&lt;b&gt;my&lt;/b&gt; &lt;span style="color:#800000;"&gt;@result&lt;/span&gt; = &lt;b&gt;&lt;span style="color:#008000;"&gt;`&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#800000;"&gt;$snmp_cmd&lt;/span&gt;&lt;span style="color:#dd0000;"&gt; -c public\@&lt;/span&gt;&lt;span style="color:#800000;"&gt;$srv&lt;/span&gt;&lt;span style="color:#dd0000;"&gt; -v 1 &lt;/span&gt;&lt;span style="color:#800000;"&gt;$snmp_address&lt;/span&gt;&lt;span style="color:#dd0000;"&gt; .1.3.6.1.4.1.140.625.340.1 2&amp;gt; /dev/null&lt;/span&gt;&lt;b&gt;&lt;span style="color:#008000;"&gt;`&lt;/span&gt;&lt;/b&gt;;&lt;br /&gt;&lt;b&gt;my&lt;/b&gt;(&lt;span style="color:#800000;"&gt;$label&lt;/span&gt;, &lt;span style="color:#800000;"&gt;$current_max_heap&lt;/span&gt;, &lt;span style="color:#800000;"&gt;$free_heap&lt;/span&gt;);&lt;br /&gt;&lt;b&gt;foreach&lt;/b&gt;(&lt;span style="color:#800000;"&gt;@result&lt;/span&gt;) {&lt;br /&gt;&lt;b&gt;if&lt;/b&gt;(&lt;b&gt;&lt;span style="color:#008000;"&gt;/&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#008000;"&gt;BEA-WEBLOGIC-MIB::jvmRuntimeName.&lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;*&lt;/span&gt;&lt;span style="color:#008000;"&gt;STRING:&lt;/span&gt;&lt;span style="color:#008080;"&gt;\s&lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;+&lt;/span&gt;&lt;span style="color:#008000;"&gt;"&lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;(&lt;/span&gt;&lt;span style="color:#008080;"&gt;\w&lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;+)&lt;/span&gt;&lt;span style="color:#008000;"&gt;"&lt;/span&gt;&lt;b&gt;&lt;span style="color:#008000;"&gt;/&lt;/span&gt;&lt;/b&gt;) { &lt;span style="color:#800000;"&gt;$label&lt;/span&gt; = &lt;span style="color:#c00000;"&gt;$1&lt;/span&gt;; }&lt;br /&gt;&lt;b&gt;elsif&lt;/b&gt;(&lt;b&gt;&lt;span style="color:#008000;"&gt;/&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#008000;"&gt;BEA-WEBLOGIC-MIB::jvmRuntimeHeapFreeCurrent.&lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;*&lt;/span&gt;&lt;span style="color:#008000;"&gt;INTEGER:&lt;/span&gt;&lt;span style="color:#008080;"&gt;\s&lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;+(&lt;/span&gt;&lt;span style="color:#008080;"&gt;\d&lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;+)&lt;/span&gt;&lt;b&gt;&lt;span style="color:#008000;"&gt;/&lt;/span&gt;&lt;/b&gt;) { &lt;span style="color:#800000;"&gt;$free_heap&lt;/span&gt; = &lt;span style="color:#c00000;"&gt;$1&lt;/span&gt;; }&lt;br /&gt;&lt;b&gt;elsif&lt;/b&gt;(&lt;b&gt;&lt;span style="color:#008000;"&gt;/&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#008000;"&gt;BEA-WEBLOGIC-MIB::jvmRuntimeHeapSizeCurrent.&lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;*&lt;/span&gt;&lt;span style="color:#008000;"&gt;INTEGER:&lt;/span&gt;&lt;span style="color:#008080;"&gt;\s&lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;+(&lt;/span&gt;&lt;span style="color:#008080;"&gt;\d&lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;+)&lt;/span&gt;&lt;b&gt;&lt;span style="color:#008000;"&gt;/&lt;/span&gt;&lt;/b&gt;) {&lt;br /&gt; &lt;span style="color:#800000;"&gt;$current_max_heap&lt;/span&gt; = &lt;span style="color:#c00000;"&gt;$1&lt;/span&gt;;&lt;br /&gt; &lt;span style="color:#800000;"&gt;$current_max_heap&lt;/span&gt; = &lt;span style="color:#000080;"&gt;int&lt;/span&gt;(&lt;span style="color:#800000;"&gt;$current_max_heap&lt;/span&gt; / &lt;span style="color:#0000ff;"&gt;1048576&lt;/span&gt; + &lt;span style="color:#800080;"&gt;.5&lt;/span&gt;);&lt;br /&gt; &lt;span style="color:#800000;"&gt;$free_heap&lt;/span&gt;        = &lt;span style="color:#000080;"&gt;int&lt;/span&gt;(&lt;span style="color:#800000;"&gt;$free_heap&lt;/span&gt; / &lt;span style="color:#0000ff;"&gt;1048576&lt;/span&gt; + &lt;span style="color:#800080;"&gt;.5&lt;/span&gt;);&lt;br /&gt; &lt;b&gt;my&lt;/b&gt; &lt;span style="color:#800000;"&gt;$used&lt;/span&gt; = &lt;span style="color:#800000;"&gt;$current_max_heap&lt;/span&gt; - &lt;span style="color:#800000;"&gt;$free_heap&lt;/span&gt;;&lt;br /&gt; &lt;span style="color:#800000;"&gt;$perfdata&lt;/span&gt; .= &lt;b&gt;&lt;span style="color:#008000;"&gt;"&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#dd0000;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;$label&lt;/span&gt;&lt;span style="color:#dd0000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;$used&lt;/span&gt;&lt;span style="color:#dd0000;"&gt;;&lt;/span&gt;&lt;span style="color:#800000;"&gt;$current_max_heap&lt;/span&gt;&lt;span style="color:#dd0000;"&gt;;&lt;/span&gt;&lt;span style="color:#800000;"&gt;$current_max_heap&lt;/span&gt;&lt;span style="color:#dd0000;"&gt;;0;&lt;/span&gt;&lt;span style="color:#800000;"&gt;$current_max_heap&lt;/span&gt;&lt;b&gt;&lt;span style="color:#008000;"&gt;"&lt;/span&gt;&lt;/b&gt;;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#000080;"&gt;print&lt;/span&gt; &lt;b&gt;&lt;span style="color:#008000;"&gt;"&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#dd0000;"&gt;WebLogic memory OK|&lt;/span&gt;&lt;span style="color:#800000;"&gt;$perfdata&lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;\n&lt;/span&gt;&lt;b&gt;&lt;span style="color:#008000;"&gt;"&lt;/span&gt;&lt;/b&gt;;&lt;/pre&gt;On configure notre agent pour accepter un nouveau type de commande :&lt;div&gt;&lt;pre&gt;command[check_weblogic_memory]=/usr/lib/nagios/plugins/check_weblogic --snmp localhost:7061&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;On configure un nouveau service sous Nagios :&lt;/div&gt;&lt;pre&gt;define service {&lt;br /&gt;host_name   machine-weblogic&lt;br /&gt;use    generic-service&lt;br /&gt;service_description  Suivi memoire WebLogic&lt;br /&gt;check_command   check_nrpe!check_weblogic_memory&lt;br /&gt;}&lt;/pre&gt;Et hop ! Au bout de quelques jours, vous obtenez le résultat suivant (en combinaison avec pnp4nagios) :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_3icrLvUmzZ4/TB_Vccm7HyI/AAAAAAAAAck/UesX9zRuSY8/s1600/memoire_java.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 174px;" src="http://2.bp.blogspot.com/_3icrLvUmzZ4/TB_Vccm7HyI/AAAAAAAAAck/UesX9zRuSY8/s320/memoire_java.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5485337555853057826" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/heapfree&gt;&lt;/quelquechose&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3536118107392327686-7449107591579125869?l=lesaventuresdeyannigdanslemondeit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lesaventuresdeyannigdanslemondeit.blogspot.com/feeds/7449107591579125869/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3536118107392327686&amp;postID=7449107591579125869' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3536118107392327686/posts/default/7449107591579125869'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3536118107392327686/posts/default/7449107591579125869'/><link rel='alternate' type='text/html' href='http://lesaventuresdeyannigdanslemondeit.blogspot.com/2010/06/supervision-de-weblogic-laide-de-nagios.html' title='Supervision de WebLogic à l&apos;aide de nagios'/><author><name>Yannig Perre</name><uri>https://profiles.google.com/104797199411947382593</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-6bgdo630G7s/AAAAAAAAAAI/AAAAAAAAAhc/P4yM7287fOg/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_3icrLvUmzZ4/TB_Vccm7HyI/AAAAAAAAAck/UesX9zRuSY8/s72-c/memoire_java.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3536118107392327686.post-7628773485296155397</id><published>2010-05-31T18:29:00.010+02:00</published><updated>2010-06-01T23:26:31.603+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ZFS'/><category scheme='http://www.blogger.com/atom/ns#' term='SDS'/><category scheme='http://www.blogger.com/atom/ns#' term='solaris'/><title type='text'>Recyclage d'une miroir SDS sous ZFS</title><content type='html'>ATTENTION !!! Dans ce qui va suivre, je vais vous expliquer comment mettre en place un pool ZFS. Cette manœuvre supprimera entièrement le contenu de votre ancien FS. Pensez à faire des sauvegardes de vos anciennes données !!!&lt;br /&gt;&lt;br /&gt;Il y a peu de temps, j'ai eu à préparer une machine Solaris (une T5120 pour les plus curieux d'entre vous). A l'origine cette machine n'utilisait que du SDS (un mirroring software livré en standard sous Solaris) en combinaison avec les slices Solaris (l'équivalent des partitions classiques sous Linux). Comme on ne peut faire que 7 slices et que 5 slices étaient déjà pris pour le système et que la machine n'avait que deux disques, je me suis donc trouvé très rapidement bloqué pour la création de nouveaux FS. Auparavant, pour contourner ce problème, nous utilisions le mécanisme de lofs de Solaris (l'équivalent de l'option de montage bind sous Linux). Mais je n'étais pas vraiment enchanté de la situation ...&lt;br /&gt;&lt;br /&gt;J'ai donc décidé de recycler un slice des deux disques qui étaient auparavant alloué à un device SDS afin de le réaffecter à un pool ZFS. En effet, avec ZFS, plus de problème de limitation de slice, de problème de mirroring, de création de FS, etc. Bref quelque chose d'un petit peu plus poussé en terme de fonctionnalité.&lt;br /&gt;&lt;br /&gt;Pour démarrer, nous allons jeter un coup d'oeil au miroir existant avant de le casser. Tout ceci se fait à l'aide de la commande metastat :&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$ metastat d6&lt;br /&gt;d6: Miroir&lt;br /&gt; Sous-miroir 0: d16&lt;br /&gt;   Etat : Ok        &lt;br /&gt; Sous-miroir 1: d26&lt;br /&gt;   Etat : Ok        &lt;br /&gt; Accès : 1&lt;br /&gt; Option de lecture : roundrobin (par défaut)&lt;br /&gt; Option d'écriture : parallel (par défaut)&lt;br /&gt; Taille : 179891328 blocs (85 GB)&lt;br /&gt;&lt;br /&gt;d16: Sous-miroir de d6&lt;br /&gt; Etat : Ok        &lt;br /&gt; Taille : 179891328 blocs (85 GB)&lt;br /&gt; Bande 0 :&lt;br /&gt;     Périphérique     Bloc de débu Base          Etat Redis Tranche dynamique&lt;br /&gt;     c1t0d0s6                0     Non             Ok   Oui&lt;br /&gt;[...]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Nous avons donc un device d6 constitué de deux sous-miroirs d16 et d26 eux-même étant les slices 6 des disques c1t0d0 et c1t1d0 (soit respectivement les slices c1t0d0s6 et c1t1d0s6). Nous allons donc supprimer tout ceci à l'aide de la commande metaclear :&lt;br /&gt;- suppression du mirroir : &lt;pre&gt;metaclear d6&lt;/pre&gt;- puis suppression des sous-mirroirs : &lt;pre&gt;metaclear d16&lt;/pre&gt; et &lt;pre&gt;metaclear d26&lt;/pre&gt;Maintenant que nous avons deux slices de disponible, nous allons les allouer à un pool ZFS en mirroir que l'on appellera &lt;span style="font-weight:bold;"&gt;zfs_pool&lt;/span&gt; :&lt;br /&gt;&lt;pre&gt;$ zpool create -f zfs_pool mirror c1t0d0s6 c1t1d0s6&lt;/pre&gt;NB : ne pas oublier l'option '-f'. Dans notre cas, comme les devices étaient anciennement utilisé en tant que partition ufs, zpool refuse de créer le pool zfs avec le message suivant :&lt;pre&gt;$ zpool create zfs_pool mirror c1t0d0s6 c1t1d0s6&lt;br /&gt;spécification vdev incorrecte&lt;br /&gt;utilisez '-f' pour ignorer les erreurs suivantes :&lt;br /&gt;/dev/dsk/c1t0d0s6 contient un système de fichiers ufs.&lt;/pre&gt;Et voilà ! Notre pool ZFS est prêt !&lt;br /&gt;&lt;br /&gt;Tentons maintenant de créer un FS :&lt;br /&gt;&lt;pre&gt;$ zfs create -o mountpoint=/data zfs_pool/data&lt;/pre&gt;Et voilà ! Le FS est monté, formaté et prêt à l'emploi. A remarquer que par défaut, il n'y a aucune limitation dans l'utilisation du FS et qu'il est possible d'utiliser tout l'espace du pool. Bien sûr, il est possible de limiter l'utilisation à l'aide de l'option quota. Ceci peut se faire avec la commande zfs set :&lt;span class="Apple-style-span"   style="font-family:monospace;font-size:100%;"&gt;&lt;span class="Apple-style-span"  style=" white-space: pre;font-size:13px;"&gt;&lt;span class="Apple-style-span"   style="font-family:Georgia, serif;font-size:130%;"&gt;&lt;span class="Apple-style-span"  style=" white-space: normal;font-size:16px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;pre&gt;$ zfs set -o quota=10G zfs_pool/data&lt;/pre&gt;Vérifions le résultat :&lt;pre&gt;$ df -h /data&lt;br /&gt;Filesystem             size   used  avail capacity  Mounted on&lt;br /&gt;zfs_pool/data           10G     8K    10G     1%    /data&lt;/pre&gt;Et voilà, je pense que ça sera tout pour aujourd'hui.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3536118107392327686-7628773485296155397?l=lesaventuresdeyannigdanslemondeit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lesaventuresdeyannigdanslemondeit.blogspot.com/feeds/7628773485296155397/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3536118107392327686&amp;postID=7628773485296155397' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3536118107392327686/posts/default/7628773485296155397'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3536118107392327686/posts/default/7628773485296155397'/><link rel='alternate' type='text/html' href='http://lesaventuresdeyannigdanslemondeit.blogspot.com/2010/05/recyclage-dune-miroir-sds-sous-zfs.html' title='Recyclage d&apos;une miroir SDS sous ZFS'/><author><name>Yannig Perre</name><uri>https://profiles.google.com/104797199411947382593</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-6bgdo630G7s/AAAAAAAAAAI/AAAAAAAAAhc/P4yM7287fOg/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3536118107392327686.post-8094213541633888074</id><published>2010-05-27T18:52:00.005+02:00</published><updated>2010-05-27T19:05:28.462+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='nrpe'/><category scheme='http://www.blogger.com/atom/ns#' term='nagios'/><title type='text'>Problème de buffer nrpe</title><content type='html'>Cet après-midi, j'ai commencé à mettre en place une surveillance de tablespace sur Oracle. Petit soucis, j'ai dépassé sans trop m'apercevoir la limite du buffer de nrpe (1024 pour un résultat).&lt;br /&gt;&lt;br /&gt;Autre petit problème, il est impossible de modifier la taille du buffer sans avoir à recompiler la commande check_nrpe et - petit bonus - le client check_nrpe obtenu est incompatible avec les anciens démons NRPE.&lt;br /&gt;&lt;br /&gt;Donc, retour à l'ancienne version et du coup, j'ai modifié ma commande de surveillance pour faire mes stats en deux fois :).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3536118107392327686-8094213541633888074?l=lesaventuresdeyannigdanslemondeit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lesaventuresdeyannigdanslemondeit.blogspot.com/feeds/8094213541633888074/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3536118107392327686&amp;postID=8094213541633888074' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3536118107392327686/posts/default/8094213541633888074'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3536118107392327686/posts/default/8094213541633888074'/><link rel='alternate' type='text/html' href='http://lesaventuresdeyannigdanslemondeit.blogspot.com/2010/05/probleme-de-buffer-nrpe.html' title='Problème de buffer nrpe'/><author><name>Yannig Perre</name><uri>https://profiles.google.com/104797199411947382593</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-6bgdo630G7s/AAAAAAAAAAI/AAAAAAAAAhc/P4yM7287fOg/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3536118107392327686.post-5420410928021717851</id><published>2010-05-20T22:01:00.009+02:00</published><updated>2010-05-27T19:08:17.379+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='grub'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='debian'/><category scheme='http://www.blogger.com/atom/ns#' term='ipmi'/><title type='text'>Connexion via ipmi sur un serveur</title><content type='html'>Je suis plutôt habitué au console Solaris mais il se trouve que récemment, j'ai eu l'occasion de bosser sur une console ipmi. Le principe est le même, à savoir une console texte accessible via le réseau.&lt;br /&gt;&lt;br /&gt;Comment est-ce qu'on arrive à s'intéresser à ce genre de problème allez vous me demander ? Et bien simplement, j'ai eu besoin de modifier les paramètres du BIOS sur une machine d'un client qui se trouve chez un hébergeur. Et il est vrai que sans accès physique à la machine, on se trouve bien bête :).&lt;br /&gt;&lt;br /&gt;Assez parlé, commençons l'activation de l'ipmi sur notre serveur. Il nous faut tout d'abord installer ipmitool :&lt;span class="Apple-style-span"   style="font-family:monospace;font-size:100%;"&gt;&lt;span class="Apple-style-span"  style=" white-space: pre;font-size:13px;"&gt;&lt;span class="Apple-style-span"   style="font-family:Georgia, serif;font-size:130%;"&gt;&lt;span class="Apple-style-span"  style=" white-space: normal;font-size:16px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;pre&gt;# apt-get install ipmitool&lt;/pre&gt;Nous allons maintenant charger le module kernel ipmi :&lt;span class="Apple-style-span"   style="font-family:monospace;font-size:100%;"&gt;&lt;span class="Apple-style-span"  style=" white-space: pre;font-size:13px;"&gt;&lt;span class="Apple-style-span"   style="font-family:Georgia, serif;font-size:130%;"&gt;&lt;span class="Apple-style-span"  style=" white-space: normal;font-size:16px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;pre&gt;# modprobe ipmi_si&lt;br /&gt;# modprobe ipmi_devintf&lt;br /&gt;# lsmod | grep ipmi&lt;br /&gt;ipmi_devintf           13200  0&lt;br /&gt;ipmi_si                43628  0&lt;br /&gt;ipmi_msghandler        38520  2 ipmi_devintf,ipmi_si&lt;/pre&gt;Tout semble bon. Ajoutons maintenant le module au redémarrage :&lt;span class="Apple-style-span"   style="font-family:monospace;font-size:100%;"&gt;&lt;span class="Apple-style-span"  style=" white-space: pre;font-size:13px;"&gt;&lt;span class="Apple-style-span"   style="font-family:Georgia, serif;font-size:130%;"&gt;&lt;span class="Apple-style-span"  style=" white-space: normal;font-size:16px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;pre&gt;# echo "ipmi_devintf" &gt;&gt; /etc/modules&lt;br /&gt;# echo "ipmi_si" &gt;&gt; /etc/modules&lt;/pre&gt;Nous allons maintenant définir un utilisateur qui puisse se connecter à la console (nous utilisons ici l'id 8 pour l'utilisateur operator du fait que la société qui nous héberge utilise déjà les 7 premiers identifiants pour ses propres besoins)  :&lt;pre&gt;# ipmitool -U root user set name 8 operator&lt;br /&gt;# ipmitool -U root user set password 8 operatorpass&lt;br /&gt;# ipmitool -U root user enable 8&lt;/pre&gt;Nous allons maintenant essayer de nous connecter à la console :&lt;span class="Apple-style-span"   style="font-family:monospace;font-size:100%;"&gt;&lt;span class="Apple-style-span"  style=" white-space: pre;font-size:13px;"&gt;&lt;span class="Apple-style-span"   style="font-family:Georgia, serif;font-size:130%;"&gt;&lt;span class="Apple-style-span"  style=" white-space: normal;font-size:16px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;pre&gt;ipmitool -I lanplus  -U operator -P operatorpass -H 10.10.10.10 sol activate&lt;/pre&gt;Malheureusement, nous allons nous retrouver bloquer puisque personne n'écoute. Néanmoins, si nous rebootons notre serveur, il nous permettra d'accéder au bios (le but de ce billet !). Un rapide coup de F2 au redémarrage et nous voyons apparaître l'écran suivant :&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_3icrLvUmzZ4/S_WZclkBHhI/AAAAAAAAAWQ/xfZhmhRnIPw/s1600/bios_au_travers_de_ipmi.png"&gt;&lt;img src="http://3.bp.blogspot.com/_3icrLvUmzZ4/S_WZclkBHhI/AAAAAAAAAWQ/xfZhmhRnIPw/s320/bios_au_travers_de_ipmi.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5473449638537272850" style="cursor: pointer; width: 320px; height: 202px; " /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_3icrLvUmzZ4/S_WYz-YCOvI/AAAAAAAAAWI/Ha3z6w2F_Vs/s1600/bios_au_travers_de_ipmi.png"&gt;&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;Activons ensuite le support Intel de virtualisation :&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://2.bp.blogspot.com/_3icrLvUmzZ4/S_WZkl1s9eI/AAAAAAAAAWY/YMhrC9gQ4rU/s1600/activation_kvm.png"&gt;&lt;img src="http://2.bp.blogspot.com/_3icrLvUmzZ4/S_WZkl1s9eI/AAAAAAAAAWY/YMhrC9gQ4rU/s320/activation_kvm.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5473449776050402786" style="cursor: pointer; width: 320px; height: 203px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Il faudra ensuite arrêter électriquement la machine et la redémarrer à l'aide de l'interface Web de l'hébergeur.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Notre mission est terminée mais pourquoi s'arrêter en si bon chemin ? Nous allons ajouter la gestion de grub ainsi que celle de la console de Linux.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Pour la gestion de la console dans grub, il faut rajouter les lignes suivantes dans le fichier &lt;b&gt;/boot/grub/menu.lst&lt;/b&gt; :&lt;pre&gt;serial --unit=0 --speed=9600 --word=8 --parity=no --stop=1&lt;br /&gt;terminal --timeout=15 serial console&lt;/pre&gt;Et ensuite mettre à jour grub :&lt;span class="Apple-style-span"   style="font-family:monospace;font-size:100%;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; white-space: pre;"&gt;&lt;span class="Apple-style-span"   style="font-family:Georgia, serif;font-size:130%;"&gt;&lt;span class="Apple-style-span" style="font-size: 16px; white-space: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;pre&gt;grub-install /dev/sda&lt;/pre&gt;Enfin, ajoutons le support du port série sur le kernel linux. Il faut pour cela ajouter &lt;b&gt;console=tty0 console=ttyS0,9600n8&lt;/b&gt; dans la ligne de démarrage du kernel. Exemple :&lt;span class="Apple-style-span"   style="font-family:monospace;font-size:100%;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; white-space: pre;"&gt;&lt;span class="Apple-style-span"   style="font-family:Georgia, serif;font-size:130%;"&gt;&lt;span class="Apple-style-span" style="font-size: 16px; white-space: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;pre&gt;kernel          /vmlinuz-2.6.26-2-amd64 root=/dev/md1 ro quiet console=tty0 console=ttyS0,9600n8&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3536118107392327686-5420410928021717851?l=lesaventuresdeyannigdanslemondeit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lesaventuresdeyannigdanslemondeit.blogspot.com/feeds/5420410928021717851/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3536118107392327686&amp;postID=5420410928021717851' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3536118107392327686/posts/default/5420410928021717851'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3536118107392327686/posts/default/5420410928021717851'/><link rel='alternate' type='text/html' href='http://lesaventuresdeyannigdanslemondeit.blogspot.com/2010/05/connexion-via-ipmi-sur-un-serveur.html' title='Connexion via ipmi sur un serveur'/><author><name>Yannig Perre</name><uri>https://profiles.google.com/104797199411947382593</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-6bgdo630G7s/AAAAAAAAAAI/AAAAAAAAAhc/P4yM7287fOg/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_3icrLvUmzZ4/S_WZclkBHhI/AAAAAAAAAWQ/xfZhmhRnIPw/s72-c/bios_au_travers_de_ipmi.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3536118107392327686.post-8756009461427335794</id><published>2010-05-19T21:01:00.009+02:00</published><updated>2010-05-27T19:08:36.664+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pnp4nagios'/><category scheme='http://www.blogger.com/atom/ns#' term='nagios'/><title type='text'>Multiple vs single datasource sous pnp4nagios</title><content type='html'>Voici maintenant quelques temps que nous utilisons pnp4nagios et je n'avais - jusqu'à maintenant - pas eu à me plaindre de ce produit plus que ça. Malheureusement, aujourd'hui, je suis tombé sur un os : la gestion des données de performances changeante. Dit comme ça, ça peut ne pas sembler complètement évident mais vous allez très vite comprendre que ça peut devenir embêtant ...&lt;br /&gt;&lt;br /&gt;Sous nagios, les données de performances (ce qu'on retrouve après le '|' sous la forme param1=i;warn-i;crit-i;min-i;max-i param2=j) est en principe tout le temps identique. Malheureusement, vous l'aurez deviné, les choses ne sont pas toujours simple et vous pouvez rencontrer des commandes qui à un moment vous donnez un certain résultat et qui le moment d'après vous sorte un résultat d'une autre forme. Ce type de désagrément arrive dans les cas suivants :&lt;br /&gt;- changement du comportement d'un script&lt;br /&gt;- changement des indicateurs surveillés (comme dans check_disk par exemple).&lt;br /&gt;&lt;br /&gt;Dans ce cas, pnp4nagios perd un peu la boule et du coup, remplace des séries de données par d'autre et plus embêtant, fait un mélange in fine entre les différentes séries. Ce petit désagrément m'est arrivé cet après-midi et j'ai donc regarder un peu si j'étais la seule personne a qui c'était arrivé. Donc en épluchant la documentation, j'ai compris qu'il s'agissait de l'utilisation des datasources de type SINGLE vs MULTIPLE sous RRD. Plus simplement, dans le cas d'un RRD SINGLE (par défaut), toutes les données sont stockées dans un seul fichier. Très pratique pour réduire le bazard dans un répertoire. En revanche, dès que mes sources changent, c'est l'anarchie. L'autre option MULTIPLE quand à elle va créer un datasource par source de données.&lt;br /&gt;&lt;br /&gt;C'est bien beau vous allez me dire mais qu'est ce que je fais du coup de mes 6 mois d'historique ? Et bien là, mauvaise nouvelle pour l'instant, il faudra restaurer le fichier avant le changement de datasource ... Ensuite, le script rrd_convert.pl est là pour faire le découpage des fichiers et - cerise sur le gateau - positionner un fichier de configuration dans le répertoire &lt;span style="font-weight:bold;"&gt;etc/check_commands&lt;/span&gt; de pnp4nagios afin de préciser au script process_perfdata.pl de ne plus utiliser un datasource &lt;span style="font-weight:bold;"&gt;SINGLE&lt;/span&gt; mais &lt;span style="font-weight:bold;"&gt;MULTIPLE&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Ci-dessous, quelques exemples de l'utilisation de cette commande :&lt;br /&gt;- Consultation des commandes disponibles :&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$ /usr/share/pnp4nagios/libexec/rrd_convert.pl --list_commands&lt;br /&gt;XML Files analyzed                       14&lt;br /&gt;XML Files found                          0&lt;br /&gt;Old XML Files ignored                    1&lt;br /&gt;Number of unique check_commands          7&lt;br /&gt;\ List of Check Commands&lt;br /&gt; |- check-host-alive                         7&lt;br /&gt; |-                                          2&lt;br /&gt; |- check_ping                               1&lt;br /&gt; |- check_load                               1&lt;br /&gt; |- check_all_disks                          1&lt;br /&gt; |- check_users                              1&lt;br /&gt; |- check_http                               1&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;- Etat des indicateurs sur mon nagios de test avant conversion :&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$ ls -ltr Current_Load.*&lt;br /&gt;total 6084&lt;br /&gt;-rw-rw-r-- 1 nagios nagios 1151496 2010-05-19 20:46 Current_Load.rrd&lt;br /&gt;-rw-rw-r-- 1 nagios nagios   12872 2010-05-19 20:46 Current_Load.xml&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;- Lancement de la conversion :&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$ /usr/share/pnp4nagios/libexec/rrd_convert.pl --check_command=check_load&lt;br /&gt;&lt;br /&gt;Search pattern                           check_load&lt;br /&gt;XML Files analyzed                       14&lt;br /&gt;XML Files found                          1&lt;br /&gt;Old XML Files ignored                    1&lt;br /&gt;Number of unique check_commands          7&lt;br /&gt;Start Converter [n|Y]?:Y&lt;br /&gt;&lt;br /&gt;Config for command check_load created (/usr/share/pnp4nagios/etc//check_commands/check_load.cfg)&lt;br /&gt;File 1/1&lt;br /&gt;RRDtool dump to /tmp/rrd_convert/localhost-Current_Load.dump&lt;br /&gt;Manipulating /tmp/rrd_convert/localhost-Current_Load.dump&lt;br /&gt;............ done 48166 lines&lt;br /&gt;Restoring File&lt;br /&gt;/var/spool/pnp4nagios/perfdata/localhost/Current_Load_load1.rrd&lt;br /&gt;/var/spool/pnp4nagios/perfdata/localhost/Current_Load_load15.rrd&lt;br /&gt;/var/spool/pnp4nagios/perfdata/localhost/Current_Load_load5.rrd&lt;br /&gt;... done&lt;br /&gt;DONE&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; \Statistics:&lt;br /&gt; |- runtime         3.048887&lt;br /&gt; |- rrd_out         3&lt;br /&gt; |- old_xml         1&lt;br /&gt; |- rrd_in          1&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;- Etat après la conversion :&lt;br /&gt;$ ls -ltr Current_Load*&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;-rw-rw-r-- 1 nagios nagios 1151496 2010-05-19 20:51 Current_Load.rrd&lt;br /&gt;-rw-rw-r-- 1 nagios nagios   12840 2010-05-19 21:21 Current_Load.xml&lt;br /&gt;-rw-r--r-- 1 nagios nagios  384952 2010-05-19 21:21 Current_Load_load5.rrd&lt;br /&gt;-rw-r--r-- 1 nagios nagios  384952 2010-05-19 21:21 Current_Load_load1.rrd&lt;br /&gt;-rw-r--r-- 1 nagios nagios  384952 2010-05-19 21:21 Current_Load_load15.rrd&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Le fichier Current_Load.rrd existe toujours, mais au vu de la date du fichier, il n'est plus alimenté. Nous pouvons également jeter un coup d'oeil dans le répertoire etc/check_commands de pnp4nagios :&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$ more /usr/share/pnp4nagios/etc/check_commands/check_load.cfg &lt;br /&gt;# Generated by rrd_convert.pl 0.6.3&lt;br /&gt;RRD_STORAGE_TYPE = MULTIPLE&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Comme nous pouvons le voir, l'outil rrd_convert.pl a bien créé un fichier pour la commande check_load afin de lui indiquer que le type de stockage étant maintenant MULTIPLE.&lt;br /&gt;&lt;br /&gt;Demain, nous testerons ça sur des vrais données de recette !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3536118107392327686-8756009461427335794?l=lesaventuresdeyannigdanslemondeit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lesaventuresdeyannigdanslemondeit.blogspot.com/feeds/8756009461427335794/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3536118107392327686&amp;postID=8756009461427335794' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3536118107392327686/posts/default/8756009461427335794'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3536118107392327686/posts/default/8756009461427335794'/><link rel='alternate' type='text/html' href='http://lesaventuresdeyannigdanslemondeit.blogspot.com/2010/05/multiple-vs-single-datasource-sous.html' title='Multiple vs single datasource sous pnp4nagios'/><author><name>Yannig Perre</name><uri>https://profiles.google.com/104797199411947382593</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-6bgdo630G7s/AAAAAAAAAAI/AAAAAAAAAhc/P4yM7287fOg/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3536118107392327686.post-928716430104347533</id><published>2010-05-15T16:05:00.009+02:00</published><updated>2010-05-27T19:08:53.673+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ndoutils'/><category scheme='http://www.blogger.com/atom/ns#' term='pnp4nagios'/><category scheme='http://www.blogger.com/atom/ns#' term='nagios'/><title type='text'>Personnalisation de PNP4Nagios : écriture d'un template</title><content type='html'>L'import de mon historique ndoutils sous pnp4nagios s'est bien passé et j'ai maintenant quelques courbes avec lesquels je peux m'amuser. J'ai notamment personnalisé l'aspect des courbes CPU afin d'y faire apparaître une tendance sur une certaine période. Pour info, j'ai mis à disposition le plugin à l'emplacement suivant : http://docs.pnp4nagios.org/templates/check_cpu&lt;br /&gt;&lt;br /&gt;Nous allons voir ensemble comment fonctionne la création de template pour pnp4nagios. Pour cela, il suffit de se rendre dans le répertoire de pnp4nagios dans le sous-répertoire share/templates. De là, on va créer un nouveau fichier et nous allons commencer à personnaliser l'aspect de nos graphiques (ici check_cpu.php).&lt;br /&gt;&lt;br /&gt;Ce qu'il faut savoir avant de commencer est que l'interface pnp4nagios génère des fichiers PNG à l'aide des RRDTools. Notre template est donc en réalité un petit programme en PHP qui initialisera les valeurs envoyé au programme RRDTool.&lt;br /&gt;&lt;br /&gt;Commençons tout d'abord par changer le titre de notre graphique :&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#&lt;br /&gt;# Copyright (c)  2010 Yannig Perre&lt;br /&gt;# Plugin: check_cpu&lt;br /&gt;#&lt;br /&gt;$ds_name[1] = "Activité CPU";&lt;br /&gt;&lt;br /&gt;$opt[1] = "--vertical-label CPU -l0  --title \"Activité CPU sur $hostname\" ";&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Nous allons maintenant définir les périodes pendant lesquelles nous allons dessiner une tendance :&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$trend_array = array(&lt;br /&gt;  "one_month"    =&gt; array(strtotime("-1 month", $this-&gt;TIMERANGE['end']), $this-&gt;TIMERANGE['end'], "Tendance sur 1 mois:dashes=10", "#FF007F", "LINE3"),&lt;br /&gt;  "global_trend" =&gt; array($this-&gt;TIMERANGE['start'], $this-&gt;TIMERANGE['end'], "Tendance globale:dashes=20", "#707070", "LINE2"),&lt;br /&gt;);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Ci-dessous, nous définissons simplement les sources de notre graphique.&lt;br /&gt;&lt;br /&gt;NB : Nous allons cumuler les valeurs des sources afin d'obtenir un graphique sous forme d'aire (io en haut du graphique, user puis consommation système). Pour se faire nous utilisons la notion de CDEF des outils RRDs : &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$def[1] =  "DEF:var1=$RRDFILE[1]:$DS[1]:AVERAGE " ;&lt;br /&gt;$def[1] .= "DEF:var2=$RRDFILE[2]:$DS[2]:AVERAGE " ;&lt;br /&gt;$def[1] .= "CDEF:user=var2,var1,+ " ;&lt;br /&gt;$def[1] .= "DEF:var3=$RRDFILE[3]:$DS[3]:AVERAGE " ;&lt;br /&gt;$def[1] .= "CDEF:io=var3,var2,+,var1,+ " ;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Une fois nos sources redéfinies, nous allons maintenant définir nos tendances en fonction du tableau $trend_array que nous avons définit précédemment :&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$trend_elements = "";&lt;br /&gt;&lt;br /&gt;foreach(array_keys($trend_array) as $trend) {&lt;br /&gt;  $def[1] .= "DEF:var1$trend=$RRDFILE[1]:$DS[1]:AVERAGE:start=".$trend_array[$trend][0]." ";&lt;br /&gt;  $def[1] .= "DEF:var2$trend=$RRDFILE[2]:$DS[2]:AVERAGE:start=".$trend_array[$trend][0]." ";&lt;br /&gt;  $def[1] .= "CDEF:user$trend=var2$trend,var1$trend,+ " ;&lt;br /&gt;&lt;br /&gt;  $def[1] .= "VDEF:dtrend$trend=user$trend,LSLSLOPE ";&lt;br /&gt;  $def[1] .= "VDEF:htrend$trend=user$trend,LSLINT ";&lt;br /&gt;  $def[1] .= "CDEF:curve_user$trend=user$trend,POP,dtrend$trend,COUNT,*,htrend$trend,+ ";&lt;br /&gt;  $trend_elements .= $trend_array[$trend][4].":curve_user$trend".$trend_array[$trend][3].":\"".$trend_array[$trend][2]."\" " ;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Ici, on rajoute les valeurs de warning et critical si présente :&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;if ($WARN[1] != "") {&lt;br /&gt;    $def[1] .= "HRULE:$WARN[1]#FFFF00 ";&lt;br /&gt;}&lt;br /&gt;if ($CRIT[1] != "") {&lt;br /&gt;    $def[1] .= "HRULE:$CRIT[1]#FF0000 ";       &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Enfin, nous allons dire aux RRD tools de dessiner 3 graphiques d'aire : les io en premier (en vert), la consommation user en bleu et enfin la consommation système en dernier. A noter que nous ajoutons des lignes noirs pour mieux définir les 3 aires.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$def[1] .= "AREA:io#00FF00:\"iowait\" " ;&lt;br /&gt;$def[1] .= "GPRINT:var3:LAST:\"%6.2lf\" " ;&lt;br /&gt;$def[1] .= "GPRINT:var3:AVERAGE:\"moy %6.2lf\" " ;&lt;br /&gt;$def[1] .= "GPRINT:var3:MAX:\"max %6.2lf\\n\" " ;&lt;br /&gt;$def[1] .= "AREA:user#005CFF:\"user  \" " ;&lt;br /&gt;$def[1] .= "GPRINT:var1:LAST:\"%6.2lf\" " ;&lt;br /&gt;$def[1] .= "GPRINT:var1:AVERAGE:\"moy %6.2lf\" " ;&lt;br /&gt;$def[1] .= "GPRINT:var1:MAX:\"max %6.2lf\\n\" ";&lt;br /&gt;$def[1] .= "AREA:var2#FF5C00:\"sys   \" " ;&lt;br /&gt;$def[1] .= "GPRINT:var2:LAST:\"%6.2lf\" " ;&lt;br /&gt;$def[1] .= "GPRINT:var2:AVERAGE:\"moy %6.2lf\" " ;&lt;br /&gt;$def[1] .= "GPRINT:var2:MAX:\"max %6.2lf\\n\" " ;&lt;br /&gt;$def[1] .= "LINE1:io#000000:\"\" " ;&lt;br /&gt;$def[1] .= "LINE1:user#000000:\"\" " ;&lt;br /&gt;$def[1] .= "LINE1:var2#000000:\"\" " ;&lt;br /&gt;$def[1] .= $trend_elements;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Voici notre fichier template terminée, il ne nous reste plus qu'à consulter le résultat sur l'interface PNP. Voici ce que j'obtiens par exemple après quelques petits réglages au niveau de la tendance sur une de mes machines sur 6 mois d'historique :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_3icrLvUmzZ4/S-6tndU4wuI/AAAAAAAAAU8/ItHF-RT5nQc/s1600/Exemple+activitee+CPU+sur+6+mois.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 209px;" src="http://2.bp.blogspot.com/_3icrLvUmzZ4/S-6tndU4wuI/AAAAAAAAAU8/ItHF-RT5nQc/s320/Exemple+activitee+CPU+sur+6+mois.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5471501490700468962" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3536118107392327686-928716430104347533?l=lesaventuresdeyannigdanslemondeit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lesaventuresdeyannigdanslemondeit.blogspot.com/feeds/928716430104347533/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3536118107392327686&amp;postID=928716430104347533' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3536118107392327686/posts/default/928716430104347533'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3536118107392327686/posts/default/928716430104347533'/><link rel='alternate' type='text/html' href='http://lesaventuresdeyannigdanslemondeit.blogspot.com/2010/05/personnalisation-de-pnp4nagios-ecriture.html' title='Personnalisation de PNP4Nagios : écriture d&apos;un template'/><author><name>Yannig Perre</name><uri>https://profiles.google.com/104797199411947382593</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-6bgdo630G7s/AAAAAAAAAAI/AAAAAAAAAhc/P4yM7287fOg/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_3icrLvUmzZ4/S-6tndU4wuI/AAAAAAAAAU8/ItHF-RT5nQc/s72-c/Exemple+activitee+CPU+sur+6+mois.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3536118107392327686.post-5354462156505818200</id><published>2010-05-12T23:14:00.010+02:00</published><updated>2010-05-27T19:09:09.332+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='nrpe'/><category scheme='http://www.blogger.com/atom/ns#' term='compilation'/><category scheme='http://www.blogger.com/atom/ns#' term='solaris'/><category scheme='http://www.blogger.com/atom/ns#' term='nagios'/><title type='text'>Compilation NRPE et génération d'un binaire statique sous Solaris 8 ou 10</title><content type='html'>On va pas aller jusqu'à dire qu'en ce moment Nagios soit toute ma vie mais en tout cas, au taff, ça occupe pas mal mes journées. Donc, je vais essayer de sortir les astuces que j'ai pu utiliser pour arriver à compiler NRPE et les plugins de surveillance standard.&lt;br /&gt;&lt;br /&gt;Donc, pour la compilation, récupérer le source de NRPE, le décompresser et commencer par modifier le fichier &lt;span style="font-weight:bold;"&gt;src/nrpe.c&lt;/span&gt; de la manière suivante :&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;617c617&lt;br /&gt;&lt;               log_facility=LOG_AUTHPRIV;&lt;br /&gt;---&lt;br /&gt;&gt;               log_facility=LOG_AUTH;&lt;br /&gt;619c619&lt;br /&gt;&lt;               log_facility=LOG_FTP;&lt;br /&gt;---&lt;br /&gt;&gt;               log_facility=LOG_DAEMON;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Une fois la modification terminée, il nous faut maintenant lancer &lt;span style="font-weight:bold;"&gt;configure&lt;/span&gt; avec les options suivantes :&lt;br /&gt;&lt;br /&gt; ./configure --prefix=/path/to/nagios --with-ssl=/usr/local/ssl/lib&lt;br /&gt;&lt;br /&gt;NB : Ici il faut s'assurer d'avoir télécharger un compilateur GCC et OpenSSL depuis le site www.sunfreeware.com.&lt;br /&gt;&lt;br /&gt;Lancez ensuite la compilation. En principe, vous devriez obtenir un nrpe fonctionnel mais lié aux librairies situées dans /usr/local/lib et autant vous dire, vous n'aurez jamais cette librairie présente sur vos machines Solaris.&lt;br /&gt;&lt;br /&gt;Pour cette raison, nous allons donc générer un binaire statique pour ne plus avoir de dépendance sur openssl. Pour se faire, se rendre dans le répertoire src et relancer manuellement la compilation de nrpe avec la commande suivante :&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;gcc -g -O2 -I/usr/local/ssl/include/openssl -I/usr/local/ssl/include -DHAVE_CONFIG_H -o nrpe-static \&lt;br /&gt;  nrpe.c utils.c -lsocket -L/usr/local/ssl/lib  /usr/local/ssl/lib/libssl.a /usr/local/ssl/lib/libcrypto.a \&lt;br /&gt;  -lnsl -lsocket  ./snprintf.o&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Pour info, voici le résultat sous Solaris 10 :&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$ ls -l nrpe nrpe-static&lt;br /&gt;-rwxr-xr-x   1 root     root      118888 mars 19 14:42 nrpe&lt;br /&gt;-rwxr-xr-x   1 root     root     1349532 mars 19 14:41 nrpe-static&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Le binaire est maintenant parfaitement fonctionnel. Il ne vous reste plus qu'à le déployer sur vos machines.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3536118107392327686-5354462156505818200?l=lesaventuresdeyannigdanslemondeit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lesaventuresdeyannigdanslemondeit.blogspot.com/feeds/5354462156505818200/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3536118107392327686&amp;postID=5354462156505818200' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3536118107392327686/posts/default/5354462156505818200'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3536118107392327686/posts/default/5354462156505818200'/><link rel='alternate' type='text/html' href='http://lesaventuresdeyannigdanslemondeit.blogspot.com/2010/05/compilation-nrpe-et-generation-dun.html' title='Compilation NRPE et génération d&apos;un binaire statique sous Solaris 8 ou 10'/><author><name>Yannig Perre</name><uri>https://profiles.google.com/104797199411947382593</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-6bgdo630G7s/AAAAAAAAAAI/AAAAAAAAAhc/P4yM7287fOg/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3536118107392327686.post-2479834080277686571</id><published>2010-05-11T21:05:00.004+02:00</published><updated>2010-05-27T19:09:21.179+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ndoutils'/><category scheme='http://www.blogger.com/atom/ns#' term='pnp4nagios'/><title type='text'>Import en cours</title><content type='html'>J'ai lancé mon script d'import de ma base ndo MySQL vers pnp4nagios. J'ai compté, il y en a pour environ 25 minutes par jour et j'ai environ 130 jours à importer. Après avoir parallélisé un peu les traitements j'ai réussi à descendre à 15 minutes pour chaque jour. Chouette, ça me fera donc environ 30 heures d'import ...&lt;br /&gt;&lt;br /&gt;Courage ! On va y arriver.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3536118107392327686-2479834080277686571?l=lesaventuresdeyannigdanslemondeit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lesaventuresdeyannigdanslemondeit.blogspot.com/feeds/2479834080277686571/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3536118107392327686&amp;postID=2479834080277686571' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3536118107392327686/posts/default/2479834080277686571'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3536118107392327686/posts/default/2479834080277686571'/><link rel='alternate' type='text/html' href='http://lesaventuresdeyannigdanslemondeit.blogspot.com/2010/05/import-en-cours.html' title='Import en cours'/><author><name>Yannig Perre</name><uri>https://profiles.google.com/104797199411947382593</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-6bgdo630G7s/AAAAAAAAAAI/AAAAAAAAAhc/P4yM7287fOg/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3536118107392327686.post-6934422583746595741</id><published>2010-05-10T22:50:00.004+02:00</published><updated>2010-05-27T19:09:56.517+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><category scheme='http://www.blogger.com/atom/ns#' term='RRD'/><title type='text'>Test du module RRD perl</title><content type='html'>Je suis en ce moment en train de finir mes scripts de migration de la base MySQL ndoutils vers des bases RRD gérées par pnp4nagios.&lt;br /&gt;&lt;br /&gt;Globalement, le script est terminé et je suis juste en train de faire quelques tests. A cette occasion, j'ai voulu connaître le différentiel de performance entre RRD via le binaire et via la bibliothèque Perl.&lt;br /&gt;&lt;br /&gt;Pour se faire, j'ai donc écrit le script suivant :&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#!/usr/bin/perl&lt;br /&gt;use RRDs;&lt;br /&gt;$use_system = 1;&lt;br /&gt;&lt;br /&gt;$current = time();&lt;br /&gt;$step = 30;&lt;br /&gt;$range = 3600 * 24 * 7;&lt;br /&gt;$start = $current - $range;&lt;br /&gt;print "Début : ".scalar(localtime())."\n";&lt;br /&gt;if($use_system) {&lt;br /&gt;  system("rrdtool create test.rrd --start $start --step $step DS:valeur_test:GAUGE:600:U:U RRA:AVERAGE:0.5:1:".($range / $step));&lt;br /&gt;} else {&lt;br /&gt;  RRDs::create("test.rrd", "--start", $start, "--step", $step, "DS:valeur_test:GAUGE:600:U:U", "RRA:AVERAGE:0.5:1:".($range / $step));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;$j = 0.;&lt;br /&gt;$| = 1;&lt;br /&gt;$i = 0;&lt;br /&gt;for($t = $start; $t &lt; $current; $t += $step) {&lt;br /&gt;  $value = int(200.5 + cos($j) * 100.);&lt;br /&gt;  if($use_system) {&lt;br /&gt;    system("rrdtool update test.rrd $t:$value");&lt;br /&gt;  } else {&lt;br /&gt;    RRDs::update("test.rrd", "$t:$value");&lt;br /&gt;  }&lt;br /&gt;  $j += 0.001;&lt;br /&gt;  $i++;&lt;br /&gt;}&lt;br /&gt;print "Insertion de $i valeurs\n";&lt;br /&gt;if($use_system) {&lt;br /&gt;  system("rrdtool graph speed.png --start $start --end $current DEF:def=test.rrd:valeur_test:AVERAGE LINE1:def#000000 -w 1000 -h 400");&lt;br /&gt;} else {&lt;br /&gt;  RRDs::graph("speed.png", "--start", $start, "--end", $current,&lt;br /&gt;            "DEF:def=test.rrd:valeur_test:AVERAGE", "LINE1:def#000000", "-w", 1000, "-h", 400);&lt;br /&gt;}&lt;br /&gt;print "Fin   : ".scalar(localtime())."\n";&lt;br /&gt;system("gwenview speed.png");&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;En gros, le script génère une sinusoïde que j'affiche ensuite sous gwenview (prenez votre lecteur d'image préféré).&lt;br /&gt;&lt;br /&gt;Un rapide test nous donne le résultat suivant :&lt;br /&gt;* via l'utilisation de la bibliothèque :&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;drayan@robinet:~/nagios/RRD$ ./generate_rrd.pl &lt;br /&gt;Début : Mon May 10 22:45:56 2010&lt;br /&gt;Insertion de 20160 valeurs&lt;br /&gt;Fin   : Mon May 10 22:45:57 2010&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;* via l'utilisation des binaires :&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Début : Mon May 10 22:46:08 2010&lt;br /&gt;ERROR: test.rrd: illegal attempt to update using time 1272919568 when last update time is 1272919568 (minimum one second step)&lt;br /&gt;Insertion de 20160 valeurs&lt;br /&gt;1081x449&lt;br /&gt;Fin   : Mon May 10 22:48:57 2010&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Donc 1 seconde contre environ 3 minutes dans le second cas. On va donc passer par la bibliothèque !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3536118107392327686-6934422583746595741?l=lesaventuresdeyannigdanslemondeit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lesaventuresdeyannigdanslemondeit.blogspot.com/feeds/6934422583746595741/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3536118107392327686&amp;postID=6934422583746595741' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3536118107392327686/posts/default/6934422583746595741'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3536118107392327686/posts/default/6934422583746595741'/><link rel='alternate' type='text/html' href='http://lesaventuresdeyannigdanslemondeit.blogspot.com/2010/05/test-du-module-rrd-perl.html' title='Test du module RRD perl'/><author><name>Yannig Perre</name><uri>https://profiles.google.com/104797199411947382593</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-6bgdo630G7s/AAAAAAAAAAI/AAAAAAAAAhc/P4yM7287fOg/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3536118107392327686.post-1153540158175976610</id><published>2010-05-08T14:15:00.003+02:00</published><updated>2010-05-27T19:10:07.849+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pnp4nagios'/><title type='text'>Utilisation de pnp4nagios</title><content type='html'>pnp4nagios est un ensemble de script perl, PHP et C qui vont vous permettre de récupérer les métriques de nagios (les perfdata) dans des bases RRD. Ces bases vous permettront ensuite de générer des graphiques à l'aide d'une petite interface Web. La force de cet outil est de s'appuyer sur un outil simple et éprouvé : les outils RRD.&lt;br /&gt;&lt;br /&gt;Il peut se configurer de trois manières différentes (si on compte la variante à base de NCPD) :&lt;br /&gt;- mode synchrone. Il s'agit du mode le plus simple à mettre en oeuvre.&lt;br /&gt;- mode asynchrone/nagios. Ici, nagios va écrire les perfdatas dans un fichier avant d'être traité par lot à interval régulier par un script pnp4nagios.&lt;br /&gt;- mode asynchrone/NCPD. Ce mode est proche du précédent à la différence que la gestion du traitement se fera à l'aide d'un démon dédié à ce travail.&lt;br /&gt;&lt;br /&gt;Comme toujours, le mode de fonctionnement dépendra du nombre d'élément que vous souhaitez surveiller. De mon point de vue, une petite infrastructure (inférieur à un ou deux milliers de services) pourra très bien fonctionner en mode synchrone. Au delà, il faudra se poser la question de mettre en place un mode asynchrone. Sachez que le premier mode asynchrone viendra bloquer nagios pendant les moments d'import des données. Sur très grosse infrastructure avec des surveillances distribués, il sera donc préférable de choisir le dernier mode.&lt;br /&gt;&lt;br /&gt;Pour ma part, n'étant pas encore obligé de faire de la surveillance décentralisé (à l'aide de DNX par exemple), j'ai choisi la seconde solution pour son bon compromis performance/complexité. En effet, le dernier mode entrainte forcément l'ajout d'un démon supplémentaire.&lt;br /&gt;&lt;br /&gt;Bref, après une petite période de test, je suis en train de commencer à déployer cet outil sur notre infrastructure. J'étudie également l'importation des anciens résultats de notre base ndo/MySQL afin de disposer dès le départ de l'ancien historique. J'ai déjà écrit les scripts d'export de la base et je suis en train de peaufiner les détails. Dès que j'aurais terminé cette petite migration, je viendrai vous en faire part ici même.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3536118107392327686-1153540158175976610?l=lesaventuresdeyannigdanslemondeit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lesaventuresdeyannigdanslemondeit.blogspot.com/feeds/1153540158175976610/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3536118107392327686&amp;postID=1153540158175976610' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3536118107392327686/posts/default/1153540158175976610'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3536118107392327686/posts/default/1153540158175976610'/><link rel='alternate' type='text/html' href='http://lesaventuresdeyannigdanslemondeit.blogspot.com/2010/05/utilisation-de-pnp4nagios.html' title='Utilisation de pnp4nagios'/><author><name>Yannig Perre</name><uri>https://profiles.google.com/104797199411947382593</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-6bgdo630G7s/AAAAAAAAAAI/AAAAAAAAAhc/P4yM7287fOg/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry></feed>
