Легковесный мониторинг
Новая возможность — легковесный мониторинг на основе трейс-плагина, который
обновляет мониторинговые счётчики в реальном времени. Счётчики хранятся в
общей памяти, поэтому эффективно работает режим Classic Server. Обновление
счётчиков не связано с блокировками. Размер общей памяти по умолчанию —
4 MB и не меняется после инициализации. Это даёт (в основном)
безблокировочную работу со счётчиками. Размер задаётся параметром плагина
MemorySize (см. ниже).
Пока поддерживается небольшой набор счётчиков. Мониторинг собирает данные о двух видах объектов — БД и соединениях. На уровне БД есть отдельный набор счётчиков по завершённым соединениям, чтобы накапливать статистику по базе.
API сервиса
Для чтения данных мониторинга добавлен новый сервис:
/* Lightweight monitoring */
#define isc_action_svc_lwmonitoring 32У сервиса два параметра. Первый выбирает операцию. Сейчас есть только «выполнить запрос»:
#define isc_spb_lwm_query 1Реализованы 4 вида запросов (ниже). Номер запроса (1–4) передаётся целым
значением isc_spb_lwm_query.
Второй параметр — имя БД — необязателен и задаётся тегом isc_spb_dbname.
Если он указан, запрос ограничен этой БД, иначе возвращаются данные по всем
известным базам.
Формат ответа
Все запросы возвращают текст, по одной строке на элемент. Элемент — сведения о БД, соединении или агрегат. Строки в JSON, чтобы их было удобно разбирать.
Первая строка ответа всегда заголовок:
{"idQuery" : 1, "tsQuery" : "2024-04-17T00:17:58" }- idQuery
- номер запроса (ID)
- tsQuery
- время начала запроса (локальное время сервера, ISO-8601)
Запрос 1 — сводка
Сводка по известным БД и соединениям. Всегда одна строка:
{"cntDb" : 1, "activeAtt" : 1, "goneAtt" : 0}- cntDb
- число баз данных
- activeAtt
- число активных соединений
- goneAtt
- число завершённых соединений
Запрос 2 — список БД
Одна или несколько строк:
{"dbName" : "SECURITY2.FDB", "activeAtt" : 1, "goneAtt" : 2}- dbName
- имя файла БД
- activeAtt
- активные соединения
- goneAtt
- завершённые соединения
Запрос 3 — сводка по соединениям каждой БД
Одна или несколько строк:
{"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 — детали по соединениям
Несколько строк двух типов:
{"dbName" : "SECURITY2.FDB", "activeAtt" : 1, "goneAtt" : 0}{"idAtt" : 0, "pidAtt" : 0, "doneTran" : 0, "activeTran" : 0, "prepReq" : 0, "execReq" : 0, "activeReq" : 0}{"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:
{"errorMsg" : "Error text"}Пример:
{"errorMsg" : "Unknown query: 5"}Примеры команд
Локальный service manager:
fbsvcmgr service_mgr action_lwmonitoring lwm_query 1Удалённый хост, запрос 4 по одной БД:
fbsvcmgr host:service_mgr action_lwmonitoring lwm_query 4 dbname employeeКонфигурация
В firebird.conf добавлен параметр с именем плагина легковесного мониторинга:
MonitoringPlugin =По умолчанию плагин не задан, мониторинг не ведётся. Имя плагина в HQbird —
fblwmon:
MonitoringPlugin = fblwmonПлагин входит в сборку HQbird и лежит в каталоге plugins.
Параметры плагина задаются обычным способом (см. README.plugins.html),
например в plugins.conf:
Plugin = fblwmon
{
Config = lwmConfig
}
Config = lwmConfig
{
# default 4MB
MemorySize = 1M
}MemorySize — размер общей памяти плагина в байтах (или с суффиксом, например 1M).
Лимит соединений
На базе легковесного мониторинга реализован встроенный лимит числа одновременных
соединений к БД. Значение лимита одно для всех баз (в HQ 2.5 нет per-database
настроек). Два целочисленных параметра в firebird.conf:
WarnCountAttachments = 0
MaxCountAttachments = 0Проверка выполняется в момент подключения и не учитывает создаваемое соединение. Используется счётчик активных соединений к данной БД:
- если счётчик ≥
WarnCountAttachmentsи <MaxCountAttachments, соединение разрешается, вfirebird.logпишется:
Database XXX: number of attachments is above warning level (N >= W)- если счётчик ≥
MaxCountAttachments, соединение запрещается. Клиент получает:
Statement failed, SQLSTATE = HY000
Number of attachments exceeds allowed maximumи в firebird.log:
Database XXX: number of attachments is above maximum level (N >= M)Не проверяются: соединения к security.db, сервисные соединения и соединения с
тегом isc_dpb_no_db_triggers в DPB.
WarnCountAttachments = 0— предупреждения не выдаютсяMaxCountAttachments = 0— соединения не запрещаются
Чтобы лимит работал, нужно установить и настроить плагин легковесного мониторинга (см. выше).