Мониторинг производительности¶
Страница посвящена системе мониторинга производительности
Подсистема мониторинга времени выполнения и частоты вызовов методов служб¶
Источником данных о производительности для подсистемы являются измерения времени выполнения и частоты вызовов методов служб.
Подсистема удовлетворяет следующим требованиям:
- позволяет хранить данные о частоте вызовов и средней продолжительности выполнения методов служб Janet модуля;
- позволяет выбирать источники данных о производительности путем внесения изменений в соответствующие файлы конфигурации;
- позволяет создавать отчеты по собранным данным, в том числе по данным собранным за продолжительный промежуток времени;
- позволяет осуществлять мониторинг в реальном масштабе времени;
- позволяет осуществлять непрерывный мониторинг в режиме 24х7;
- сбор данных о производительности Janet модуля не оказывает пагубного влияния на его быстродействие.
Сбор данных о быстродействии¶
Конфигурацию мониторинга предлагается производить внутри конфигурационного файла iJaNet-модуля jws-module.xml путем задания параметров мониторинга. Необходимый набор параметров будет рассмотрен на этапе реализации.
Измерения предлагается производить внутри системного метода jws.core.services.ServiceBase.invoke(). Полученные данные о времени вызова и времени выполнения передавать в очередь измерений откуда после предварительной обработки сохранять в файл, например, средствами log4j. Обработка данных включает в себя расчет среднего времени выполнения и частоты вызовов метода за минуту.
Количество записей в одном файле предлагается ограничить временным интервалом в одни сутки. Т.о. максимальный размер файла, содержащего данные с измерениями не будет превышать 24 * 60 = 1440 строк.
Для каждого метода являющегося источником данных о производительности создаётся отдельный набор файлов с данными измерений.
Анализ данных¶
Анализ проведенных измерений включает в себя разбор файлов с данными о производительности и построение пары графиков по имеющимся данным. Первый график: среднее время выполнения метода за минуту на заданном интервале. Второй: частота вызовов метода на заданном интервале. Пользователь должен иметь возможность изменять временной интервал. На рисунке приведен пример графика соответсвующего интервалу с 14:13 по 14:22 текущего дня.
Реализация¶
Очередь (FIFO) измерений janet.services.apm.impl.core.MeasurementQueue представляет собой синглтон с ленивой инициализацией - экземпляр класса создаётся при первом обращении к методу janet.services.apm.impl.core.MeasurementQueue.getInstance(). Элементы очереди - объекты класса janet.services.apm.impl.core.TraceRecord содержат информацию о времени вызова метода и времени возврата из метода, а также уникальный индентификатор фильтра в соотствии с которым было призведено измерение.
Для помещения/извлечения элементов в/из очередь(и) реализованы два метода:
public void push(TraceRecord)- заносит новую запись о производительности в конец очереди. Если достигнут максимальный размер очереди происходит возврат из метода, переданное значение теряется.public TraceRecord pop()- забирает запись о производительности из начала очереди с удалением ее из очереди. Если очередь пуста метод возвращаетnull.
Оба этих метода, а также метод janet.services.apm.impl.core.MeasurementQueue.getInstance() потокобезопасны.
Коллектор измерений - работа выполняемая по расписанию. Реализована в классе janet.services.apm.impl.core.TraceInfoCollectorJob. В цикле извлекает элементы из очереди и передаёт их трассировщику.
Трассировщик - внутренняя служба модуля. Реализована в пакете janet.services.apm.impl. Содержит набор методов для сохранения и извлечения данных об измерениях. Для корректной работы службы необходимо сконфигурировать её backend.
Замечание: методы для извлечения данных доступны только при использовании janet.services.apm.impl.tracer.backend.DbBackend
janet.services.apm.impl.tracer.backend. Позволяет сохранять полученные измерения в одном из трех видов:
- вывод поступающих данных на консоль (
janet.services.apm.impl.tracer.backend.ConsoleBackend) - сохранение поступающих данных в файл (
)janet.services.apm.impl.tracer.backend.LogFileBackend - сохранение поступающих данных в базу данных (
janet.services.apm.impl.tracer.backend.DbBackend)
Конфигурирование очереди, коллектора и трассировщика¶
Размер очереди по умолчанию принимается равным 1000 экземплярам класса janet.services.apm.impl.core.TraceRecord. При необходимости размер очереди можно изменять в конфигурационном файле iJaNet-модуля jws-module.xml. Для этого в секции <module-properties> необходимо добавить следующий параметр
<param name="janet.apm.max_queue_size" type="int">[desired value]</param>
Настройка коллектора измерений производится внутри секции <scheduled-jobs>. Для этого внутри секции создается подсекция <job> следующего вида
<job start-delay="10000" interval="20000">
<job-class>janet.services.apm.impl.core.TraceInfoCollectorJob</job-class>
<parameters>
<param name="janet.apm.tracer_service_name" type="string">apm</param>
</parameters>
</job>
Атрибуты start-delay и interval имеют то же значение, что и для обычной работы по расписанию. <job-class> должен содержать ссылку на реализацию коллектора janet.services.apm.impl.core.TraceInfoCollectorJob. Единственный параметр janet.apm.tracer_service_name содержит название службы-трассировщика, которое было задано при конфигурации службы-трассировщика.
Трассировщик описывается в секции <local-services> в отдельном подразделе <service>. Пример конфигурации трассировщика приведён ниже:
<service name="apm" publish="true">
<factory-class>jws.core.services.GenericServiceFactory</factory-class>
<service-interface>janet.services.apm.ITracerService</service-interface>
<parameters>
<param name="impl.class" type="string">janet.services.apm.impl.TracerServiceImpl</param>
<param name="backend" type="janet.services.apm.impl.conf.TracerServiceBackendConf">
<backend-class>janet.services.apm.impl.tracer.backend.ConsoleBackend</backend-class>
</param>
</parameters>
</service>
В атрибуте name задаётся имя службы-трассировщика. В подсекциях <factory-class> и <service-interface> задаётся имя класса используемого для управления экземплярами службы и класса определяющего интерфейс службы jws.core.services.GenericServiceFactory и janet.services.apm.ITracerService соответственно. В параметре impl.class задаётся имя класса реализующего интерфейс службы janet.services.apm.impl.TracerServiceImpl. В параметре backend конфигурируется backend трассировщика.
backend-class>, которая может принимать одно из следующих значений:
janet.services.apm.impl.tracer.backend.ConsoleBackendjanet.services.apm.impl.tracer.backend.FileBackendjanet.services.apm.impl.tracer.backend.DbBackend
В первых двух случаях данные об измерениях сохраняются в системную консоль или лог-файл. В последнем случае сохранение производится в БД, для чего необходимо сконфигурировать источник данных и параметры таблицы. Пример кофигурации приведён ниже:
<param name="backend" type="janet.services.apm.impl.conf.TracerServiceBackendConf">
<backend-class>janet.services.apm.impl.tracer.backend.DbBackend</backend-class>
<parameters>
<param name="datasource" type="jws.services.common.DirectDataSourceConf">
<driver-class>org.firebirdsql.jdbc.FBDriver</driver-class>
<connection-url>jdbc:firebirdsql:localhost:janet</connection-url>
<driver-parameters>
<param name="user" type="string">SYSDBA</param>
<param name="password" type="string">masterkey</param>
</driver-parameters>
</param>
<param name="backend.db.tableName" type="string">APM_TRACER_MEASUREMENTS</param>
</parameters>
</param>
Источник данных задаётся в параметре datasource. Работа с источниками данных подробно рассмотрена в Платформа iJaNet V5. Общее описание. В параметре backend.db.tableName задаётся название для таблицы СУБД в которую будут сохраняться данные произведенных измерений. Значение параметра должно совпадать с названием предварительно созданной таблицы в БД. Скрипт для создания таблицы с именем APM_TRACER_MEASUREMENTS приведен ниже:
CREATE TABLE APM_TRACER_MEASUREMENTS ( SERVICE_NAME VARCHAR(256), FILTER_ID VARCHAR(256), START_TIME BIGINT, FINISH_TIME BIGINT );