Костыль для рисования графиков FreeNibs

Проблемы с установкой, настройкой и работой системных и сетевых программ.

Модераторы: GRooVE, alexco

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
armadex
мл. сержант
Сообщения: 111
Зарегистрирован: 2007-11-07 21:29:33
Откуда: Ukraine, Кривой Рог
Контактная информация:

Костыль для рисования графиков FreeNibs

Непрочитанное сообщение armadex » 2010-09-29 11:20:48

Может кому то понадобится.
rrd_collect.pl (раз в минуту собирает статистику и распихивает по rrd базам)

Код: Выделить всё

#!/usr/bin/perl

use DBI;

$dbname = "";
$username = "";
$password = "";
$dbhost = "";
$dbport = "5432";
$dboptions = "-e";
$dbtty = "ansi";

$dbh = DBI->connect("dbi:Pg:dbname=$dbname;host=$dbhost;port=$dbport;options=$dboptions;tty=$dbtty","$username","$password",
		    {PrintError => 0});

if ($DBI::err != 0) {
  print $DBI::errstr . "\n";
  exit($DBI::err);
}

$rrdtool="/usr/local/bin/rrdtool";
$rrd_data_dir="/usr/home/rrd/rrd_data"; # Папка для хранения RRD баз
$rrd_graph_dir="/ftp/pub/server-stats"; # Папка для хранения графиков
###########################################################
my (@who_is_online) = ();
my (@all_user_list) = ();
my (@all_list) = ();
my (@who_offline) = ();
my (@off_list) = ();
my $time = time;
$before_time = $time - 90;
################ КТО В ОНЛАЙНЕ ############################
$who_online_query = "SELECT username FROM online";

$sth = $dbh->prepare($who_online_query);
$sth->execute();

while (my @who_online = $sth->fetchrow_array())	{
	push(@who_is_online, [@who_online]);
}
################# СПИСОК ВСЕХ ЮЗЕРОВ ######################
$all_users_query = "SELECT username FROM users";

$sth = $dbh->prepare($all_users_query);
$sth->execute();

while (my @all_users = $sth->fetchrow_array())	{
	push(@all_user_list, [@all_users]); 
}
################# ОФФЛАЙН #################################
push(@all_list, @all_user_list, @who_is_online);

for $rsh ( @all_list ) {
$z = "@$rsh";
push (@who_offline, $z);
}

my $hash;
foreach $i (@who_offline){
    $hash{$i}++;
}
    foreach $key (keys %hash){
    if($hash{$key}==1){push(@off_list, $key);}
}

######## ЕСЛИ ЮЗЕР ОНЛАЙН ДОБАВЛЯЕМ СТАТИСТИКУ В RRD БАЗУ ######
$online_update_query = "SELECT online.uid, online.last_change, users.username, users.uid AS usersuid, graph_data.id_user, graph_data.lin_bytes, graph_data.lout_bytes, graph_data.date_time FROM online, users, graph_data \
            WHERE online.uid=users.uid AND graph_data.id_user=online.uid AND graph_data.date_time BETWEEN '$before_time' AND '$time'";

$sth = $dbh->prepare($online_update_query);
$sth->execute();
while (($uid,$last_change,$username,$uuid,$id_user,$in_bytes,$out_bytes,$date_time) = $sth->fetchrow_array()) {
#print "$username\n";
if (!(-e "$rrd_data_dir/$username.rrd"))
    {
   system ("$rrdtool create $rrd_data_dir/$username.rrd \\
     DS:input:ABSOLUTE:600:U:U   \\
     DS:output:ABSOLUTE:600:U:U  \\
     RRA:AVERAGE:0.5:1:600      \\
     RRA:AVERAGE:0.5:6:700      \\
     RRA:AVERAGE:0.5:24:775     \\
     RRA:AVERAGE:0.5:288:797    \\
     RRA:MAX:0.5:1:600          \\
     RRA:MAX:0.5:6:700          \\
     RRA:MAX:0.5:24:775         \\
     RRA:MAX:0.5:288:797");
    }
#
system ($rrdtool." update $rrd_data_dir/$username.rrd N:$out_bytes:$in_bytes");
}
############# ЕСЛИ ЮЗЕР ОФФЛАЙН ЗАБИВАЕМ RRD БАЗУ НОЛЯМИ #####
for $off_name (@off_list) {
#print "$off_name.rrd";
if (!(-e "$rrd_data_dir/$off_name.rrd"))
    {
  system ("$rrdtool create $rrd_data_dir/$off_name.rrd \\
     DS:input:ABSOLUTE:600:U:U   \\
     DS:output:ABSOLUTE:600:U:U  \\
     RRA:AVERAGE:0.5:1:600      \\
     RRA:AVERAGE:0.5:6:700      \\
     RRA:AVERAGE:0.5:24:775     \\
     RRA:AVERAGE:0.5:288:797    \\
     RRA:MAX:0.5:1:600          \\
     RRA:MAX:0.5:6:700          \\
     RRA:MAX:0.5:24:775         \\
     RRA:MAX:0.5:288:797");
    }

system ($rrdtool." update $rrd_data_dir/$off_name.rrd N:0:0");

}
##############################################################
$sth->finish();
$dbh->disconnect();
graph.pl (собственно рисует графики из rrd (раз в 5 минут))

Код: Выделить всё

#!/usr/bin/perl

use DBI;

$dbname = "";
$username = "";
$password = "";
$dbhost = "";
$dbport = "5432";
$dboptions = "-e";
$dbtty = "ansi";

$dbh = DBI->connect("dbi:Pg:dbname=$dbname;host=$dbhost;port=$dbport;options=$dboptions;tty=$dbtty","$username","$password",
                    {PrintError => 0});

if ($DBI::err != 0) {
  print $DBI::errstr . "\n";
  exit($DBI::err);
}

$rrdtool="/usr/local/bin/rrdtool";
$rrd_data_dir="/usr/home/rrd/rrd_data"; # Папка для хранения RRD баз
$rrd_graph_dir="/ftp/pub/server-stats"; # Папка для хранения графиков
##############################################
$get_users_query = "SELECT username FROM users";

$sth = $dbh->prepare($get_users_query);
$sth->execute();

while (($username) = $sth->fetchrow_array()) {

if (!(-e "$rrd_data_dir/$username.rrd"))
    {
   system ("$rrdtool create $rrd_data_dir/$username.rrd \\
     DS:input:ABSOLUTE:600:U:U   \\
     DS:output:ABSOLUTE:600:U:U  \\
     RRA:AVERAGE:0.5:1:600      \\
     RRA:AVERAGE:0.5:6:700      \\
     RRA:AVERAGE:0.5:24:775     \\
     RRA:AVERAGE:0.5:288:797    \\
     RRA:MAX:0.5:1:600          \\
     RRA:MAX:0.5:6:700          \\
     RRA:MAX:0.5:24:775         \\
     RRA:MAX:0.5:288:797");
    }
%date_data =(
                'day'   => '-86400:-300',
                'week'  => '-604800:-1800',
                'month' => '-2678400:-7200',
                'year'  => '-33053184:-86400',
               );

   $inceil  = 1024*1024;
   $outceil = 1024*1024;

   foreach $_ (keys %date_data)
   {
     ($start, $end) = split (/:/, $date_data{$_});
     system "$rrdtool graph $rrd_graph_dir/$username-$_.png \\
         --start $start --end $end \\
             --width 650 --height=150 --rigid --alt-autoscale-max --lower-limit=0 \\
             --vertical-label=\"bits per second\" \\
             --color CANVAS#F1F1F1 \\
             DEF:in=$rrd_data_dir/$username.rrd:input:AVERAGE \\
             DEF:out=$rrd_data_dir/$username.rrd:output:AVERAGE \\
             CDEF:inbits=in,8,* \\
             CDEF:outbits=out,8,* \\
             CDEF:inperc=inbits,100,* \\
             CDEF:outperc=outbits,100,* \\
             CDEF:inperc_res=inperc,$inceil,/ \\
             CDEF:outperc_res=outperc,$outceil,/ \\
             AREA:inbits#00CC00:\"Input (Kbit/s)\"  \\
             LINE1:outbits#0000FF:\"Output (Kbit/s)\" \\
             COMMENT:\"\\n\" \\
             COMMENT:\"\\n\" \\
             COMMENT:\"Max In\\:\" \\
             GPRINT:inbits:MAX:\"  %4.2lf %sb/s\\g\" \\
             GPRINT:inperc_res:MAX:\" (%3.1lf\\g\" \\
             COMMENT:\"%)\" \\
             COMMENT:\"  Avg In\\:\" \\
             GPRINT:inbits:AVERAGE:\"  %4.2lf %sb/s\\g\" \\
             GPRINT:inperc_res:AVERAGE:\" (%3.1lf\\g\" \\
             COMMENT:\"%)\" \\
             COMMENT:\"  Cur In\\:\" \\
             GPRINT:inbits:LAST:\"  %4.2lf %sb/s\\g\" \\
             GPRINT:inperc_res:LAST:\" (%3.1lf\\g\" \\
             COMMENT:\"%)\" \\
             COMMENT:\"\\n\" \\
             COMMENT:\"Max Out\\:\" \\
             GPRINT:outbits:MAX:\" %4.2lf %sb/s\\g\" \\
             GPRINT:outperc_res:MAX:\" (%3.1lf\\g\" \\
             COMMENT:\"%)\" \\
             COMMENT:\"  Avg Out\\:\" \\
             GPRINT:outbits:AVERAGE:\" %4.2lf %sb/s\\g\" \\
             GPRINT:outperc_res:AVERAGE:\" (%3.1lf\\g\" \\
             COMMENT:\"%)\" \\
             COMMENT:\"  Cur Out\\:\" \\
             GPRINT:outbits:LAST:\" %4.2lf %sb/s\\g\" \\
             GPRINT:outperc_res:LAST:\" (%3.1lf\\g\" \\
             COMMENT:\"%)\" \\
             COMMENT:\"\\n\" >/dev/null";

	}
}

$sth->finish();
$dbh->disconnect();
SQL

Код: Выделить всё

CREATE TABLE "graph_data" (
	"graph_id" BIGSERIAL NOT NULL,
	"id_user" int8 NOT NULL DEFAULT (0)::bigint,
	"lin_bytes" int8 NOT NULL DEFAULT (0)::bigint,
	"lout_bytes" int8 NOT NULL DEFAULT (0)::bigint,
	"date_time" int4 NOT NULL DEFAULT unix_timestamp(now()),
  CONSTRAINT "graph_data_pkey" PRIMARY KEY("graph_id")
)
WITHOUT OIDS;

CREATE RULE "graph_data_act" AS
    ON UPDATE TO actions DO ALSO 
    INSERT INTO graph_data (id_user, lin_bytes, lout_bytes) VALUES(OLD.uid, NEW.in_bytes-OLD.in_bytes, NEW.out_bytes-OLD.out_bytes);
Ну и результат всего этого безобразия (График на юзера, тарифный план 1Мбит):
Изображение
Вложения
rrd_graph.tar.bz2
(2.55 КБ) 28 скачиваний
Автор благодарит алфавит за любезно предоставленные буквы!

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
vadim64
майор
Сообщения: 2101
Зарегистрирован: 2009-09-17 15:15:26
Откуда: Засратовец

Re: Костыль для рисования графиков FreeNibs

Непрочитанное сообщение vadim64 » 2010-09-29 15:49:58

какую статистику? откуда? где HOWTO и дикламейшн к продукту вашему?
Люди не делятся на национальности, партии, фракции и религии. Люди делятся на умных и дураков, а вот дураки делятся на национальности, партии, фракции и религии.

Аватара пользователя
armadex
мл. сержант
Сообщения: 111
Зарегистрирован: 2007-11-07 21:29:33
Откуда: Ukraine, Кривой Рог
Контактная информация:

Re: Костыль для рисования графиков FreeNibs

Непрочитанное сообщение armadex » 2010-09-29 16:03:45

статистику по трафику, написано ж что для FreeNibs'а, а именно третьей ветки, по поводу откуда, естественно что из базы PostgreSQL
Автор благодарит алфавит за любезно предоставленные буквы!

Аватара пользователя
hizel
дядя поня
Сообщения: 9031
Зарегистрирован: 2007-06-29 10:05:02
Откуда: Выборг

Re: Костыль для рисования графиков FreeNibs

Непрочитанное сообщение hizel » 2010-09-29 16:41:27

пишется конечно с пинка, но я поднял, так как мне цветовая схема нравится, чтобы не потерять когда займусь :]
В дурацкие игры он не играет. Он просто жуткий, чу-чу, паровозик, и зовут его Блейн. Блейн --- это Боль.

Аватара пользователя
armadex
мл. сержант
Сообщения: 111
Зарегистрирован: 2007-11-07 21:29:33
Откуда: Ukraine, Кривой Рог
Контактная информация:

Re: Костыль для рисования графиков FreeNibs

Непрочитанное сообщение armadex » 2010-09-29 19:51:46

других вариантов к сожалению не придумал(((
Автор благодарит алфавит за любезно предоставленные буквы!

Аватара пользователя
hizel
дядя поня
Сообщения: 9031
Зарегистрирован: 2007-06-29 10:05:02
Откуда: Выборг

Re: Костыль для рисования графиков FreeNibs

Непрочитанное сообщение hizel » 2010-09-29 19:54:55

каких таких других вариантов?
В дурацкие игры он не играет. Он просто жуткий, чу-чу, паровозик, и зовут его Блейн. Блейн --- это Боль.

Аватара пользователя
armadex
мл. сержант
Сообщения: 111
Зарегистрирован: 2007-11-07 21:29:33
Откуда: Ukraine, Кривой Рог
Контактная информация:

Re: Костыль для рисования графиков FreeNibs

Непрочитанное сообщение armadex » 2010-09-29 20:54:25

ну можно еще рисовать с помощью Cacti при условии использовании mpd и привязке пользователя к определенному ng интерфейсу
Автор благодарит алфавит за любезно предоставленные буквы!

Аватара пользователя
hizel
дядя поня
Сообщения: 9031
Зарегистрирован: 2007-06-29 10:05:02
Откуда: Выборг

Re: Костыль для рисования графиков FreeNibs

Непрочитанное сообщение hizel » 2010-09-29 21:25:48

кактус как и php не нужен :(
В дурацкие игры он не играет. Он просто жуткий, чу-чу, паровозик, и зовут его Блейн. Блейн --- это Боль.

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35262
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: Костыль для рисования графиков FreeNibs

Непрочитанное сообщение Alex Keda » 2010-09-29 21:25:52

а чё тема в новостях делает?
я помоему её уже выносил оттуда пару дней назад.
Убей их всех! Бог потом рассортирует...

Аватара пользователя
hizel
дядя поня
Сообщения: 9031
Зарегистрирован: 2007-06-29 10:05:02
Откуда: Выборг

Re: Костыль для рисования графиков FreeNibs

Непрочитанное сообщение hizel » 2010-09-29 21:26:50

я важность поставил :-[
В дурацкие игры он не играет. Он просто жуткий, чу-чу, паровозик, и зовут его Блейн. Блейн --- это Боль.

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35262
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: Костыль для рисования графиков FreeNibs

Непрочитанное сообщение Alex Keda » 2010-10-01 7:55:17

зачем?
Убей их всех! Бог потом рассортирует...

Аватара пользователя
hizel
дядя поня
Сообщения: 9031
Зарегистрирован: 2007-06-29 10:05:02
Откуда: Выборг

Re: Костыль для рисования графиков FreeNibs

Непрочитанное сообщение hizel » 2010-10-01 8:40:59

думал значком каким пометится, а оно вишь куда вылезло, до чего техника форумная дошла
В дурацкие игры он не играет. Он просто жуткий, чу-чу, паровозик, и зовут его Блейн. Блейн --- это Боль.