CDR. Статистика звонков Asterisk в MySQL

Asterisk LogoМы уже имеем настроенный сервер Asterisk через который Oktell осуществляет звонки на мобильные. Вся статистика храниться в /var/log/asterisk/cdr-csv/Master.csv Не очень удобно в плане работы… Вот и хочу перенести все в MySQL, а потом смогу эту информацию использовать в сценариях Oktell. Как и в предыдущей статье все будим собирать с исходников на Ubuntu Linux.
Приступим!

Проверяем, установлен ли у нас MySQL и клиентская библиотека:

dpkg -l mysql-server libmysqlclient*dev

ii  mysql-server              5.1.41-3ubuntu12.6        MySQL database server

Мне нужно установить дополнительно установить клиентскую библиотеку:

aptitude install libmysqlclient-dev

Качаем исходники и собираем модули:

svn checkout http://svn.digium.com/svn/asterisk-addons/branches/1.6.2 asterisk-addons-1.6.2
cd asterisk-addons-1.6.2 
./configure 
make clean 
make 
make install
make sample

Прописываем в файле modules.conf загрузку модуля:

; MySQL CDR
load => cdr_addon_mysql.so

Дальше, нужно создать в MySQL пользователя, базу и таблицу:

CREATE USER 'asterisk'@'localhost' IDENTIFIED BY  'password';

GRANT USAGE ON * . * TO  'asterisk'@'localhost' IDENTIFIED BY  '***' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;

CREATE DATABASE IF NOT EXISTS  `asterisk` ;

GRANT ALL PRIVILEGES ON  `asterisk` . * TO  'asterisk'@'localhost';

FLUSH PRIVILEGES ;

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 '',
`hangupcause` VARCHAR( 50 ) NOT NULL ,
`peerip` VARCHAR( 50 ) NOT NULL ,
`recvip` VARCHAR( 50 ) NOT NULL ,
`fromuri` VARCHAR( 50 ) NOT NULL ,
`uri` VARCHAR( 50 ) NOT NULL ,
`useragent` VARCHAR( 50 ) NOT NULL ,
`codec1` VARCHAR( 50 ) NOT NULL ,
`codec2` VARCHAR( 50 ) NOT NULL ,
`llp` VARCHAR( 50 ) NOT NULL,
`rlp` VARCHAR( 50 ) NOT NULL ,
`ljitt` VARCHAR( 50 ) NOT NULL ,
`rjitt` VARCHAR( 50 ) NOT NULL
); 

ALTER TABLE `cdr` ADD `uniqueid` VARCHAR(32) NOT NULL default ''; 
ALTER TABLE `cdr` ADD INDEX ( `calldate` ); 
ALTER TABLE `cdr` ADD INDEX ( `dst` ); 
ALTER TABLE `cdr` ADD INDEX ( `accountcode` );

Переходим к файлу /etc/asterisk/cdr_mysql.conf и прописываем наши параметры доступа к базе и расширенные параметры логирования:

[global]
hostname=localhost
dbname=asterisk
table=cdr
password=password 
user=asterisk

[columns]
alias start => calldate
alias callerid => clid
alias hangupcause => hangupcause
alias peerip => peerip
alias recvip => recvip
alias fromuri => fromuri
alias uri => uri
alias useragent => useragent
alias codec1 => codec1
alias codec2 => codec2
alias llp => llp
alias rlp => rlp
alias ljitt => ljitt
alias rjitt => rjitt 

Нужные контексты файла /etc/asterisk/extensions.conf прописываем сбор информации в MySQL:

; CDR
;exten h must be in same context!  
exten => h,1,noop("extended CDR") 
exten => h,n,set(CDR(hangupcause)=${HANGUPCAUSE})
exten => h,n,set(CDR(peerip)=${CHANNEL(peerip)})
exten => h,n,set(CDR(recvip)=${CHANNEL(recvip)})
exten => h,n,set(CDR(fromuri)=${CHANNEL(from)})
exten => h,n,set(CDR(uri)=${CHANNEL(uri)})
exten => h,n,set(CDR(useragent)=${CHANNEL(useragent)})
exten => h,n,set(CDR(codec1)=${CHANNEL(audioreadformat)})
exten => h,n,set(CDR(codec2)=${CHANNEL(audiowriteformat)})
exten => h,n,set(CDR(llp)=${CHANNEL(rtpqos,audio,local_lostpackets)})
exten => h,n,set(CDR(rlp)=${CHANNEL(rtpqos,audio,remote_lostpackets)})
exten => h,n,set(CDR(ljitt)=${CHANNEL(rtpqos,audio,local_jitter)})
exten => h,n,set(CDR(rjitt)=${CHANNEL(rtpqos,audio,remote_jitter)})

Перезапускаем Asterisk и делаем звонки. Все, статистика уже в MySQL:

mysql> select * from cdr;
+---------------------+------+---------------+------------+-------------------+-------------------------+-------------------------+---------+---------------------------------------+----------+---------+-------------+----------+-------------+-----------+--------------+-------------+------------+------------+---------+------------------------------+-----------+--------+--------+-----+-----+-------+-------+
| calldate | clid | src | dst | dcontext | channel | dstchannel | lastapp | lastdata | duration | billsec | disposition | amaflags | accountcode | userfield | uniqueid | hangupcause | peerip | recvip | fromuri | uri | useragent | codec1 | codec2 | llp | rlp | ljitt | rjitt |
+---------------------+------+---------------+------------+-------------------+-------------------------+-------------------------+---------+---------------------------------------+----------+---------+-------------+----------+-------------+-----------+--------------+-------------+------------+------------+---------+------------------------------+-----------+--------+--------+-----+-----+-------+-------+
| 2010-10-23 23:17:18 | | +38093xxxxxxx | s | datacard-incoming | Datacard/datacard1-6f10 | SIP/oktell-00000000 | Dial | SIP/500@oktell | 2 | 0 | FAILED | 3 | | | 1287865038.0 | 16 | | | | | | slin | slin | | | | |
| 2010-10-23 23:17:21 | | asterisk | 093xxxxxxx | gsm-out | SIP/oktell-00000001 | Datacard/datacard1-ea69 | Dial | Datacard/i:358705030202263/093xxxxxxx | 12 | 1 | ANSWERED | 3 | | | 1287865041.2 | 16 | 10.10.10.1 | 10.10.10.1 | | sip:asterisk@10.10.10.1:5060 | Oktell | slin | slin | 1 | 0 | 0 | 0 |
| 2010-10-23 23:17:41 | | asterisk | 093xxxxxxx | gsm-out | SIP/oktell-00000002 | Datacard/datacard1-266d | Dial | Datacard/i:358705030202263/093xxxxxxx | 12 | 3 | ANSWERED | 3 | | | 1287865061.4 | 16 | 10.10.10.1 | 10.10.10.1 | | sip:asterisk@10.10.10.1:5060 | Oktell | slin | slin | 1 | 0 | 12 | 0 |
+---------------------+------+---------------+------------+-------------------+-------------------------+-------------------------+---------+---------------------------------------+----------+---------+-------------+----------+-------------+-----------+--------------+-------------+------------+------------+---------+------------------------------+-----------+--------+--------+-----+-----+-------+-------+
3 rows in set (0.00 sec)

2 Comments on "CDR. Статистика звонков Asterisk в MySQL"


  1. Попробовал ваш совет, но не все данные пишутся в БД. Инфо о кодеках выводится, а вот некоторые остальные ошибка такого типа

    Executing [h@russiacalls:3] Set(“SIP/home-000000ce”, “CDR(llp)=”) in new stack
    [Sep 22 11:21:10] WARNING[26692]: sip/dialplan_functions.c:225 sip_acf_channel_read: Unrecognized argument ‘rtpqos,audio,remote_lostpackets’ to CHANNEL

    В чем может быть ошибка? Asterisk 10.8.0

Leave a Reply

Your email address will not be published. Required fields are marked *