Pull to refresh

Подключение к FireBird из Python и мониторинг факта записи в БД

Reading time 2 min
Views 22K

Предыстория


Имеем в «штате» 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 минут (что в нашем случае невозможно в рабочее время), система мониторинга нас оповестит об этом.
Tags:
Hubs:
+6
Comments 16
Comments Comments 16

Articles