Мониторинг mysql с помощью nagios и perl

Не так давно возникло у меня желание наглядно видеть использование сервера mysql, т.е. информацию об интенсивности запросов, поступающих к нему в каждый конкретный момент времени. Благо nagios и pnp4nagios уже были настроены и показывали красивые графики по использованию процессора и памяти. В коллекции плагинов nagios имелся check_mysql, но по сути все, что он делал, это определял доступность mysql, а вот информацию о запросах с его помощью не собрать. В результате я решил написать соответствующие скрипты сам с использованием языка perl 5.12.

Но оказалось не все так просто — mysql не умеет показывать количество запросов за последнюю минуту или секунду. Все, что он может, — это по команде show global status показывать статистику за все прошедшее с момента его запуска время — в том числе и общее количество запросов, количество запросов select, insert и т.д. Что ж, тогда пришлось написать два скрипта — первый вычисляет количество запросов за определенный интервал времени (например, за минуту), а второй служит плагином для nagios, сообщая ему эту информацию по запросу.

Первый скрипт я назвал mysql-usage.pl и поместил в /usr/local/bin.

#!/usr/bin/perl
 
use 5.012;
use strict;
use warnings;
 
my $last_file = '/var/last-mysql-usage';
my $current_file = '/var/current-mysql-usage';
 
my $last_result;
if (open(FD,$last_file)) {
    $last_result = <FD>;
    close (FD);
}
 
my @result = `echo "show global status" | mysql -u <user> -p<pass> --connect-timeout=1`;
 
unless (@result) {
    unlink($last_file);
    exit(1);
}
 
my ($questions,$selects,$inserts,$updates,$deletes) = (0,0,0,0,0);
my ($last_questions,$last_selects,$last_inserts,$last_updates,$last_deletes) = (0,0,0,0,0);
if ($last_result) {
    ($last_questions,$last_selects,$last_inserts,$last_updates,$last_deletes) = split(/:/,$last_result);
}
 
foreach (@result) {
    when (/Questions\s+(\d+)/) { $questions = $1; }
    when (/Com_select\s+(\d+)/) { $selects = $1; }
    when (/Com_insert\s+(\d+)/) { $inserts = $1; }
    when (/Com_update\s+(\d+)/) { $updates = $1; }
    when (/Com_delete\s+(\d+)/) { $deletes = $1; }
}
 
open(FD,">",$last_file) or die "Can't open file $last_file";
print FD "$questions:$selects:$inserts:$updates:$deletes";
close(FD);
 
if (defined($last_result)) {
    open(FD,">",$current_file) or die "Can't open file $current_file";
    print FD ($questions-$last_questions).":".($selects-$last_selects).":".
        ($inserts-$last_inserts).":".($updates-$last_updates).":".
        ($deletes-$last_deletes);
    close(FD);
}
 
exit(0);


Необходимо только заменить подстроки и на имя пользователя mysql и пароль (вместо этого можно использовать и конфигурационный файл, чтобы было безопаснее).
Этот скрипт необходимо выполнять с помощью cron каждую минуту. Он работает следующим образом: с помощью запроса show global status определяет текущие значения нужных счетчиков и сохраняет их в файле /var/last-mysql-usage. Если же скрипт запускается не первый раз, то вычисляется разница между текущими значениями счетчиков и соответствующими сохраненными. И эта разница записывается в /var/current-mysql-usage. Именно этот файл и будет использоваться следующим скриптом, который выдает информацию nagios.

Второй скрипт я назвал nagios-mysql-usage.pl и также поместил в /usr/local/bin.

#!/usr/bin/perl
 
use 5.012;
use strict;
use warnings;
 
my $file = '/var/current-mysql-usage';
my $line;
 
open(FD,$file) or die "Can't open file $file";
$line = <FD>;
close (FD);
 
my ($questions, $selects, $inserts, $updates, $deletes, $nagios_data, $nagios_status, $exit_code);
($questions, $selects, $inserts, $updates, $deletes) = split(/:/,$line);
 
$nagios_data = sprintf(
    "|questions=%d;;; selects=%d;;; inserts=%d;;; updates=%d;;; deletes=%d;;; ",
    $questions,$selects,$inserts,$updates,$deletes
);
$nagios_status = "MYSQL status: OK";
$exit_code = 0;
 
print $nagios_status . $nagios_data;
exit $exit_code;


Ну вот собственно и все. Недостатком этого плагина является то, что он не определяет, доступен ли mysql в данный момент или нет — это приходится мониторить с помощью плагина check_mysql отдельно. Саму настройку nagios и pnp4nagios описывать не буду, ибо документации на эту тему и так достаточно.


0 комментариев

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.