В этой статье мы расскажем, как мы ловим в voip атс Asterisk пропущенные звонки . Пропущенные звонки — звонки не получившие ответ в очередях. В cdr asterisk нет такого понятия как пропущенные в очередях. Если очередь отвечает, то сразу заносит запись в базу с пометкой ANSWERED. Отлавливать пропущенные звонки (со статусом ABANDONE) будем через стандартное логирование очередей. По умолчанию оно либо выключено, либо ведется в текстовый файл:
1 |
/var/log/asterisk/queue_log |
Парсить этот файл особого смысла нет.
Переходим к правке конфигов:
1 |
nano /etc/asterisk/logger_general_additional.conf |
Приводим его к виду:
1 2 3 4 |
dateformat=%F %T appendhostname=no queue_log=yes rotatestrategy=rotate |
Далее правим:
1 |
nano /etc/asterisk/logger_general_custom.conf |
1 2 |
queue_adaptive_realtime = yes queue_log_to_file = yes |
Если не надо писать лог в файл:
1 |
queue_log_to_file = no |
Далее:
1 |
nano /etc/asterisk/extconfig.conf |
1 2 |
[settings] queue_log=>odbc,asteriskcdrdb,queue_log |
Затем переходим к созданию таблицы:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
CREATE TABLE IF NOT EXISTS `queue_log` ( `time` varchar(32) DEFAULT NULL, `callid` char(64) DEFAULT NULL, `queuename` char(64) DEFAULT NULL, `agent` char(64) DEFAULT NULL, `event` char(32) DEFAULT NULL, `data` char(64) DEFAULT NULL, `data1` char(64) DEFAULT NULL, `data2` char(64) DEFAULT NULL, `data3` char(64) DEFAULT NULL, `data4` char(64) DEFAULT NULL, `data5` char(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; |
Формируем sql запрос для читабельного вывода информации:
1 2 3 4 5 |
SELECT a.callid,a.queuename,a.data3,b.data2 FROM `queue_log` AS a LEFT JOIN `queue_log` AS b ON ( a.`callid` = b.`callid` ) WHERE a.`event` = 'ABANDON' AND b.`event` = 'ENTERQUEUE'; |
Приводим пример вывода таблицы, в чистом mysql
Как видно данная инструкция выводит 4 колонки.
callid — id звонка в cdr;
queuename — номер очереди;
data3 — время ожидания;
data2 — номер пропущенного.
В примере пропущенные номера состоят из трех/четырех знаков, так как использовались не внешние номера для тестов, в реальности будут полноценные номера.
Приводим пример получения информации на php:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<?php ini_set('display_errors',1); error_reporting(0); $hostname = "localhost"; // Хост с бд $username = "ЮЗЕР_БД"; //Юзер БД $password = "ПАРОЛЬ БД"; //Пароль БД $dbname = "asteriskcdrdb"; //База данных mysql_connect($hostname,$username,$password) OR DIE ("Не могу создать подключение"); //Подключение к SQL mysql_select_db($dbname) or die(mysql_error()); //Выбор базы данных $query = "SELECT a.callid,a.queuename,a.data3,b.data2 FROM queue_log AS a LEFT JOIN queue_log AS b ON ( a.`callid` = b.`callid` ) WHERE a.`event` = 'ABANDON' AND b.`event`='ENTERQUEUE'"; //Парсим базу на соответсвие условиям $res = mysql_query($query) or die(mysql_error()); while ($result = mysql_fetch_assoc($res)) { foreach ($result as $key=>$val) { echo $key . ' - ' . $val . "\n"; }; }; ?> |
При выполнении в консоли результат будет выглядеть примерно так:
Как оказалось после каждой перезагрузки, и изменении любых настроек, при использовании freepbx, файл:
1 |
nano /etc/asterisk/extconfig.conf |
перезаписывался. И как следствие лог переставал писаться.
Для избежания пропадания логов был написан скрипт, для сверки md5 сумм, и добавлен в cron.
Текст скрипта представлен ниже:
1 2 3 4 5 6 7 8 9 10 11 12 |
#!/bin/bash fihome=/home/asterisk/extconfig.conf fietc=/etc/asterisk/extconfig.conf file1=md5=`md5sum /etc/asterisk/extconfig.conf | awk '{ print $1 }'` file2=md5=`md5sum /home/asterisk/extconfig.conf | awk '{ print $1 }'` if [ "$file1" == "$file2" ] ; then echo равны else cp $fihome $fietc /usr/sbin/asterisk -rx "core reload" /usr/sbin/asterisk -rx "module reload" fi |