Я ни разу не телефонист, но вдруг кому пригодится. Если пользователи начинают периодически жаловаться на плохое качество разговора, то обычно что делают?
в крон добавляют нечто подобное:
0,30 8-16 * * 1-5 timeout 31m tcpdump -s 0 -n host IP_SIP_TRUNK or host IP_USERS -w "/home/dumps/`date +\%d-\%m-\%y_\%H.\%M.\%S`.pcap"
Записываем оба плеча звонка (от астериска до транка провайдера, от астериска до ip пользователей, под которыми они подключаются к нашей АТС). Потом скармливаем wireshark, находим проблемный звонок и пытаемся сделать вывод у кого проблемы. Например:
Одно плечо звонка:
Второе плечо звонка:
Видно, что от провайдера не пришло rtp пакетов, пустоту отправили и к пользователям. Звоним провайдеру, выясняем.
Такой подход плох тем, что, необходимо ждать когда снова появится проблемный звонок, чтобы понять где проблема. Классно было бы сразу видеть примерную картину. Какие есть для этого средства? Есть очень хорошая программа voipmonitor, но можно "поколхозить" и самому)).
Используем команду sip show channelstats и систему мониторинга заббикс.
asterisk -rx 'sip show channelstats' . Peer Call ID Duration Recv: Pack Lost ( %) Jitter Send: Pack Lost ( %) Jitter IP1 239cf475a0 00:00:46 0000000000 0000000000 ( 0.00%) 0.0000 0000000000 0000000000 ( 0.00%) 0.0000 IP2 14f1558a13 00:00:46 0000001541 0000000000 ( 0.00%) 0.0000 0000002309 0000000000 ( 0.00%) 0.0027 2 active SIP channels
Нас будут интересовать столбцы Lost (%) и Jitter
Добавим в мониторинг в заббикса, делаем на агенте:
1) /etc/sudoers:
zabbix ALL=(root) NOPASSWD: /usr/sbin/asterisk
2) tail /etc/zabbix/zabbix_agentd.conf
UserParameter=asterisk.channelstats_loses[*],/etc/zabbix/scripts/asterisk_channelstats_loses.sh $1 $2
UserParameter=asterisk.channelstats_jitter[*],/etc/zabbix/scripts/asterisk_channelstats_jitter.sh $1 $2
Выдергиваем столбцы процента Lost и если значения одного из этих столбцов превышают некие пороги, то выводим danger или alarm:
cat /etc/zabbix/scripts/asterisk_channelstats_loses.sh #!/bin/bash sudo /usr/sbin/asterisk -rx 'sip show channelstats' | sort -rnk 5 | grep -v "Peer\|SIP" \ | awk '{ if(NF==13) print $1,$7,$12 }' | tr -d "%)" | \ awk -v danger_threshold=$1 -v alarm_threshold=$2 \ '{ if($2>=danger_threshold && $2<alarm_threshold || $3 >=danger_threshold && $3<alarm_threshold) \ print $1,$2,$3 " danger"; \ if($2>=alarm_threshold || $3>=alarm_threshold ) print $1,$2,$3 " alarm" }'
Выдергиваем столбцы процента Jitter и, если значения одного из этих столбцов превышают некие пороги, то выводим danger или alarm (столбец jitter измеряется в секундах, т.е. 0.01 - это 10ms).
cat /etc/zabbix/scripts/asterisk_channelstats_jitter.sh #!/bin/bash sudo /usr/sbin/asterisk -rx 'sip show channelstats' | sort -rnk 5 | grep -v "Peer\|SIP" \ | awk '{ if(NF==13) print $1,$8,$13 }' \ | awk -v danger_threshold=$1 -v alarm_threshold=$2 \ '{ if($2>=danger_threshold && $2<alarm_threshold || $3 >=danger_threshold \ && $3<alarm_threshold) print $1,$2,$3 " danger"; \ if($2>=alarm_threshold || $3>=alarm_threshold ) \ print $1,$2,$3 " alarm" }'
Важный момент -какие пороги задавать? Здесь , например, https://forum.asterisk.ru/viewtopic.php?f=13&t=6333, про процент потерь говорят, что должно быть не более 2, в другом - не более 3, про джиттер или не более 75 мс или 20 мс. Тут уже каждый решает сам.
Создаем элемент данных в заббиксе (Loses):
Создаем элемент данных в заббиксе (Jitter):
Опционально можно задать триггеры:
Если находим вхождения по строкам danger или alarm, то генерируем событие (danger - предупреждение, alarm - средняя)