NOTE: This page has been translated automatically from Russian to English. Original page.



Zabbix: Monitoring Server 1C

Crossbreed powerful Zabbix monitoring system 1C

Originally I wanted to write a serious article about how to search for a way to solve as tried variations, etc.
But I come to that that it will not be interesting.
So just describe the case.

Goal:

  1. 1C monitor the service is up and running (not just that rphost revolves, namely running)
  2. To monitor the number of sessions
  3. To monitor the number of computers / users
  4. Monitor asleep / sessions hung

Decision:

Stage 1 - actually obtain the needed data.

Create a routine task in any information base.
If everyone is on the support, it is possible to create a blank or add a routine task in the expansion.
Scheduled run once per minute.
I have set up so that during database maintenance - routine does not start and did not prevent the renewal or unloading
The scheduled jobs collect the needed performance.
My example of this collection:

 Соединение = Новый 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; Прервать; КонецЦикла; 

Stage 2 - send the data zabbix

From the data obtained form the file and send it to the server via zabbix zabbix sender.
Format lines of a file: <hostname> <key> < value>.
An example of my code:

 Строка = "- 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); "" + UserMaxName + "" "" +  Строка = "- 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); "" + HostMaxName + "" "" +  Строка = "- 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); ", "CESU-  Строка = "- 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/zabbix_agentd.conf -i C: /zabbix/tmp.txt";  Строка = "- 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); 

Make no mistake: zabbix with all auxiliary files in the folder "C: / zabbix /".
If you have another folder, specify it.

Stage 3 - maintain and analyze the data obtained in zabbix

Everything is relatively easy for those who have worked with zabbix.
Create a database with the names of the elements of the file and the needed Triggers.
The only caveat: the data elements must have "zabbix trapper" type.
The essence of this type is that it is not zabbix requests data and the data sent to him through zabbix_sender.

For simplicity, I attached my template.
In addition to the pattern described elements still have:

  1. Standard tracking status Server service 1C 8.3
  2. Triger on service availability (from 8 am to 12 am)
  3. Triger the lack of response from 1c more than 2 minutes (from 8 am to 12 am)
  4. Triger long request to a DB (database were captured from the console more than 300c.) (from 8 am to 12 am)
  5. a pair of elementary graphs (session and activity).

colophon

Such decisions are usually individual and the monitoring and control point for each can be his.
Also, methods of control are different.
It described the decision came out of my experience gradual improvement and the analysis of problems.

So I do not claim to be the best and optimal solution.
This is just my case.
But I will be happy to improve it, if there are suggestions and ideas)))

1C:Enterprise Developer's Community