Плагин munin для мониторинга трафика пользователей 3proxy.

Munin — легковесный сервер для сбора и отображения информации, работает по принципу сервер-клиент, то есть сервер через установленные промежутки времени запрашивает данные у клиентов.

Рассмотрим создание простого плагина на примере сбора статистики использования прокси. В качестве прокси-сервера будем использовать 3proxy. 3Proxy имеет свои средства для сбора статистики по каждому пользователю, но данные хранятся в виде текста и не имеют истории использования по времени, так что графики будут информативнее и красивее.



Первым делом настроим ведение лога нужного формата. Для этого добавим в конфигурацию прокси следующее:
logformat "L %U %I %O"
log /var/log/3proxy.log

logformat — описание формата лога:
  • L — использование локального времени сервера, обязательный параметр
  • %U — имя пользователя
  • %I — исходящий трафик, байты
  • %O — входящий трафик, байты
log /путь/к/файлу — файл лога, 3proxy должен иметь права на запись в этот файл

Сохраняем, перезапускаем процесс 3proxy.

Далее разберемся как работают плагины в munin.

Плагин для munin, это исполняемый файл, который возвращает форматированные данные и, при указании параметра config, возвращает конфигурацию для munin, в которой описывается формат данных и отображения информации.
Для 3proxy предлагаем 2 плагина, они отличаются только форматом вывода графиков.

Первый вариант: отображает 1 график с данными всех пользователей сразу.
(+) Удобно сравнивать потребление трафика у всех пользователей сразу.
(-) При большом количестве пользователей график становится плохо читаемым.

Второй вариант: отображает 1 график общего трафика и отдельные графики для каждого пользователя.
(+) Удобно оценивать как общее потребление трафика, так и для каждого пользователя.
(-) Не много большая нагрузка на сервер, так как отрисовывается по 2-3 графика на 1 пользователя.

Первый вариант

#!/bin/bash

log="/var/log/3proxy.log"
# путь к лог файлу указанный в конфиге 3proxy

users=`cat /home/3proxy/3proxy.cfg | grep allow | cut -f2 -d' '` 
#составление списка пользователей, замените путь к конфиг файлу на ваш

function header {

echo "graph_category 3proxy"
echo "graph_title Users send/recieve bytes"
echo "graph_vlabel bytes"
echo "graph_scale yes"
echo 'graph_period minutes'
}

function header_users {
echo $user"_snd.label $user send"
echo $user"_snd.type ABSOLUTE"
echo $user"_snd.graph no"

echo $user"_rcv.label $user recieve"
echo $user"_rcv.draw LINE"
echo $user"_rcv.type ABSOLUTE"
echo $user"_rcv.negative "$user"_snd"
}

function send_values {

cat $log > /tmp/log.tmp
truncate --size 0 $log

for user in $users; do
cat /tmp/log.tmp | grep $user | awk '{sum3+=$3} END {print$1 "_snd.value " sum3}'
cat /tmp/log.tmp | grep $user | awk '{sum2+=$2} END {print$1 "_rcv.value " sum2}'
done


}

function send_config {

header;

for user in $users; do
header_users;
done

}

if [ "$1" == "config" ]; then

send_config

else

send_values

fi


Примерный вид графика


Второй вариант

#!/bin/bash
log="/var/log/3proxy.log"
# путь к лог файлу указанный в конфиге 3proxy

users=`cat /home/3proxy/3proxy.cfg | grep allow | cut -f2 -d' '`
#составление списка пользователей, замените путь к конфиг файлу на ваш

function header_total {

echo "graph_category 3proxy"
echo "multigraph 3proxy_bytes"
echo "graph_title Total send/recieve bytes"
echo "graph_vlabel bytes"
echo "graph_scale yes"
echo 'graph_period minutes'

echo "Total_snd.label Total send"
echo "Total_snd.type ABSOLUTE"
echo "Total_snd.graph no"

echo "Total_rcv.label Total recieve"
echo "Total_rcv.draw AREASTACK"
echo "Total_rcv.type ABSOLUTE"
echo "Total_rcv.negative Total_snd"
}

function header_users {

echo "graph_category 3proxy"
echo "multigraph 3proxy_bytes."$user
echo "graph_title $user send/recieve bytes"
echo "graph_order"
echo "graph_vlabel bytes"
echo "graph_scale yes"
echo 'graph_period minutes'

echo "snd.label $user send"
echo "snd.type ABSOLUTE"
echo "snd.graph no"

echo "rcv.label "$user" recieve/send (±)"
echo "rcv.draw AREASTACK"
echo "rcv.type ABSOLUTE"
echo "rcv.negative snd"
}

function send_values {

cat $log > /tmp/log.tmp
truncate --size 0 $log

for user in $users; do
echo 'multigraph 3proxy_bytes.'$user
cat /tmp/log.tmp | grep $user | awk '{sum3+=$3} END {print"snd.value " sum3}'
cat /tmp/log.tmp | grep $user | awk '{sum2+=$2} END {print"rcv.value " sum2}'
done
echo 'multigraph 3proxy_bytes'
cat /tmp/log.tmp | awk '{sum3+=$3} END {print"Total_snd.value " sum3}'
cat /tmp/log.tmp | awk '{sum2+=$2} END {print"Total_rcv.value " sum2}'
}

function send_config {

header_total;
for user in $users; do
header_users;
done;

}

if [ "$1" == "config" ]; then

send_config

else

send_values

fi



Общий вид в munin

Графики пользователй


Использованная информация

Документация munin по плагинам
Munin Wiki
Настройка логирования 3proxy

Комментарии (0)

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