Asterisk-CDR-Viewer-Mod icon indicating copy to clipboard operation
Asterisk-CDR-Viewer-Mod copied to clipboard

Дублирование статистики

Open ghost opened this issue 9 years ago • 36 comments

Ещё раз скопирую суть проблемы. Есть небольшая проблема, если звонок приходит допустим в очередь (или сразу на несколько пиров), то в 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 "не отвеченный".

Заранее спасибо.

ghost avatar Aug 04 '15 07:08 ghost

Опять же это к скрипту никак не относится. Попроовал у себя такое (ael) на Asterisk 11: 555 => { Dial(SIP/1&SIP/2,60); Hangup(); } У меня в базу пишется только одна строка, даже если все пиры не ответили. Что-то у вас с диалпланом видимо не так. Попробуйте убрать из диалплана лишнее (экстеншены i t например), может из-за них так. Если не получится, попробуйте использовать дебаг (Verbose).

А дописывать скрипт, как вы написали - это костыли, нужно устранить первначальную проблему. Иначе со временем база будет только увеличиваться и тормозить.

prog-it avatar Aug 05 '15 08:08 prog-it

Дело тут не в диал плане, пробовал всё, результат тот же. Видел скрины cdr таблиц c астериском версии 12+, там аналогично происходит запись (тут можно посмотреть, там правда проблема была в том что в cdr в обще не писалось, но скрины есть https://issues.asterisk.org/jira/browse/ASTERISK-24443) , сравнивал конфиги Asterisk 11 версии с 13.4.0 по настройкам изменений почти нет, крутил и так и сяк :). В итоге не стал сильно заморачитваться (времени и возможности эксперементировать уже не было), быстро пересобрал астериск, а точнее сделал "дангрейд" до 11 версии и всё стало на свои места, теперь пишет в cdr как положено :))

p.s. все конфиги сип экстеншн очереди были скопированы со старого астериска.

ghost avatar Aug 06 '15 07:08 ghost

Как я говорил в самом начале, значит дело было в asterisk. Хорошо, что написали. Хотел в ближайшее время тоже переходить на 13 версию, но пока не буду. Гавное в 13 версии, что добавили ARI интерфейс, с AMI не очень удобно.

prog-it avatar Aug 06 '15 18:08 prog-it

Да, это такая "фича" в 13 версии asterisk. Он логирует отдельной записью в CDR все попытки дозвина через Dial или Queue. Надеемся, что они сделают параметр в конфиге, который будет отключать данную "фичу".

miho120 avatar Dec 02 '15 09:12 miho120

Спасибо за пояснение)

prog-it avatar Dec 02 '15 22:12 prog-it

@miho120 @prog-it

Действительно на 13-й версии ( тестил на Asterisk 13.3.2) при попадании в очередь звонки дублируются и как следствие дублируются записи в детализации, что значительно усложняет понимание того что произошло при звонке.

| 2015-12-19 14:19:56 | "xxxxxxxx" | xxxxxxxx | 1 | in | SIP/a-000000a6 | SIP/1000-000000a7 | Queue | q_b,t,,,300 | 23 | 23 | 2015-12-19 14:19:56 | 2015-12-19 14:19:56 | 2015-12-19 14:20:20 | ANSWERED | 3 | b | | 1450513196.285 | 1450513196.285-2015-12-19-14_20-xxxxxxxx-1.mp3 | ![2015-12-19 14-37-08]

| 2015-12-19 14:20:13 | "xxxxxxxx" | xxxxxxxx | 1 | in | SIP/a-000000a6 | SIP/1002-000000a8 | Queue | q_b,t,,,300 | 1 | 1 | 2015-12-19 14:20:13 | 2015-12-19 14:20:13 | 2015-12-19 14:20:14 | NO ANSWER | 3 | b | | 1450513196.285 | 1450513196.285-2015-12-19-14_20-xxxxxxxx-1.mp3 |

2015-12-19 14-37-08

Можно конечно чистить базу звонков с одинаковыми id звонков, и оставлять только последний отвеченный или неотвеченный. Но это костыль.

Может кто-то знает как это победить?

leks404 avatar Dec 19 '15 08:12 leks404

Это фича 13 версии Астериска, прочитайте выше. Пока это никак не победить. Сам использую 11 версию, пока все устраивает.

prog-it avatar Dec 19 '15 09:12 prog-it

Можно победить, но опять же костылем. Создать триггер в базе на событие INSERT, который будет чистить записи с одинаковым uniqueid.

prog-it avatar Dec 19 '15 09:12 prog-it

Ну тригер, это жесткий костыль =) Можно что то нужное грохнуть =) Если руки дойдут и кому-то кроме меня это будет нужно, то я чуть перепишу код модуля cdr, что бы убрать эту "фичу" и выложу сюда... Хотя это тоже не совсем правильный метод)))

miho120 avatar Dec 19 '15 09:12 miho120

В общем, меня это все достало и я все таки чуть подпилил исходники астера) Создал патч, вот выкладываю его сюда для нуждающихся. Если в кратце, алгоритм работы 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 avatar Dec 19 '15 16:12 miho120

P.P.S. Если кто-то хочет, то я могу сделать включение этой "антифичи" через параметр в cdr.conf

miho120 avatar Dec 19 '15 16:12 miho120

Спасибо, думаю многим это поможет. Теперь одной проблемой меньше, когда буду ставить 13 версию. Думаю в cdr.conf можно не включать, т.к. особой пользы от новой фичи не вижу.

prog-it avatar Dec 19 '15 16:12 prog-it

А мне кажется обязательно в cdr.conf нужно включить, потому как у многих уже настроена работа с crm и вытягивание нужного из того хлама что пишется в cdr.  И не известно как будут вести себя текущие доработки, если будет писаться только 1 строчка.

Когда можно ожидать включение через cdr?

mttzzz avatar Dec 28 '15 10:12 mttzzz

Может на этой неделе доработаю... Посмотрим, новый год все таки =)

miho120 avatar Dec 28 '15 10:12 miho120

Всех с Новым Годом)

prog-it avatar Dec 28 '15 10:12 prog-it

Было бы супер! С НГ!!

mttzzz avatar Dec 28 '15 10:12 mttzzz

miho120, есть новости по включению киллерфичи в cdr.conf?

mttzzz avatar Jan 22 '16 12:01 mttzzz

mttzzz, погоди) Я в другую страну переехал и есть траблы с инетом пока. Но вскоре сделаю, так как самому актуально)

miho120 avatar Jan 22 '16 12:01 miho120

Супер!!!! Даже не знаю как тебя благодарить!

mttzzz avatar Jan 22 '16 12:01 mttzzz

Попробуйте лучше мой патч для вьювера. Он делает тоже самое, но правильным образом (записи в базе остаются) и пересобирать астериск не нужно (переименуйте в .patch и накладывайте, напрямую не удается загрузить):

cdr-noduplicates.txt

anphsw avatar Aug 18 '16 11:08 anphsw

anphsw, как можно воспользоваться данным патчем на уже рабочей системе?

dimavelichko avatar Oct 05 '16 20:10 dimavelichko

в папке с вьювером: patch -p1 < cdr-noduplicates.patch

он правит веб-интерфейс, не сам астериск.

anphsw avatar Oct 06 '16 05:10 anphsw

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

dimavelichko avatar Oct 06 '16 06:10 dimavelichko

Тогда посмотрите, что патч правит, и отредактируйте вручную.

anphsw avatar Oct 06 '16 09:10 anphsw

Я так понимаю к старым записям тоже должно примениться

dimavelichko avatar Oct 06 '16 09:10 dimavelichko

В очереди 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

dimavelichko avatar Oct 06 '16 09:10 dimavelichko

Интересен факт что не все звонки так отображаются. Некоторые отображаются нормально.

dimavelichko avatar Oct 06 '16 09:10 dimavelichko

Да, это связано с тем, что cdr viewer загружает по 1 записи из результата в буфер, и при определенных обстоятельствах нельзя определить, будет ли следующая запись дублем, или нет. Я это поправил, но с достаточно большой модификацией кода. Будет время - выложу.

anphsw avatar Oct 06 '16 10:10 anphsw

Ещё интересней, все звонки с московских номеров отображаются корректно. С питерских городских и мобильных записи задваиваются по шаблону описанному выше.

dimavelichko avatar Oct 06 '16 10:10 dimavelichko

anphsw, благодарю, буду ждать.

dimavelichko avatar Oct 10 '16 07:10 dimavelichko

Создал pull-request с исправлением бага со статистикой и warning'ов php. У меня работает, но мог что-то не доглядеть, так что проверяйте. Или из моего форка, если не терпится: https://github.com/anphsw/Asterisk-CDR-Viewer-Mod/tree/patches

anphsw avatar Dec 18 '16 07:12 anphsw

Спасибо, добавлю патч в ближайшее обновление.

prog-it avatar Feb 10 '17 08:02 prog-it

В общем, меня это все достало и я все таки чуть подпилил исходники астера) Создал патч, вот выкладываю его сюда для нуждающихся. Если в кратце, алгоритм работы 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 avatar Jul 25 '19 17:07 webberrs

@webberrs

Вот этот патч, но только для Asterisk 13. Для версий Asterisk выше не пойдет.

asterisk13_cdr_patch.zip

prog-it avatar Jul 25 '19 23:07 prog-it

@prog-it Благодарю!

webberrs avatar Jul 26 '19 23:07 webberrs

Попробуйте лучше мой патч для вьювера. Он делает тоже самое, но правильным образом (записи в базе остаются) и пересобирать астериск не нужно (переименуйте в .patch и накладывайте, напрямую не удается загрузить):

cdr-noduplicates.txt

Здравствуйте, а есть патч для Asterisk 16 и новой версии Asterisk CDR Viewer Mod v2.6.4? Записи дублируются и при 'duphide' = '1'.

Settled70 avatar Dec 02 '19 10:12 Settled70