FreeBSD 8.3, Asterisk 1.8.18
Дано: несколько шлюзов goip1, выход через них настроен с помощью chanisavail, статус у каналов бывает двух видов - 4 (есть в системе, но не зарегистрирован) и 3 (зарегистрирован, но в данный момент используется, т.е. занят).
Трафик на данные каналы идет пока что с одной учетки со стороннего (клиентского сервера), авторизуется он по IP. Возможно в дальнейшем еще учетки появятся.
Свободные для звонков каналы отлично выбираются, но периодически возникает ситуация когда все каналы недоступны (некоторые заняты, а некоторые не зарегистрированы). Так вот, в такой ситуации не создается канал в "core show channels", и соответственно в базу mysql вообще никаких данных о непрошедшем звонке не падает, даже со статусом FAILED. Ну и в такие моменты естественно клиентские звонки видя статус о недоступности уходят на альтернативные маршруты.
Задача: увидеть, на сколько часто происходит "отбивание" звонка нашей стороной. Сколько собственно говоря не прошло по причине, когда мои гейты заняты или недоступны. Соответственно исходя из этих данных можно будет увидеть - сколько каналов реально не хватает, какое количество трафика не может пройти через текущую емкость каналов.
Идеально если эти данные будут попадать в MYSQL, но если это не возможно - то хотя бы в файл какой....ума никак не приложу как такое реализовать можно.
Спасибо!
Added after 3 minutes:
Можно ограничить учетную запись клиента записью call-limit=n, но я думаю это мне ничего не даст...
Вид примерно такой, под себя редактируйте
exten => s,1,System(echo ${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)} ${CUT(INVALID_EXTEN,-,2)} ${CALLERID(num)} \\>\\> ${CUT(INVALID_EXTEN,-,1)} >> /var/
А мне это действие добавлять перед выбором свободного канала (chanisavail), или после него?
Диалплан для теста:
| Код: |
| [test_goip] exten => _X.,1,Macro(test-goip,${EXTEN}) |
Макрос для теста:
| Код: |
| [macro-test-goip] exten=s,1,ChanIsAvail(SIP/goip009,as) exten=s,2,System(echo ${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)} ${CUT(INVALID_EXTEN,-,2)} ${CALLERID(num)} \\>\\> ${CUT(INVALID_EXTEN,-,1)} >> /var/log/asterisk/goip_err.log exten=s,n,NoOp(Availchan is ${AVAILCHAN}) ; exten=s,n,NoOp(Availstatus is ${AVAILSTATUS}) ; exten=s,n,Dial(${CUT(AVAILCHAN,,1)}/+${ARG1}) exten=s,n,Hangup() |
goip009 в системе не существует, после выполнения chanisavail получаю:
| Код: |
| [Nov 27 22:30:25] WARNING[18860]: pbx.c:4027 pbx_substitute_variables_helper_full: Error in extension logic (missing '}') [Nov 27 22:30:25] WARNING[18860]: pbx.c:3654 func_args: Can't find trailing parenthesis for function 'CUT(INVALID_EXTEN,-,'? |
Added after 18 minutes:
Подобные строчки в лог случайно не падают? NOTICE там какой или еще что...
Added after 21 minutes:
Кстати, а это случайно не те записи mysql, где disposition=failed?
Added after 7 minutes:
может вот эти строчки в логах:
cause 20 - Subscriber absent и cause 66 - Channel not implemented как то к моему вопросу относятся?
Точку с запятой можно наверное то же убрать у нопов
_________________
Мы всегда можем уметь...
а насчет знака ";" - он не мешает) там коммент был
Added after 4 minutes:
Правда мне это не очень помогло
При звонке через несуществующий гейт падает строчка "2012-11-27 23:40:23 >>", но так же и при удачном звонке через существующий канал - такая же вещь падает в файл.
Может с ними поиграть?
_________________
Мы всегда можем уметь...
Сейчас вот что нашел, ${HANGUPCAUSE}, т.е. причина сброса. Вызывается эта переменная если не прошел звонок (не было каналов/были заняты). Переменная нормально код возвращает - define AST_CAUSE_CHAN_NOT_IMPLEMENTED 66.
И в общем исходя из всего этого, в диалплане появилась строчка следующего вида:
exten=s,n,System(echo ${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)} Hangupcause is ${HANGUPCAUSE} >> /var/log/asterisk/goip_err.log)
И я счастлив))
Единственный вопрос - chan not implemented (66) - это точно оно?)))