MRTG - свободное программное обеспечение для организации сервиса мониторинга.

Установка MRTG

Установка на Ubuntu Server (в данном случае 12.04)

apt-get install mrtg mrtgutils mrtg-ping-probe

Настройка MRTG

Создаём конфигурацию в таком виде /etc/mrtg.cfg (или /etc/mrtg/mrtg.cfg для CentOS)

1
2
 WorkDir: /var/www/mrtg
 WriteExpires: Yes

Конфигурации для случаев

Ниже идут примеры, когда не используется SNMP

Проверяем скорость канала

Если периодически нужно замерять канал, можно это делать, загружая определённые файлы со стороннего сервера с хорошим каналом. Например, есть файл на 1МБ по ссылке http://wikiadmin.net/file

Итак, добавляем в конфиг следующее

1
2
3
4
5
6
 Title[mrtg.speed]: speed download
 PageTop[mrtg.speed]: <H1>speed download</H1>
 Target[mrtg.speed]: `/etc/mrtg/mrtg.speed`
 MaxBytes[mrtg.speed]: 2000000
 Options[mrtg.speed]: growright,unknaszero,nopercent,gauge
 YLegend[mrtg.speed]: RTT (speed)

И создаём скрипт /etc/mrtg/mrtg.speed

1
2
3
 #!/bin/bash
 echo "scale=1; `curl --silent -w "%{speed_download}" http://wikiadmin.net/file -o /dev/null`" | bc | xargs -I {} echo {}
 echo 131072

Значение 131072 - это указываем для синий линии, значит мегабит, который должен быть по тарифу. Если у вас другой тариф - укажите его.

Мониторим сторонние сервисы с помощью ICMP(ping)

Добавим в конфиг следующее

1
2
3
4
5
 Title[localhost.ping]: RTT to 8.8.8.8
 PageTop[localhost.ping]: <H1>Ping to 8.8.8.8</H1>
 Target[localhost.ping]: '/etc/mrtg/mrtg.ping'
 MaxBytes[localhost.ping]: 2000
 Options[localhost.ping]: integer,nobanner,growright,nopercent,gauge

Создаём скрипт /etc/mrtg/mrtg.ping

1
2
3
4
5
 #!/bin/sh
 PING8=`ping -c2 -s50 8.8.8.8 -q | awk '/time/{print $10}' | sed 's/ms//g'`
 LOSS=`ping -c2 -s50 8.8.8.8 -q | awk '/time/{print $6}' | sed 's/%//g'`
 echo $PING8
 echo $LOSS

Делаем его исполняемым

1
 chmod +x /etc/mrtg.ping

Мониторим сколько процентов места занято на диске

Добавим в конфиг следующее

1
2
3
4
5
6
7
8
9
10
11
12
 Target[disk]: `/etc/mrtg/mrtg.disk`
 Title[disk]:  Root partition % used
 MaxBytes[disk]: 100
 PageTop[disk]: <H1> Root partition % used </H1>
 Suppress[disk]: y
 LegendI[disk]:  % used_root
 LegendO[disk]:  % used_boot
 Legend1[disk]:  % used_root
 Legend2[disk]:  % used_boot
 YLegend[disk]: percent used
 ShortLegend[disk]: used
 Options[disk]: growright, gauge

Создаём скрипт /etc/mrtg/mrtg.disk

1
2
3
4
5
6
7
8
9
10
 #!/usr/bin/perl
 
 foreach $_ (`df -k | grep -v "Filesystem"| grep md1`)
 {
   ($device, $size, $used, $free, $percent, $mount/) = split(/\s+/);
   chop($percent);
   print "$percent\n";
 }
 
 print "0";

Учтите, что grep md1 - это для моего случая, у вас диск может быть другим. Посмотрите это с помощью

1
 df -k | grep -v "Filesystem"

и решите, что туда добавить. Делаем скрипт исполняемым

1
 chmod +x /etc/mrtg/mrtg.disk

Мониторим количество соединений в общем

Добавим в конфиг следующее

1
2
3
4
5
 Target[net]: `/etc/mrtg/mrtg.net`
 MaxBytes[net]: 15000000000
 Options[net]: nopercent,growright,bits
 Title[net]: Traffic Analysis for eth0
 PageTop[net]: <h1>Traffic Analysis for eth0</h1>

Создаём скрипт /etc/mrtg/mrtg.net

1
2
3
4
5
6
7
8
9
 #!/bin/bash
 INPUT=`netstat -iv | grep -m 1 'eth0' | awk {'print $4'}`
 OUTPUT=`netstat -iv | grep -m 1 'eth0' | awk {'print $8'}`
 DATE=`date +%s`
 NAME='MANAGEMENT'
 echo $INPUT
 echo $OUTPUT
 echo $DATE
 echo $NAME

Делаем скрипт исполняемым

1
 chmod +x /etc/mrtg/mrtg.net

Мониторим количество соединений на отдельных портах

Можно мониторить любые порты. например 25,110 или 143 для тех же почтовиков. У меня была задача получать кол-во соединений на 80 порту (Nginx) и на 8080 (Apache). Это несложно. Добавляем в конфиг следующее:

1
2
3
4
5
6
7
8
9
10
11
12
 Target[connect]: `/etc/mrtg/mrtg.connect`
 Title[connect]:  connect to our web in sec
 MaxBytes[connect]: 100000
 PageTop[connect]: <H1> connect to our web </H1>
 Suppress[connect]: y
 LegendI[connect]:  80 port
 LegendO[connect]:  8080 port
 Legend1[connect]:  connect in sec
 Legend2[connect]:  connect in sec
 YLegend[connect]: connects
 ShortLegend[connect]:connects
 Options[connect]: growright, nopercent, gauge

Создаём простенький скрипт /etc/mrtg/mrtg.connect

1
2
3
 #!/bin/bash
 /bin/netstat -plan | /bin/grep :80 | /bin/grep -c tcp
 /bin/netstat -plan | /bin/grep :8080 | /bin/grep -c tcp

где указаны нужные нам порты. Делаем скрипт исполняемым

1
 chmod +x /etc/mrtg/mrtg.connect

Мониторим нагрузку процессора

Добавим в конфиг mrtg.cfg следующее

1
2
3
4
5
6
7
8
9
10
 Target[cpu]: `/etc/mrtg/cpuinfo.pl localhost linux`
 MaxBytes[cpu]: 100
 Options[cpu]: gauge, nopercent, growright
 Unscaled[cpu]: dwym
 YLegend[cpu]: % of CPU used
 ShortLegend[cpu]: %
 LegendO[cpu]:  CPU System:
 LegendI[cpu]:  CPU User:
 Title[cpu]: cpu name
 PageTop[cpu]: <H1>CPU usage for cpu name</H1>

Создаём скрипт /etc/mrtg/cpuinfo.pl

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
 #!/usr/bin/perl
 
 # ============================================================================
 # CPU Usage script for mrtg
 #
 # ============================================================================
 # setup local vars
 my($machine, $os);
 
 # ============================================================================
 # == Enter your rsh program here here ==
 
 $rsh = "/usr/local/bin/ssh -x";         # Enter your rsh command here
 
 # == You shouldn't need to edit anything below this line ==
 #========================================================
 
 # This checks for options passed cpuinfo.pl from the cmd line
 if (scalar(@ARGV) < 2)
    {
    print("USAGE: cpuinfo.pl {machine} {os}\n");
    exit(-1);
    }
 
 if ($ARGV[0] ne '' && $ARGV[0] ne '#')
    {
    $machine = $ARGV[0];
    }
 
 if ($ARGV[1] ne '' && $ARGV[1] ne '#')
    {
    $os = $ARGV[1];
    }
 
 # Validate the os
 SWITCH:
 {
   if ($os =~ /^sun$/){last SWITCH;}
   if ($os =~ /^linux$/){last SWITCH;}
 
   # DEFAULT: Die if we can't figure out what the os is
   die "Can't figure out which OS the machine is.\n";
 }
 
 # Execute the appropriate subroutine based on the os
 &$os;
 
 exit(0);
 
 #=======================================================
 # Subroutines: names of subroutines are supported OSs.
 #========================================================
 sub sun
   {
 
    # Run commands
    if ($machine =~ 'localhost')
    {
    $getcpu = `sar -u 1 10 | grep Average`;
    $getuptime = `uptime`;
    }
    else
    {
    $getcpu = `$rsh $machine "sar -u 1 10" | grep Average`;
    $getuptime = `$rsh $machine "uptime"`;
    }
 
    # Parse though getcpu and get data
    $getcpu =~ /^Average\s+(\d+)\s+(\d+)\s+/;
    $outputusr = $1;
    $outputsys = $2;
 
    # Print getcpu data for mrtg
    print $outputusr."\n";
    print $outputsys."\n";
 
    # Parse though getuptime and get data
    $getuptime =~ /^\s+\d{1,2}:\d{2}..\s+up\s+(\d+)\s+(......),/;
 
    # Print getuptime data for mrtg
    print $1." ".$2."\n";
 
    # Print machine name for mrtg
    print $machine."\n";
 
   }
 
 sub linux
   {
    # Run commands
    if ($machine =~ 'localhost')
    {
    $getcpu = `/usr/bin/sar -u 1 10 | grep Average`;
    $getuptime = `/usr/bin/uptime`;
    }
    else
    {
    $getcpu = `$rsh $machine "/usr/local/bin/sar -u 1 10 | grep Average"`;
    $getuptime = `$rsh $machine "/usr/bin/uptime"`;
    }
 
    # Parse though getcpu and get data
    $getcpu =~ /^Average:\s+all\s+(\d+)\.\d+\s+\d+\.\d+\s+(\d+)\.\d+\s+\d+\.\d+/;
    $getcpuusr = $1;
    $getcpusys = $2;
 
    # Print getcpu data for mrtg
    print $getcpuusr."\n";
    print $getcpusys."\n";
 
    # Parse though getuptime and get data
    $getuptime =~ /^\s+\d{1,2}:\d{2}..\s+up\s+(\d+)\s+(\w+),/;
 
    # Print getuptime data for mrtg
    print $1." ".$2."\n";
 
    # Print machine name for mrtg
    print $machine."\n";
 
   }
 exit(0);

Делаем его исполняемым

1
 chmod +x /etc/mrtg/cpuinfo.pl

Мониторим NGINX

Задача: видеть кол-во активных соединений и ожидающих. В конфиг любого виртуального хоста добавляем это:

1
2
3
4
5
6
      location /nginx2_status {
             stub_status on;
             allow 127.0.0.1;
             allow СВОИ_АДРЕС;
             allow IP_СЕРВЕРА;
             deny    all;

Создаём файлик:

1
 /etc/mrtg/nginx.conf

следующего содержания:

1
2
3
4
5
6
7
8
 #!/bin/sh
 ADDR="http://wikiadmin.net/nginx2_status"
 CURL="/usr/bin/curl"
 DATA=`$CURL --silent $ADDR `
 LOAD=`echo $DATA | awk '{print $3 }' | tr -d %`
 WAIT=`echo $DATA | awk '{print $16 }' | tr -d %`
 echo $LOAD
 echo $WAIT

Добавляем в конфиг MRTG:

1
2
3
4
5
 Target[nginx]: `/etc/mrtg/nginx.conf`
 Options[nginx]: integer,nobanner,growright,unknaszero,nopercent,gauge
 MaxBytes[nginx]: 10000
 Title[nginx]: Connections on nginx
 PageTop[nginx]: <h1>Connections on nginx</h1>

Создаём индекс-файл

Для начала создайте index.html на основе той конфигурации, которая у вас есть:

1
 indexmaker /etc/mrtg/mrtg.cfg --columns=1 --output /var/www/mrtg/index.html

И пропишите в ваш веб-сервер, например, в Nginx, данные строки, чтобы можно было посмотреть данные в браузере.

Думаю, не стоит напоминать, что это ПО должно запускаться с помощью Cron раз в 5 минут.

конфиг nginx для mrtg

Самый простой вариант без аутентификации. Создаём файл /etc/nginx/conf.d/mrtg.conf следующего содержания:

1
2
3
4
5
6
7
8
 server {
   listen IP:80;
     server_name  mrtg.domain;
     location / {
     root   /var/www/mrtg;
     index  index.html;
     }
 }

Перегружаем nginx

1
 /etc/init.d/nginx restart

Другие команды

Мониторим пинг до номера 100 на Asterisk

1
 asterisk -rx 'sip show peer 100' | grep Status | awk '{print $4 }' | cut -c 2-9