Универсальный способ мониторинга Asterisk с помощью Zabbix

    image

    Добрый день, хабровчане.

    В этом посте я хотел бы рассказать о том, как мы осуществляем мониторинг серверов Asterisk. Безусловно, посты по использованию Zabbix для мониторинга Asterisk уже есть на хабре, в них мы почерпнули множество интересной информации и добавили еще ряд необходимых, на наш взгляд, вещей.

    Что из этого вышло — можно посмотреть под катом.

    Телефония является критичным сервисом в работе компании. Важнейшей задачей после развертывания и настройки телефонной инфраструктуры является ее мониторинг. Своевременное оповещение ответственных за функционирование телефонных сети лиц сможет сэкономить компании огромное количество времени и денег и минимизировать время простоя телефонной станции.

    Изначально для мониторинга сервера Asterisk нужно выбрать инструмент, которым будет производиться мониторинг. Безусловно в сети существует огромное количество самописных скриптов, которые позволяют осуществлять поверхностный мониторинг сервера, но зачастую они малофункциональны, требуют глубоких знаний linux и естественно не имеют GUI.

    Для мониторинга состояния серверов телефонии нами была выбрана система мониторинга Zabbix. Zabbix — довольно мощный инструмент мониторинга, который имеет большое количество шаблонов для мониторинга узлов сети и процессов и позволяет встраивать пользовательские. Для нормального функционирования сервера Asterisk мы выделили следующие компоненты, которые нужно мониторить и написали под них скрипты на python, которые будем портировать в Zabbix:

    • Использование CPU, RAM, HDD (графики, отчеты и уведомления)
    • Сетевой трафик на каждом интерфейсе
    • Мониторинг процесса и памяти для Asterisk
    • Анализ процесса и памяти для Mysql
    • Мониторинг процесса и памяти для Apache
    • Отслеживание процесса fail2ban
    • Регистрация и статус SIP провайдеров
    • Статус каждого SIP пеера (peer)
    • Количество текущих звонков в Asterisk
    • Мониторинг очередей
    • Отслеживание количества звонков в очереди
    • Мониторинг Агентов очереди


    При возникновении проблем с одним из вышеназванных параметров, Zabbix отправляет уведомление (варианты оповещения: уведомления на e-mail, jabber, SMS) администратору АТС или любому другому ответственному лицу для принятия мер по оперативному устранению проблемы.

    Архитектура Zabbix включает в себя:

    • непосредственно сам сервера мониторинга, получающий и обрабатывающий данные, а также запускающий скрипты оповещения
    • базы данных
    • веб-интерфейса
    • Zabbix-агента, установленного на наблюдаемом сервере.



    Рассмотрим процесс установки zabbix-агента.



    Изначально на вашем сервере должны быть удовлетворены следующие зависимости:

    • python 2.7+
    • python-all-dev
    • Zabbix 2.4+
    • asterisk 1.8+
    • argparse 1.2.1+
    • pexpect 3.3+
    • posix-ipc 0.9.9+
    • wsgiref 0.1.2+


    Устанавливаем непосредственно сам Zabbix-агент:
    aptitude install zabbix-agent
    


    Устанавливаем python-модули для исполнения наших пользовательских скриптов Zabbix:

    aptitude install python-pip python-all-dev
    pip install argparse pexpect posix-ipc wsgiref
    


    Качаем необходимые нам скрипты (для удобства собрали их на bitbucket):
    cd /etc/zabbix/
    git clone https://pbxware@bitbucket.org/pbxware/asterisk-zabbix-py.git
    cd asterisk-zabbix-py
    


    Изменяем settings.py в соответствии с нашими настройками Asterisk:
    vim setting.py
    
    # coding=utf-8
    HOST = "localhost" - адрес, на котором работае наш сервер Asterisk
    PORT = "5038" - порт AMI из manager.conf
    USERNAME = "zabbix" - пользователь AMI
    PASSWORD = "zabbixpasswordami" - пароль пользователя AMI
    DEFAULT_TIMEOUT = 3
    AMI_VERSION = "1.3" - версия AMI, чтобы узнать наберите в терминале telnet localhost 5038
    


    Добавляем в конце конфигурационного файла /etc/asterisk/manager.conf следующие строки:

    [zabbix] ; username from settings.py
    secret=zabbixpasswordami ; password from settings.py
    deny=0.0.0.0/0.0.0.0
    permit=127.0.0.1/255.255.255.0
    read = system,call,log,verbose,agent,user,config,dtmf,reporting,cdr,dialplan
    write = system,call,agent,user,command,reporting,message
    allowmultiplelogin = yes
    displayconnects = no
    writetimeout = 100
    


    После выполнения данных действий перезагружаем Asterisk:

    service asterisk restart
    


    Далее в конфигурационный файл zabbix-агента /etc/zabbix/zabbix_agentd.conf добавляем в самом низу:

    Include=/etc/zabbix/asterisk-zabbix-py/userparameter_asterisk.conf
    


    и перезагружаем zabbix-агент:

    /etc/init.d/zabbix-agent restart
    


    Имеющиеся команды:

    • channel — CoreShowChannels
    • member — SIP member
    • peer — SIP peers
    • queue — SIP queue
    • registry — SIP registrations


    Параметры:

    ./run.py -a Discovery.
    ./run.py -f <field_name> -p Return the param of the field
    ./run.py -f <field_name> -p -r Regular expression for field value. (Return group 1)
    ./run.py -v Verbose

    Примеры:

    sudo -u zabbix /etc/zabbix/asterisk-zabbix-py/run.py registry -a Return all SIP Registrations
    sudo -u zabbix /etc/zabbix/asterisk-zabbix-py/run.py peer -a Return all SIP Peers
    sudo -u zabbix /etc/zabbix/asterisk-zabbix-py/run.py peer -f Address-IP -p 101 Return ip address peer 101
    sudo -u zabbix /etc/zabbix/asterisk-zabbix-py/run.py peer -f Status -r "(\d+)" -p 101 Return Qualify user 101

    Описание модуля



    Модуль для опроса Asterisk работает через AMI.

    settings.py — настройки модуля
    userparameter_asterisk.conf — команды zabbix и параметры, передающейся модулю
    zasterisk/ami.py — подключение к AMI используя pexpect
    commands/ — папка с командами

    Модуль универсальный, и если нет нужного параметра, то его можно легко добавить. К примеру нужно получить контекст sip-пира 101:

    sudo -u zabbix /etc/zabbix/asterisk-zabbix-py/run.py peer -f Context -p 101
    

    получим ответ from-users (мое название контекста)

    или к примеру узнать используемые кодеки:

    sudo -u zabbix /etc/zabbix/asterisk-zabbix-py/run.py peer -f Codecs -p 101
    

    получим ответ (g722|ulaw|alaw|g729)

    Для более детального вывода информации к командам можно добавлять опцию "-v"

    Если нам нужны дополнительные команды, то по аналогии с файлами из commands добавляем свой, к примеру iax2.py, который будет мониторить IAX-пиры:

    # coding=utf-8
    from zasterisk.base import DiscoveryFieldCommand
    
    
    class Command(DiscoveryFieldCommand):
        help = '''
            IAX2 peers
        '''
    
        def discovery(self, ami):
            def callback(connect, timeout):
                events = self.parse_events(connect)
                return self.create_discovery(events.get("PeerEntry"), "{#USERNAME}", "ObjectName")
    
            return ami.execute("IAXpeers", {}, callback)
    
        def get_field(self, ami, field_name, param):
            return ami.execute("IAXpeers", {"Peer": param}, lambda connect, timeout: self.expect_field(
                connect, field_name, timeout))
    
        def count(self, ami):
            return 0
    


    В результате получим возможность мониторить параметры IAX пиров:

    sudo -u zabbix /etc/zabbix/asterisk-zabbix-py/run.py iax2 -v -f IPaddress -p demo
    


    результат: 216.207.245.47

    В заключении хотелось бы отметить, что мы привели только некоторые, важные по нашему мнению, процессы для мониторинга. С помощью данного модуля для Zabbix вы можете мониторить другие необходимые вам процессы. Надеюсь данный топик может вам получать более подробную информацию о «жизнедеятельности» вашего Asterisk и максимально минимизировать время простоя:)
    Поделиться публикацией
    Ой, у вас баннер убежал!

    Ну. И что?
    Реклама
    Комментарии 22
      –2
      На скриншоте я даже без утилит могу прочитать то, что вы так «старательно» замазали.
      0
      Лучше бы скрипты или алгоритмы выложили. Как поставить астериск уже и так огромное количество раз описано. Никакой практической пользы в этой статье я не нашел.
        +3
        Качаем необходимые нам скрипты (для удобства собрали их на bitbucket)
        git clone pbxware@bitbucket.org/pbxware/asterisk-zabbix-py.git — вот же всё в статье написано и скрипты в общем доступе, может стоит внимательнее читать, а не сливать карму?
          –1
          Благодарю. Действительно пропустил место про скачивание скриптов (что логично, т.к. процедуру установки заббикса мне изучать необязательно). Логичнее было бы намекнуть заранее, что использоваться будут скрипты, находящиеся в общем доступе, чем потом тыкать человека в то, что он не заметил среди ненужного куска одну строчку. Вы же для людей пишете, я надеюсь, а не для того, чтоб заставлять их чувствовать себя неловко =). Карму вашу трогал не я.
            0
            Извините, если был резок. Впредь при написании постараюсь максимально акцентировать внимание на самых значимых местах в топике:)
        0
        Подскажите, пожалуйста, а можно ли как то мониторить работоспособность транков из вне?
          0
          Возможно, не очень подробно в статье расписал, но принцип работы таков: на сервере с asterisk вы ставите только zabbix-агент и скрипты, описанные в статье. Zabbix-агент с прикрученными скриптами отсылает информацию на ваш Zabbix-сервер, который может находится где угодно, необязательно в вашей локальной сети. Единственное, что нужно помнить, что для нормального взаимодействия с сервером zabbix-агенту нужно прокинуть порт (по умолчанию 10050). Как развернуть zabbix-сервер можете посмотрет, например, здесь.
            0
            Я не достаточно четко сформулировал вопрос, извиняюсь. Как мне определить, что транк не работает, если он в астериске в статусе «Registered», но звонки на него из вне не проходят, а, например, сбрасываются.
              0
              А, теперь понял. Нет, к сожалению, пока это невозможно, скрипты смотрят только статус «registered» и отличные от него. Постараемя решить, как можно реализовать интересующий вас функционал:)
                0
                Спасибо, давно ищу такой функционал.
          +1
          А уже готовых темплейтов для заббикс нету под это дело? Чтоб руками не добавлять все элементы данных и т.п.
            0
            Набросал простенький шаблон — www.dropbox.com/s/mtipnso8ktdet3a/zbx_export_asterisk_template.xml?dl=0
            добавлены все LLD, а так же созданны пара item prototype и один trigger prototype.
            Trigger prototype срабатывает если qualify peer'а не ОК, для этого нужно подправить userparameter_asterisk.conf:
            + UserParameter=asterisk.sip.qualify[*],/etc/zabbix/asterisk-zabbix-py/run.py peer -f Status -r "([A-Z]+)" -p $1
            - UserParameter=asterisk.sip.qualify[*],/etc/zabbix/asterisk-zabbix-py/run.py peer -f Status -r "(\d+)" -p $1
            
          0
          То что нужно!
          Благодарю за труд.
            +1
            Пожалуйста. Рад, что вам пригодилось:)
            0
            Что-то ему не нравится, в чем проблема может быть?

            sudo -u zabbix /etc/zabbix/asterisk-zabbix-py/run.py peer -f Context -p 1001
            Traceback (most recent call last):
            File "/etc/zabbix/asterisk-zabbix-py/run.py", line 5, in from zasterisk.ami import TelnetAmi
            File "/etc/zabbix/asterisk-zabbix-py/zasterisk/__init__.py", line 21
            commands.update({name: module_name + "." + name for name in find_commands(command_dir)})
            ^
            SyntaxError: invalid syntax
              0
              Не понимает name for name in find_commands
              какая у вас версия питона? покажите вывод python --version

              0
              [root@localhost ~]# python --version
              Python 2.6.6
                0
                В самом начале статьи я писал:
                Изначально на вашем сервере должны быть удовлетворены следующие зависимости:

                python 2.7+
                python-all-dev
                Zabbix 2.4+
                asterisk 1.8+
                argparse 1.2.1+
                pexpect 3.3+
                posix-ipc 0.9.9+
                wsgiref 0.1.2+

                  0
                  да, я уже понял, щас ковыряюсь с питоном

              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

              Самое читаемое