← Функции сервера HQbird

Новая возможность — легковесный мониторинг на основе трейс-плагина, который обновляет мониторинговые счётчики в реальном времени. Счётчики хранятся в общей памяти, поэтому эффективно работает режим Classic Server. Обновление счётчиков не связано с блокировками. Размер общей памяти по умолчанию — 4 MB и не меняется после инициализации. Это даёт (в основном) безблокировочную работу со счётчиками. Размер задаётся параметром плагина MemorySize (см. ниже).

Пока поддерживается небольшой набор счётчиков. Мониторинг собирает данные о двух видах объектов — БД и соединениях. На уровне БД есть отдельный набор счётчиков по завершённым соединениям, чтобы накапливать статистику по базе.

API сервиса

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

c
/* Lightweight monitoring */
#define isc_action_svc_lwmonitoring  32

У сервиса два параметра. Первый выбирает операцию. Сейчас есть только «выполнить запрос»:

c
#define isc_spb_lwm_query  1

Реализованы 4 вида запросов (ниже). Номер запроса (1–4) передаётся целым значением isc_spb_lwm_query.

Второй параметр — имя БД — необязателен и задаётся тегом isc_spb_dbname. Если он указан, запрос ограничен этой БД, иначе возвращаются данные по всем известным базам.

Формат ответа

Все запросы возвращают текст, по одной строке на элемент. Элемент — сведения о БД, соединении или агрегат. Строки в JSON, чтобы их было удобно разбирать.

Первая строка ответа всегда заголовок:

json
{"idQuery" : 1, "tsQuery" : "2024-04-17T00:17:58" }
idQuery
номер запроса (ID)
tsQuery
время начала запроса (локальное время сервера, ISO-8601)

Запрос 1 — сводка

Сводка по известным БД и соединениям. Всегда одна строка:

json
{"cntDb" : 1, "activeAtt" : 1, "goneAtt" : 0}
cntDb
число баз данных
activeAtt
число активных соединений
goneAtt
число завершённых соединений

Запрос 2 — список БД

Одна или несколько строк:

json
{"dbName" : "SECURITY2.FDB", "activeAtt" : 1, "goneAtt" : 2}
dbName
имя файла БД
activeAtt
активные соединения
goneAtt
завершённые соединения

Запрос 3 — сводка по соединениям каждой БД

Одна или несколько строк:

json
{"dbName" : "SECURITY2.FDB", "activeAtt" : 1, "goneAtt" : 0, "doneTran" : 1, "activeTran" : 0, "prepReq" : 0, "execReq" : 0, "activeReq" : 0}
dbName
имя файла БД
activeAtt
активные соединения
goneAtt
завершённые соединения
doneTran
завершённые транзакции
activeTran
активные транзакции
prepReq
подготовленные запросы
execReq
выполненные запросы
activeReq
активные запросы

Дополнительные счётчики:

rowsFetched
строки, полученные приложением
execTime
время выполнения запроса, мс
errors
ошибки, полученные приложением
fetches
число fetch
reads
чтения страниц
marks
marks (перед изменением страницы)
writes
записи страниц

Запрос 4 — детали по соединениям

Несколько строк двух типов:

json
{"dbName" : "SECURITY2.FDB", "activeAtt" : 1, "goneAtt" : 0}
json
{"idAtt" : 0, "pidAtt" : 0, "doneTran" : 0, "activeTran" : 0, "prepReq" : 0, "execReq" : 0, "activeReq" : 0}
json
{"idAtt" : 13925, "pidAtt" : 11188, "doneTran" : 1, "activeTran" : 0, "prepReq" : 0, "execReq" : 0, "activeReq" : 0}

Строки типа (a) описывают БД, типа (b) — соединения к этой БД. После каждой строки (a) есть хотя бы одна строка (b) для этой базы.

idAtt
id соединения, или 0 для агрегата по завершённым соединениям
pidAtt
PID серверного процесса, обслуживающего соединение

Ошибки

При ошибке сервис либо возвращает исключение в status vector, либо строку JSON:

json
{"errorMsg" : "Error text"}

Пример:

json
{"errorMsg" : "Unknown query: 5"}

Примеры команд

Локальный service manager:

Command
fbsvcmgr service_mgr action_lwmonitoring lwm_query 1

Удалённый хост, запрос 4 по одной БД:

Command
fbsvcmgr host:service_mgr action_lwmonitoring lwm_query 4 dbname employee

Конфигурация

В firebird.conf добавлен параметр с именем плагина легковесного мониторинга:

ini
MonitoringPlugin =

По умолчанию плагин не задан, мониторинг не ведётся. Имя плагина в HQbird — fblwmon:

ini
MonitoringPlugin = fblwmon

Плагин входит в сборку HQbird и лежит в каталоге plugins.

Параметры плагина задаются обычным способом (см. README.plugins.html), например в plugins.conf:

ini
Plugin = fblwmon
{
  Config = lwmConfig
}

Config = lwmConfig
{
  # default 4MB
  MemorySize = 1M
}

MemorySize — размер общей памяти плагина в байтах (или с суффиксом, например 1M).

Лимит соединений

На базе легковесного мониторинга реализован встроенный лимит числа одновременных соединений к БД. Значение лимита одно для всех баз (в HQ 2.5 нет per-database настроек). Два целочисленных параметра в firebird.conf:

ini
WarnCountAttachments = 0
MaxCountAttachments = 0

Проверка выполняется в момент подключения и не учитывает создаваемое соединение. Используется счётчик активных соединений к данной БД:

  • если счётчик ≥ WarnCountAttachments и < MaxCountAttachments, соединение разрешается, в firebird.log пишется:
text
Database XXX: number of attachments is above warning level (N >= W)
  • если счётчик ≥ MaxCountAttachments, соединение запрещается. Клиент получает:
text
Statement failed, SQLSTATE = HY000
Number of attachments exceeds allowed maximum

и в firebird.log:

text
Database XXX: number of attachments is above maximum level (N >= M)

Не проверяются: соединения к security.db, сервисные соединения и соединения с тегом isc_dpb_no_db_triggers в DPB.

  • WarnCountAttachments = 0 — предупреждения не выдаются
  • MaxCountAttachments = 0 — соединения не запрещаются

Чтобы лимит работал, нужно установить и настроить плагин легковесного мониторинга (см. выше).