Данная подсистема предназначена для мониторинга количества обработанных и опубликованных событий приложением, к которому данная подсистема мониторинга (сбора статистики) подключена.
Подсистема мониторинга состоит из 6 модулей:
- Statistics Holder -- модуль, аккумулирующий собираемую статистику;
- Statistics Collector AOP -- модуль, собирающий статистику средствами AOP;
- Statistics Collector JDBC -- модуль, собирающий статистику о выполнении запросов к БД и обработке полученных результатов в качестве обёртки над JDBC;
- Statistics Exposer JMX -- модуль, экспортирующий статистику в JMX-бины;
- Statistics Exposer Zabbix -- модуль, отправляющий статистику на Zabbix-сервер средствами ZabbixSender;
- Statistics Exposer Log -- модуль, производящий вывод собранной статистики в лог.
Для подключения данного мониторинга к приложению, мониторинг которого необходимо осуществлять, необходимы, как минимум, 3 модуля:
- Statistics Holder, в котором будет аккумулироваться собираемая статистика;
- Statistics Collector AOP для сборки статистики;
- Statistics Exposer JMX и Statistics Exposer Zabbix для экспорта статистика в JMX и публикации статистики в Zabbix.
Модуль Statistics Holder является агрегатором статистики, поступающей в него из StatisticsCollector
'а.
Данный модуль аккумулирует:
- количество обработанных приложением событий, а так же минимальное, среднее, максимальное и последнее время обработки каждого из типов событий в наносекундах;
- количество опубликованных приложением событий, агрегированное по типам событий.
Данный модуль аггрегирует как полную статистику (от момента последнего обнуления статистики), так и статистику за промежуток времени тайм-фрейм, определяемый свойством statistics.monitor.timeFrame
.
Полная статистика может быть получена потребителем статистики в любой момент времени, в отличии от статистики за тайм-фрейм, которая предоставляется потребителю статистики, реализующему интерфейс FramedEventStatisticsConsumer строго на границе окончания временного промежутка, определённого свойством statistics.monitor.timeFrame
.
Для подключения агрегатора статистики к вашему приложению необходимо в зависимости проекта добавить зависимость от данного модуля, подгрузить его Spring-контекст и определить свойство statistics.monitor.timeFrame
.
<dependency>
<groupId>io.github.esirotkin</groupId>
<artifactId>statistics-holder</artifactId>
<version>1.1.6</version>
</dependency>
<import resource="classpath:/META-INF/spring/monitor-context.xml" />
Конфигурационные свойства:
statistics.monitor.timeFrame
-- свойство, определяющее временной промежуток тайм-фрейм в миллисекундах (параметр необязательный: значение по умолчанию = 15000 миллисекунд);
Для взаимодействия с агрегатором статистики предоставляются 9 интерфейсов:
- StatisticsCollector -- для сбора статистики об обработанных и опубликованных событиях;
- StatisticsProvider -- для получения полной статистики об обработанных и опубликованных событиях;
- FramedEventStatisticsSubscription -- для подписки на получение статистики за временной промежуток тайм-фрейм;
- FramedEventStatisticsConsumer -- должен быть реализован потребителем статистики за временной промежуток тайм-фрейм;
- FramedEventStatisticsProvider -- интерфейс, наследуемый от StatisticsProvider, предоставляемый потребителю статистики за временной промежуток тайм-фрейм для получения этой самой статистики;
- QueueStatisticsCollector -- для сбора статистики работы очереди обработки событий вашего приложения/сервиса (при наличии таковой);
- QueueStatisticsProvider -- для получения статистики работы очереди обработки событий вашего приложения/сервиса (при наличии таковой);
- QueueStatisticsCleaner -- для очистки статистики работы очереди обработки событий вашего приложения/сервиса (при наличии таковой);
- StatisticsCleaner -- для очистки всей собранной статистики.
С интерфейсом StatisticsCollector взаимодействуют сборщики статистики, такие как Statistics Collector AOP.
С интерфейсом StatisticsProvider взаимодействуют экспортёры статистики, такие как Statistics Exposer JMX и Statistics Exposer Log.
С интерфейсами FramedEventStatisticsSubscription, FramedEventStatisticsConsumer и FramedEventStatisticsProvider так же взаимодействуют экспортёры статистики, такие как Statistics Exposer Zabbix и Statistics Exposer Log.
С этими интерфейсами вам взаимодействовать внутри вашего приложения в явном виде вряд ли придётся.
Для сбора статистики о работе очереди обработки событий необходимо в класс, реализующий очередь обработки событий, заинжектить бин, реализующий интерфейс QueueStatisticsCollector.
@Autowired
private QueueStatisticsCollector statisticsCollector;
И при каждом добавлении нового события в очередь вызывать метод statisticsCollector.eventQueued()
, а после каждого обработанного события вызывать метод statisticsCollector.eventProcessed()
.
Для мониторинга статистики взаимодействия с БД предназначен отдельный StatisticsHolder
, кототрый предоставляет 6 интерфейсов, аналогичных вышеописанным интерфейсам:
- StatisticsCollector -- для сбора статистики о выполненных запросах и обработанных записях (в каждом из
ResultSet
ов); - StatisticsProvider -- для получения полной статистики о выполненных запросах и обработанных записях;
- FramedDbStatisticsSubscription -- для подписки на получение статистики за временной промежуток тайм-фрейм;
- FramedDbStatisticsConsumer -- должен быть реализован потребителем статистики за временной промежуток тайм-фрейм;
- FramedDbStatisticsProvider -- интерфейс, наследуемый от StatisticsProvider, предоставляемый потребителю статистики за временной промежуток тайм-фрейм для получения этой самой статистики;
- StatisticsCleaner -- для очистки всей собранной статистики.
Как и в случае с интерфейсами, ответственными за сбор и получение статистики об обработке и публикации событий (Event
), взаимодействовать напрямую с данными интерфейсами нет необходимости.
Для сбора статистики об исполнении запросов БД и обработке полученных в результате исполнения запроса результатов предназначен модуль Statistics Collector JDBC, а публикацией собранной статистики в Zabbix занимается общий модуль Statistics Exposer Zabbix.
Для обнуления собранной за определённый период статистики (например, за сутки; или по факту получения события CleanEvent
) следует воспользоваться интерфейсом StatisticsCleaner, предваритеьлно заинжектив соответствующий бин в своё приложение/сервис.
@Autowired
private StatisticsCleaner statisticsCleaner;
Далее обнулять собранную статистику в любой момент времени следует вызовом метода statisticsCleaner.clear()
.
Модуль Statistics Collector AOP предназначен для сбора статистики средствами Spring AOP.
Использование подхода AOP оправдано тогда, когда сложно внедрить в ваше приложение дополнительные Proxy-объекты для организации сбора статистики.
Для подключения данного сборщика статистики к вашему приложению необходимо в зависимости проекта добавить зависимость от данного модуля и подгрузить Spring-контекст, в котором вы должны будете определить конфигурацию AOP аналогично примеру, приведённому ниже.
<dependency>
<groupId>io.github.esirotkin</groupId>
<artifactId>statistics-collector-aop</artifactId>
<version>1.1.6</version>
</dependency>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<import resource="classpath:/META-INF/spring/monitor-aop-context.xml" />
<aop:aspectj-autoproxy proxy-target-class="true" />
<aop:config>
<aop:aspect id="processEventAspect" ref="statisticsCollectorAspect">
<aop:pointcut id="processEvent" expression="execution(public !static void ru.open..*.onEvent*(..))" />
<aop:around pointcut-ref="processEvent" method="eventProcessed" />
</aop:aspect>
<aop:aspect id="publishEventAspect" ref="statisticsCollectorAspect">
<aop:pointcut id="publishEvent" expression="execution(public !static void ru.open..*.consumeEvent(..))" />
<aop:after pointcut-ref="publishEvent" method="eventPublished" />
</aop:aspect>
<aop:aspect id="sendRequestAspect" ref="statisticsCollectorAspect">
<aop:pointcut id="sendRequest" expression="execution(public !static * ru.open..*.sendRequest(..))" />
<aop:around pointcut-ref="sendRequest" method="requestPublished" />
</aop:aspect>
<aop:aspect id="processRequestAspect" ref="statisticsCollectorAspect">
<aop:pointcut id="processRequest" expression="execution(public !static * ru.open..*.processRequest(..))" />
<aop:around pointcut-ref="processRequest" method="requestProcessed" />
</aop:aspect>
</aop:config>
</beans>
Модуль Statistics Collector JDBC предназначен для сбора статистики о выполнении запросов к БД и обработке результатов, полученных в результате исполнения запросов.
Для подключения данного сборщика статистики к вашему приложению необходимо, прежде всего, в зависимости проекта добавить зависимость от данного модуля.
<dependency>
<groupId>io.github.esirotkin</groupId>
<artifactId>statistics-collector-jdbc</artifactId>
<version>1.1.6</version>
</dependency>
Далее необходимо подгрузить необходимые Spring
-контексты.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<import resource="classpath:/META-INF/spring/monitor-context.xml" />
<import resource="classpath:/META-INF/spring/monitor-jdbc-context.xml" />
<import resource="classpath:/META-INF/spring/monitor-zabbix-context.xml" />
</beans>
А в приложении необходимо каждый JDBC Connection
обернуть в ConnectionWrapper (как показано ниже).
@Autowired
private ConnectionWrapperFactory wrapperFactory;
public Connection createConnection() throws SQLException, ClassNotFoundException, IllegalAccessException, InstantiationException {
Connection connection = ...; // some implementation
return wrapperFactory.wrapConnection(connection);
}
И дальше использовать полученную обёртку в вашем приложении, как обычный JDBC Connection
.
Модуль Statistics Exposer JMX предназначен для экспорта собранной статистики в JMX-бины.
В JMX-бины транслируется полная статистика, собранная от момента последнего обнуления статистики.
Для взаимодействия с этими JMX-бинами можно воспользоваться инструментом JConsole, поставляемым в комплекте с JDK.
При инициализации Spring-контекста данного модуля в JMX экспортируются 3 бина:
ru.open.monitor.statistics:ProcessedEvents
-- предоставляет информацию об обработанных вашим приложением событиях;ru.open.monitor.statistics:PublishedEvents
-- предоставляет информацию об опубликованных вашим приложением событиях;ru.open.monitor.statistics:StatisticsCleaner
-- предоставляет возможность обнуления статистики вашего приложения посредством вызова методаclearStatistics()
.
Бины ProcessedEvents
и PublishedEvents
статистику об обработанных и опубликованных событиях предоставляют в виде атрибутов, имена которых соответствуют полному имени Java-класса события.
Типы обработанных событий (атрибуты JMX-бина), по которым информация будет отображаться в бине ProcessedEvents
, должны быть указаны в свойстве statistics.monitor.jmx.interestProcessedEvents
в виде полных имён Java-классов, перечисленных через запятую.
По каждому типу события (в виде составного типа данных) предоставляется следующая информация (в последовательности нижеследующего списка):
- имя класса потребителя событий (в виде префикса аттрибута);
- количество обработанных событий -- суффикс
count
; - минимальное время обработки события в секундах (суффикс
min
); - среднее время обработки события в секундах (суффикс
avg
); - максимальное время обработки события в секундах (суффикс
max
); - последнее время обработки события в секундах (суффикс
last
).
Так же данный бин предоставляет возможность получить список всех типов обрабатываемых данным приложением событий посредством вызова метода getProcessedEventsClasses()
.
Так же есть возможность получить список интересующих событий (тех, что перечислены в свойстве statistics.monitor.jmx.interestProcessedEvents
) посредством вызова метода getInterestEventsClasses()
.
Типы опубликованных событий (атрибуты JMX-бина), по которым информация будет отображаться в бине PublishedEvents
, должны быть указаны в свойстве statistics.monitor.jmx.interestPublishedEvents
в виде полных имён Java-классов, перечисленных через запятую.
По каждому типу события (в виде составного типа данных) предоставляется следующая информация:
- имя класса публикатора событий (в виде префикса аттрибута);
- количество опубликованных событий -- суффикс
count
.
Так же данный бин предоставляет возможность получить список всех типов публикуемых данным приложением событий посредством вызова метода getPublishedEventsClasses()
.
Так же есть возможность получить список интересующих событий (тех, что перечислены в свойстве statistics.monitor.jmx.interestPublishedEvents
) посредством вызова метода getInterestEventsClasses()
.
Для подключения JMX-exposer'а к вашему приложению необходимо в зависимости проекта добавить зависимость от данного модуля и подгрузить его Spring-контекст.
<dependency>
<groupId>io.github.esirotkin</groupId>
<artifactId>statistics-exposer-jmx</artifactId>
<version>1.1.6</version>
</dependency>
<import resource="classpath:/META-INF/spring/monitor-jmx-context.xml" />
Для организации мониторинга Java-приложения (средствами JMX) в Zabbix наиболее распространены 2 подхода:
- использование нативного Zabbix Java Gateway, выступающего в роли Zabbix-прокси;
- использование JMX-HTTP моста Jolokia, предоставляющего доступ к атрибутам JMX-бинов черех HTTP.
Для получения в Zabbix значений JMX-атрибутов посредством Java Gateway ключ атрибута будет выглядеть следующим образом:
jmx["ru.open.monitor.statistics:name=ProcessedEvents","<eventTypeEscaped>.<handlerSimpleType>\.count"]
-- для получения количества обработанных обработчикомhandlerType
событий типаeventType
;jmx["ru.open.monitor.statistics:name=ProcessedEvents","<eventTypeEscaped>.<handlerSimpleType>\.min"]
-- для получения минимального времени обработки события типаeventType
(в секундах) обработчикомhandlerType
;jmx["ru.open.monitor.statistics:name=ProcessedEvents","<eventTypeEscaped>.<handlerSimpleType>\.avg"]
-- для получения среднего времени обработки события типаeventType
(в секундах) обработчикомhandlerType
;jmx["ru.open.monitor.statistics:name=ProcessedEvents","<eventTypeEscaped>.<handlerSimpleType>\.max"]
-- для получения максимального времени обработки события типаeventType
(в секундах) обработчикомhandlerType
;jmx["ru.open.monitor.statistics:name=ProcessedEvents","<eventTypeEscaped>.<handlerSimpleType>\.last"]
-- для получения последнего времени обработки события типаeventType
(в секундах) обработчикомhandlerType
;jmx["ru.open.monitor.statistics:name=PublishedEvents","<eventTypeEscaped>.<publisherSimpleType>\.count"]
-- для получения количества опубликованных публикаторомpublisherType
событий типаeventType
.
Суффикс Escaped
означает, что "точки" .
в полном имени Java-класса события должны быть экранированы (заменены на \.
).
Суффикс Simple
означает, что имя класса обработчика/публикатора представлено в простой форме (без указания пакета).
Модуль Statistics Exposer Zabbix предназначен для отправки статистики в Zabbix.
В Zabbix статистика отправляется за тайм-фрейм -- промежуток времени, определяемый свойством statistics.monitor.timeFrame
.
В отличии от вышеописанного варианта получения статистики об обработанных и опубликованных событиях в Zabbix средствами Zabbix Java Gateway через JMX, данный модуль сам отправляет статистику в Zabbix по таймеру (определяемому свойством statistics.monitor.timeFrame
), а не ожидает, когда его Zabbix опросит.
Следует отметить, что средствами ZabbixSender
в Zabbix отправляется статистика только о количестве обработанных и опубликованных сообщений. Дополнительная статистика о времени обработки сообщения обновляется на сервере Zabbix средствами Zabbix Java Gateway.
Для подключения данного модуля к вашему приложению необходимо в зависимости проекта добавить зависимость от данного модуля, подгрузить его Spring-контекст и определить несколько свойств.
<dependency>
<groupId>io.github.esirotkin</groupId>
<artifactId>statistics-exposer-zabbix</artifactId>
<version>1.1.6</version>
</dependency>
<import resource="classpath:/META-INF/spring/monitor-zabbix-context.xml" />
Конфигурационные свойства:
statistics.monitor.zabbix.enable
-- свойство, включающее/отключающее отправку статистики в Zabbix средствамиZabbixSender
;statistics.monitor.zabbix.server.host
-- DNS-имя или IP-адрес сервера Zabbix;statistics.monitor.zabbix.sender.port
-- номер порта сервера Zabbix для взаимодействия по протоколу ZBX посредством Zabbix Sender (параметр необязательный: значение по умолчанию = 10051);statistics.monitor.zabbix.api.port
-- номер порта сервера Zabbix для взаимодействия по протоколу Zabbix API (параметр необязательный: значение по умолчанию = 80);statistics.monitor.zabbix.server.user
-- имя пользователя Zabbix, обладающего правами просмотра и создания новых хостов (hosts), интерфейсов (host interfaces), приложений (applications) и элементов (items);statistics.monitor.zabbix.server.password
-- пароль вышеобозначенного пользователя Zabbix;statistics.monitor.zabbix.proxy.list
-- список хостов (и портов) Zabbix Proxy в нотации IPv4, перечисляемых через запятую (параметр необязательный: в случае отсутствия будет использовано значениеstatistics.monitor.zabbix.server.host
:statistics.monitor.zabbix.sender.port
);statistics.monitor.zabbix.onDemandSendRhythm
-- ритм (периодичность) отправки значений по требованию в Zabbix (параметр необязательный: значение по умолчанию = 500 мс);statistics.monitor.zabbix.host.group
-- имя группы хостов (host group), к которой принадлежит данный сервер (на котором запущено данное приложение);statistics.monitor.zabbix.simpleNames
-- использовать простые имена для элементов данных (item) в Zabbix (параметр необязательный: значение по умолчанию =true
);statistics.monitor.zabbix.applyTemplates
-- применять ли перечисленные в параметреstatistics.monitor.zabbix.templates
шаблоны к данному хосту (параметр необязательный: значение по умолчанию =false
);statistics.monitor.zabbix.templates
-- имена шаблонов Zabbix (например,Template JMX Generic
), перечисленные через запятую, которые должны быть применены к данному хосту (параметр необязательный);statistics.monitor.zabbix.configureJvmMonitor
-- настраивать ли в Zabbix элементы данных, триггеры и графики для базового мониторинга JVM (параметр необязательный: значение по умолчанию =false
);statistics.monitor.zabbix.api.url
-- URL Zabbix API (параметр необязательный: при отсутствии значения URL будет сформирован на основеstatistics.monitor.zabbix.server.host
иstatistics.monitor.zabbix.api.port
);statistics.monitor.zabbix.agent.subnet
-- IPv4-подсеть в нотации CIDR для автоматического определения IP-адреса данногоZabbixSender
'а (параметр необязательный: значение по умолчанию = 10.0.0.0/8);statistics.monitor.zabbix.agent.app
-- имя приложения для идентификации отправителя в Zabbix (вместо данного параметра можно определить свойствоspring.application.name
);statistics.monitor.zabbix.agent.host
-- IP адрес или доменное имя хоста, видимого Zabbix серверу (или прокси) для случая запуска приложения в контейнере с внутренней подсетью (параметр необязательный: значение по умолчанию =java.rmi.server.hostname
или автоматически определённый IP адрес локального хоста);statistics.monitor.zabbix.agent.hostname
-- имя хоста, передаваемое Zabbix при конфигурировании хоста (параметр необязательный: значение по умолчанию =hostname
);statistics.monitor.zabbix.interestProcessedEvents
-- типы обрабатываемых событий, перечисленных через запятую, по которым статистика должна отправляться в Zabbix (параметр необязательный: по умолчанию статистика в Zabbix будет отправляться по всем обработанным событиям);statistics.monitor.zabbix.interestPublishedEvents
-- типы публикуемых событий, перечисленных через запятую, по которым статистика должна отправляться в Zabbix (параметр необязательный: по умолчанию статистика в Zabbix будет отправляться по всем опубликованным событиям);statistics.monitor.zabbix.interestDatabaseStatements
-- имена (идентификаторы) запросов к БД, перечисленных через запятую, по которым статистика должна отправляться в Zabbix (параметр необязательный: по умолчанию статистика в Zabbix будет отправляться по всем запросам к базе данных);statistics.monitor.jmx.interestProcessedEvents
-- типы обрабатываемых событий, перечисленных через запятую, для которых в Zabbix будет настроен их мониторинг средствами Zabbix Java Gateway (параметр необязательный: при отсутствии таковых JMX-мониторинг для обрабатываемых событий настраиваться НЕ будет);statistics.monitor.jmx.interestPublishedEvents
-- типы публикуемых событий, перечисленных через запятую, для которых в Zabbix будет настроен их мониторинг средствами Zabbix Java Gateway (параметр необязательный: при отсутствии таковых JMX-мониторинг для публикуемых событий настраиваться НЕ будет);statistics.monitor.zabbix.includeEventsExposedToJmx
-- конфигурировать Zabbix для получения статистики по событиям, перечисленным только в параметрахstatistics.monitor.jmx.interestProcessedEvents
иstatistics.monitor.jmx.interestPublishedEvents
(параметр необязательный: значение по умолчанию =false
);statistics.monitor.zabbix.jmx.delay
-- периодичность (в секундах) обновления значений, отслеживаемых Zabbix'ом средствами Zabbix Java Gateway (параметр необязательный: значение по умлочанию = 30 секунд);statistics.monitor.zabbix.attemptCount
-- количество попыток, которые будут предприняты для отправки статистики в Zabbix (параметр необязательный: значение по умолчанию = 5 попыток);statistics.monitor.zabbix.attemptInterval
-- интервал времени, определяющий периодичность (после первой неудачной) попыток отправки статистики в Zabbix (параметр необязательный: значение по умолчанию = 500 миллисекунд);statistics.monitor.zabbix.numberOfConfigurationAttempts
-- количество попыток, предпринимаемых для конфигурирования сервера Zabbix (параметр необязательный: значение по умолчанию = 5 попыток);java.rmi.server.hostname
-- IPv4-адрес сервера, на которм запущено данное приложение (параметр необязательный: при отсутствии значения IP-адрес будет запрошен у операционной системы с фильтрацией поstatistics.monitor.zabbix.agent.subnet
);com.sun.management.jmxremote.port
-- номер порта JMX данного приложения;statistics.monitor.zabbix.deleteObsoleteItems
-- удалять из Zabbix устаревшие элементы данных (параметр необязательный: значение по умолчанию =true
);statistics.monitor.zabbix.numberOfEmptyDaysForObsoleteItem
-- количество дней, по истечении которых элементы данных (items) следует считать неактуальными (при отсутствии "свежих" значений) и удалять (параметр необязательный: значение по умолчанию = 90 дней);statistics.monitor.zabbix.protectedItemNames
-- имена (или их части) элементов данных Zabbix (перечисленные через запятую), защищённых от удаления (параметр необязательный).
При включенном свойстве statistics.monitor.zabbix.enable
в true
ZabbixConfigurer перед отправкой статистики в Zabbix средствами ZabbixSender
производит конфигурирование сервера Zabbix для приёма отправляемой вашим приложением статистики.
Конфигурирование состоит из следующих этапов:
- проверки сконфигурированного хоста с соответствующим JMX-интерфейсом -- при отсутствии таковых они создаются;
- применении шаблонов Zabbix, перечисленных через запятую в свойстве
statistics.monitor.zabbix.templates
к данному хосту; - проверки сконфигурированных групп элементов (
Application
в терминологии Zabbix):ProcessedEvents
иPublishedEvents
,QueueStatistics
,ExecutedStatements
иProcessedResultSets
-- при отсутствии таковых они создаются; - проверки сконфигурированных элементов (
Item
в терминологии Zabbix) -- по элементу на каждый статистический показатель -- при отсутствии таковых (или добавлении нового) они создаются.
При этом следует отметить, что средствами ZabbixSender
(с периодичностью, определённой в свойстве statistics.monitor.timeFrame
) отправляется статистика лишь о количестве и среднем за тайм-фрейм времени обработки обработанных и количестве опубликованных событий, а так же статистика о работе очереди обработки событий (при наличии таковой).
Иные показатели, такие как минимальное, максимальное и последнее зафиксированное время обработки события даже в случае, если данный тип события указан в свойстве statistics.monitor.zabbix.interestProcessedEvents
, будут обновляться в Zabbix'е средствами Zabbix Java Gateway (JMX) с той периодичностью, кот. определена в свойстве statistics.monitor.zabbix.jmx.delay
.
Это целесообразно с точки зрения оптимизации трафика.
ZabbixSender отправляет на сервер Zabbix сообщения в JSON-формате, где ключ key
-- это соответствующий атрибут, а value
-- его значение.
Статистика об обработанных сообщениях каждого типа отправляются в Zabbix в виде пары key
/value
:
host
:<zabbixApplicationHost>
zabbixApplicationHost
-- имя приложения из свойстваstatistics.monitor.zabbix.agent.app
илиspring.application.name
key
:ProcessedEvents.<eventSimpleClass>.<handlerSimpleClass>.<itemName>
eventSimpleClass
-- простое (без префикса пакета) имя Java-класса обрабатываемого событияhandlerSimpleClass
-- простое (без префикса пакета) имя Java-класса обработчика событияitemName
-- имя элемента данных (используются:count
илиavg
)
value
:<eventCount>
или<avgTime>
eventCount
-- количество обработанных сообщений данного типа (пересчитанное на 1 секунду)avgTime
-- среднее за тайм-фрейм время в секундах обработки события данного типа
Статистика об опубликованных сообщениях каждого типа отправляются в Zabbix в виде пары key
/value
:
host
:<zabbixApplicationHost>
zabbixApplicationHost
-- имя приложения из свойстваstatistics.monitor.zabbix.agent.app
илиspring.application.name
key
:PublishedEvents.<eventSimpleClass>.<publisherSimpleClass>.<itemName>
eventSimpleClass
-- простое (без префикса пакета) имя Java-класса публикуемого событияpublisherSimpleClass
-- простое (без префикса пакета) имя Java-класса публикатора событияitemName
-- имя элемента данных (используется:count
)
value
:<eventCount>
eventCount
-- количество опубликованных сообщений данного типа (пересчитанное на 1 секунду)
Статистика о работе очереди обработки событий (при наличии таковой) отправляются в Zabbix в виде пары key
/value
:
host
:<zabbixApplicationHost>
zabbixApplicationHost
-- имя приложения из свойстваstatistics.monitor.zabbix.agent.app
илиspring.application.name
key
:QueueStatistics.<parameterName>.<itemName>
parameterName
-- имя параметра:QueuedEvent
илиProcessedEvent
itemName
-- имя элемента данных (используется:count
)
value
:<processedEventCount>
или<queuedEventCount>
queuedEventCount
-- количество сообщений (необработанных), оставшихся в очереди обработки событийprocessedEventCount
-- общее количество обработанных за тайм-фрейм сообщений (пересчитанное на 1 секунду)
Статистика о выполненных запросах к БД отправляются в Zabbix в виде пары key
/value
:
host
:<zabbixApplicationHost>
zabbixApplicationHost
-- имя приложения из свойстваstatistics.monitor.zabbix.agent.app
илиspring.application.name
key
:ExecutedStatements.<statement>.<itemName>
statement
-- имя (идентификатор) запроса к БД (без перечисления параметров, пробелы заменены знаком_
)itemName
-- имя элемента данных (используются:count
илиavg
)
value
:<executionCount>
или<avgTime>
executionCount
-- количество исполнений запроса / вызова процедуры (пересчитанное на 1 секунду)avgTime
-- среднее за тайм-фрейм время в секундах выполнения запроса
Статистика обработки записей, полученных в результате выполнения запросов к БД, отправляются в Zabbix в виде пары key
/value
:
host
:<zabbixApplicationHost>
zabbixApplicationHost
-- имя приложения из свойстваstatistics.monitor.zabbix.agent.app
илиspring.application.name
key
:ProcessedResultSets.<statement>.<resultSetNumber>.<itemName>
statement
-- имя (идентификатор) запроса к БД (без перечисления параметров, пробелы заменены знаком_
)resultSetNumber
-- порядковый номерResultSet
а (нумерация с0
)itemName
-- имя элемента данных (используются:count
илиavg
)
value
:<recordCount>
или<avgTime>
recordCount
-- количество обработанных записей БД в рамках данногоResultSet
а (пересчитанное на 1 секунду)avgTime
-- среднее за тайм-фрейм время в секундах обработки каждой записи
Иногда возникает необходимость отправления в Zabbix неопределённых (то есть, не фиксированных каким-либо форматом или соглашением) данных по требованию (то есть, не по таймеру, а в момент возникновения такой необходимости).
Такая возможность предусмотрена в данном модуле.
Для того, чтобы ей воспользоваться, необходимо в вашем Spring
-контексте дополнительно инициализировать бин OnDemandZabbixSender
как показано ниже.
<import resource="classpath:/META-INF/spring/monitor-zabbix-context.xml" />
<bean id="onDemandZabbixSender" class="ru.open.monitor.statistics.zabbix.OnDemandZabbixSender" />
И, заинжектив его в своё приложение, отправлять в Zabbix неопределённые данные, реализующие интерфейс ExternalItem.
@Autowired
private OnDemandZabbixSender zabbixSender;
public void sendToZabbix(SomeExternalItem item) {
zabbixSender.sendToZabbix(item);
}
Модуль Statistics Exposer Log предназначен для периодического вывода статистики в лог.
В лог может выводиться как полная статистика (от момента последнего обнуления статистики), так и статистика за промежуток времени / тайм-фрейм, определённый свойством statistics.monitor.timeFrame
.
Для подключения данного модуля к вашему приложению необходимо в зависимости проекта добавить зависимость от данного модуля, подгрузить его Spring-контекст, определить несколько свойств и настроить вывод в лог.
<dependency>
<groupId>io.github.esirotkin</groupId>
<artifactId>statistics-exposer-log</artifactId>
<version>1.1.6</version>
</dependency>
<import resource="classpath:/META-INF/spring/monitor-log-context.xml" />
Для логирования полной статистики необходимо настроить логирование класса ru.open.monitor.statistics.log.FullStatisticsLogger
, уровень логирования указать в соответствии со свойством statistics.monitor.log.fullLoggerLevel
.
<property name="LOG_PATH" value="${LOG_PATH:-./log}" />
<logger name="ru.open.monitor.statistics.log.FullStatisticsLogger" level="TRACE" additivity="false">
<appender class="ru.open.monitor.statistics.log.logback.layout.appender.StateFileAppender">
<file>${LOG_PATH}/statistics/statistics-full.log</file>
<encoder>
<pattern>%d{dd.MM.yyyy HH:mm:ss.SSS} | %msg%n</pattern>
<immediateFlush>true</immediateFlush>
</encoder>
</appender>
</logger>
Для логирования статистики за тайм-фрейм необходимо настроить логирование класса ru.open.monitor.statistics.log.FramedStatisticsLogger
, уровень логирования указать в соответствии со свойством statistics.monitor.log.framedLoggerLevel
.
<property name="LOG_PATH" value="${LOG_PATH:-./log}" />
<logger name="ru.open.monitor.statistics.log.FramedStatisticsLogger" level="DEBUG" additivity="false">
<appender class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/statistics/statistics-framed-${ROLLING_PATTERN}</fileNamePattern>
<maxHistory>10</maxHistory>
</rollingPolicy>
<append>true</append>
<encoder>
<pattern>%d{dd.MM.yyyy HH:mm:ss.SSS} | %msg%n</pattern>
<immediateFlush>true</immediateFlush>
</encoder>
</appender>
</logger>
Для логирования статистики обработки пачки событий очередью CoreEventQueue
необходимо настроить логирование класса ru.open.monitor.statistics.log.EventBatchStatisticsLogger
, уровень логирования указать в соответствии со свойством statistics.monitor.log.framedLoggerLevel
.
<property name="LOG_PATH" value="${LOG_PATH:-./log}" />
<logger name="ru.open.monitor.statistics.log.EventBatchStatisticsLogger" level="DEBUG" additivity="false">
<appender class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/statistics/statistics-batch-${ROLLING_PATTERN}</fileNamePattern>
<maxHistory>10</maxHistory>
</rollingPolicy>
<append>true</append>
<encoder>
<pattern>%d{dd.MM.yyyy HH:mm:ss.SSS} | %msg%n</pattern>
<immediateFlush>true</immediateFlush>
</encoder>
</appender>
</logger>
Для логирования статистики за тайм-фрейм в формате CSV необходимо добавить следующие логгеры:
ru.open.monitor.statistics.log.FramedStatisticsQueuedLoggerCsv
;ru.open.monitor.statistics.log.FramedStatisticsProcessedLoggerCsv
;ru.open.monitor.statistics.log.FramedStatisticsPublishedLoggerCsv
;ru.open.monitor.statistics.log.FramedStatisticsQueueLoggerCsv
.
<property name="LOG_PATH" value="${LOG_PATH:-./log}" />
<property name="ROLLING_PATTERN_CSV" value="%d{yyyy-MM-dd}.csv.gz" />
<logger name="ru.open.monitor.statistics.log.FramedStatisticsQueuedLoggerCsv" level="DEBUG" additivity="false">
<appender class="ru.open.monitor.statistics.log.logback.rolling.ProcessedEventStatisticsRollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/statistics/queued-events-${ROLLING_PATTERN_CSV}</fileNamePattern>
<maxHistory>10</maxHistory>
</rollingPolicy>
<append>true</append>
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="ru.open.monitor.statistics.log.logback.layout.CsvLayout">
<lineSeparator>UNIX</lineSeparator>
</layout>
<immediateFlush>true</immediateFlush>
</encoder>
</appender>
</logger>
<logger name="ru.open.monitor.statistics.log.FramedStatisticsProcessedLoggerCsv" level="DEBUG" additivity="false">
<appender class="ru.open.monitor.statistics.log.logback.rolling.ProcessedEventStatisticsRollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/statistics/processed-events-${ROLLING_PATTERN_CSV}</fileNamePattern>
<maxHistory>10</maxHistory>
</rollingPolicy>
<append>true</append>
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="ru.open.monitor.statistics.log.logback.layout.CsvLayout">
<lineSeparator>UNIX</lineSeparator>
</layout>
<immediateFlush>true</immediateFlush>
</encoder>
</appender>
</logger>
<logger name="ru.open.monitor.statistics.log.FramedStatisticsPublishedLoggerCsv" level="DEBUG" additivity="false">
<appender class="ru.open.monitor.statistics.log.logback.rolling.PublishedEventStatisticsRollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/statistics/published-events-${ROLLING_PATTERN_CSV}</fileNamePattern>
<maxHistory>10</maxHistory>
</rollingPolicy>
<append>true</append>
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="ru.open.monitor.statistics.log.logback.layout.CsvLayout">
<lineSeparator>UNIX</lineSeparator>
</layout>
<immediateFlush>true</immediateFlush>
</encoder>
</appender>
</logger>
<logger name="ru.open.monitor.statistics.log.FramedStatisticsQueueLoggerCsv" level="DEBUG" additivity="false">
<appender class="ru.open.monitor.statistics.log.logback.rolling.QueueStatisticsRollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/statistics/queue-statistics-${ROLLING_PATTERN_CSV}</fileNamePattern>
<maxHistory>10</maxHistory>
</rollingPolicy>
<append>true</append>
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="ru.open.monitor.statistics.log.logback.layout.CsvLayout">
<lineSeparator>UNIX</lineSeparator>
</layout>
<immediateFlush>true</immediateFlush>
</encoder>
</appender>
</logger>
Конфигурационные свойства:
statistics.monitor.log.rate
-- периодичность вывода полной статистики в лог в миллисекундах (параметр необязательный: значение по умолчанию = 30000);statistics.monitor.log.interestProcessedEvents
-- типы обрабатываемых событий, перечисленных через запятую, по которым статистика должна выводиться в лог (параметр необязательный: по умолчанию в лог будет выводиться статистика по всем типам обрабатываемых событий);statistics.monitor.log.interestPublishedEvents
-- типы публикуемых событий, перечисленных через запятую, по которым статистика должна выводиться в лог (параметр необязательный: по умолчанию в лог будет выводиться статистика по всем типам публикуемых событий);statistics.monitor.log.fullLoggerLevel
-- уровень логирования для вывода полной статистики (параметр необязательный: значение по умолчанию =TRACE
);statistics.monitor.log.framedLoggerLevel
-- уровень логирования для вывода статистики за промежуток времени (параметр необязательный: значение по умолчанию =DEBUG
).