Asterisk. Статистика звонков в MySQL.
Запись статистики, Asterisk, ведет автоматически, если загружен модуль cdr_csv.so, статистика ведется по умолчанию в /var/log/asterisk/cdr-csv/Master.csv. Этой статистики в принципе достаточно, но работать не удобно. Удобней всего обрабатывать статистику хранящуюся в базе. Для того, что бы статистика писалась в MySQL нужно установить из портов:
cd /usr/ports/net/asterisk-addons/ make install clean
В начале появится конфигурационный диалог с одним пунктом:
┌────────────────────────────────────────────────────────────────────┐ │ Options for asterisk-addons 1.4.6_4 │ │ ┌────────────────────────────────────────────────────────────────┐ │ │ │ [X] SAMPLE_CONFIG Install sample configuration files │ │ │ │ │ │ │ │ │ │ ├─└────────────────────────────────────────────────────────────────┘─┤ │ [ OK ] Cancel │ └────────────────────────────────────────────────────────────────────┘
Выбираем этот пункт, он позволяет разместить примеры конфигурационных файлов. А примеры нам пригодятся и ждем когда соберется модуль.
Естественно, у вас уже должен быть сервер MySQL, клиента при сборке порт вытащит по депендам.
После того, как все оберется приступаем к настройке.
В первую очередь создадим базу asterisk в MySQL и пользователя asterisk с паролем asterisk-123. Для этого подключаемся к MySQL и выполняем такие команды:
mysql -uroot create database asterisk; grant all on asterisk.* to 'asterisk'@'localhost' identified by 'asterisk-777';
и теперь создадим таблицу в которой будем хранить информацию:
USE asterisk; CREATE TABLE `cdr` ( `calldate` datetime NOT NULL default '0000-00-00 00:00:00', `clid` varchar(80) NOT NULL default '', `src` varchar(80) NOT NULL default '', `dst` varchar(80) NOT NULL default '', `dcontext` varchar(80) NOT NULL default '', `channel` varchar(80) NOT NULL default '', `dstchannel` varchar(80) NOT NULL default '', `lastapp` varchar(80) NOT NULL default '', `lastdata` varchar(80) NOT NULL default '', `duration` int(11) NOT NULL default '0', `billsec` int(11) NOT NULL default '0', `disposition` varchar(45) NOT NULL default '', `amaflags` int(11) NOT NULL default '0', `accountcode` varchar(20) NOT NULL default '', `userfield` varchar(255) NOT NULL default '' );
Как вы можете заметить приведенная таблица совсем без индексов. Почему? Да все очень просто, индексы при каждой вставке новой записи пересчитываются, это замедляет работу с базой. При большой интенсивности звонков это может негативно отразится на работе. Если для вас скорость построения отчета более важна(работа select, выборка статистики), можно добавить индексы.
create index cld_idx on cdr(calldate); create index src_idx on cdr(src); create index dst_idx on cdr(dst); create index acc_idx on cdr(accountcode);
Теперь настроим подключение к MySQL, для этого внесем в файл /usr/local/etc/asterisk/cdr_mysql.conf настройки на наш аккаунт MySQL:
[global] hostname=localhost dbname=asterisk table=cdr password=asterisk-777 user=asterisk sock=/tmp/mysql.sock userfield=1
И загрузить модуль в астериск. Для этого подключимся к работающем астериску и загрузим модуль:
asterisk -r
load cdr_addon_mysql.soAsterisk должен написать что то типа такого:
The 'load' command is deprecated and will be removed in a future release. Please use 'module load' instead. == Parsing '/usr/local/etc/asterisk/cdr_mysql.conf': Found Loaded cdr_addon_mysql.so => (MySQL CDR Backend)
Но это еще не все. Модуль будет болтаться в памяти, а статистика вестись не будет. Нужно вызвать подключение MySQL, делается это в extentions.conf при обработке звонка:
[dialout] exten => _8.,1,MYSQL(Connect connid localhost asterisk asterisk-777 asterisk) exten => _8.,2,Dial(SIP/prov1/${EXTEN}) exten => h,1,MYSQL(Disconnect ${connid})
Последняя строка MYSQL(Disconnect ${connid}) – обязательна, задается она в extention h. h – это обработчик вызываемый при hangup, то есть когда разрывается канал связи, а попросту когда одна из сторон ложит трубку.
На этом настройка закончена. Статистика будет писаться и считать ее, можно так, допусти сколько назвонил абонент 333 на 8-ку:
select sum(billsec) from cdr where src='333' and dst like '8%';
Ну в общем тут можно много разных вариантов придумать. Можно использовать ограничение времени calldate, работать с разными направлениями и т.д. и т.п. в общем насколько знаний SQL хватит.




By дима, 24.03.2010 @ 13:25
Огромное спасибо за проделанную вами роботу после ваших статей все стало ясно как белый день.
By Soeti, 27.08.2010 @ 11:18
В новых версиях Астериск уже не понимает директивы load
нужно писать module load, чтобы заработало
By root, 08.09.2010 @ 12:49
А еще, в версии 1.4 по крайней мере точно, не нужна запись
[dialout]
exten => _8.,1,MYSQL(Connect connid localhost asterisk asterisk-777 asterisk)
exten => _8.,2,Dial(SIP/prov1/${EXTEN})
exten => h,1,MYSQL(Disconnect ${connid})
и так нормально складывает логи.