Zabbix: Мониторинг состояния сервера 1С
05.09.16 14:41

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

Цель:

  1. Мониторить что служба 1С запущена и работает (не просто что rphost крутится, а именно работает)
  2. Мониторить количество сеансов
  3. Мониторить количество компьютеров/пользователей
  4. Мониторить уснувшие/зависшие сеансы

Решение:

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. стандартное отслеживание состояния службы сервера 1С 8.3
  2. тригер на доступность службы (с 8 утра до 12 ночи)
  3. тригер на отсутствие ответа от 1с больше 2х минут (с 8 утра до 12 ночи)
  4. тригер на долгий запрос к БД (Захвачено СУБД из консоли больше 300с.) (с 8 утра до 12 ночи)
  5. пара элементарных графиков (сессии и активность).

Концовка

Такие решения обычно бывают индивидуальными и точки мониторинга и контроля у каждого могут быть своими.
Также способы этого контроля бывают разные.
Описанное решение вышло из моего опыта постепенного улучшения и анализа возникающих проблем.

Поэтому я не претендую на лучшее и оптимальное решение.
Это лишь мой кейс.
Но я буду рад улучшить его, если будут предложения и идеи)))

Read Full Article