Предыстория


Имеем в «штате» Asterisk 11 и СУБД FireBird 2.5, в которую PBX пишет CDR. Нечасто, но бывает так, что запись в БД прекращается, а узнаем мы об этом тогда, когда нужно что-то посмотреть в CDR. Увидев, что записей нет, перезапускаем Asterisk, запись в БД восстанавливается. В очередной раз не получив важную информацию из CDR, было решено каким-то образом отслеживать факт записи/не записи в CDR.

В качестве системы мониторинга мы используем Zabbix 3, поэтому было решено написать простенький скрипт на Python, который будет подключаться к FireBird и проверять время последней записи в таблицу с CDR, если это время превышает 30 минут, то система мониторинга просигнализирует нам об этом.

Установка Python 3


Asterisk установлен на уже стареньком Centos 6.8, поэтому для начала устанавливаем свежий Python.

Качаем самые свежие на момент написания статьи исходники:

wget http://www.python.org/ftp/python/3.6.1/Python-3.6.1.tar.xz -O /var/tmp/Python-3.6.1.tar.xz

Идём в указанный выше каталог:

cd /var/tmp/Python-3.6.1

Выполняем:

./configure

Собираем:

make

Устанавливаем:

make install

Python установится в каталог /usr/local/bin/python3

Установка питоновской библиотеки для связи с FireBird


Нужно обновить или записать клиентскую библиотеку для нашей версии FireBird. Можно 2.5.5, можно 3.0.2.

2.5.5. уже была, добавляем в этот же каталог /usr/lib64 еще libfbclient.so.3.0.2, создаем, аналогично уже существующим, симлинки libfbclient.so.3 и заменяем симлинк libfbclient.so на такой же, указывающий на libfbclient.so.3.

Pip с нашей последней версией python 3.6.1 уже имеется, называется аналогично python3 – pip3.
Устанавливаем библиотеку для работы с FireBird на Linux:

pip install fdb

Скрипт подключения к FireBird и получения результата о наличии/отсутствии записи в CDR


#!/usr/local/bin/python3
# Скрипт предназначен для мониторинга заполняемости таблицы cdr в базе
import fdb
from datetime import timedelta, datetime

# Соединение
con = fdb.connect(dsn='192.168.7.15:e:/path/db_asterisk.fdb', user='user', password='password')

# Объект курсора
cur = con.cursor()

# Выполняем запрос
dt = (datetime.now() - timedelta(minutes=30)).replace(microsecond=0)
cur.execute("select iif(exists(select * from cdr c where c.calldate > '" + str(dt) + "'), 1, 0) from rdb$database")

# cur.fetchall() возвращает список из кортежей. Адресуемся к единственному значению; + перевод строки
print(str(cur.fetchall()[0][0]))

В строке соединения, естественно, указываем свои данные (IP, путь, логин, пароль).

Zabbix сервер


Данная статья не преследует цель научить пользоваться системой мониторинга, поэтому здесь всё кратко, для понимания процесса.

Создаём новый элемент данных на узле с Asterisk:

image

Добавляем триггер на событие:

image

Zabbix агент


Идем на сервер с Asterisk и правим конфигурацию агента.
В конец файла /etc/zabbix/zabbix_agentd.conf добавляем строчку:

UserParameter=CDRWrite.check[*], /path/to_scripts/script.py

И перезапускаем агент:

service zabbix-agent restart

После проделанного на Zabbix сервер должны начать поступать данные о выполнении скрипта. В случае, если данные не пишутся более 30 минут (что в нашем случае невозможно в рабочее время), система мониторинга нас оповестит об этом.
Поделиться с друзьями
-->

Комментарии (16)


  1. nikolayv81
    04.04.2017 20:26
    +1

    А почему не использовать встроенную утилиту командной строки от разработчиков БД?
    https://firebirdsql.org/manual/isql.html


    1. jumper_xf-666
      04.04.2017 22:53
      -1

      Потому что конкретно в нашей ситуации нам было удобнее и сподручнее «смотреть» в базу так, как мы это реализовали, поэтому мы даже не задумывались об Firebird Interactive SQL Utility.


    1. Arbane
      05.04.2017 23:10

      Вроде ценное замечание, но можно использовать для чего именно?

      • Можно вместо fdb, работая в интерактивном режиме, тут понятно, но менее удобно;
      • Можно вместо питона, но что может гарантировать стабильный вывод значения, скажем в диапазоне 0..1, который в статье указан? Опять же, если намек на INput filename


      1. nikolayv81
        07.04.2017 00:25

        специально поставил firebird, zabbix и asterix не стал ставить…
        как то так

        test.sql
        connect employee;
        select 'result: '||/*тут у нас результат-*/'1' as res from rdb$database;
        quit;
        


        скрипт для вставки
        root@home:~# /opt/firebird/bin/isql -q -now -i test.sql | grep 'result:' | awk '{print $2}'
        1
        

        Что там вырезать с помощью awk/grep или других «встроенных» утилит каждый может решать сам, но по сути python тут видится лишним элементом.


        1. Arbane
          07.04.2017 01:14

          Благодарен, что взяли на себя труд. Но это же медленное извращение с текстом! Надо еще обработать exception'ы. Так можно и firebird взять лишним элементом. А по-моему честный код в который всегда можно добавить хоть обращение к веб, хоть что — удобнее. Ах да, можно ведь использовать wget…


          1. nikolayv81
            07.04.2017 08:28

            Ну так смысл в статье — написать скрипт который по крону раз в n минут заполняет переменную состояния для zabbix-а (а предыдущий вопрос строго для чисел был), потому и удивило что для этого питон с доп. библиотекой тянут :)
            Обычно в таких случаях стараются что-то из базовой поставки использовать.


  1. Diaskhan
    04.04.2017 21:27
    -1

    Не используйте firebird для Веба. Fb тупиковая Бд.
    у нас стоит fb 2.5 классик максимальное количество коннектов 400.
    Дальше отказывается подключать пользователей !


    А Если используете, и будете масштабироватся знайте лучше сразу мигрировать на тот же постгре либо коммерческие бд.


    А весь хваленный маркетинг в итоге превращается в очень сложное сопровождение этой субд.
    Новые проекты лучше уж начинать с MariaDb либо c Postresql.


    1. nikolayv81
      04.04.2017 21:31

      И зачем вы используете classic с его накладными расходами, да и как то вы не указали условия, а то может в вашем варианте не в БД проблема?


    1. jumper_xf-666
      04.04.2017 22:55

      Не используйте firebird для Веба.

      Никто и не говорил, что FB у нас используется для Веба. Эта СУБД у нас на вооружении касаемо проектов, никак не связанных с Вебом.


    1. bat
      06.04.2017 09:17

      1. да FB не для веба, если веб на PHP
      2. про тупиковую не согласен
      3. зачем используете классик если у вас коротко живущие коннекты?
      4. тестировали ли FB 3?

      зы
      про 400 пользователей: что за железо?
      есть БД ежедневно 3k+ подключений, проблемы начинаются ближе к 4к
      причем есть основания полагать, что истинный корень проблемы в количестве соединений а в неправильной работе с транзакциями в некоторых АРМах


    1. Greendq
      06.04.2017 18:46

      Вы её просто готовить не умеете. Зачем на классике каждого посетителя сразу к базе пускать?


  1. MMik
    05.04.2017 12:48

    Ну вот и снова очередная статья с `make install`.

    wget http://www.python.org/ftp/python/3.6.1/Python-3.6.1.tar.xz -O /var/tmp/Python-3.6.1.tar.xz
    cd /var/tmp/Python-3.6.1
    ./configure
    make
    make install
    Раз уж вы пишете настолько банальные вещи, то почему упустили распаковку скачанного архива? Вдруг читатель не знает, как это сделать?

    Библиотека fdb работает с версиями Python 2.6+ и 3.x; в CentOS 6.8 стоит Python 2.6, если мне память не изменяет. Нужды разводить бардак на сервере, и тем более рекомендовать поступать так другим, небыло.


    1. Arbane
      05.04.2017 15:16

      Почему бардак? python3 и pip3 вместе с python и pip, никто никому не мешает. Тем более лично мне python3 нравится намного больше, потому как функции это функции, никаких команд print, все единообразно. Никаких танцев с бубнами со строками. Опять же, все серьезные проекты (например Django) давным давно поддерживают python 3. И, опять же, не нужно думать о virtualenv.

      Дабы не городить бардак, python 2 можно удалить, но зачем лишние действия?

      Действительно, можно указать, что можно использовать и python. Как вы верно заметили, fdb работает и с тем, и с тем. Только стоит учесть, что если копировать скрипт 1 в 1 из статьи — в статье python3.


      1. MMik
        05.04.2017 15:36


        Дабы не городить бардак, python 2 можно удалить
        Нельзя. В данном случае нельзя просто взять, и удалить Python 2.


      1. foldr
        06.04.2017 13:32

        Опять же, все серьезные проекты (например Django) давным давно поддерживают python 3. И, опять же, не нужно думать о virtualenv.

        Вот только в серьезных проектах обычно используют виртуальные окружения, дабы не разводить бардак в системе и переключаться между несколькими окружениями. Не хочется возиться с установкой python3 (тем более собирать из исходников!) — можно установить miniconda/anaconda дистрибутив. Всего лишь надо скачать установочный скрипт и запустить, можно даже без прав рута. Далее,
        conda create -n myvenv python=3.5
        source activate myenv
        Вуаля! И, в отличие от venv, не надо дополнительно устанавливать setuptools, pip3. И можно создавать окружения с любыми версиями питона (venv использует установленный в системе)


        python 2 можно удалить

        И отвалятся системные скрипты


  1. jumper_xf-666
    05.04.2017 12:51

    Раз уж вы пишете настолько банальные вещи, то почему упустили распаковку скачанного архива? Вдруг читатель не знает, как это сделать?

    Ну, такими темпами могу сказать, что нет предела совершенству, придраться можно ко всему. Практически данный процесс не помешает, с точки зрения перфекционизма да, скорее всего, тут не всё круто, на идеал и не претендую.

    Библиотека fdb работает с версиями Python 2.6+ и 3.x; в CentOS 6.8 стоит Python 2.6, если мне память не изменяет.

    Тут спорить не буду. Мы хотели максимально актуальные версии, в чем нас нельзя обвинять =)