Изначально хотел написать серьезную статью о том как искал способ решения, как пробовал варианты и т.д.
Но пришел к тому что это будет не интересно.
Поэтому просто опишу кейс.
Цель:
- Мониторить что служба 1С запущена и работает (не просто что rphost крутится, а именно работает)
- Мониторить количество сеансов
- Мониторить количество компьютеров/пользователей
- Мониторить уснувшие/зависшие сеансы
Решение:
1 этап - собственно получаем нужные нам данные.
Создаем регламентное задание в любой информационной базе.
Если все находятся на поддержке, то можно создать пустую или добавить регламентное задание в расширение.
Регламентное запускаем раз в минуту.
Я настроил чтобы во время обслуживания базы - регламентное не запускалось и не мешало обновлению или выгрузке
В регламентном задании собираем нужные нам показатели.
Мой пример такого сбора:
Соединение = Новый COMОбъект("V83.COMConnector");
Агент = Соединение.ConnectAgent("tcp://<Имя сервера>");
Кластер = Агент.GetClusters().GetValue(0);
Агент.Authenticate(Кластер, "<логин администратора сервера 1с>", "<пароль администратора сервера 1с>");
МассивСессий = Агент.GetSessions(Кластер).Выгрузить();
countSession = 0; // Счетчик сессий
countHibernate = 0; // счетчик уснувших сессий
// показатели активных сессий
durationCurrentDBMSМакс = 0;
durationCurrentМакс = 0;
dbProcTookМакс = 0;
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("infoBase", Новый ОписаниеТипов("Строка"));
ТЗ.Колонки.Добавить("AppID", Новый ОписаниеТипов("Строка"));
ТЗ.Колонки.Добавить("userName", Новый ОписаниеТипов("Строка"));
ТЗ.Колонки.Добавить("Host", Новый ОписаниеТипов("Строка"));
ТЗ.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число"));
Для Каждого Сессия Из МассивСессий Цикл
Если Сессия.AppID = "SrvrConsole" Тогда
Продолжить; // пропускаем сессии консоли
КонецЕсли;
СтрТЗ = ТЗ.Добавить();
ЗаполнитьЗначенияСвойств(СтрТЗ, Сессия);
СтрТЗ.infoBase = Сессия.infoBase.Name;
СтрТЗ.Количество = 1;
countSession = countSession + 1;
durationCurrentDBMSМакс = Макс(durationCurrentDBMSМакс, Сессия.durationCurrentDBMS);
durationCurrentМакс = Макс(durationCurrentМакс, Сессия.durationCurrent);
dbProcTookМакс = Макс(dbProcTookМакс, Сессия.dbProcTook);
Если Сессия.Hibernate Тогда
countHibernate = countHibernate + 1;
КонецЕсли;
КонецЦикла;
// Получаем пользователей с большим количеством сеансов
UserMaxCount = 0;
UserMaxName = "";
ТаблUserName = ТЗ.Скопировать();
ТаблUserName.Свернуть("userName", "Количество");
ТаблUserName.Сортировать("Количество Убыв");
Для Каждого Стр Из ТаблUserName Цикл
UserMaxCount = Стр.Количество;
UserMaxName = Стр.userName;
Прервать;
КонецЦикла;
// Получаем компьютеры с большим количеством сеансов
HostMaxCount = 0;
HostMaxName = "";
ТаблHost = ТЗ.Скопировать();
ТаблHost.Свернуть("Host", "Количество");
ТаблHost.Сортировать("Количество Убыв");
Для Каждого Стр Из ТаблHost Цикл
HostMaxCount = Стр.Количество;
HostMaxName = Стр.Host;
Прервать;
КонецЦикла;
2 этап - отправляем полученные данные zabbix
Из полученных данных формируем файл и отправляем его zabbix серверу через zabbix sender.
Формат строк файла: <hostname> <key> <value>.
Пример моего кода:
Строка = "- srv1c.avaible 1" + Символы.ПС;
Строка = Строка + "- srv1c.sessions.count " + Формат(countSession, "ЧН=0; ЧГ=0") + Символы.ПС;
Строка = Строка + "- srv1c.hibernate.count " + Формат(countHibernate, "ЧН=0; ЧГ=0") + Символы.ПС;
Строка = Строка + "- srv1c.dbproctook.current " + Формат(dbProcTookМакс, "ЧН=0; ЧГ=0") + Символы.ПС;
Строка = Строка + "- srv1c.duration.current.dbms " + Формат(durationCurrentDBMSМакс, "ЧН=0; ЧГ=0") + Символы.ПС;
Строка = Строка + "- srv1c.duration.current.1c " + Формат(durationCurrentМакс, "ЧН=0; ЧГ=0") + Символы.ПС;
Строка = Строка + "- srv1c.user.count " + Формат(UserMaxCount, "ЧН=0; ЧГ=0") + Символы.ПС;
Строка = Строка + "- srv1c.host.count " + Формат(HostMaxCount, "ЧН=0; ЧГ=0") + Символы.ПС;
Строка = Строка + "- srv1c.user.name " + """" + UserMaxName + """" + Символы.ПС;
Строка = Строка + "- srv1c.host.name " + """" + HostMaxName + """" + Символы.ПС;
ЗаписьТекста = Новый ЗаписьТекста("c:\zabbix\tmp.txt", "CESU-8",, Ложь, Символы.ПС); //ТекстБезБОМ
ЗаписьТекста.Записать(Строка);
ЗаписьТекста.Закрыть();
КомандаZabbix = "C:/zabbix/bin/win32/zabbix_sender.exe -c C:/zabbix/zabbix_agentd.conf -i C:/zabbix/tmp.txt";
ЗапуститьПриложение(КомандаZabbix);
Поясняю: zabbix со всеми вспомогательными файлами находится в папке "C:/zabbix/".
Если у вас другая папка, то указываем ее.
3 этап - сохраняем и анализируем полученные данные в zabbix
Тут все относительно просто для тех кто работал с zabbix.
Создаем элементы данных с именами из файла и нужные нам тригеры.
Единственный нюанс: элементы данных должны иметь тип "zabbix траппер".
Суть этого типа в том что не zabbix запрашивает данные, а данные ему отправляются через zabbix_sender.
Для простоты я прикрепил свой шаблон.
В шаблоне помимо описанных элементов еще есть:
- стандартное отслеживание состояния службы сервера 1С 8.3
- тригер на доступность службы (с 8 утра до 12 ночи)
- тригер на отсутствие ответа от 1с больше 2х минут (с 8 утра до 12 ночи)
- тригер на долгий запрос к БД (Захвачено СУБД из консоли больше 300с.) (с 8 утра до 12 ночи)
- пара элементарных графиков (сессии и активность).
Концовка
Такие решения обычно бывают индивидуальными и точки мониторинга и контроля у каждого могут быть своими.
Также способы этого контроля бывают разные.
Описанное решение вышло из моего опыта постепенного улучшения и анализа возникающих проблем.
Поэтому я не претендую на лучшее и оптимальное решение.
Это лишь мой кейс.
Но я буду рад улучшить его, если будут предложения и идеи)))