Собирать данные мониторинга для Zabbix можно несколькими способами:
- Формирование файла нужного формата сразу по нескольких показателям (Items), например с помощью регламентного задания и отправка этого файла Zabbix серверу через Zabbix sender (На Инфостарте уже есть отдельная статья об этом).
- Способ сбора данных, когда Zabbix запрашивает данные через REST интерфейс. Его преимущество в том, данные по мониторингу из 1С может получить любая другая система (например Grafana).
- Формирование значения по одному показателю (Item) в момент выполнения какого-либо действия в 1С и отправка этого значения Zabbix серверу через Zabbix sender. Это разновидность способа номер 1.
Сбор данных через REST интерфейс.
Сначала, о том, что мы собираем через REST интерфейс и зачем:
- показатели количества сессий 1С: все сессии, только клиентские сессии, только jobs, только com connections.
- показатели количества использованных лицензий, в разрезе каждой лицензии. Зачем: у нас ограниченное количество лицензий и проходиться контролировать количество входящих com connections. Мониторинг показателей с Apllication сервера 1С лучше вешать на отдельную БД, что-то типа MonitoringDB, в ней надо создать пользователя Zabbix, у которого будет указано Windows аутентификация типа \\Net_NT\ServerOneS$.
- показатели очередей импорта/экспорта объектов. Зачем: наши системы 1С получают в день от 500 тысяч до 1 млн. событий извне и порой в очередях 1С может скапливаться десятки тысяч событий, соответственно срабатывание Trigger'a на определенном пороге для нас сигнал, что возникла проблема.
- показатели работы Apllication и sql серверов, которые собираются с помощью типовых шаблонов самого Zabbix.
Как настроить сбор данных через REST интерфейс:
1. На стороне 1С создаются https сервисы, каждый из которых будет возвращать значение нужного нам показателя. Подразумеваем, что у Вас уже стоит и настроен IIS или Apache.
2. На стороне Zabbix настраиваем нужное количество Items и необходимые Triggers.
Шаг 1. Создание https сервисов в базе 1С.
Здесь все стандартно и уже не раз описывалось на Инфостарте, покажу пример на сборе данных о лицензиях. В итоге должен получиться примерной такой вызов: http://serverOneS/MonitoringDB/hs/1CMonitoring/GetLicensessData/serverOneS/Server8100000001, который вернет значение: licence_Server8100000001:10
Примеры кода 1С приложены в обработке к статье, код протестирован на платформе 1С 8.3.10.2669.
Функция GetLicensesData(Parametrs)
NameClusterПар = Parametrs.ПараметрыURL.Получить("NameCluster");
TypeOfParameterПар = Parametrs.ПараметрыURL.Получить("TypeOfParameter");
Соединение = Новый COMОбъект("V83.COMConnector");
Агент = Соединение.ConnectAgent("tcp://" + NameClusterПар);
Кластер = Агент.GetClusters().GetValue(0);
Агент.Authenticate(Кластер,"","" );
МассивСессий = Агент.GetSessions(Кластер).Выгрузить();
Кластер = Неопределено; Агент = Неопределено; Соединение = Неопределено;
ClientORGL8Set20 = 0; //аппаратная лицензия
Server8100000001 = 0; //программная лицензия
Для Каждого Сессия Из МассивСессий Цикл
Если Сессия.License <> Неопределено И Сессия.License.ShortPresentation = "Client, ORGL8 Set 20" Тогда
ClientORGL8Set20 = ClientORGL8Set20 + 1;
КонецЕсли;
Если Сессия.License <> Неопределено И Сессия.License.ShortPresentation = "Server, 8100000001 20 20" Тогда
Server8100000001 = Server8100000001 + 1;
КонецЕсли;
КонецЦикла;
МассивСессий = Неопределено;
Ответ = Новый HTTPСервисОтвет(200);
Ответ.Заголовки.Вставить("Content-type", "application/json; charset=utf-8");
Если TypeOfParameterПар = "licenceClientORGL8Set20" Тогда
Ответ.УстановитьТелоИзСтроки("licence_ClientORGL8Set20:" + ClientORGL8Set20);
ИначеЕсли TypeOfParameterПар = "Server8100000001" Тогда
Ответ.УстановитьТелоИзСтроки("licence_Server8100000001:" + Server8100000001);
КонецЕсли;
Возврат Ответ;
КонецФункции
Шаг 2. Создание Items в Zabbix.
Заходим в Configuration - All hosts - Host - Item - Create Item.
Самое главное корректно заполнить поле Key с помощью шаблона Поиск строки на веб-странице: web.page.regexp[хост,<путь>,<порт>,<регулярное выражение>,<длина>,<вывод>] .
В моем примере в поле Key надо положить строку: web.page.regexp[serverOneS,"MonitoringDB/hs/1CMonitoring/GetLicensesData/serverOneS/licenceClientORGL8Set20",80,"licence_ClientORGL8Set20:([0-9]+)",,\1]
Разберем формат строки:
- хост - serverOneS - сервер 1С, на котором поднят IIS;
- путь - MonitoringDB/hs/1CMonitoring/GetLicensesData - путь к http сервису + serverOneS/licenceClientORGL8Set20 - параметры передаваемые в http сервис.
- регулярное выражение - "licence_ClientORGL8Set20:([0-9]+)" - шаблон строки, который разбирается Zabbix. В скобках указан шаблон извлечения числа и если Zabbix сможет эту часть преобразовать в число, то это и будет value для Item.
- вывод - по этому параметру, к сожалению, не нашел внятного описания, поэтому поставил аналогично примерам найденным на форумах.
Остальные параметры Item заполняем аналогично скриншоту ниже:
Проверяем в Latest Data, что Zabbix собирает данные.
В таком случае, надо проверить через отладчик, что Zabbix цепляет http сервис и возвращает ему правильную строку. Если все-таки отладчик покажет, что строка возврата верная, то скорее всего запрос внутри 1С отрабатывает, более 20 секунд и этом случае Zabbix считает, что ответа нет и выдает ошибку "Value "" of type "string" is not suitable for value type "Numeric (unsigned)"".
Сбор данных по определенным показателям через Zabbix sender:
- На стороне Zabbix настроить Item с типом Zabbix trapper.
- На стороне 1С необходимо вставить вызов Windows команды, которая будет отравлять значение по нужному Item в Zabbix.
Для чего можно использовать именно такой способ сбора данных: с помощью регламентных заданий каждые 30 минут отрабатывает реконсиляция между 1С и сторонней системой по входящим объектам, которая показывает количество расхождений по объектам и как результат в Zabbix отравляется количество брейков.
Мы не храним внутри 1С количество брэйков, поэтому второй способ не подходит, а видеть сколько у нас брэйков на графике надо, чтобы нужный момент отчитаться бизнесу.
Шаг 1. Настройка Item с типом Zabbix trapper
Заходим в Configuration - All hosts - Host - Item - Create Item.
Необходимо заполнить поля Name и Key названием показателя. В поле Type выбрать Zabbix trapper, поле Type of information = Numeric(unsigned).
Шаг 2. Вызов Windows команды внутри регламентного задания
Добавить в конце регламентного задания подобный код:
Попытка
КоличествоРасхождений = СтрЗаменить(КоличествоРасхождений,Символы.НПП,"");
CodeReturn = "";
ВнешняяКоманда="c:/ZabbixAgent/zabbix_sender.exe -c c:/ZabbixAgent/zabbix_agentd.conf -s <ИМЯ хоста в ZABBIX> -k document_breaks -o "+Формат(КоличествоРасхождений,"ЧГ=")+"";
ЗапуститьПриложение(ВнешняяКоманда,,True, CodeReturn);
Исключение
ЗаписьЖурналаРегистрации("ZabbixAgent", УровеньЖурналаРегистрации.Предупреждение,,,"Не удалось выполнить внешнюю команду! "+ ВнешняяКоманда + " " + ОписаниеОшибки() + "CodeReturn: " + CodeReturn);
КонецПопытки;
После настройки Items и получения данных из 1С, настраиваем Graphs и Dashboards и наслаждаемся :-).
P.S. Zabbix отлично собирает данные, но возможности в настройках Dashboards у него не большие, гораздо лучше и красивее в этом плане Grafana, у которой в качестве источника можно указать Items из Zabbix'а:
P.S.P.S. Данный способ мониторинг довольно прост, но чтобы разобраться с ним я потратил немало времени на поиск информации, поэтому статья написана, не только с целью поделиться своим опытом, но и узнать опыт коллег. Всем удачи.