Archives pour la catégorie ‘Zabbix’

Zabbix : configuration d’un item trapper

La mise en place d’un item trapper est nécessaire lorsque le temps d’obtention de l’information à monitorer est supérieur au timeout imposé au niveau de l’agent Zabbix (par défaut de 5 secondes). Avec un item trapper, l’agent ne se charge ni de récupérer, ni d’envoyer l’information au serveur : tout est déporté à un script externe.

En guise d’exemple, ce script récupère le décalage temporel d’un hôte par rapport à un serveur NTP externe :

root@host:/etc/zabbix/scripts# cat ntpdate_offset.sh
#!/bin/sh

ZABBIX_SENDER=/usr/local/bin/zabbix_sender
ZABBIX_CONF=/usr/local/etc/zabbix/zabbix_agentd.conf

VALUE=$(ntpdate -q fr.pool.ntp.org | grep 'adjust time server' | awk '{print $10}')
echo - ntpdate.offset $VALUE | $ZABBIX_SENDER -c $ZABBIX_CONF -i -

Son exécution est à planifier en cron selon la fréquence de monitoring souhaitée. Au niveau du serveur Zabbix, il reste à créer et activer l’item ntpdate.offset en sélectionnant le type trapper.

Zabbix : monitorer l’activité d’un disque

Pour monitorer l’activité disque avec Zabbix, il convient de créer deux éléments par disque :

  • le premier pour la lecture avec la clé vfs.dev.read
  • le second pour l’écriture avec la clé vfs.dev.write

Il faut spécifier 512 comme coefficient de multiplication étant donné que Linux utilise 512 octets par bloc secteur.

 

Voici un rendu graphique des données récupérées :

Remarque : depuis la version 1.8.6 de Zabbix, il est possible de monitorer un volume LVM. Par exemple, pour le LV /dev/mapper/vg-sql, la clé à utiliser serait : vfs.dev.read[vg/sql,sectors].

Zabbix : monitorer un serveur Postfix

Voici les différents éléments de configuration nécessaires à la supervision d’un serveur Postfix avec Zabbix.

En premier lieu, rajouter un élément dans le fichier de configuration de l’agent Zabbix /etc/zabbix/zabbix_agentd.conf pour reporter le nombre actuel de mails dans la file d’exécution :

UserParameter=postfix.mailq,mailq|grep -v "Mail queue is empty"|grep -c '^[0-9A-Z]'

Ne pas oublier de créer l’élément dans l’interface web de Zabbix et le graphique associé.

Pour monitorer les statistiques sur les messages traités par Postfix, il convient d’installer les programmes pflogsumm ainsi que logcheck. Le premier permet d’analyser le journal du serveur et produire un rapport détaillés sur les messages. logcheck apporte quant à lui la commande logtail qui va permettre d’accélérer le temps de parsing du fichier log en gardant un offset de position à chaque passe par pflogsumm.

L’analyse s’effectue par ce script qu’il conviendra de placer en cron selon l’intervalle de temps désiré. Le script se charge d’envoyer les  différentes valeurs au serveur Zabbix gràce à la commande zabbix_sender :

#!/bin/bash
PFLOGSUMM=/usr/bin/pflogsumm.pl
MAILLOG=/var/log/mail.log
LOGTAIL=/usr/sbin/logtail
DAT1=/tmp/zabbix-postfix-offset.dat
DAT2=$(mktemp)
ZABBIX_SENDER=/usr/bin/zabbix_sender
ZABBIX_CONF=/etc/zabbix/zabbix_agentd.conf
DEBUG=0

function zsend {
   key="postfix.`echo "$1" | tr ' -' '_' | tr '[A-Z]' '[a-z]' | tr -cd [a-z_]`"
   value=`grep -m 1 "$1" $DAT2 | awk '{print $1}'`

   [ ${DEBUG} -ne 0 ] && echo "Send key \"${key}\" with value \"${value}\"" >&2
   $ZABBIX_SENDER -c $ZABBIX_CONF -k "${key}" -o "${value}" 2>&1 >/dev/null
}

$LOGTAIL -f $MAILLOG -o $DAT1 | $PFLOGSUMM -h 0 -u 0 --bounce_detail=0 --deferral_detail=0 --reject_detail=0 --no_no_msg_size --smtpd --warning_detail=0 > $DAT2

zsend received
zsend delivered
zsend forwarded
zsend deferred
zsend bounced
zsend rejected
zsend held
zsend discarded
zsend "reject warnings"
zsend "bytes received"
zsend "bytes delivered"
zsend senders
zsend recipients

rm $DAT2

Template XML : [Téléchargement introuvable]

Source : http://www.zabbix.com/wiki/howto/monitor/mail/postfix/monitoringpostfix

Zabbix : monitoring Nginx / PHP-FPM / MySQL

Voici les scripts que j’utilise pour monitorer avec Zabbix des serveurs Nginx / MySQL / PHP-FPM. Je vous livre également une template contenant l’ensemble des items et triggers.

zabbix_agentd.conf :

UserParameter=nginx.active,/etc/zabbix/scripts/nginx.pl|cut -f1|cut -d" " -f2
UserParameter=nginx.requests,/etc/zabbix/scripts/nginx.pl|cut -f2|cut -d" " -f2
UserParameter=nginx.reading,/etc/zabbix/scripts/nginx.pl|cut -f3|cut -d" " -f2
UserParameter=nginx.writing,/etc/zabbix/scripts/nginx.pl|cut -f4|cut -d" " -f2
UserParameter=nginx.waiting,/etc/zabbix/scripts/nginx.pl|cut -f5|cut -d" " -f2
UserParameter=php.ping,/etc/zabbix/scripts/php-fpm_ping.pl
UserParameter=php.conn,/etc/zabbix/scripts/php-fpm_status.pl|cut -f1|cut -d" " -f3
UserParameter=php.idle,/etc/zabbix/scripts/php-fpm_status.pl|cut -f2|cut -d" " -f3
UserParameter=php.active,/etc/zabbix/scripts/php-fpm_status.pl|cut -f3|cut -d" " -f3
UserParameter=php.total,/etc/zabbix/scripts/php-fpm_status.pl|cut -f4|cut -d" " -f3
UserParameter=php.maxchildren,/etc/zabbix/scripts/php-fpm_status.pl|cut -f5|cut -d" " -f3
UserParameter=mysql.status[*],/etc/zabbix/scripts/mysql_status.pl $1

/etc/zabbix/scripts/nginx.pl :

#!/usr/bin/perl#
# Boris HUISGEN <bhuisgen@hbis.fr>

use LWP::UserAgent;

my $URL = "http://127.0.0.1/nginx_status";

#
# DO NOT MODIFY AFTER THIS LINE
#

my $ua = LWP::UserAgent->new(timeout => 15);
my $response = $ua->request(HTTP::Request->new('GET', $URL));

my $active =  0;
my $reading = 0;
my $writing = 0;
my $waiting = 0;
my $requests = 0;

foreach (split(/\n/, $response->content)) {
 $active = $1 if (/^Active connections:\s+(\d+)/);

 if (/^Reading:\s+(\d+).*Writing:\s+(\d+).*Waiting:\s+(\d+)/) {
 $reading = $1;
 $writing = $2;
 $waiting = $3;
 }

 $requests = $3 if (/^\s+(\d+)\s+(\d+)\s+(\d+)/);
}

print "Active: $active\tRequests: $requests\tReading: $reading\tWriting: $writing\tWaiting: $waiting\n";

php-fpm_ping.pl :

#!/usr/bin/perl
#
# Boris HUISGEN <bhuisgen@hbis.fr>

use LWP::UserAgent;

my $URL = "http://127.0.0.1/php5fpm-ping";

#
# DO NOT MODIFY AFTER THIS LINE
#

my $ua = LWP::UserAgent->new(timeout => 15);
my $response = $ua->request(HTTP::Request->new('GET', $URL));

if ($response->is_success) {
 print "1\n";
}
else {
 print "0\n";
}

php-fpm_status.pl :

#!/usr/bin/perl
#
# Boris HUISGEN <bhuisgen@hbis.fr>

use LWP::UserAgent;

my $URL = "http://127.0.0.1/php5fpm-status";

#
# DO NOT MODIFY AFTER THIS LINE
#

my $ua = LWP::UserAgent->new(timeout => 15);
my $response = $ua->request(HTTP::Request->new('GET', $URL));

my $conn = 0;
my $idle = 0;
my $active = 0;
my $total = 0;
my $maxchildren = 0;

foreach (split(/\n/, $response->content)) {
 $conn = $1 if (/^accepted conn:\s+(\d+)/);
 $idle = $1 if (/^idle processes:\s+(\d+)/);
 $active = $1 if (/^active processes:\s+(\d+)/);
 $total = $1 if (/^total processes:\s+(\d+)/);
 $maxchildren = $1 if (/^max children reached:\s+(\d+)/);
}

print "Accepted conn: $conn\tIdle proc: $idle\tActive proc: $active\tTotal proc: $total\tMax children: $maxchildren\n";

mysql_status.pl :

#!/usr/bin/perl
#
# Boris HUISGEN <bhuisgen@hbis.fr>

my($mysql)   = "/usr/bin/mysql";
my($user)    = "zabbix";
my($passwd)  = "abcdef123";
my($host)    = "localhost";

#
# DO NOT MODIFY AFTER THIS LINE
#

=head1 NAME

mysql_status.pl - show MySQL variable status

=head1 SYNOPSIS

 mysql_status.pl VARIABLE

 --help                      print this help message
 --version                   print version information

=head1 DESCRIPTION

This program shows the status of a MySQL variable.

=head1 AUTHOR

Boris HUISGEN <bhuisgen@hbis.fr>

=cut

use strict;
use warnings;

use Getopt::Long qw(:config auto_help auto_version);
use Pod::Usage;

$main::VERSION = "0.1-2012040501";

exit main();

sub show_variable {
 my ($variable) = $_[0];

 my ($cmd) = "$mysql -u $user -p$passwd -h $host --execute \"SHOW GLOBAL STATUS LIKE '$variable'\" --skip-column-name";
 my ($ret) =`$cmd 2> /dev/null`;
 exit(1) unless($ret);

 $ret =~ m/^$variable.[\s\t]*(.*)/;
 print "$1\n";
}

sub main {
 GetOptions ()
 or pod2usage(1);

 pod2usage (1) unless ($#ARGV == 0);

 my ($variable) = $ARGV[0];

 show_variable($variable);
}

# end of script

nginx.conf :

server {
 listen          127.0.0.1:80;
 listen          [::1]:80;
 server_name     localhost;
 root            /var/www/default/www/html;
 access_log      /var/www/default/www/logs/access.log;
 error_log       /var/www/default/www/logs/error.log;
 index           index.html;

 location /nginx_status {
 stub_status on;
 access_log off;
 allow 127.0.0.1;
 deny all;
 }

 location = /php5fpm-status {
 fastcgi_pass    unix:/var/run/php5-fpm.sock;
 fastcgi_index   index.php;
 fastcgi_param   SCRIPT_FILENAME  /var/www/default/www/html$fastcgi_script_name;
 include         fastcgi_params;
 }

 location = /php5fpm-ping {
 fastcgi_pass    unix:/var/run/php5-fpm.sock;
 fastcgi_index   index.php;
 fastcgi_param   SCRIPT_FILENAME  /var/www/default/www/html$fastcgi_script_name;
 include         fastcgi_params;
 }

php-fpm.conf :

pm.status_path = /php5fpm-status
ping.path = /php5fpm-ping
ping.path = /php5fpm-ping

Template Zabbix : [Téléchargement introuvable]

Haut de page