Realtime Queues

При построении кол-центра нужно организовывать Queues(очереди). Как это делается с помощью конфиг файлов рассказано здесь. Но захотелось кое-какой функционал перенести в БД(MySQL). Очень кратенько попытался изложить все моменты, если что-то упустил пишите. Спасибо.
1. Realtime Queue log
2. Realtime Queues config
3. Realtime Queues Members

Начнем с малого,но не менее важного логов нашего колл центра! С их помощью можно все важные х-ки работы нашего колл центра!

1.Queues LOG Realtime
Итак мы решили хранить все логи нашего кол-центра в БД
Если мы хотим чтобы данные писались в поля data1-5, а не в data и разделителем |, ТО необходимо добавить
queue_adaptive_realtime=yes в logger.conf и не удалять queue_log = yes
Структура таблицы

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;

Рассмотрим по порядку назначение каждого поля.
time — Дата и время события. С некоторых пор к дате и времени через точку добавляются микросекунды, после этого поле таблицы по понятным причинам уже не может быть SQL формата datetime, меняем формат поля на varchar.
callid — «REALTIME», «NONE», или уникальный идентификатор канала.
queuename — Имя затронутой очереди пока описанной в конфигурационном файле queues.conf
agent — название агента с которым случилось данное событие
event- Одно из значений ADDMEMBER, REMOVEMEMBER, RINGNOANSWER, EXITEMPTY, TRANSFER, AGENTDUMP, ABANDON, SYSCOMPAT, CONNECT, COMPLETECALLER, COMPLETEAGENT, AUSEALL, UNPAUSEALL, PAUSE, UNPAUSE, PENALTY, ENTERQUEUE, EXITWITHTIMEOUT, EXITEMPTY, EXITWITHKEY, или значение определённое пользователем.
data … data5 — Аргументы связанные с событием описанном в поле event.
ABANDON(position|origposition|waittime) — Пользователь задолбался ждать в очереди и ушел. position — Позиция с какой он ушел из очереди, origposition — позиция на которую первоначально попал звонящий, waittime — сколько ждал звонящий пока не ушел.
ADDMEMBER — член очереди был добавлен. Имя сбриджеванного канала будет записано с именем канала добавленого в очередь.
AGENTDUMP — Агент сбросил звонящего во время прослушивания приглашения очереди.
AGENTLOGIN(channel) — Агент залогинился. Канал записан.
AGENTLOGOFF(channel|logintime) — агент вышел.
COMPLETEAGENT(holdtime|calltime|origposition) — Абонент был соединен с агентом, и звонок был завершен агентом. Время ожидания абонентом и длительность разговора записывается. также записывается позиция звонящего в очереди. (data1,data2,data3)
COMPLETECALLER(holdtime|calltime|origposition) — Абонент был соединен с агентом, и звонок был завершен абонентом. Время ожидания абонентом и длительность разговора записывается. также записывается позиция звонящего в очереди. (data1,data2,data3)
CONFIGRELOAD — Конфигурация была перезагружена (например asterisk -rx reload)
CONNECT(holdtime|bridgedchanneluniqueid|ringtime) — Абонент был соединен с агентом. Holdtime показывает сколько ждал абонент. bridgedchanneluniqueID содержит unique ID агента очереди который ответил на звонок. Полезно когда пытаемся привязать записанный файл к конкретному звонку в очереди. Ringtime Время поднятия трубки оператором(видимо некоторым нравится когда их телефон долго пиликает).
ENTERQUEUE(url|callerid) — Звонок пришел в очередь. Записываются URL (если задан) и Caller*ID.
EXITEMPTY(position|origposition|waittime) — Абонент вышел из очереди потому что в очереди не было доступных агентов, если это настроено в конфиге. position отображает с какой позиции в очереди выкинуло абонента, origposition — первоначальная позиция в очереди, waittime сколько времени абонент ждал пока его не выкинуло.
EXITWITHKEY(key|position|origposition|waittime) — Абонент нажал кнопку выхода из очереди. Записывается кнопка и позиция выхода, первоначальная позиция и время ожидания в очереди.
EXITWITHTIMEOUT(position|origposition|waittime) — Абонент был выброшен из очереди по таймауту(очень долго ждал). записывается позиция выхода, первоначальная позиция и время ожидания.
QUEUESTART — Очереди запущены первый раз для этой сессии.
REMOVEMEMBER — Агент удаляется из очереди. Поле канала содержит имя агента ушедшего из очереди.
RINGNOANSWER(ringtime) — После попытки дозвониться доступному агенту(в мс), агент не взял трубочку. Плохой агент!;)
SYSCOMPAT -Звонок отвечен агентом, но звонок был сброшен потому что каналы несовместимы.
TRANSFER(extension|context|holdtime|calltime|origposition) — Звонящий был переадресован в другой экстеншен. записываются Контекст и экстеншен. записывается Время ожидания и общая длительность звонка, также и позиция зонящего на момент переадресации. ПаЖаЛуЙсТа запомните что трансфер совершенный SIP UA с помощью реинвайтов не всегда может быть видим астеру. чтобы быть уверенным на 100% что вы увидите событие трансфера это использовать встроенный функционал астера.

Добавляем в extconfig.conf
queue_log => odbc,asterisk
в консольке module reload и можно начинать смотреть данные которые начнут появляться в MySQL таблице queue_log.

2. Realtime queues
Можно совмещать статическое и динамическое описание очередей. Если задана и статическая и динамическая запись, то предпочтение отдается статической. Добавление агентов(в таблицу агентов можно осуществить только лишь добавлением записи в таблицу, из диалплана никак)

Правим extconfig.conf
queues => odbc,asterisk

Создаем таблицу

CREATE TABLE IF NOT EXISTS `queues` (
`name` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
`musiconhold` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL,
`announce` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL,
`context` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL,
`timeout` int(11) DEFAULT NULL,
`monitor_type` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL,
`monitor_format` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL,
`queue_youarenext` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL,
`queue_thereare` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL,
`queue_callswaiting` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL,
`queue_holdtime` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL,
`queue_minutes` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL,
`queue_seconds` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL,
`queue_lessthan` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL,
`queue_thankyou` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL,
`queue_reporthold` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL,
`announce_frequency` tinyint(2) DEFAULT NULL,
`announce_round_seconds` int(11) DEFAULT NULL,
`announce_holdtime` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL,
`retry` tinyint(2) DEFAULT NULL,
`wrapuptime` int(11) DEFAULT NULL,
`maxlen` int(11) DEFAULT NULL,
`servicelevel` int(11) DEFAULT NULL,
`strategy` varchar(128) COLLATE utf8_unicode_ci DEFAULT NULL,
`joinempty` tinyint(1) DEFAULT '0',
`leavewhenempty` tinyint(1) DEFAULT '1',
`eventmemberstatus` tinyint(1) DEFAULT NULL,
`eventwhencalled` varchar(6) COLLATE utf8_unicode_ci DEFAULT 'vars',
`reportholdtime` tinyint(1) DEFAULT NULL,
`memberdelay` int(11) DEFAULT NULL,
`weight` int(11) DEFAULT NULL,
`timeoutrestart` tinyint(1) DEFAULT NULL,
`periodic_announce` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL,
`periodic_announce_frequency` int(11) DEFAULT NULL,
`ringinuse` tinyint(1) DEFAULT NULL,
`setinterfacevar` tinyint(1) DEFAULT NULL,
`setqueuevar` tinyint(1) NOT NULL,
`setqueueentryvar` tinyint(1) NOT NULL,
PRIMARY KEY (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

Описание полей аналогично статическому описанию в конфигурационном файле.

Учтите что нужно будет перегрузить параметры
queue reload parameters

3. Realtime Queues Members
Добавляем в extconfig.conf
queue_members => odbc,asterisk
Создаем таблицу

CREATE TABLE `queue_members` (
`uniqueid` int(10) unsigned NOT NULL AUTO_INCREMENT,
`membername` varchar(40) DEFAULT NULL,
`queue_name` varchar(128) DEFAULT NULL,
`interface` varchar(128) DEFAULT NULL,
`penalty` int(11) DEFAULT NULL,
`paused` int(11) DEFAULT NULL,
PRIMARY KEY (`uniqueid`),
UNIQUE KEY `queue_interface` (`queue_name`,`interface`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

Напомню что добавлять агентов из диалплана, можно только костылем в виде INSERTа в таблицу!


Комментарии: