Статистика времени выполнения кода

Компонента для сбора времени выполнения кода (например проведения накладной) и отправка сначала в MS SQL далее в Zabbix.

Небольшая предыстория: пользователи жалуются на тормоза 1с — сделаю изменения, проверю своим скриптом время до и после, а пользователи все жалуются и жалуются… 

В итоге сделал следующий комплекс:

  • Компонента которая используется в 1с для "экранирования" замеряемых участков кода
  • SQL таблица, в которую отправляются полученные замеры всеми пользователями
  • Служба, которая получает данные из таблицы и отправляет в zabbix. (до версии 1.0.1.0 отправлялись усредненные значения)

Что делать в 1с:

Создать константу ZabbixСтатистикаВыполнения

в глобальном модуле описать

Перем глСтатистикаВыполнения Экспорт; //:Addin.ZabbixStatistics
Перем глОтправлятьСтатистикуВыполнения Экспорт;

в глобальном модуле в процедуре ПриНачалеРаботыСистемы()

глОтправлятьСтатистикуВыполнения=0;
Если Константа.ZabbixСтатистикаВыполнения=1 Тогда
Попытка
глСтатистикаВыполнения = СоздатьОбъект("Addin.ZabbixStatistics");
глСтатистикаВыполнения.НазваниеБазы = ТекущаяИбКод();
глСтатистикаВыполнения.Инициализация();
глОтправлятьСтатистикуВыполнения=1;
Исключение
КонецПопытки;
КонецЕсли;

Также в глобальном модуле добавить процедуры

//-->> Статистика выполнения кода
Процедура глСтатистикаВыполнения_Начать(Параметр,ЗначениеПриОшибке=-1) Экспорт
Если глОтправлятьСтатистикуВыполнения=1 Тогда
глСтатистикаВыполнения.Начать(Параметр,ЗначениеПриОшибке);
КонецЕсли;
КонецПроцедуры

Процедура глСтатистикаВыполнения_Отменить()  Экспорт
Если глОтправлятьСтатистикуВыполнения=1 Тогда
глСтатистикаВыполнения.Отменить();
КонецЕсли;
КонецПроцедуры

Процедура глСтатистикаВыполнения_Закончить() Экспорт
Если глОтправлятьСтатистикуВыполнения=1 Тогда
глСтатистикаВыполнения.Закончить();
КонецЕсли;
КонецПроцедуры
//<<--

Теперь в требуемом месте "экранировать" замеряемый участок

глСтатистикаВыполнения_Начать("Documents.Provedenie.RN",-1000);

//ВАШ КОД
//
//глСтатистикаВыполнения_Отменить(); Возврат; //Или иной выход из замеряемого участка кода
//
//ВАШ КОД

глСтатистикаВыполнения_Закончить();

 

Инструкция установка компоненты, службы, zabbix есть в описании на github, а также в скачиваемом архиве

 

Исходный код gihub

 

02.02.2024 Версия 1.0.1.0

  • При начале нового замера проверяется завершенность предыдущего.
  • Добавлен метод Отменить(), который требуется выполнять при выходе из замера принудительно (Прервать, возврат, и т.д.), чтобы он не считался некорректно завершенным
  • Служба теперь отправляет все значения(а не усредняет).

 

 

 

10 Comments

  1. Serg O.

    тормозит — понятие субъективное…

    да, надо четкое определение — сколько сек… МиллиСек…

    среднее у Вас на рисунке 106 мс = это 1/10 секунды… это для пользователя — мгновенно…

    но есть пики почти до 1,2 сек… что тоже очень быстро, но все-таки это в 12 раз больше среднего…

    или вы не там меряете… или проблема в «умах»…

    возможно «пики» — из-за блокировок…

    грузят например платёжки… блокируются реализации (регистр взаиморасчетов),

    или проводятся перемещения большие — так же реализации блокируются (регистр остатки товаров на складах) — таких пиков на рисунке несколько в 11-05 максимум…

    кроме того «психологически» долго — по одной из рекомендуемых 1С методике APDEX -это

    время, которое превышает среднее (хорошее) в 4 раза -и это уже для клиента «долго» и «неприемлимо»…

    и, возможно, тормозит не само проведение… а «возврат» в список документов

    новое отображение (особенно если есть расцветка… доп.обработка или у пользователя — свои поля настроены криво через 2-3 подзапроса)

    p.s.

    спасибо за обработки… zabbix как раз хотел «покопать»… посмотрю на досуге

    Reply
  2. ImHunter

    А как насчет многопоточности и/или вложенности замеров?

    Reply
  3. serpent

    А «SQL таблица, в которую отправляются полученные замеры» сама создается или надо самому делать?

    Reply
  4. LLIKIPER

    К сожалению 1с не многопоточна. Также вложенность замеров изначально не думал делать(но можно) ввиду того, что дополнительный код только увеличивает время выполнения.

    В sql желательно создать отдельную базу, отдельного пользователя, в которую создать таблицу скриптом в архиве(есть и в исходниках).

    Я именно так и делал, создавал отдельно базу, отдельного пользователя с доступом только в эту базу, ну и таблицу скриптом.

    При первом запуске советую уровень Info изменить на Debug, тогда увидите результаты отправки в заббикс.

    Небольшие ньюансы по работе компоненты:

    Не отправляется статистика отмененного кода(например была ошибка транзакции). Скоро реализую в новой версии.

    Отправка компонентой в sql идет в другом потоке, чтобы не тормозить код 1с, поэтому есть задержка указываемая в конфиге(изначально равна 10) с которой данные отправляются пока создан объект. Отсюда вывод, можно поймать ситуацию когда данные не успеют отправиться, а 1с будет закрыта

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

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

    Reply
  5. LLIKIPER

    По поводу вложенности, можно сделать, но не буду ввиду несовместимости с алгоритмом по отправке статистики прерванного кода.

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

    Я подумаю еще насчет вложенности, в принципе можно передать вторым параметром уровень текущей вложенности. В общем подумаю…

    Reply
  6. capitan

    Вроде же zabbix умеет читать apdex, почему так сделано ?

    Reply
  7. LLIKIPER

    (7) в 7.7 нет Apdex, но спасибо за комментарий, было полезно про него прочитать, а также наткнулся на статью отправки данных zabbix агентом из sql в zabbix (что собственно и делает моя служба)

    Reply
  8. capitan

    (8)Пардоньте. Не обратил внимание что под 77

    Тогда конечно заслуженный +

    Reply
  9. LLIKIPER

    Спасибо комментирующим! Узнал что все таки возможно отправлять замеры за прошедшее время и не требуется их усреднять. (Есть с версии 1.0.1.0)

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

    Я буду рад новым комментариям!

    Reply
  10. LLIKIPER

    Ну вот и первые плоды пошли(см. вложение)

    Reply

Leave a Comment

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