Мониторинг СУБД Firebird с помощью Zabbix

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Примерно 20 лет назад была установлена СУБД Firebird, если не ошибаюсь, версии 1.0.3, на сегодняшний день база все еще жива и нужна, размер ее перевалил за 30ГБ, что по сегодняшним меркам очень мало, но и основной рост базы пришелся на начало века.

С повсеместным внедрением средств мониторинга захотелось снимать минимальную статистику и определять работоспособность СУБД и самой БД. Для мониторинга использую Zabbix установленный на Ubuntu 20.04 LTS, а сама СУБД находится на виртуальной машине с Windows 2008 Server. Версии на которых был использован метод мониторинга описанный ниже для СУБД Firebird 2.5.9, версия Zabbix 6.0. Но думаю что и с другими версиями проблем быть не должно.

Даная статья не ставит целью описать процесс установки СУБД Firebird, к слову он очень прост, или средства мониторинга Zabbix, эта статья покажет как за минимальное время можно "завести" СУБД Firebird в Zabbix, получать необходимые данные для мониторинга и реакции на сбои.

Первое что необходимо сделать это вспомнить о isql.exe который фактически является CLI для FB. Был написан небольшой скрипт которые достаёт данные из заранее подготовленной вьюшки MONITORING, которая в свою очередь собирает данные из таблиц мониторинга СУБД.

CREATE OR ALTER VIEW MONITORING(
    "Database_Name", "Page_Size", "ODS_Version", "Oldest_Tr",
    "Oldest_Active_Tr", "Oldest_Snapshot_Tr",
    "Next_Tr", "Page_Buffers", "SQL_Dialect",
    "Shutdown_Mode", "Sweep_Interval",
    "Read_Only", "Forced_Writes", "Reserve_Space",
    "Created_At", "Pages",
    "Size_MB", "Backup_State", "Nonindexed_Reads",
    "Indexed_Reads", "Records_Inserted",
    "Records_Updated", "Records_Deleted",
    "Records_Backed_Out", "Records_Purged",
    "Records_Expunged", "Page_Reads", "Page_Writes",
    "Page_Fetches", "Page_Marks", "Connections",
    "Stat group")
AS
SELECT
       db.mon$database_name,
       db.mon$page_size,
       db.mon$ods_major || '.' || db.mon$ods_minor,
       db.mon$oldest_transaction, db.mon$oldest_active,
       db.mon$oldest_snapshot, db.mon$next_transaction,
       db.mon$page_buffers, db.mon$sql_dialect,
       db.mon$shutdown_mode, db.mon$sweep_interval,
       db.mon$read_only, db.mon$forced_writes,
       db.mon$reserve_space, db.mon$creation_date,
       db.mon$pages,
       cast((db.mon$pages * db.mon$page_size / 1024.00 / 1024.00) as numeric(18,2)),
       db.mon$backup_state, r.mon$record_seq_reads,
       r.mon$record_idx_reads, r.mon$record_inserts,
       r.mon$record_updates, r.mon$record_deletes,
       r.mon$record_backouts, r.mon$record_purges,
       r.mon$record_expunges, io.mon$page_reads,
       io.mon$page_writes, io.mon$page_fetches,
       io.mon$page_marks,
       (select count(*) from mon$attachments),
       r.mon$stat_group
FROM mon$database db
left join mon$record_stats r on (db.mon$stat_id = r.mon$stat_id)
left join mon$io_stats io on (db.mon$stat_id = io.mon$stat_id)

Скрипт isql.cmd запрашивающий данные от СУБД выглядит так:

C:\Program Files\Firebird\Firebird_2_5\bin\isql.exe" -q -i "C:\zabbix\isql.sql

А сам SQL запрос isql.sql которрый "скармливается" isql.exe так:

CONNECT 'localhost:employee' user 'SYSDBA' password 'masterkey';
SET list on;
SELECT * FROM MONITORING;
EXIT;

Данный скрипт примечателен только выражением "SET list on", которое в дальнейшем упрощает разбор данных регулярными выражениями, т.к. предоставляет данные списком, а не таблицей.

В итоге после отработки скрипта получаем данные которые предоставила СУБД, а точнее строку приготовленной ранее вьюшки:

Результат работы isql.exe
Результат работы isql.exe

Теперь эти данные нужно передать в Zabbix. Передавать будем используя конфигурационный файл агента, а именно параметр UserParameter, выглядит это примерно так:

UserParameter=FirebirdData,C:\zabbix\isql.cmd

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

Создаем новый шаблон и не забываем привязать этот шаблон к узлу на котором расположена СУБД:

Создание шаблона
Создание шаблона

И добавляем элементы данных, которых может быть множество, основные я представил на рисунке ниже, почти все они создаются по одному образу:

Список готовых элементов данных
Список готовых элементов данных

Основной элемент данных, от которого зависят все остальные элементы это FirebirdData, это текст который передает агент Zabbix:

Элемент данных содержащий таблицу для разбора
Элемент данных содержащий таблицу для разбора

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

Элемент данных
Элемент данных
Предобработка элемента данных
Предобработка элемента данных

Перечислять все элементы данных нет необходимости они все очень похожи и отличаются только предобработкой. Какие-то параметры целочисленные, какие-то дробные или текстовые.

Теперь на основе имеющихся данных можно создать триггеры. Первый из триггеров будет определять, доступны ли данные о БД:

Триггер nodata
Триггер nodata

Определять в каком состоянии БД:

Триггер shutdown
Триггер shutdown

Ну и разницу между текущей транзакцией и OIT, что для версионных БД важно:

Триггер OIT
Триггер OIT

Можно "вытащить" из БД больше данных, собрать информацию по индексам или таблицам, но у меня в этом нет необходимости.

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

Графики мониторинга
Графики мониторинга

Здесь все достаточно просто, первый график показывает количество чтений из БД, второй операции удаления, обновления и создания, а последний показывает отставание OIT.

Думаю, что все кто ранее хоть одним глазом видел FirebirdSQL и Zabbix настроит мониторинг очень быстро и без проблем. Всем спасибо.

Источник: https://habr.com/ru/post/662049/


Интересные статьи

Интересные статьи

Где только не применяют нейросети — от интернета вещей до распознавания текстов, в том числе древних рукописей. В этот раз машинное обучение помогло разобраться в свитках из Иудейской п...
В предыдущих статьях Google Earth Engine (GEE) как общедоступный суперкомпьютер и Google Earth Engine (GEE) как общедоступный каталог больших геоданных мы познакомились со способами удобн...
В прошлой статье, посвященной выяснению победителя в состязании JS-парсеров строки buffers-атрибута узла плана PostgreSQL, мы дошли до факта, что самый эффективный в...
… а также глубокого обучения на основе облачных вычислений и акустического моделирования Для выращивания тканей органов из клеток в лаборатории исследователям нужен неинвазивный способ у...
Хотите использовать линукс на работе, но корпоративный VPN не даёт? Тогда эта статья может помочь, хотя это не точно. Хочу заранее предупредить, что вопросы администрирования сетей я понимаю плох...