Calamaris

From SysadminWiki.ru
Jump to: navigation, search

Calamaris (http://calamaris.cord.de) - Анализатор журналов

  • Переводится с английского также как и Squid – кальмар, головоногий моллюск.
  • Понимает журналы Squid, NetCache, Inktomi Traffic Server, Oops! proxy server, Compaq Tasksmart, Novell Internet Caching System, Netscape/iPlanet/SunONE Web Proxy Server, Cisco Content Engines
  • Если Calamaris будет не единственным обработчиком журналов Squid, то я бы не ставил поддержку графики (от них практической пользы нет) и не выводил статистику по пользователям (другие программы это делают и полнее, и красивее). В таком облегчённом варианте он ставится быстро, и генерируемые им отчёты в будущем будет занимать меньше места.

Установка и настройка из исходников

Если не нужны графики, то достаточно одного скрипта. Распаковываем:

#tar -xzvf /path/to/calamaris-2.59.tgz

Если же хочется увидеть ещё и в графиках, то нужно устанавливать бета-версию 2.99.4.0 (сбоев не замечено) и доустановить библиотеки и модули. Для облегчения труда установим CPAN:

#apt-get install perl-CPAN

И с его помощью установим библиотеки:

#cpan install GD::Graph
#cpan install NetAddr::IP
  • Распаковываем:
#tar -xzvf GDGraph-1.43.tar.gz
#tar -xzvf GDTextUtil-0.86.tar.gz
#tar -xzvf NetAddr-IP-3.21.tar.gz

и устанавливаем, используя последовательность команд:

#perl Makefile.PL
#make
#make test
#make install

Создаём каталоги для самого Calamaris и для создаваемых им отчётов:

#mkdir -p /etc/calamaris /var/www/html/reports/calamaris

Копируем calamaris.conf в /etc/calamaris/ и редактируем:

$requester_report = -1;
$status_report = 1;
$type_report = -1;
$hostname = 'lookup';
$output_format = 'html,graph';
$output_path = '/var/www/html/reports/calamaris';
$output_file = 'index.html';
$show_reports = '0,2,5,6,8,10,11,13,14';

Копируем calamaris в /etc/calamaris/calamaris.pl. Расширение добавляем для определённости, что это скрипт на Perl.

Создаём каталог /usr/lib/perl5/calamaris (или там, где у вас находятся библиотеки perl) и копируем туда calAxestype.pm, calAxestype3d.pm, calBars3d.pm.

Копируем мануал calamaris.1 в /usr/local/man/man1/

Будем использовать скрипт, который позволит нам создавать ежедневные, еженедельные, ежемесячные и ежегодные отчёты. Ежедневные будут храниться месяц, а еженедельные и ежемесячные - год. Скрипт поместим в /etc/calamaris/calam_rep.sh. Смотрим и если нужно меняем переменные, описанные вначале. Если архивные файлы называются не access.log.0, а, например, access.log.1.bz2, то это меняем тоже. Делаем этот скрипт исполняемым:

#chmod +x /etc/calamaris/calam_rep.sh

Cоздаём отчёт:

#./calam_rep.sh yesterday

/etc/calamaris/calamaris.pl: Couldn't load package calamaris::calBars3d,
maybe it is not installed: No such file or directory

при такой ошибке проверяем работоспособность модуля:

#perl -e "use calamaris::calBars3d"

GD object version 2.18 does not match $GD::VERSION 2.19 at /usr/lib/perl5/i386-linux/DynaLoader.pm line 253.
Compilation failed in require at /usr/lib/perl5/vendor_perl/GD/Graph.pm line 36.
BEGIN failed--compilation aborted at /usr/lib/perl5/vendor_perl/GD/Graph.pm line 36.
Compilation failed in require at /usr/lib/perl5/calamaris/calAxestype3d.pm line 44.
BEGIN failed--compilation aborted at /usr/lib/perl5/calamaris/calAxestype3d.pm line 44.
Compilation failed in require at /usr/lib/perl5/calamaris/calBars3d.pm line 43.
BEGIN failed--compilation aborted at /usr/lib/perl5/calamaris/calBars3d.pm line 43.
Compilation failed in require at -e line 1.
BEGIN failed--compilation aborted at -e line 1.

Видим, что он ожидает более старую версию модуля GD. Меняем в /user/lib/perl5/GD.pm значение на то, что он хочет:

$VERSION = "2.18"

Если выдаёт:

Can't locate GD/Graph.pm in @INC (@INC contains: /usr/local /usr/lib/perl5/5.8.0/ :


То создаём каталог GD там, где ищет perl, напр. /usr/lib/perl5/5.8.0/GD и кладём туда файл Graph.pm и каталог Graph из дистрибутива модуля GDGraph.

  • Теперь ещё раз запускаем отчёт и смотрим в браузере по адресу http://our.domain.ru/reports/calamaris/days/
#./calam_rep.sh yesterday
  • Создаём журнальный файл /var/log/calam_rep.log, куда будем записывать результаты запуска скрипта по cron:
#touch /var/log/calam_rep.log

- Для сборки библиотеки GD из исходников, берём её c http://www.boutell.com/gd/

- Если не установлена поддержка jpeg и png с заголовками, то доустанавливаем и проверяем куда установелно:

#rpm -i zlib-devel-1.1.4-8.i386.rpm
#rpm -i libpng-devel-1.2.2-16.i386.rpm
#rpm -i libjpeg-devel-6b-26.i386.rpm
#rpm -ql libpng-devel

...

/usr/include/pngconf.h
/usr/lib/libpng.a

...


  • Устанавливаем библиотеку
#tar -zxvf GD-2.19.tar.gz
#./configure '--with-png=/usr/lib' '--with-jpeg=/usr/lib' '--with-zlib-dir=/usr/lib'

...
Support for PNG library: yes
Support for JPEG library: yes
Support for Freetype 2.x library: no
Support for Fontconfig library: no
Support for Xpm library: no
Support for pthreads: yes
...

#make
#make check
#make install
  • Аналогично устанавливаем библиотеки GDGraph, GDTextUtil, NetAddr-IP. Далее устанавливаем также как для Alt Linux.


Слабое место Calamaris – это статистика по пользователям и сайтам, а сильная сторона – это общая статистика по нагрузке на прокси-сервер. Все отчёты последовательно отображаются на одной html-страничке. Некоторые отчёты не отображаются, если в журнале не найдены необходимые для него записи. Мне удалось получить 11 отчётов. Вот их описание:

Summary суммарная информация по работе прокси сервера (рис.1)
Incoming requests by method Входящие запросы по методу (Get, Post …)
Incoming UDP(TCP)-requests by status Входящие запросы по статусу (HIT, MISS, DENIED …)
Outgoing requests by status Исходящие запросы по статусу
Outgoing requests by destination Исходящие запросы по месту назначения
Request-destinations by 2nd-level-domain Сгруппированная статистика для доменов 2-го уровня, т.е. запросы на site1.example.com и site2.example.com суммируются в статистике для домена example.com
Request-destinations by toplevel-domain Сгруппированная статистика для доменов 1-го уровня, т.е. ru, com, org …
TCP-Request-protocol Распределение трафика по протоколам (рис.2)
Requested content-type Распределение трафика по значению поля Content-type и по статусу входящих TCP запросов (TCP_HIT, TCP_MISS, TCP_DENIED, и т.д.)
Requested extensions Распределение трафика по расширениям запрошенных файлов, т.е. gif, htm…
Incoming UDP(TCP)-requests by host Статистика по пользователям (количество запросов, скаченный объём)

Calamaris1.png

рис.1. Calamaris. Cуммарная информация по работе прокси сервера

Calamaris2.png

рис.2. Calamaris. Распределение трафика по протоколам


  • Осталось автоматизировать генерацию отчётов путём добавления в /etc/crontab соответствующих заданий:
#Генерируем отчёты прокси сервера Squid
30 0 * * * root /etc/calamaris/calam_rep.sh yesterday >> /var/log/calam_rep.log
35 0 * * 1 root /etc/calamaris/calam_rep.sh week >> /var/log/calam_rep.log
45 0 1 * * root /etc/calamaris/calam_rep.sh month > /var/log/calam_rep.log

Статистика для отдельного пользователя

Calamaris собирает общую статистику, но можно настроить сбор и по одному пользователю. Для этого нужно создать отдельный конфигурационный файл со слегка изменёнными настройками. Копируем файл конфигурации calamaris:

# cp /etc/calamaris/calamaris.conf /etc/calamaris/calamaris_ip.conf

Меняем в нём настройки, чтобы получилось следующее:

$domain_report = -1;
$domain_report_n_level = -1;
$performance_report = 60;
$requester_report = -1;
$requester_report_with_targets = -1;
$status_report = 1;
$type_report = -1;
$type_report_ignore_case= 1;
$hostname= 'lookup';
$output_format = 'html,graph';
$output_file= 'index.html';
$show_reports = '0,2,7,8,9,10,11,12,13,14';

Создаём скрипт /etc/calamaris/calam_rep_ip.sh, определяя в нём переменные

#!/bin/bash
# Script for calamaris 3 to generate squid reports for ip
#
# The most recent version of this script you can find at
#  http://sysadminwiki.ru/wiki/Calamaris
# "Usage: calam_rep_ip.sh [today|yesterday|week|month|year] [ip_address]"
#
# Pavel Malakhov 16.05.05 
#       01.06.05 fixed problem with non-English letters in logs ($LANG added)
#       22.06.05 added different dir (including cache) for each ip
#       17.08.06 fixed week report:  7-th day added for a week. 
#                fixed month report: day.1 -> day.01 in the code for a month
#                added year report 
#         (changes applied acording to calam_rep.sh and did not checked yet!)

# ip to monitor, can be overrided by command line parameter
# IP='10.0.10.0/24:10.0.0.5:10.0.0.7';   # monitor whole subnet and 2 ip addresses

IP='10.0.0.199';
if [ "$2" != "" ]; then
  IP=$2;
fi

CALAM_DIR='/etc/calamaris';                    # where calamaris is
SQUID_LOG_DIR='/var/log/squid';                # where squid logs are
# where to store reports. Root dir, all the other will be created by this script
REP_PATH_PREFIX='/var/www/html/admin/reports/calamaris/ip';
CACHE_DIR="/etc/calamaris/cache_ip/$IP";     # where to store cache files for every week
YESTD=`date -d yesterday +%d`;               # yesterday's day of month
YESTW=`date -d yesterday +%V`;               # yesterday's week of year
YESTM=`date -d yesterday +%m`;               # yesterday's month number
YESTM2=`date -d yesterday +%m_%B`;           # yesterday's month number and name
YESTY=`date -d yesterday +%Y`;               # yesterday's year

# There is a problem with processing non-English letters, if $LANG=en_US.UTF-8
# So we have to redefine the variable. If it sets to something else or you don't
# expirience the problem, comment these 2 lines.
LANG=en_US
export $LANG


# ------------ You don't need to edit anything below ---------------------------
# ------------------ [but welcome to analyze!] ---------------------------------

# Check for dir for report. Create, if does not exist.
function checkdir {
     if [ ! -e "$REPPATH" ];then
       echo -n `date +%c` "Dir \"$REPPATH\" is not created. Creating...   ";   
       mkdir -p $REPPATH;   
       echo "Done.";
     fi;
}

# Check for parameters
if [ "$1" = "" ]; then
  echo "Usage: calam_rep_ip.sh [today|yesterday|week|month|year] [ip_address]";
  exit 1;
fi

# check for cache dir
if [ ! -e "$CACHE_DIR" ];then                              
   echo -n `date +%c` "Cache dir \"$CACHE_DIR\" is not created. Creating...   ";   
   mkdir -p $CACHE_DIR;   
   echo "Done.";
fi;

case "$1" in
  "today" )
     REPPATH=$REP_PATH_PREFIX'/today';
     checkdir;
     cd $CALAM_DIR;
     echo -n `date +%c` "Processing data for today...   ";
     cat $SQUID_LOG_DIR/access.log | ./calamaris.pl --config-file ./calamaris_ip.conf --ipfilter-include $IP --output-path $REPPATH;
     ;;

  "yesterday" )
     REPPATH=$REP_PATH_PREFIX'/days/'$YESTD;
     checkdir;
     cd $CALAM_DIR;
     echo -n `date +%c` "Processing data for yesterday...   ";
     cat $SQUID_LOG_DIR/access.log.0 | ./calamaris.pl --config-file ./calamaris_ip.conf --ipfilter-include $IP \
--output-path $REPPATH --cache-output-file $CACHE_DIR/day.$YESTD;
     ;;

  "week" )
     REPPATH=$REP_PATH_PREFIX'/weeks/'$YESTW'/'$IP;
     checkdir;
     cd $SQUID_LOG_DIR;
     echo -n `date +%c` "Processing data for week...   ";
     cat access.log.7 access.log.6 access.log.5 access.log.4 access.log.3 access.log.2 access.log.1 access.log.0  \
| $CALAM_DIR/calamaris.pl --config-file $CALAM_DIR/calamaris_ip.conf --ipfilter-include $IP \
--output-path $REPPATH  --cache-output-file $CACHE_DIR/week.$YESTW;
     ;;

  "month" )
     REPPATH=$REP_PATH_PREFIX'/months/'$YESTM2'/'$IP;
     checkdir;
     cd $CACHE_DIR;
     CACHEFILES="";
     for ((i=1; i<=31; i++)); do
       if [ "$i" -lt "10" ];  then 
           FILE='day.0'$i
         else 
           FILE='day.'$i
       fi       
       if [ -e "$FILE" ]; then 
         if ["$CACHEFILES" = ""]; then 
           CACHEFILES=$FILE;
         else
           CACHEFILES=$CACHEFILES':'$FILE;
         fi
       fi    
     done 
     echo 'files to process '$CACHEFILES;
     echo -n `date +%c` "Processing data for month...   ";
     $CALAM_DIR/calamaris.pl --config-file $CALAM_DIR/calamaris_ip.conf --ipfilter-include $IP --cache-input-file \
$CACHEFILES --no-input --output-path $REPPATH  --cache-output-file $CACHE_DIR/month.$YESTM;
     echo "Done";
     # clean up cache directory at the start of a month
     # delete only cached days, leave cached weeks 
     DD=`date +%d`;
     if [ "$DD" = "01" ]; then 
       echo -n `date +%c` "Cleaning up cache dir...   ";
       rm -f $CACHE_DIR/day.*;
     fi
     ;;

  "year" )
     REPPATH=$REP_PATH_PREFIX'/years/'$YESTY;
     checkdir;
     cd $CACHE_DIR;
     CACHEFILES="";
     for ((i=1; i<=12; i++)); do
       if [ "$i" -lt "10" ];  then 
         CFILE='month.0'$i;
       else  
         CFILE='month.'$i;
       fi        
       if [ -e "$CFILE" ]; then 
         if [[ $CACHEFILES = "" ]]; then 
           CACHEFILES=$CFILE;
         else
           CACHEFILES=$CACHEFILES':'$CFILE;
         fi
       fi    
     done 
     echo 'files to process '$CACHEFILES;
     echo -n `date +%c` "Processing data for month...   ";
     $CALAM_DIR/calamaris.pl --config-file $CALAM_DIR/calamaris_ip.conf --cache-input-file $CACHEFILES \
--no-input --output-path $REPPATH --cache-output-file $CACHE_DIR/year.$YESTY;
     echo "Done";
     # clean up cache directory at the start of a year
     DD=`date +%d`;
     MM=`date +%m`;
     if [ "$MM" = "01" ]; then 
       if [ "$DD" = "01" ]; then 
         echo -n `date +%c` "Cleaning up cache dir...   ";
         rm -f $CACHE_DIR/week.*;
         rm -f $CACHE_DIR/month.*;
       fi
     fi
     ;;
 
esac
echo "Done";
echo `date +%c` "---Everything is done" 
exit 0

Запускаем его, например, так:

# /etc/calamaris/calam_rep_ip.sh week 10.0.0.5

В веб браузере смотрим результат.