Leider kann Asterisk derzeit das Queue-Log noch nicht direkt in
eine SQL-Datenbank-Tabelle schreiben. Daß die Daten in einer
SQL-Datenbank liegen, ist aber für alle bekannten Statistik-Tools eine
Grundvoraussetzung. Zu diesem Zweck existieren verschiedene
Skripte[73] (meist in Perl) bzw. werden bei den Tools mitgeliefert.
Sie alle gehen den im unten angefügten Skript beschriebenen Weg, die
Datei queue_log
durch eine Named-Pipe (FIFO) zu
ersetzen. Das Skript öffnet die FIFO zum Lesen, und sobald Asterisk eine
Log-Meldung hineinschreibt, wird diese in die Datenbank
eingetragen.
Warnung | |
---|---|
Diese Methode wird vermutlich in 99 % aller Fälle problemlos
funktionieren. Allerdings besteht die Gefahr, daß das Skript, falls es
aus irgendwelchen Gründen nicht vor Asterisk gestartet sein sollte
oder vorzeitig beendet wird, nicht mehr aus der Named-Pipe liest und
Asterisk beim Versuch zu Schreiben ein
|
Da aber ohne Unterstützung durch Asterisk keine wirkliche Alternative besteht, soll hier der theoretischen Gefahr zum Trotz ein Perl-Skript von William Lloyd den Ansatz beschreiben[74]:
#!/usr/bin/perl -w # # wlloyd at slap.net # The asterisk version indpendant way to get queue stats into Mysql, Postgres # or whatever is supported by Perl DBI # It's all about named pipes # to setup this software # stop asterisk # rm /var/log/asterisk/queue_log # mkfifo /var/log/asterisk/queue_log # make sure permissions are setup # chmod 777 /var/log/asterisk/queue_log # run this program as root or under another user as you see fit. # should start BEFORE asterisk. Add to /etc/rc.d/rc.local or whatever # restart asterisk # requires a DB table like the following.. # CREATE TABLE csr_queue ( # qname varchar(30) default NULL, # agent varchar(30) default NULL, # action text, # info1 text, # info2 text, # info3 text, # timestamp int(11) NOT NULL default '0', # id tinytext NOT NULL #) TYPE=MyISAM; use DBI; use IO::File; my $opt_debug = 0; # if you want postgres change this to "Pg" my $db_type = "mysql"; my $db_host = "127.0.0.1"; my $db_user_name = 'username'; my $db_password = 'password'; my $db_database = 'asteriskstat'; my $dbh = DBI->connect("DBI:$db_type:dbname=$db_database;host= $db_host;", $db_user_name, $db_password); open(FIFO, "< /var/log/asterisk/queue_log") or die "Can't open queue_log : $!\n"; while (1) { $message = <FIFO>; next unless defined $message; # interrupted or nothing logged chomp $message; # remove chars that will cause DB problems $message =~ s/\"\'//g; @data = split(/\|/,$message); # these messages are almost useless for my purposes next if ($data[4] eq "QUEUESTART" ); next if ($data[4] eq "CONFIGRELOAD" ); if (!defined($data[5])) { $data[5] = ''; } if (!defined($data[6])) { $data[6] = ''; } if (!defined($data[7])) { $data[7] = ''; } my $sql = "INSERT INTO csr_queue (timestamp, id, qname, agent, action, info1, info2, info3) VALUES ('$data[0]', '$data[1]', '$data [2]', '$data[3]', '$data[4]', '$data[5]', '$data[6]', '$data[7]')"; print "$sql \n\n" if ($opt_debug); $dbh->do($sql); # if you want an actual logfile you might want to uncomment this # if ( open(LOG, ">> /var/log/asterisk/queue_log_real") ) { # print LOG "$message\n"; # close(LOG); # } else { # warn "Couldn't log to /var/log/asterisk_queue_log: $!\n"; # } # } $dbh->disconnect(); exit 0;
Bei QueueMetrics (kostenlose Demo-Version) wird
ebenfalls ein Perl-Skript queueLoader.pl
mitgeliefert (siehe Warnung oben!).
[74] wlloyd at slap.net, veröffentlicht auf der
Digium-Mailingliste asterisk-users
, siehe: http://lists.digium.com/pipermail/asterisk-users/2005-July/109892.html
$Revision:473 $
Beta-Version!
2.0 Entwickler-Version des Asterisk Buches. Die 1.0 stabile Version ist natürlich noch online. Die 2.0er Version enthält viele Neuerungen, ist aber noch nicht 100% fehlerfrei. Im Zweifelsfall bitte auf die 1.0er Version gehen.
Bitte melden Sie Fehler und Feedback zur neuen 2.0er Version per E-Mail an den Autor.
Asterisk-Tag.org 2008
Auf der Asterisk-Tag.org Webseite finden Sie die Folien und Videos der Vorträge.