Asterisk-CDR-Viewer-Mod
Asterisk-CDR-Viewer-Mod copied to clipboard
Дублирование статистики
Ещё раз скопирую суть проблемы. Есть небольшая проблема, если звонок приходит допустим в очередь (или сразу на несколько пиров), то в cdr падают записи о том что вызываются одновременно все пиры, следовательно веб интерфейс берёт все эти записи и получается дубляж с одним и тем же номером и временем. Допустим в очереди 5 пиров, пришёл звонок, на него ответили. В статистики видно "Номер звонящего 1" - "номер назначения 2" и таких записей будет 5 (потому что в очереди 5 пиров), только 4 из них будут "не отвечены", а один отвечен. Аналогично с файлами записи, для всех 5 будут одинаковы. Можно как это поправить?
Версия Asterisk 13.4.0
Кусок диал плана по которому проходит звонок [macro-recording] exten => s,1,GoToIf($["${RECORDING}" = "1"]?yes:no) exten => s,n(yes),Set(fname=${UNIQUEID}-${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M)}-${ARG1}-${ARG2}); exten => s,n,Set(CDR(filename)=${fname}.wav); exten => s,n,MixMonitor(${DIR_RECORDS}${fname}.wav,b); exten => s,n(no),Verbose(Exit record);
[in-5500] exten => s,1,Answer() exten => s,n,BackGround(hello) exten => s,n,WaitExten(5) exten => 1,1,Playback(hello-en) exten => 1,2,Goto(1212,601,1) exten => i,1,Goto(1212,601,1) exten => t,1,Goto(1212,601,1) exten => _[1-4]XX,1,Dial(SIP/${EXTEN}) exten => s,n,Hangup()
[1212] exten => 601,1,Answer() exten => 601,n,Macro(recording,${CALLERID(num)},${EXTEN}) exten => 601,n,Queue(call-center,tT) exten => 601,n,Hangup()
В очереди находится 5 пиров. Если вместо очереди сделать так "exten => 601,n,Dial(SIP/400&SIP/402&SIP/403&SIP/429&SIP/442,,tTo)" ситуация аналогичная, в базу пишутся одновременно звонки на все пиры, следовательно веб интерфейс их показывает, тем самым захламляя статистику. p.s. Аналогичная ситуация даже если везде стоит экстеншен s. Вот так в интерфейсе это выглядит: 2015-08-04 11:38:25 Отвечено 896----7735 s 00:15 0.00 Queue SIP SIP 2015-08-04 11:38:25 Не Отвечено 896----7735 s 00:06 0.00 Queue SIP SIP 2015-08-04 11:38:25 Не Отвечено 896----7735 s 00:06 0.00 Queue SIP SIP 2015-08-04 11:38:25 Не Отвечено 896----7735 s 00:06 0.00 Queue SIP SIP
Да я понимаю что веб интерфейс сам ничего не дописывает, но может быть можно как то это поправить? Например где нибудь в астериске "отключить" такое поведение или ограничить условием в веб интерфейсе, что если звонок с одним и тем же индификатором и временем, то показывать только отвеченный, если отвеченного нет, то показывать 1 "не отвеченный".
Заранее спасибо.
Опять же это к скрипту никак не относится.
Попроовал у себя такое (ael) на Asterisk 11:
555 => {
Dial(SIP/1&SIP/2,60);
Hangup();
}
У меня в базу пишется только одна строка, даже если все пиры не ответили. Что-то у вас с диалпланом видимо не так. Попробуйте убрать из диалплана лишнее (экстеншены i t например), может из-за них так. Если не получится, попробуйте использовать дебаг (Verbose).
А дописывать скрипт, как вы написали - это костыли, нужно устранить первначальную проблему. Иначе со временем база будет только увеличиваться и тормозить.
Дело тут не в диал плане, пробовал всё, результат тот же. Видел скрины cdr таблиц c астериском версии 12+, там аналогично происходит запись (тут можно посмотреть, там правда проблема была в том что в cdr в обще не писалось, но скрины есть https://issues.asterisk.org/jira/browse/ASTERISK-24443) , сравнивал конфиги Asterisk 11 версии с 13.4.0 по настройкам изменений почти нет, крутил и так и сяк :). В итоге не стал сильно заморачитваться (времени и возможности эксперементировать уже не было), быстро пересобрал астериск, а точнее сделал "дангрейд" до 11 версии и всё стало на свои места, теперь пишет в cdr как положено :))
p.s. все конфиги сип экстеншн очереди были скопированы со старого астериска.
Как я говорил в самом начале, значит дело было в asterisk. Хорошо, что написали. Хотел в ближайшее время тоже переходить на 13 версию, но пока не буду. Гавное в 13 версии, что добавили ARI интерфейс, с AMI не очень удобно.
Да, это такая "фича" в 13 версии asterisk. Он логирует отдельной записью в CDR все попытки дозвина через Dial или Queue. Надеемся, что они сделают параметр в конфиге, который будет отключать данную "фичу".
Спасибо за пояснение)
@miho120 @prog-it
Действительно на 13-й версии ( тестил на Asterisk 13.3.2) при попадании в очередь звонки дублируются и как следствие дублируются записи в детализации, что значительно усложняет понимание того что произошло при звонке.
| 2015-12-19 14:19:56 | "xxxxxxxx"
| 2015-12-19 14:20:13 | "xxxxxxxx"
Можно конечно чистить базу звонков с одинаковыми id звонков, и оставлять только последний отвеченный или неотвеченный. Но это костыль.
Может кто-то знает как это победить?
Это фича 13 версии Астериска, прочитайте выше. Пока это никак не победить. Сам использую 11 версию, пока все устраивает.
Можно победить, но опять же костылем. Создать триггер в базе на событие INSERT, который будет чистить записи с одинаковым uniqueid.
Ну тригер, это жесткий костыль =) Можно что то нужное грохнуть =) Если руки дойдут и кому-то кроме меня это будет нужно, то я чуть перепишу код модуля cdr, что бы убрать эту "фичу" и выложу сюда... Хотя это тоже не совсем правильный метод)))
В общем, меня это все достало и я все таки чуть подпилил исходники астера) Создал патч, вот выкладываю его сюда для нуждающихся. Если в кратце, алгоритм работы cdr остался тот же, что исключает различные ошибки. Он просто при записи cdr смотрит последняя ли это запись. Если последняя, то пишем её. А последняя запись именно то, что нам нужно. Проверен на версии 13.4 и 13.6.
Установка: Пропатчить исходники астера через patch и собрать/пересобрать астер, "patch asterisk-13.6.0/main/cdr.c ./asterisk13_cdr.patch"
Патч: http://miho.org.ua/download/asterisk/asterisk13_cdr_patch.zip
P.S. Напишите сюда если вам помогло или если нашли баг =)
P.P.S. Если кто-то хочет, то я могу сделать включение этой "антифичи" через параметр в cdr.conf
Спасибо, думаю многим это поможет. Теперь одной проблемой меньше, когда буду ставить 13 версию. Думаю в cdr.conf можно не включать, т.к. особой пользы от новой фичи не вижу.
А мне кажется обязательно в cdr.conf нужно включить, потому как у многих уже настроена работа с crm и вытягивание нужного из того хлама что пишется в cdr. И не известно как будут вести себя текущие доработки, если будет писаться только 1 строчка.
Когда можно ожидать включение через cdr?
Может на этой неделе доработаю... Посмотрим, новый год все таки =)
Всех с Новым Годом)
Было бы супер! С НГ!!
miho120, есть новости по включению киллерфичи в cdr.conf?
mttzzz, погоди) Я в другую страну переехал и есть траблы с инетом пока. Но вскоре сделаю, так как самому актуально)
Супер!!!! Даже не знаю как тебя благодарить!
Попробуйте лучше мой патч для вьювера. Он делает тоже самое, но правильным образом (записи в базе остаются) и пересобирать астериск не нужно (переименуйте в .patch и накладывайте, напрямую не удается загрузить):
anphsw, как можно воспользоваться данным патчем на уже рабочей системе?
в папке с вьювером: patch -p1 < cdr-noduplicates.patch
он правит веб-интерфейс, не сам астериск.
anphsw, patch -p1 < cdr-noduplicates.patch patching file inc/config.inc.php Hunk #1 FAILED at 95. 1 out of 1 hunk FAILED -- saving rejects to file inc/config.inc.php.rej patching file index.php
Тогда посмотрите, что патч правит, и отредактируйте вручную.
Я так понимаю к старым записям тоже должно примениться
В очереди 4 участника, режим ringall Теперь в CDR не 4 записи, а две, с одинаковыми аудиозаписями. Один номер звонящего, разная продолжительность разговора, по факту один оператор но разные внутренние номера. Версия астериска 13.10
2016-10-06 11:55:17 Не Отвечено 78127XXXXX s s 00:02 0.00 Queue SIP/8495XXXXX SIP/2103
2016-10-06 11:55:16 Отвечено 7812XXXXX s s 01:17 0.00 Queue SIP/8495XXXXX SIP/2102
Интересен факт что не все звонки так отображаются. Некоторые отображаются нормально.
Да, это связано с тем, что cdr viewer загружает по 1 записи из результата в буфер, и при определенных обстоятельствах нельзя определить, будет ли следующая запись дублем, или нет. Я это поправил, но с достаточно большой модификацией кода. Будет время - выложу.
Ещё интересней, все звонки с московских номеров отображаются корректно. С питерских городских и мобильных записи задваиваются по шаблону описанному выше.
anphsw, благодарю, буду ждать.
Создал pull-request с исправлением бага со статистикой и warning'ов php. У меня работает, но мог что-то не доглядеть, так что проверяйте. Или из моего форка, если не терпится: https://github.com/anphsw/Asterisk-CDR-Viewer-Mod/tree/patches
Спасибо, добавлю патч в ближайшее обновление.
В общем, меня это все достало и я все таки чуть подпилил исходники астера) Создал патч, вот выкладываю его сюда для нуждающихся. Если в кратце, алгоритм работы cdr остался тот же, что исключает различные ошибки. Он просто при записи cdr смотрит последняя ли это запись. Если последняя, то пишем её. А последняя запись именно то, что нам нужно. Проверен на версии 13.4 и 13.6.
Установка: Пропатчить исходники астера через patch и собрать/пересобрать астер, "patch asterisk-13.6.0/main/cdr.c ./asterisk13_cdr.patch"
Патч: http://miho.org.ua/download/asterisk/asterisk13_cdr_patch.zip
P.S. Напишите сюда если вам помогло или если нашли баг =)
@miho120 Привет. Можно перезалить пожалуйста патч? Буду очень благодарен. Очень остро стоит проблема.
@webberrs
Вот этот патч, но только для Asterisk 13. Для версий Asterisk выше не пойдет.
@prog-it Благодарю!
Попробуйте лучше мой патч для вьювера. Он делает тоже самое, но правильным образом (записи в базе остаются) и пересобирать астериск не нужно (переименуйте в .patch и накладывайте, напрямую не удается загрузить):
Здравствуйте, а есть патч для Asterisk 16 и новой версии Asterisk CDR Viewer Mod v2.6.4? Записи дублируются и при 'duphide' = '1'.