Depuis quelques temps déjà, le développement d’un plugin Cacti me trotter dans la tête. Le week-end dernier n’étant pas trop surchargé, je m’attaquais donc à l’écriture de ce plugin que je vous présente maintenant dans ce post.
Ce script, écris en Perl côté serveur et en PHP coté client, permet de retourner l’utilisation courante du cache d’opcode.
Rien de bien particuliers pour cette étape si ce n’est la copie des scripts sur les serveurs correspondants.
Je commencerai par la configuration du client étant donné que la configuration du serveur se basera sur ce qui a été définit dans cette partie.
Script PHP
<?php /* * Author : Axel JAMAIN <axel@jamain.net> * Date : 02/12/2010 * Version : 0.1 * Description : Returns APC informations * This script is to place on the client */ /********** Functions **********/ function byteSize($size) { $new_size = ($size / 1024) / 1024; return round($new_size,1); } /********** Main **********/ if( isset($_GET['type']) ) { if( extension_loaded('apc') && ini_get('apc.enabled') ) { switch($_GET['type']) { case 'memory': $mem_info = apc_sma_info(true); $memory['free'] = byteSize($mem_info['avail_mem']); foreach(array('files','user') as $value) { $arr_cacheinfo = apc_cache_info($value); $memory[$value] = byteSize($arr_cacheinfo['mem_size']); } print("mf:$memory[free] mfc:$memory[files] muc:$memory[user]"); break; case 'request': $timestamp = $_SERVER["REQUEST_TIME"]; foreach(array('files','user') as $value) { $arr_cacheinfo = apc_cache_info($value); $start_time = $arr_cacheinfo['start_time']; $request[$value]['hit'] = round(($arr_cacheinfo['num_hits'] / ($timestamp - $start_time)),2); $request[$value]['miss'] = round(($arr_cacheinfo['num_misses'] / ($timestamp - $start_time)),2) ; $request[$value]['insert'] = round(($arr_cacheinfo['num_inserts'] / ($timestamp - $start_time)),2); } print("fh:{$request['files']['hit']} fm:{$request['files']['miss']} fi:{$request['files']['insert']} "); print("uh:{$request['user']['hit']} um:{$request['user']['miss']} ui:{$request['user']['insert']}"); break; case 'cache': foreach(array('files','user') as $value) { $arr_cacheinfo = apc_cache_info($value); $cache[$value]['entries'] = $arr_cacheinfo['num_entries']; } print("cf:{$cache['files']['entries']} cu:{$cache['user']['entries']}"); break; } } } ?>
Pour ma part, le script se trouve dans /var/www/apc_infos.php.
Configuration du serveur HTTP
Une fois que le script PHP est en place, passons à la configuration du serveur HTTP Apache qui permettra au serveur Cacti de récupérer les informations sur le cache APC. Pour cela, on déclare un nouveau Virtual Host.
$ cat /usr/local/etc/apache22/httpd.conf [...] <VirtualHost *:80> ServerName status.worldofunix.fr Alias /apc_infos.php /var/www/apc_infos.php <Location /apc_infos.php> Order deny,allow Deny from all # Adresse IP du serveur Cacti Allow from 192.168.1.100 </Location> </VirtualHost>
Un reload du serveur HTTP pour terminer la configuration du client.
Validation de la configuration cliente
Connectons nous au serveur Cacti et effectuons une requête HTTP.
$ telnet status.worldofunix.fr 80 Trying 192.168.1.154... Connected to web.worldofunix.fr. Escape character is '^]'. GET /apc_infos.php?type=memory HTTP/1.1 Host: status.worldofunix.fr HTTP/1.1 200 OK Date: Wed, 12 Jan 2011 09:02:36 GMT Server: Apache Content-Length: 21 Content-Type: text/html mf:63.7 mfc:0.3 muc:0 quit
Le serveur Apache retourne bien les informtations sur le cache APC, passons maintenant à la configuration du serveur Cacti.
Ce script est à copier dans le répertoire des scripts Cacti.
#!/usr/bin/perl -w # # Author : Axel JAMAIN <axel@jamain.net> # Date : 02/12/2010 # Version : 0.1 # Description : Returns APC informations # This script is to place on the server # # Syntaxe : apc_infos.pl <hostname> <type_of_request> # <hostname> = server.domain.com # <type_of_request> = {memory|request|cache} use strict; use warnings; require LWP::UserAgent; require HTTP::Request; ########## Variables ########## my $uri = '/apc_infos.php'; # URI which is called (ex: http://<hostname>/apc_infos.php) ########## Main ########## if( @ARGV == 2 ) { my $host = $ARGV[0]; my $type = $ARGV[1]; my $url = "http://$host$uri?type=$type"; my $ua = LWP::UserAgent->new(agent => 'APCbot/0.1'); my $response = $ua->request(HTTP::Request->new(GET => "$url")); if( $response->is_success) { print $response->content; } }
Le script prend deux paramètres :
– Le nom d’hôte du serveur qui permettra d’afficher la page PHP
– Le type de check à faire (memory, request ou cache)
Les quatres fichiers xml ci-dessous sont à importer dans l’interface Cacti.
cacti-apc_cache_entry.xml
cacti-apc_file_request_rate.xml
cacti-apc_memory_usage.xml
cacti-apc_user_request_rate.xml
Pour finir, il ne reste plus qu’à associer les graphes au serveur.

Et indiquer à Cacti de les grapher.
Aperçu de ce que donne le plugin sur l’un de mes serveurs.
Si vous avez des remarques ou juste pour dire un petit « merci », laissez un commentaire.