Изначально хотел написать серьезную статью о том как искал способ решения, как пробовал варианты и т.д.
Но пришел к тому что это будет не интересно.
Поэтому просто опишу кейс.
Цель:
- Мониторить что служба 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 mp.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 ночи)
- пара элементарных графиков (сессии и активность).
Концовка
Такие решения обычно бывают индивидуальными и точки мониторинга и контроля у каждого могут быть своими.
Также способы этого контроля бывают разные.
Описанное решение вышло из моего опыта постепенного улучшения и анализа возникающих проблем.
Поэтому я не претендую на лучшее и оптимальное решение.
Это лишь мой кейс.
Но я буду рад улучшить его, если будут предложения и идеи)))
Спасибо огромное! Как раз задался этим вопросом и стал изобретать велосипед.
(1) kolabaister, буду рад если Вам пригодится.
Также если что-то не учел или будут предложения по улучшению — с радостью рассмотрю.
Отлично! Ты подал мне идею!
Долго мучился со своей проблемой … но вот же … идея 🙂
(3) ValeriTim, отлично)
Как решите — напишите итог.
Думаю будет интересно…
Вот так совпадение.
https://github.com/bessonovevgen/srv-1c-linux-zabbix-template
Видимо во вселенной накопилась критическая масса 🙂
Только я сделал с помощью консольных утилит администрирования сервера приложений 1с.
(5) _evgen_b, тоже отличный вариант)
Я думал насчет rac/ras, но честно говоря изначально все делалось ради самого первого показателя в списке «srv1c.avaible»
В общем я несколько раз сталкивался с тем что служба 1с работает, консоль тоже, но при этом 1с не работает.
Обычно это было из-за того что диск на котором хранятся темп файлы 1с и сессии иногда вылетает.
При этом вроде все норм, а по факту 1с не работает.
Поэтому мысль была в том чтобы изнутри продакшн базы сообщать забиксу что все норм.
Причем изначально я думал из 1с записывать в файл с временем и забикс агентом его читать.
Это самая распространенная схема при сложных аналитиках, чтобы таймауты агента не завышать.
Но когда наткнулся на трапер — мне показалось идеальным вариантом для такого мониторинга…
ИМХО каждый вариант имеет право на жизнь)))
(6) Может быть в этом случае более правильно организовать мониторинг свободного пространства на диске и сообщить администратору, когда оно уменьшится до критического значения?
(7) blackhole321, не совсем так.
в тех конкретных ситуациях просто диск отваливался.
но мысль несколько иная — мониторить не только и не столько состояние железа и служб, а максимально близко к пользователю.
ближе регламентного в продакшн базе я не вижу.
а диск итак уже мониторится))) причем тоже забиксом)))
(8) Что будет происходить, если регламентное задание по каким либо причинам перестанет выполняться? Будет какой-то алерт?
(9) blackhole321, да в забиксе тригер на то что в течении 2х минут 1с не говорила что с ней все норм…
Вообще изначально у меня был только он. остальное я потихоньку добавил. плюс еще пару метрик на конкретные базы, которые я не стал сюда писать.
(0) Молодец, спасибо!
srv-1c-linux-zabbix-template
Хорошо бы еще какие-нибудь картинки приложить, аналогичные картинкам из
(0), Еще полезно видеть количество и суммарное время ожидания на управляемых блокировок.
(11) artbear, Вам спасибо. Попробую с рабочего приложить. Но они не будут такими красочными)))
(12) Sergey.Noskov, хм.
Давай обсудим как их получить.
У меня просто все крутится на постгри и с блокировками давно не сталкивался (в основном бывает блокировка документа сеансом, но там человеческий фактор).
Подскажи как их получать или в какую сторону копать)))
(11) artbear, добавил 2 графика из шаблона (у меня они правда чуть другие, но в целом картину думаю отражают)
Попутно перечитав возможностиhttps://github.com/bessonovevgen/srv-1c-linux-zabbix-template подумал может стоит отделить пользователей от фоновых сеансов.
И еще может сделать отдельные счетчики для каждой ИБ.
(12) Sergey.Noskov, полистав Гилеваhttp://www.gilev.ru/setupdeadlock/ и http://www.gilev.ru/deadlock/ , я так понял для такого анализа лучше всего подходит тех. журнал и подключение к MSSQL.
Не уверен что смогу тягаться с инструментами Гилева)))
А если серьезно — наверное можно будет прикрутить, но без аналитики о причине думаю это не будет особо ценной информацией.
А подобную аналитику заносить в забикс думаю несколько неправильно…
Хотя если будут конкретные предложения и кейсы — можно попробовать что-то собрать)
(15) извиняюсь за длительное молчание
Обычно любые данные мониторинга не нужны, пока не сталкиваешься с какой либо проблемой. Думаю желание мониторить конкретно эти параметры, описанные в статье, родилось не просто так;)
Да, график блокировок сам по себе проблему не решает (как, впрочем, и любой другой график), но может подсказать куда копать. У нас в Zabbix выводится и число упр. блокировок и APDEX. Вывести блокировки достаточно просто — по свойству сеанса blockedByLS. Потребуется или нет — никто наперед не скажет, но чем выше требования к работоспособности базы, тем больше параметров необходимо логировать.
deevil, А будет ли данный способ работать при отвале всех рабочих процессов в 1с? У меня на 8.2 иногда возникают ситуации когда сервер запущен, но клиенты не могут запуститься с сообщением «Не запущен ни один рабочий процесс. Соединение с информационной базой невозможно».
(16) Sergey.Noskov, ок. Попробую посмотреть и протестировать — после этого обновлю статью и шаблон.
Просто есть такой момент, что блокировка длиться 5-10 секунд. Но не минутами — по крайней мере насколько я понимаю.
И вопрос в том, что даст если мы раз в минуту будем получать эти цифры.
В моем понимании отслеживание блокировок эффективно отслеживать по ТЖ или статистикам БД, там можно аналитику строить и все такое…
(17) SuhoffGV, как раз первая проверка для этого и существует.
Если сеансы не могут запуститься, то и фоновое задание не запуститься и как следствие 1С не скажет забиксу, что работает.
А тригер настроен на то, что 1с отвечает раз в 2-3 минуты.
Есть конечно вероятность что в вашем случае фоновые задания будут запускаться, но если нет рабочих процессов, то не должно…
(14) тут думаю нужно копать в сторону автообнаружения и уже потом счетчики на обнаруженные базы.
Возможно будет полезно/интересно —PowerShell
Подскажите, пожалуйста, как можно скачать файл шаблона, предложенного в статье? Если считаете это возможным.
Есть вероятность, что не подойдёт для желаемого, но глянуть — хотелось бы, а только из-за этого платить 1500 — несколько дороговато,по моему.
Спасибо за любой ответ.
аналогично. проблема тоже висит для 1С мониторинга. но в сети информации очень мало. нашел одну тему на хабре, но вот шаблон там кривой, забикс ругается что много ошибок. я исправил парочку ошибок, но они все не кончаются. может каму и пригодится мой полукривой исправленый шаблон. взят с сайта Хабрахабр.
Есть ещё идея мониторить размер журнала базы для 1С-разрабов. В прошлую пятницу была буча, что бухгалтерская база встала раком из-за того, что отдельные индивиды из 1с-ников не умеют у себя в конфигураторе настраивать архивацию и ротацию журнала. Вот от таких и думаю прикрутить мониторинг размера журналу, потому что когда они начинают из конфигуратора поиск по журналу, а размер журнала больше 100 гектаров… а на базе при этом ещё порядка 60 активных сессий… начинается трэш и содомия.
А шаблона вашего на гитхабе нету? А то половина доступна, половины нету 🙂
(17) был немного в офлайне.
Отвал означает что 1с не передает информацию в zabbix и как следствие это решает тригер в zabbix на время последнего ответа.
(22)
не видя скриптов мало чем помогу
(23)
У меня отдельно мониторится свободное место — поэтому не задумывался над журналом.
Но можно: в принципе все сводится к тому чтобы добавить в код формирование цифры и передачу его в файл и добавить в заббикс соответствующий элемент
(24)
Гитхаба нету)
Шаблон донельзя простой — в нем содержаться элементы передаваемые из кода с типом zabbix trapper и в принципе все…
Здесьzabbix_1C исходники COM объекта, чтобы не использовать zabbix_sender и командную строку.
Данные отправляются по udp