Авг 11 2009

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.so

Asterisk должен написать что то типа такого:

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 хватит.

Добавить в закладки:

google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru
  • By дима, 24.03.2010 @ 13:25

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

Other Links to this Post


Украинская Баннерная Сеть