Asterisk: queue_log в MySQL через unixODBC
Realtime лог очереди в нативную базу данных Asterisk.
SQL таблица лога очереди
Создадим таблицу в БД asterisk.
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;
Выключение текстового лога
Asterisk использует имя - queue_log, по умолчанию
при перезагрузке модуля logger:
*CLI> module reload logger Module 'logger' reloaded successfully. Asterisk Queue Logger restarted
в файле /etc/asterisk/logger.conf выключите лог в файл:
queue_log_to_file = no
в файле /etc/asterisk/asterisk.conf*
[options] queue_adaptive_realtime = no
time | callid | queuename | agent | event | data | data1 | data2 | data3 | data4 | data5 |
---|---|---|---|---|---|---|---|---|---|---|
2017-02-27 11:38:18.212707 | 1488184697.2048062 | 2 | NONE | ENTERQUEUE | |9981138|1| |
Конфигурация realtime family
в файле /etc/asterisk/extconfig.conf
queue_log => odbc,asterisk,queue_log
где 'asterisk' ваш db конфиг в /etc/asterisk/res_odbc.conf:
[asterisk] enabled => yes dsn => asterisk username => dbuser password => dbpass pre-connect => yes
Расшифровка значений событий очереди - queue_log events
event | data1 | data2 | data3 | data4 | data5 |
---|---|---|---|---|---|
ABANDON | exitposition | enterposition | waittime | ||
AGENTDUMP | |||||
AGENTLOGIN | channel | ||||
AGENTCALLBACKLOGIN | exten@context | ||||
AGENTLOGOFF | channel | logintime | |||
AGENTCALLBACKLOGOFF | exten@context | logintime | reason | ||
ADDMEMBER | |||||
REMOVEMEMBER | |||||
COMPLETEAGENT | holdtime | calltime | origposition | ||
COMPLETECALLER | holdtime | calltime | origposition | ||
CONFIGRELOAD | |||||
CONNECT | holdtime | uniqueid | |||
DID(freepbx custom) | did number | ||||
ENTERQUEUE | url | callerid | enterposition | ||
RINGCANCELED | ? | ||||
RINGNOANSWER | Agent Timeout | ||||
EXITWITHKEY | key | position | |||
EXITWITHTIMEOUT | exitposition | enterposition | timeout | ||
QUEUESTART | |||||
SYSCOMPAT | |||||
ATTENDEDTRANSFER | Application | uuid | holdtime | calltime | retry? |
BLINDTRANSFER | number | context | holdtime | calltime | retry |
PAUSE | Reason | ||||
UNPAUSE | Reason |
Пример принятого вызова в таблице MySQL с кастомизированным событием DID:
time | callid | queuename | agent | event | data1 | data2 | data3 |
---|---|---|---|---|---|---|---|
2017-02-17 19:58:25.661590 | 1487339905.409426 | 991 | NONE | DID | 3216111 | ||
2017-02-17 19:58:25.671737 | 1487339905.409426 | 991 | NONE | ENTERQUEUE | 9981138 | 1 | |
2017-02-17 19:58:27.540265 | 1487339905.409426 | 991 | Tanya | CONNECT | 2 | 1487339905.409427 | 1 |
2017-02-17 19:59:32.108944 | 1487339905.409426 | 991 | Tanya | COMPLETECALLER | 2 | 65 | 1 |
В 19:58:25.66 вызов поступил на номер 3216111 с номера 9981138
В 19:58:25.67 попал в очередь 991 сразу на первую позицию и был отвечен агентом Tanya в 19:58:27.54, когда находился на первой же позиции в очереди. Время ожидания составило 2 секунды, а время разговора 65 секунд.
[ext-queues] ... exten => queueName1,n,QueueLog(queueName1,${UNIQUEID},NONE,DID,${FROM_DID}) ...
Таким же образом вы можете создать и сохранить в лог очереди другие пользовательские события и передать в них требуемые данные из канала.
Например, создадим в логе очереди событие IVR, с которым соотнесем время нахождения абонента в голосовом меню, перед тем как он попадет, непосредственно, в очередь вызовов:
exten => card,1,noop(card) same => n,queuelog(card,${UNIQUEID},NONE,DID,${FROM_DID}) same => n,queuelog(card,${UNIQUEID},NONE,IVR,${CDR(billsec)}) same => n,queue(card) same => n,hangup
В самом же голосовом меню создадим событие лога очереди IVR_ABANDON, чтобы учесть пользователей, покинувших ivr до попадания в очередь:
exten => h,1,queuelog(NONE,${UNIQUEID},NONE,IVR_ABANDON,${CALLERID(num)}|${FROM_DID}|${CDR(billsec)}) exten => h,n,hangup
Пример принятого вызова с последующим сопровождаемым переводом:
time | callid | queuename | agent | event | data1 | data2 | data3 | data4 | data5 |
---|---|---|---|---|---|---|---|---|---|
2017-01-07 13:22:08.418825 | 1483773699.76487 | 999 | NONE | DID | 3216111 | ||||
2017-01-07 13:22:08.445013 | 1483773699.76487 | 999 | NONE | ENTERQUEUE | 4226789 | 1 | |||
2017-01-07 13:22:22.203683 | 1483773699.76487 | 999 | Christa Paffgen | CONNECT | NULL | 14 | 1483773740.76488 | 1 | |
2017-01-07 13:23:35.928089 | 1483773699.76487 | 999 | Christa Paffgen | ATTENDEDTRANSFER | BRIDGE | 3fd42053-51ec-4b7a-9174-e6d096a827ce | 14 | 73 | 1 |
Пример пропущенного вызова (ожидающий абонент повесил трубку)
time | callid | queuename | agent | event | data | data1 | data2 | data3 |
---|---|---|---|---|---|---|---|---|
2017-01-02 12:27:39.653242 | 1483338440.1685 | 998 | NONE | DID | NULL | 318 | ||
2017-01-02 12:27:39.683765 | 1483338440.1685 | 998 | NONE | ENTERQUEUE | NULL | 8270213 | 1 | |
2017-01-02 12:27:54.700961 | 1483338440.1685 | 998 | Jarboe | RINGNOANSWER | NULL | 15000 | ||
2017-01-02 12:28:14.727020 | 1483338440.1685 | 998 | Jarboe | RINGNOANSWER | NULL | 15000 | ||
2017-01-02 12:28:21.799513 | 1483338440.1685 | 998 | NONE | ABANDON | NULL | 1 | 1 | 42 |
Пауза агента в обслуживании очереди с указанием причины (lunch break):
time | callid | queuename | agent | event | data | data1 | data2 | data3 | data4 | data5 |
---|---|---|---|---|---|---|---|---|---|---|
2017-03-23 16:30:34.232289 | NONE | 77777 | 77778 | PAUSE | NULL | lunch break | ||||
2017-03-23 16:45:36.639872 | NONE | 77777 | 77778 | UNPAUSE | NULL | Back from lunch |
Добавление и удаление динамического интерфейса в очередь:
time | callid | queuename | agent | event | data | data1 | data2 | data3 | data4 | data5 |
---|---|---|---|---|---|---|---|---|---|---|
2017-03-23 13:54:32.450580 | MANAGER | 77777 | Local/77779@from-queue/n | ADDMEMBER | NULL | |||||
2017-03-23 17:55:09.392784 | MANAGER | 77777 | Local/77779@from-queue/n | REMOVEMEMBER | NULL |
Другие страницы с тегом 'queue':
Asterisk настройка очереди - queues.conf
Функция диалплана Asterisk: QUEUE_VARIABLES
function 'QUEUE_WAITING_COUNT'
Handlebars Helper LastCall Queue Agent