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


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

Концовка

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

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

29 Comments

  1. kolabaister

    Спасибо огромное! Как раз задался этим вопросом и стал изобретать велосипед.

    Reply
  2. deevil

    (1) kolabaister, буду рад если Вам пригодится.

    Также если что-то не учел или будут предложения по улучшению — с радостью рассмотрю.

    Reply
  3. ValeriTim

    Отлично! Ты подал мне идею!

    Долго мучился со своей проблемой … но вот же … идея 🙂

    Reply
  4. deevil

    (3) ValeriTim, отлично)

    Как решите — напишите итог.

    Думаю будет интересно…

    Reply
  5. _evgen_b

    Вот так совпадение.

    Видимо во вселенной накопилась критическая масса 🙂

    https://github.com/bessonovevgen/srv-1c-linux-zabbix-template

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

    Reply
  6. deevil

    (5) _evgen_b, тоже отличный вариант)

    Я думал насчет rac/ras, но честно говоря изначально все делалось ради самого первого показателя в списке «srv1c.avaible»

    В общем я несколько раз сталкивался с тем что служба 1с работает, консоль тоже, но при этом 1с не работает.

    Обычно это было из-за того что диск на котором хранятся темп файлы 1с и сессии иногда вылетает.

    При этом вроде все норм, а по факту 1с не работает.

    Поэтому мысль была в том чтобы изнутри продакшн базы сообщать забиксу что все норм.

    Причем изначально я думал из 1с записывать в файл с временем и забикс агентом его читать.

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

    Но когда наткнулся на трапер — мне показалось идеальным вариантом для такого мониторинга…

    ИМХО каждый вариант имеет право на жизнь)))

    Reply
  7. blackhole321

    (6) Может быть в этом случае более правильно организовать мониторинг свободного пространства на диске и сообщить администратору, когда оно уменьшится до критического значения?

    Reply
  8. deevil

    (7) blackhole321, не совсем так.

    в тех конкретных ситуациях просто диск отваливался.

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

    ближе регламентного в продакшн базе я не вижу.

    а диск итак уже мониторится))) причем тоже забиксом)))

    Reply
  9. blackhole321

    (8) Что будет происходить, если регламентное задание по каким либо причинам перестанет выполняться? Будет какой-то алерт?

    Reply
  10. deevil

    (9) blackhole321, да в забиксе тригер на то что в течении 2х минут 1с не говорила что с ней все норм…

    Вообще изначально у меня был только он. остальное я потихоньку добавил. плюс еще пару метрик на конкретные базы, которые я не стал сюда писать.

    Reply
  11. artbear

    (0) Молодец, спасибо!

    Хорошо бы еще какие-нибудь картинки приложить, аналогичные картинкам из srv-1c-linux-zabbix-template

    Reply
  12. Sergey.Noskov

    (0), Еще полезно видеть количество и суммарное время ожидания на управляемых блокировок.

    Reply
  13. deevil

    (11) artbear, Вам спасибо. Попробую с рабочего приложить. Но они не будут такими красочными)))

    (12) Sergey.Noskov, хм.

    Давай обсудим как их получить.

    У меня просто все крутится на постгри и с блокировками давно не сталкивался (в основном бывает блокировка документа сеансом, но там человеческий фактор).

    Подскажи как их получать или в какую сторону копать)))

    Reply
  14. deevil

    (11) artbear, добавил 2 графика из шаблона (у меня они правда чуть другие, но в целом картину думаю отражают)

    Попутно перечитав возможности https://github.com/bessonovevgen/srv-1c-linux-zabbix-template подумал может стоит отделить пользователей от фоновых сеансов.

    И еще может сделать отдельные счетчики для каждой ИБ.

    Reply
  15. deevil

    (12) Sergey.Noskov, полистав Гилева http://www.gilev.ru/setupdeadlock/ и http://www.gilev.ru/deadlock/, я так понял для такого анализа лучше всего подходит тех. журнал и подключение к MSSQL.

    Не уверен что смогу тягаться с инструментами Гилева)))

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

    А подобную аналитику заносить в забикс думаю несколько неправильно…

    Хотя если будут конкретные предложения и кейсы — можно попробовать что-то собрать)

    Reply
  16. Sergey.Noskov

    (15) извиняюсь за длительное молчание

    Обычно любые данные мониторинга не нужны, пока не сталкиваешься с какой либо проблемой. Думаю желание мониторить конкретно эти параметры, описанные в статье, родилось не просто так;)

    Да, график блокировок сам по себе проблему не решает (как, впрочем, и любой другой график), но может подсказать куда копать. У нас в Zabbix выводится и число упр. блокировок и APDEX. Вывести блокировки достаточно просто — по свойству сеанса blockedByLS. Потребуется или нет — никто наперед не скажет, но чем выше требования к работоспособности базы, тем больше параметров необходимо логировать.

    Reply
  17. SuhoffGV

    deevil, А будет ли данный способ работать при отвале всех рабочих процессов в 1с? У меня на 8.2 иногда возникают ситуации когда сервер запущен, но клиенты не могут запуститься с сообщением «Не запущен ни один рабочий процесс. Соединение с информационной базой невозможно».

    Reply
  18. deevil

    (16) Sergey.Noskov, ок. Попробую посмотреть и протестировать — после этого обновлю статью и шаблон.

    Просто есть такой момент, что блокировка длиться 5-10 секунд. Но не минутами — по крайней мере насколько я понимаю.

    И вопрос в том, что даст если мы раз в минуту будем получать эти цифры.

    В моем понимании отслеживание блокировок эффективно отслеживать по ТЖ или статистикам БД, там можно аналитику строить и все такое…

    (17) SuhoffGV, как раз первая проверка для этого и существует.

    Если сеансы не могут запуститься, то и фоновое задание не запуститься и как следствие 1С не скажет забиксу, что работает.

    А тригер настроен на то, что 1с отвечает раз в 2-3 минуты.

    Есть конечно вероятность что в вашем случае фоновые задания будут запускаться, но если нет рабочих процессов, то не должно…

    Reply
  19. _evgen_b

    (14) тут думаю нужно копать в сторону автообнаружения и уже потом счетчики на обнаруженные базы.

    Reply
  20. c1nil

    Возможно будет полезно/интересно — PowerShell

    Reply
  21. user827387

    Подскажите, пожалуйста, как можно скачать файл шаблона, предложенного в статье? Если считаете это возможным.

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

    Спасибо за любой ответ.

    Reply
  22. user861096

    аналогично. проблема тоже висит для 1С мониторинга. но в сети информации очень мало. нашел одну тему на хабре, но вот шаблон там кривой, забикс ругается что много ошибок. я исправил парочку ошибок, но они все не кончаются. может каму и пригодится мой полукривой исправленый шаблон. взят с сайта Хабрахабр.

    Reply
  23. aquablast.rus

    Есть ещё идея мониторить размер журнала базы для 1С-разрабов. В прошлую пятницу была буча, что бухгалтерская база встала раком из-за того, что отдельные индивиды из 1с-ников не умеют у себя в конфигураторе настраивать архивацию и ротацию журнала. Вот от таких и думаю прикрутить мониторинг размера журналу, потому что когда они начинают из конфигуратора поиск по журналу, а размер журнала больше 100 гектаров… а на базе при этом ещё порядка 60 активных сессий… начинается трэш и содомия.

    Reply
  24. serega7

    А шаблона вашего на гитхабе нету? А то половина доступна, половины нету 🙂

    Reply
  25. deevil

    (17) был немного в офлайне.

    Отвал означает что 1с не передает информацию в zabbix и как следствие это решает тригер в zabbix на время последнего ответа.

    Reply
  26. deevil

    (22)

    но в сети информации очень мало. нашел одну тему на хабре, но вот шаблон там кривой, забикс ругается что много ошибок. я исправил парочку ошибок, но они все не кончаются. может каму и пригодится мой полукривой исправленый шаблон. взят с сайта Хабрахабр.

    не видя скриптов мало чем помогу

    Reply
  27. deevil

    (23)

    У меня отдельно мониторится свободное место — поэтому не задумывался над журналом.

    Но можно: в принципе все сводится к тому чтобы добавить в код формирование цифры и передачу его в файл и добавить в заббикс соответствующий элемент

    Reply
  28. deevil

    (24)

    Гитхаба нету)

    Шаблон донельзя простой — в нем содержаться элементы передаваемые из кода с типом zabbix trapper и в принципе все…

    Reply
  29. user1042939

    Здесь zabbix_1C исходники COM объекта, чтобы не использовать zabbix_sender и командную строку.

    Данные отправляются по udp

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *