Биллинговая система Nodeny

Главная категория => Разработка => Тема начата: blackjack от 11 Января 2010, 21:13:22



Название: мониторинг юзверей на основе cacti
Отправлено: blackjack от 11 Января 2010, 21:13:22
выделено из топика http://forum.nodeny.com.ua/index.php?topic=367.0  (c) elite



Ой, да ладно, все итак открыто, изложу суть модуля.
Может у тс и по другому немного, но кто захочет разобратся, тот это сделает.
Итак.
Скрипт который из базы биллинга выдергивает имена юзеров и создает в какти графики для каждого пользователя.
Почитать как добавить график из командной строки можно сдесь http://www.cacti.net/downloads/docs/html/cli_add_graphs.html (http://www.cacti.net/downloads/docs/html/cli_add_graphs.html)
Код:
#!/usr/bin/perl

use DBI;

$main_config='/usr/local/nodeny/nodeny.cfg.pl';
require $main_config;

$DSN="DBI:mysql:database=$db_name;host=$db_server;mysql_connect_timeout=$mysql_connect_timeout;";
$dbh=DBI->connect($DSN,$user,$pw,{PrintError=>1});

$uq=300; #первыйх N юзеров для которых надо создать графики
$tmpl_id=36; #graph-template-id читаем это http://www.cacti.net/downloads/docs/html/cli_add_graphs.html
$hid=3; #host-id читаем это http://www.cacti.net/downloads/docs/html/cli_add_graphs.html

for($i=1; $i<=$uq; $i++)
{
$query="SELECT `name` FROM `users` WHERE `id`=$i";

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

$rv=$sth->fetchrow_hashref;
$username=$rv->{name};

    if ($username ne "")
    {
    system("/usr/local/bin/php /usr/local/share/cacti/cli/add_graphs.php --graph-type=cg --graph-template-id=$tmpl_id --input-fields=\"uid=$i\" --graph-title=$username --host-id=$hid --force");
    }
}

дальше делаем скрипт, который будет из базы биллинга выбирать из X таблиц данные по трафику для юзера по id за последние 5 минут и скармливаем аутпут какти.

Код:
#!/usr/bin/perl

use DBI;

$main_config='/usr/local/nodeny/nodeny.cfg.pl';
require $main_config;

$DSN="DBI:mysql:database=$db_name;host=$db_server;mysql_connect_timeout=$mysql_connect_timeout;";
$dbh=DBI->connect($DSN,$user,$pw,{PrintError=>1});

$userid=$ARGV[0];

my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime time;

$year=$year+1900;
$mon=$mon+1;

$query="SELECT SUM(`in`)*8/300 AS `averin`,SUM(`out`)*8/300 AS `averout` FROM `x".$year."x".$mon."x".$mday."` WHERE `mid`=".$userid." AND FROM_UNIXTIME(`time`)>'".$year."-".$mon."-".$mday." ".$hour.":".($min-5).":".$sec."'";

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

$rv=$sth->fetchrow_hashref;
if ($rv->{averin} && $rv->{averout})
{
print "in:$rv->{averin} out:$rv->{averout}";
}else
{
print "in:0 out:0";
}

дальше сама настройка какти

1. Логинимся
2. Console
3. Data Input Methods
  3.1 Add
  3.2 Name  -  Users traffic
  3.3 Input Type  -  Script/Command
  3.4 Input String  -  perl <path_cacti>/scripts/userstraf.pl <id>
  3.5 Create
  3.6 Input Fields->Add
     3.6.1 Friendly Name - User id
     3.6.2 Create
  3.7 Output Fields->Add
     3.7.1 Field [Output] - in
     3.7.2 Friendly Name - Traffic in
     3.7.3 Create
 3.8 Output Fields->Add
     3.7.1 Field [Output] - out
     3.7.2 Friendly Name - Traffic out
     3.7.3 Create
 3.9 Save
4. Data Templates
 4.1 Add
 4.2 Data Templates [new]-> Name - Users traffic
 4.3 Data Source->Name - User traffic
 4.4 Data Input Method - Users traffic
 4.5 Data Source Item  -> Internal Data Source Name - in
 4.6 Create
 4.7 Data Source Item - New
 4.8 Data Source Item -> Internal Data Source Name - out
 4.9 Custom Data [data input: Users traffic] -> User id - Ставим галочку Use Per-Data Source Value (Ignore this Value)
 4.10 Save
5. Graph Templates
 5.1 Add
 5.2 Template->Name - User traffic
 5.3 Graph Template->Title (--title) - Ставим галочку Use Per-Graph Value (Ignore this Value)
 5.4 Create

 5.5 Graph Template Items
 5.6 Add
 5.7 Data Source - Users traffic - (in)
 5.8 Color - 00CF00
 5.9 Graph Item Type - AREA
 5.10 Consolidation Function - AVERAGE
 5.11 Text Format - Inbound:

 5.12 Graph Template Items
 5.13 Add
 5.14 Data Source - Users traffic - (in)
 5.15 Color - NONE
 5.16 Graph Item Type - GPRINT
 5.17 Consolidation Function - LAST
 5.18 Text Format - Current:

 5.19 Graph Template Items
 5.20 Add
 5.21 Data Source - Users traffic - (in)
 5.22 Color - NONE
 5.23 Graph Item Type - GPRINT
 5.24 Consolidation Function - AVERAGE
 5.25 Text Format - Average:

 5.19 Graph Template Items
 5.20 Add
 5.21 Data Source - Users traffic - (in)
 5.22 Color - NONE
 5.23 Graph Item Type - GPRINT
 5.24 Consolidation Function - MAX
 5.25 Text Format - Maximum:
 5.26 Insert Hard Return - true

6. Повторяем пункты 5.5 - 5.26 только для Data Source - Users traffic - (out)  (пункт 5.7 in меняем на out)
7. Save

8. New Graphs
8.1 Выбираем нужный нам хост   Host:
8.2 Graph Templates->Create: User traffic
8.3 Create
8.4 Create Graph from 'User traffic' - вводим логин юзера   marinka
8.5 User id - 1115

Ну вот один график добавили, выше приведен скрипт который автоматизирует добавление графиков для пользователей из базы данных биллинга.

Ну вот и все. Теперь добавить графики в биллинг дело техники, написать примочку для юзерской статистики либо плагин админки и выводить соответсвующий график при редактировании пользователя в админке или пользователю в его статистике.

этот модуль надо юзать осторожно, а то вчера я добавил прорисовку 2000 юзеров, так нагрузка на проц выросла до 100%
В моем модуле прорисовку 2000 пользователей делать можно!!!! Так что, Василь.... не делай мне тут черный пиар, а признай что сам смастерил что-то ))) только не угадал как ).

а вот нечего и угадывать. если вы прочитали полностью топик, то увидите что нигде нет моих костылей, только автоматизация,
1. Данные для прорисовки графиков уже готовы и есть в базе биллинга
2. Один запрос в базу и передача результата в cacti
3. Скрипт для создания графиков из коммандной строки входит в стандартную поставку CACTI
4. Cacti poller обрабатывает все это

Так вот. Никому я не делаю черный пиар, ничего я не смастерил, а автоматизировал только то что уже было, и помоему точно угадал как.
А вы сами пробовали своим модулем прорисовать графики для 2000 пользователей и промониторить загрузку ЦП?
На сервере который рисовал графики крутится еще dhcp, MySQL и ядро NoDeny.
Сервер

Copyright (c) 1992-2009 The FreeBSD Project.
Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994
   The Regents of the University of California. All rights reserved.
FreeBSD is a registered trademark of The FreeBSD Foundation.
FreeBSD 8.0-RELEASE-p1 #2: Fri Dec 11 11:37:29 EET 2009
    admin@router.ua:/usr/obj/usr/src/sys/GATE_8_0
Timecounter "i8254" frequency 1193182 Hz quality 0
CPU: AMD Athlon(tm) 64 X2 Dual Core Processor 4200+ (2210.20-MHz 686-class CPU)
  Origin = "AuthenticAMD"  Id = 0x60fb2  Stepping = 2
  Features=0x178bfbff<FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CLFLUSH,MMX,FXSR,SSE,SSE2,HTT>
  Features2=0x2001<SSE3,CX16>
  AMD Features=0xea500800<SYSCALL,NX,MMX+,FFXSR,RDTSCP,LM,3DNow!+,3DNow!>
  AMD Features2=0x11f<LAHF,CMP,SVM,ExtAPIC,CR8,Prefetch>
  TSC: P-state invariant
real memory  = 1073741824 (1024 MB)
avail memory = 1031913472 (984 MB)
ACPI APIC Table: <080207 APIC1152>
FreeBSD/SMP: Multiprocessor System Detected: 2 CPUs



Название: Re: мониторинг юзверей на основе cacti
Отправлено: Cell от 11 Января 2010, 22:21:34
Так вот. Никому я не делаю черный пиар, ничего я не смастерил, а автоматизировал только то что уже было, и помоему точно угадал как.
Совсем не угадал. Модуль сделал с нуля и к Cacti не имеет отношения.
А вы сами пробовали своим модулем прорисовать графики для 2000 пользователей и промониторить загрузку ЦП?
В моем, даже очень воспаленном мозгу не могло бы такое придуматься т.к. это изначально бредовая идея так напрягать сервер.
В моем модуле график рисуется только во время обращения именно к нужной странице биллинга и не перерисовывается если к нему обратится в течении следующих 5 минут тем самым не позволяя юзеру задосить сервер постоянными обновлениями страницы, а для этого рисуночеггг складывается на винт и показывается как ни в чем ни бывало.
Будем дальше спорить что любой даже самый скромный сервачек без напряга выполнит 2000 запросов к базе в течении каждых 5 минут?
На сервере который рисовал графики крутится еще dhcp, MySQL и ядро NoDeny.
Хоть атомный реактор там еще установлен, по данной схеме будет все валится. Я использую Cacti только для мониторинга сетевых интерфейсов всех серверов сети (по snmp), загрузки их проциков, распределения памяти и вольтажа бесперебойников.