gifts2017

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

Опубликовал deevil deevil (deevil) в раздел Администрирование - Сервисные утилиты

Скрещиваем мощную систему мониторинга Zabbix с 1С

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

Цель:

  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. пара элементарных графиков (сессии и активность).

Концовка

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

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

Скачать файлы

Наименование Файл Версия Размер
Шаблон Zabbix 40
.xml 27,42Kb
02.09.16
40
.xml 27,42Kb Скачать

См. также

PowerTools от 1 000
Подписаться Добавить вознаграждение
Комментарии
1. Павел Колабухов (kolabaister) 02.09.16 23:24
Спасибо огромное! Как раз задался этим вопросом и стал изобретать велосипед.
olesha; deevil; +2 Ответить 1
2. deevil deevil (deevil) 04.09.16 17:08
(1) kolabaister, буду рад если Вам пригодится.
Также если что-то не учел или будут предложения по улучшению - с радостью рассмотрю.
3. ValeriTim (ValeriTim) 05.09.16 09:59
Отлично! Ты подал мне идею!
Долго мучился со своей проблемой ... но вот же ... идея :)
4. deevil deevil (deevil) 05.09.16 13:41
(3) ValeriTim, отлично)

Как решите - напишите итог.
Думаю будет интересно...
5. Евгений Бессонов (_evgen_b) 06.09.16 06:44
Вот так совпадение.
Видимо во вселенной накопилась критическая масса :-)
https://github.com/bessonovevgen/srv-1c-linux-zabbix-template

Только я сделал с помощью консольных утилит администрирования сервера приложений 1с.


headMade; Upiterus; artbear; deevil; +4 Ответить 1
6. deevil deevil (deevil) 06.09.16 12:36
(5) _evgen_b, тоже отличный вариант)

Я думал насчет rac/ras, но честно говоря изначально все делалось ради самого первого показателя в списке "srv1c.avaible"
В общем я несколько раз сталкивался с тем что служба 1с работает, консоль тоже, но при этом 1с не работает.
Обычно это было из-за того что диск на котором хранятся темп файлы 1с и сессии иногда вылетает.
При этом вроде все норм, а по факту 1с не работает.
Поэтому мысль была в том чтобы изнутри продакшн базы сообщать забиксу что все норм.

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

ИМХО каждый вариант имеет право на жизнь)))
7. Юрий Дешин (blackhole321) 06.09.16 12:52
(6) deevil,Может быть в этом случае более правильно организовать мониторинг свободного пространства на диске и сообщить администратору, когда оно уменьшится до критического значения?
8. deevil deevil (deevil) 06.09.16 13:15
(7) blackhole321, не совсем так.
в тех конкретных ситуациях просто диск отваливался.

но мысль несколько иная - мониторить не только и не столько состояние железа и служб, а максимально близко к пользователю.
ближе регламентного в продакшн базе я не вижу.

а диск итак уже мониторится))) причем тоже забиксом)))
9. Юрий Дешин (blackhole321) 06.09.16 14:03
(8) deevil, Что будет происходить, если регламентное задание по каким либо причинам перестанет выполняться? Будет какой-то алерт?
10. deevil deevil (deevil) 06.09.16 14:12
(9) blackhole321, да в забиксе тригер на то что в течении 2х минут 1с не говорила что с ней все норм...

Вообще изначально у меня был только он. остальное я потихоньку добавил. плюс еще пару метрик на конкретные базы, которые я не стал сюда писать.
11. Артур Аюханов (artbear) 07.09.16 11:26
(0) Молодец, спасибо!
Хорошо бы еще какие-нибудь картинки приложить, аналогичные картинкам из srv-1c-linux-zabbix-template
12. Сергей Носков (Sergey.Noskov) 07.09.16 12:55
(0), Еще полезно видеть количество и суммарное время ожидания на управляемых блокировок.
13. deevil deevil (deevil) 07.09.16 13:03
(11) artbear, Вам спасибо. Попробую с рабочего приложить. Но они не будут такими красочными)))

(12) Sergey.Noskov, хм.
Давай обсудим как их получить.
У меня просто все крутится на постгри и с блокировками давно не сталкивался (в основном бывает блокировка документа сеансом, но там человеческий фактор).
Подскажи как их получать или в какую сторону копать)))
14. deevil deevil (deevil) 07.09.16 15:07
(11) artbear, добавил 2 графика из шаблона (у меня они правда чуть другие, но в целом картину думаю отражают)

Попутно перечитав возможности https://github.com/bessonovevgen/srv-1c-linux-zabbix-template подумал может стоит отделить пользователей от фоновых сеансов.
И еще может сделать отдельные счетчики для каждой ИБ.
15. deevil deevil (deevil) 07.09.16 18:52
(12) Sergey.Noskov, полистав Гилева http://www.gilev.ru/setupdeadlock/ и http://www.gilev.ru/deadlock/, я так понял для такого анализа лучше всего подходит тех. журнал и подключение к MSSQL.

Не уверен что смогу тягаться с инструментами Гилева)))
А если серьезно - наверное можно будет прикрутить, но без аналитики о причине думаю это не будет особо ценной информацией.
А подобную аналитику заносить в забикс думаю несколько неправильно...

Хотя если будут конкретные предложения и кейсы - можно попробовать что-то собрать)
16. Сергей Носков (Sergey.Noskov) 12.10.16 14:49
(15) deevil, извиняюсь за длительное молчание
Обычно любые данные мониторинга не нужны, пока не сталкиваешься с какой либо проблемой. Думаю желание мониторить конкретно эти параметры, описанные в статье, родилось не просто так;)
Да, график блокировок сам по себе проблему не решает (как, впрочем, и любой другой график), но может подсказать куда копать. У нас в Zabbix выводится и число упр. блокировок и APDEX. Вывести блокировки достаточно просто - по свойству сеанса blockedByLS. Потребуется или нет - никто наперед не скажет, но чем выше требования к работоспособности базы, тем больше параметров необходимо логировать.
17. Дмитрий К (SuhoffGV) 12.10.16 17:06
deevil, А будет ли данный способ работать при отвале всех рабочих процессов в 1с? У меня на 8.2 иногда возникают ситуации когда сервер запущен, но клиенты не могут запуститься с сообщением "Не запущен ни один рабочий процесс. Соединение с информационной базой невозможно".
18. deevil deevil (deevil) 12.10.16 21:43
(16) Sergey.Noskov, ок. Попробую посмотреть и протестировать - после этого обновлю статью и шаблон.
Просто есть такой момент, что блокировка длиться 5-10 секунд. Но не минутами - по крайней мере насколько я понимаю.
И вопрос в том, что даст если мы раз в минуту будем получать эти цифры.
В моем понимании отслеживание блокировок эффективно отслеживать по ТЖ или статистикам БД, там можно аналитику строить и все такое...

(17) SuhoffGV, как раз первая проверка для этого и существует.
Если сеансы не могут запуститься, то и фоновое задание не запуститься и как следствие 1С не скажет забиксу, что работает.
А тригер настроен на то, что 1с отвечает раз в 2-3 минуты.

Есть конечно вероятность что в вашем случае фоновые задания будут запускаться, но если нет рабочих процессов, то не должно...
19. Евгений Бессонов (_evgen_b) 29.10.16 09:30
(14) deevil, тут думаю нужно копать в сторону автообнаружения и уже потом счетчики на обнаруженные базы.
20. Yauhen Makei (mrDSide) 01.12.16 17:09
Возможно будет полезно/интересно - PowerShell