мониторинг качества голоса через zabbix

Я ни разу не телефонист, но вдруг  кому пригодится. Если  пользователи начинают периодически жаловаться на плохое качество разговора, то обычно что делают?

в крон  добавляют нечто подобное:

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 - средняя)

 

 

 

 

Please publish modules in offcanvas position.