Админ

среда, 4 декабря 2013 г.

Мониторинг подключений к БД Firebird 2.5

|
У нас в вузе большинство приложений, связанных с автоматизацией управления учебным процессом, работают на общей базе данных под управлением СУБД Firebird версии 2.5. Не так давно у начальства возник вопрос: как определить, сколько пользователей работает с базой, сколько и каких приложений они используют? Решать его, естественно, пришлось мне.

Я быстро, за пару часов, набросал небольшую программу, которая выводит на экран количество текущих подключений, и продемонстрировал начальству. Потом, в свободное от работы время, я немного усовершенствовал программу, потом ещё немного усовершенствовал… короче говоря, стало ясно, что скоро простенькая программа превратится в некое подобие машины Голдберга, и тогда я решил на этом остановиться.

Некоторые технические подробности

Одной из приятных особенностей Firebird является возможность (особенно версии 2.1 и выше) получать различные метаданные при помощи вполне обычных SQL-запросов к системным таблицам.

В частности, получить список адресов и приложений, использующих базу в текущий момент времени, можно посредством такого запроса:
select
  MON$REMOTE_PROCESS,
  MON$REMOTE_ADDRESS
from
  MON$ATTACHMENTS
Этот запрос возвращает таблицу из двух столбцов: в первом будет имя процесса (для большинства приложений Windows это полное имя exe-файла), во втором — IP-адрес или сетевое имя компьютера (в том случае, если сервер и клиент расположены в одной рабочей группе одной локальной сети).

Собственно, на этом можно было бы и остановиться и не писать никакой программы. Но просто показать полученный список «нормальному» человеку нельзя. Поэтому я сделал несложную графическую оболочку, которая позволяет видеть названия приложений вместо имён exe-файлов, пометки в списке IP-адресов, а главное — может запоминать текущее количество подключений и вести статистику. Можно посмотреть, например, как меняется количество подключений в течение дня, какие программы используются чаще всего.

Как работает программа

Выбор базы данных

Вначале программа считывает из ini-файла список баз данных (это обычный ini-файл, имя которого можно передать программе в качестве параметра, либо его имя должно совпадать с именем программы). Каждой базе данных соответствует секция в ini-файле. Там содержится информация о пути к базе, логин и пароль (необязательные) и немногочисленные прочие настройки.

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

Рис. 1. Список баз данных

Если секция в файле всего одна, то она и обрабатывается далее. Если секций несколько, то программа пытается найти секцию с именем default и обработать её или же просто первую по порядку секцию (пользователь потом может выбрать другую базу из списка).

Если в файле нет логина и/или пароля, то программа попросит их ввести (рис. 2).

Рис. 2. Ввод логина и пароля

После успешного подключения к базе программа начинает периодически (интервал устанавливается через ini-файл для каждой базы индивидуально, по умолчанию 1 минута) посылать на сервер тот самый SQL-запрос. Полученный ответ представляется в виде двух списков: приложений и адресов.

Список известных приложений

Программа выводит на экран список приложений и количество адресов, с которых идёт подключение к каждой программе, причём имена exe-файлов заменяются на осмысленные названия (рис. 3).


Рис. 3. Список приложений

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


Рис. 4. Список известных приложений

Принцип прост: имя exe-файла проверяется на наличие подстроки, указанной слева (то есть если запрос вернул строку «C:\Program Files\MyProg\MyProg.exe», то ему подойдут «MyProg.exe», «MyProg\MyProg.exe» и даже «Prog.exe»). Если совпадение есть, то в списке выводится то название, которое стоит справа. Если ни одно не подошло, то выводится имя exe-файла, а если подошли несколько, то используется то, которое выше по списку (пример есть на рисунке, программа «Учебные и рабочие планы»). Разумеется, нужно заранее знать, какие программы могут подключаться к базе.

Может оказаться, что запрос не вернул имя процесса (MON$REMOTE_PROCESS=null). Это связано с разными причинами. Например, не-Windows приложения могут не сообщать СУБД своё имя. Тогда программа проверяет список известных IP-адресов (который устроен так же, как и список известных приложений: адрес и имя / псевдоним). Если подходящий адрес нашёлся, то соответствующий псевдоним будет добавлен к списку приложений. Например, это можно использовать если данные из базы берёт какой-то процесс, запущенный на стороннем сервере, и адрес сервера известен.

Все неидентифицированные процессы сводятся в одну строку (название для этой строки тоже можно задать в списке известных приложений, показанном на рис. 4, — это строка, у которой пуста левая графа).

Список известных адресов

Мы уже упомянули этот список. Настраивается он так же, как и список приложений:


Рис. 5. Список известных адресов

И страница с адресами очень похожа на страницу с приложениями:


Рис. 6. Список подключённых адресов

В левом столбце перечислены все адреса, который подключались к базе с момента запуска программы, а в правом — все приложения, которые были подключены с этих адресов в момент последнего обновления. Если с одного и того же адреса одно и то же приложение одновременно создаёт несколько подключений (например, запущено несколько копий программы или одна программа открывает несколько соединений с одной и той же базой данных), то после названия программы в скобках будет стоять число этих подключений.

Хронология

Программа умеет сохранять историю колебаний количества приложений и адресов. После каждого обновления данных она запоминает два числа: количество запущенных в этот момент приложений и количество адресов на соответствующей странице (эти два числа выводятся на странице «Приложения» сразу после списка приложений). Числа можно отображать не все, а после определённого количества обновлений данных (но в памяти они всё равно хранятся все). Например, если таймаут между обновлениями составляет 60 секунд, а число указано 30, то получится, что на экране будут значения через каждые полчаса. Впрочем, пользователь может вмешиваться в процесс обновления (ставить на паузу, требовать немедленного обновления и т. п.), так что правилом это считать нельзя.


Рис. 7. Хронология

Действия

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

Загрузить файл можно двумя способами: заменив содержимое списка или дописав данные (обычно в конец, кроме списка адресов, который всегда отсортирован).


Рис. 8. Действия

Настройка

Большая часть настроек хранится в ini-файле. Списки известных приложений и адресов редактируются прямо в программе и сохраняются тут же, при вводе (из чего следует, что папка программы должна быть доступна для записи пользователю, если он собирается что-то редактировать).

Программа не пишет больше ничего: ни в реестр, ни в ini-файл.

Справка

Никакой полноценной справочной системы в программе нет, а есть банальный текстовый файл, который загружается на отдельной страничке. Форматирование осуществляется при помощи различных скобок (квадратных и угловых). Идея была навеяна Markdown и его аналогами, хотя и упрощена до предела (нет шрифтов, только заголовки, все гиперссылки на отдельных строках).

Предваряя вопрос «почему бы не использовать HTML?»: я не хотел использовать сторонние компоненты, а встроенный TWebBrowser слишком зависит от установленной в системе версии Internet Explorer. Неоднократно уже я видел компьютеры, на которых Internet Explorer работает некорректно, из-за чего TWebBrowser либо не отображает содержимое, либо даже вовсе выдаёт ошибку или зависает.


Рис. 9. Помощь

Прочее

Ещё программа умеет отображать состояние таймера в панели задач (работает только в Windows 7 и Windows 8).

Рис. 10. Статус в панели задач Windows

Недостатки

Во-первых, таймер довольно неточен. Насколько я понимаю, погрешность зависит от компьютера, операционной системы и текущей загрузки процессора, на моём компьютере она составляет в среднем 2 секунды за минуту, то есть минуту за полчаса. Это немало, впрочем, я не считаю это важным: всё же программа не предназначена для обработки каких-то критических данных, когда на счету каждая секунда. Ради интереса я пробовал сделать приложение многопоточным, но заметного выигрыша в производительности не вышло, а логика усложнилась.

Во-вторых, программа показывает только те подключения, которые она успела «поймать», то есть приложения, которые держали открытые транзакции в момент обновления данных. Многие программы так не делают (однако «длинные» транзакции на чтение часто используются при создании приложений на Delphi с применением традиционных компонентов доступа к данным вроде IBExpress или FIB+). Для увеличения точности можно уменьшить интервал обновлений (например, опрашивать базу не раз в минуту, а раз в 10 секунд или даже вовсе раз в секунду).

В-третьих, программа изначально разрабатывалась под небольшую базу с небольшим количеством (несколькими сотнями) клиентов. Я не проверял, что будет, если счёт клиентов пойдёт на десятки тысяч. Если кто-то когда-нибудь заинтересуется этим вопросом — дайте знать, пожалуйста.

Скачать

Обновлено 08.10.2014 — исправлены «битые» ссылки (увы, никто из пытавшихся скачать файл даже не удосужился сообщить об этом раньше).

Скачать саму программу можно по этой ссылке:

Исходные тексты (Delphi 7, никаких дополнительных компонентов, много комментариев на русском языке) здесь:

Комментариев нет:

Отправить комментарий

К началу