{"id":15297557,"url":"https://github.com/esirotkin/statistics-subsystem","last_synced_at":"2025-03-25T13:15:16.081Z","repository":{"id":57733148,"uuid":"165114624","full_name":"esirotkin/statistics-subsystem","owner":"esirotkin","description":"Subsystem for monitoring and collecting statistics of event-driven Java applications","archived":false,"fork":false,"pushed_at":"2021-01-02T14:02:22.000Z","size":150,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-10T22:34:11.111Z","etag":null,"topics":["java","monitoring","statistics","zabbix"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/esirotkin.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-01-10T18:58:50.000Z","updated_at":"2021-01-02T14:02:25.000Z","dependencies_parsed_at":"2022-09-26T22:11:17.820Z","dependency_job_id":null,"html_url":"https://github.com/esirotkin/statistics-subsystem","commit_stats":null,"previous_names":[],"tags_count":8,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/esirotkin%2Fstatistics-subsystem","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/esirotkin%2Fstatistics-subsystem/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/esirotkin%2Fstatistics-subsystem/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/esirotkin%2Fstatistics-subsystem/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/esirotkin","download_url":"https://codeload.github.com/esirotkin/statistics-subsystem/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245467615,"owners_count":20620216,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["java","monitoring","statistics","zabbix"],"created_at":"2024-09-30T19:18:17.868Z","updated_at":"2025-03-25T13:15:15.939Z","avatar_url":"https://github.com/esirotkin.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"Данная подсистема предназначена для мониторинга количества обработанных и опубликованных событий приложением, к которому данная подсистема мониторинга (сбора статистики) подключена.\n\n### \u003ca name=\"MonitoringDescription\" /\u003e Описание подсистемы мониторинга\n\nПодсистема мониторинга состоит из 6 модулей:\n\n* [Statistics Holder](#StatisticsHolderDescription) -- модуль, аккумулирующий собираемую статистику;\n* [Statistics Collector AOP](#StatisticsCollectorAOPDescription) -- модуль, собирающий статистику средствами [AOP](http://habrahabr.ru/post/114649/);\n* [Statistics Collector JDBC](#StatisticsCollectorJDBCDescription) -- модуль, собирающий статистику о выполнении запросов к БД и обработке полученных результатов в качестве обёртки над [JDBC](http://ru.wikipedia.org/wiki/Java_Database_Connectivity);\n* [Statistics Exposer JMX](#StatisticsExposerJMXDescription) -- модуль, экспортирующий статистику в [JMX](http://en.wikipedia.org/wiki/Java_Management_Extensions)-бины;\n* [Statistics Exposer Zabbix](#StatisticsExposerZabbixDescription) -- модуль, отправляющий статистику на [Zabbix](http://ru.wikipedia.org/wiki/Zabbix)-сервер средствами [ZabbixSender](http://www.zabbix.com/documentation/3.0/ru/manual/concepts/sender);\n* [Statistics Exposer Log](#StatisticsExposerLogDescription) -- модуль, производящий вывод собранной статистики в лог.\n\nДля подключения данного мониторинга к приложению, мониторинг которого необходимо осуществлять, необходимы, как минимум, 3 модуля:\n\n* [Statistics Holder](#StatisticsHolderDescription), в котором будет аккумулироваться собираемая статистика;\n* [Statistics Collector AOP](#StatisticsCollectorAOPDescription) для сборки статистики;\n* [Statistics Exposer JMX](#StatisticsExposerJMXDescription) и [Statistics Exposer Zabbix](#StatisticsExposerZabbixDescription) для экспорта статистика в [JMX](http://ru.wikipedia.org/wiki/Java_Management_Extensions) и публикации статистики в [Zabbix](http://ru.wikipedia.org/wiki/Zabbix).\n\n### \u003ca name=\"StatisticsHolderDescription\" /\u003e Statistics Holder\n\nМодуль [Statistics Holder](#StatisticsHolderDescription) является агрегатором статистики, поступающей в него из `StatisticsCollector`'а.\n\nДанный модуль аккумулирует:\n\n* количество обработанных приложением событий, а так же минимальное, среднее, максимальное и последнее время обработки каждого из типов событий в *наносекундах*;\n* количество опубликованных приложением событий, агрегированное по типам событий.\n\nДанный модуль аггрегирует как *полную* статистику (от момента последнего обнуления статистики), так и статистику за промежуток времени *тайм-фрейм*, определяемый свойством `statistics.monitor.timeFrame`.\n\n*Полная* статистика может быть получена потребителем статистики в любой момент времени, в отличии от статистики за *тайм-фрейм*, которая предоставляется потребителю статистики, реализующему интерфейс [FramedEventStatisticsConsumer](https://github.com/esirotkin/statistics-subsystem/blob/master/statistics-holder/src/main/java/ru/open/monitor/statistics/event/frame/FramedEventStatisticsConsumer.java) строго на границе окончания временного промежутка, определённого свойством `statistics.monitor.timeFrame`.\n\n#### \u003ca name=\"StatisticsHolderConnection\" /\u003e Подключение к приложению\n\nДля подключения агрегатора статистики к вашему приложению необходимо в зависимости проекта добавить зависимость от данного модуля, подгрузить его Spring-контекст и определить свойство `statistics.monitor.timeFrame`.\n\n```xml\n    \u003cdependency\u003e\n        \u003cgroupId\u003eio.github.esirotkin\u003c/groupId\u003e\n        \u003cartifactId\u003estatistics-holder\u003c/artifactId\u003e\n        \u003cversion\u003e1.1.6\u003c/version\u003e\n    \u003c/dependency\u003e\n```\n\n```xml\n    \u003cimport resource=\"classpath:/META-INF/spring/monitor-context.xml\" /\u003e\n```\n\nКонфигурационные свойства:\n\n* `statistics.monitor.timeFrame` -- свойство, определяющее временной промежуток *тайм-фрейм* в *миллисекундах* (параметр *необязательный*: значение по умолчанию = 15000 *миллисекунд*);\n\n#### \u003ca name=\"StatisticsHolderInterfaces\" /\u003e Интерфейсы Statistics Holder'а\n\n##### Сбор статистики об обработанных и опубликованных приложением событиях\n\nДля взаимодействия с агрегатором статистики предоставляются 9 интерфейсов:\n\n* [StatisticsCollector](https://github.com/esirotkin/statistics-subsystem/blob/master/statistics-holder/src/main/java/ru/open/monitor/statistics/event/StatisticsCollector.java) -- для сбора статистики об обработанных и опубликованных событиях;\n* [StatisticsProvider](https://github.com/esirotkin/statistics-subsystem/blob/master/statistics-holder/src/main/java/ru/open/monitor/statistics/event/StatisticsProvider.java) -- для получения *полной* статистики об обработанных и опубликованных событиях;\n* [FramedEventStatisticsSubscription](https://github.com/esirotkin/statistics-subsystem/blob/master/statistics-holder/src/main/java/ru/open/monitor/statistics/event/frame/FramedEventStatisticsSubscription.java) -- для подписки на получение статистики за временной промежуток *тайм-фрейм*;\n* [FramedEventStatisticsConsumer](https://github.com/esirotkin/statistics-subsystem/blob/master/statistics-holder/src/main/java/ru/open/monitor/statistics/event/frame/FramedEventStatisticsConsumer.java) -- должен быть реализован потребителем статистики за временной промежуток *тайм-фрейм*;\n* [FramedEventStatisticsProvider](https://github.com/esirotkin/statistics-subsystem/blob/master/statistics-holder/src/main/java/ru/open/monitor/statistics/event/frame/FramedEventStatisticsProvider.java) -- интерфейс, наследуемый от [StatisticsProvider](https://github.com/esirotkin/statistics-subsystem/blob/master/statistics-holder/src/main/java/ru/open/monitor/statistics/event/StatisticsProvider.java), предоставляемый потребителю статистики за временной промежуток *тайм-фрейм* для получения этой самой статистики;\n* [QueueStatisticsCollector](https://github.com/esirotkin/statistics-subsystem/blob/master/statistics-holder/src/main/java/ru/open/monitor/statistics/queue/QueueStatisticsCollector.java) -- для сбора статистики работы очереди обработки событий вашего приложения/сервиса (при наличии таковой);\n* [QueueStatisticsProvider](https://github.com/esirotkin/statistics-subsystem/blob/master/statistics-holder/src/main/java/ru/open/monitor/statistics/queue/QueueStatisticsProvider.java) -- для получения статистики работы очереди обработки событий вашего приложения/сервиса (при наличии таковой);\n* [QueueStatisticsCleaner](https://github.com/esirotkin/statistics-subsystem/blob/master/statistics-holder/src/main/java/ru/open/monitor/statistics/queue/QueueStatisticsCleaner.java) -- для очистки статистики работы очереди обработки событий вашего приложения/сервиса (при наличии таковой);\n* [StatisticsCleaner](https://github.com/esirotkin/statistics-subsystem/blob/master/statistics-holder/src/main/java/ru/open/monitor/statistics/event/StatisticsCleaner.java) -- для очистки всей собранной статистики.\n\nС интерфейсом [StatisticsCollector](https://github.com/esirotkin/statistics-subsystem/blob/master/statistics-holder/src/main/java/ru/open/monitor/statistics/event/StatisticsCollector.java) взаимодействуют сборщики статистики, такие как [Statistics Collector AOP](#StatisticsCollectorAOPDescription).\n\nС интерфейсом [StatisticsProvider](https://github.com/esirotkin/statistics-subsystem/blob/master/statistics-holder/src/main/java/ru/open/monitor/statistics/event/StatisticsProvider.java) взаимодействуют экспортёры статистики, такие как [Statistics Exposer JMX](#StatisticsExposerJMXDescription) и [Statistics Exposer Log](#StatisticsExposerLogDescription).\n\nС интерфейсами [FramedEventStatisticsSubscription](https://github.com/esirotkin/statistics-subsystem/blob/master/statistics-holder/src/main/java/ru/open/monitor/statistics/event/frame/FramedEventStatisticsSubscription.java), [FramedEventStatisticsConsumer](https://github.com/esirotkin/statistics-subsystem/blob/master/statistics-holder/src/main/java/ru/open/monitor/statistics/event/frame/FramedEventStatisticsConsumer.java) и [FramedEventStatisticsProvider](https://github.com/esirotkin/statistics-subsystem/blob/master/statistics-holder/src/main/java/ru/open/monitor/statistics/event/frame/FramedEventStatisticsProvider.java) так же взаимодействуют экспортёры статистики, такие как [Statistics Exposer Zabbix](#StatisticsExposerZabbixDescription) и [Statistics Exposer Log](#StatisticsExposerLogDescription).\n\nС этими интерфейсами вам взаимодействовать внутри вашего приложения в явном виде вряд ли придётся.\n\n##### Сбор статистики о работе очереди обработки событий\n\nДля сбора статистики о работе очереди обработки событий необходимо в класс, реализующий очередь обработки событий, заинжектить бин, реализующий интерфейс [QueueStatisticsCollector](https://github.com/esirotkin/statistics-subsystem/blob/master/statistics-holder/src/main/java/ru/open/monitor/statistics/queue/QueueStatisticsCollector.java).\n\n```java\n    @Autowired\n    private QueueStatisticsCollector statisticsCollector;\n```\n\nИ при каждом добавлении нового события в очередь вызывать метод `statisticsCollector.eventQueued()`, а после каждого обработанного события вызывать метод `statisticsCollector.eventProcessed()`.\n\n##### Сбор статистики о выполнении запросов к БД и обработке полученных результатов\n\nДля мониторинга статистики взаимодействия с БД предназначен отдельный `StatisticsHolder`, кототрый предоставляет 6 интерфейсов, аналогичных вышеописанным интерфейсам:\n\n* [StatisticsCollector](https://github.com/esirotkin/statistics-subsystem/blob/master/statistics-holder/src/main/java/ru/open/monitor/statistics/database/StatisticsCollector.java) -- для сбора статистики о выполненных запросах и обработанных записях (в каждом из `ResultSet`ов);\n* [StatisticsProvider](https://github.com/esirotkin/statistics-subsystem/blob/master/statistics-holder/src/main/java/ru/open/monitor/statistics/database/StatisticsProvider.java) -- для получения *полной* статистики о выполненных запросах и обработанных записях;\n* [FramedDbStatisticsSubscription](https://github.com/esirotkin/statistics-subsystem/blob/master/statistics-holder/src/main/java/ru/open/monitor/statistics/database/frame/FramedDbStatisticsSubscription.java) -- для подписки на получение статистики за временной промежуток *тайм-фрейм*;\n* [FramedDbStatisticsConsumer](https://github.com/esirotkin/statistics-subsystem/blob/master/statistics-holder/src/main/java/ru/open/monitor/statistics/database/frame/FramedDbStatisticsConsumer.java) -- должен быть реализован потребителем статистики за временной промежуток *тайм-фрейм*;\n* [FramedDbStatisticsProvider](https://github.com/esirotkin/statistics-subsystem/blob/master/statistics-holder/src/main/java/ru/open/monitor/statistics/database/frame/FramedDbStatisticsProvider.java) -- интерфейс, наследуемый от [StatisticsProvider](https://github.com/esirotkin/statistics-subsystem/blob/master/statistics-holder/src/main/java/ru/open/monitor/statistics/database/StatisticsProvider.java), предоставляемый потребителю статистики за временной промежуток *тайм-фрейм* для получения этой самой статистики;\n* [StatisticsCleaner](https://github.com/esirotkin/statistics-subsystem/blob/master/statistics-holder/src/main/java/ru/open/monitor/statistics/database/StatisticsCleaner.java) -- для очистки всей собранной статистики.\n\nКак и в случае с интерфейсами, ответственными за сбор и получение статистики об обработке и публикации событий (`Event`), взаимодействовать напрямую с данными интерфейсами нет необходимости.\nДля сбора статистики об исполнении запросов БД и обработке полученных в результате исполнения запроса результатов предназначен модуль [Statistics Collector JDBC](#StatisticsCollectorJDBCDescription), а публикацией собранной статистики в Zabbix занимается общий модуль [Statistics Exposer Zabbix](#StatisticsExposerZabbixDescription).\n\n##### Обнуление статистики\n\nДля обнуления собранной за определённый период статистики (например, за сутки; или по факту получения события `CleanEvent`) следует воспользоваться интерфейсом [StatisticsCleaner](https://github.com/esirotkin/statistics-subsystem/blob/master/statistics-holder/src/main/java/ru/open/monitor/statistics/event/StatisticsCleaner.java), предваритеьлно заинжектив соответствующий бин в своё приложение/сервис.\n\n```java\n    @Autowired\n    private StatisticsCleaner statisticsCleaner;\n```\n\nДалее обнулять собранную статистику в любой момент времени следует вызовом метода `statisticsCleaner.clear()`.\n\n\n### \u003ca name=\"StatisticsCollectorAOPDescription\" /\u003e Statistics Collector AOP\n\nМодуль [Statistics Collector AOP](#StatisticsCollectorAOPDescription) предназначен для сбора статистики средствами [Spring AOP](http://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#aop).\n\nИспользование подхода [AOP](http://ru.wikipedia.org/wiki/%D0%90%D1%81%D0%BF%D0%B5%D0%BA%D1%82%D0%BD%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5) оправдано тогда, когда сложно внедрить в ваше приложение дополнительные [Proxy](http://ru.wikipedia.org/wiki/Proxy_%28%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%29)-объекты для организации сбора статистики.\n\n#### \u003ca name=\"StatisticsCollectorAOPConnection\" /\u003e Подключение к приложению\n\nДля подключения данного сборщика статистики к вашему приложению необходимо в зависимости проекта добавить зависимость от данного модуля и подгрузить Spring-контекст, в котором вы должны будете определить [конфигурацию AOP](http://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#aop-schema) аналогично примеру, приведённому ниже.\n\n```xml\n    \u003cdependency\u003e\n        \u003cgroupId\u003eio.github.esirotkin\u003c/groupId\u003e\n        \u003cartifactId\u003estatistics-collector-aop\u003c/artifactId\u003e\n        \u003cversion\u003e1.1.6\u003c/version\u003e\n    \u003c/dependency\u003e\n```\n\n```xml\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\n\u003cbeans xmlns=\"http://www.springframework.org/schema/beans\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n       xmlns:aop=\"http://www.springframework.org/schema/aop\"\n       xsi:schemaLocation=\"http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd\n                           http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd\"\u003e\n\n    \u003cimport resource=\"classpath:/META-INF/spring/monitor-aop-context.xml\" /\u003e\n\n    \u003caop:aspectj-autoproxy proxy-target-class=\"true\" /\u003e\n\n    \u003caop:config\u003e\n        \u003caop:aspect id=\"processEventAspect\" ref=\"statisticsCollectorAspect\"\u003e\n            \u003caop:pointcut id=\"processEvent\" expression=\"execution(public !static void ru.open..*.onEvent*(..))\" /\u003e\n            \u003caop:around pointcut-ref=\"processEvent\" method=\"eventProcessed\" /\u003e\n        \u003c/aop:aspect\u003e\n        \u003caop:aspect id=\"publishEventAspect\" ref=\"statisticsCollectorAspect\"\u003e\n            \u003caop:pointcut id=\"publishEvent\" expression=\"execution(public !static void ru.open..*.consumeEvent(..))\" /\u003e\n            \u003caop:after pointcut-ref=\"publishEvent\" method=\"eventPublished\" /\u003e\n        \u003c/aop:aspect\u003e\n        \u003caop:aspect id=\"sendRequestAspect\" ref=\"statisticsCollectorAspect\"\u003e\n            \u003caop:pointcut id=\"sendRequest\" expression=\"execution(public !static * ru.open..*.sendRequest(..))\" /\u003e\n            \u003caop:around pointcut-ref=\"sendRequest\" method=\"requestPublished\" /\u003e\n        \u003c/aop:aspect\u003e\n        \u003caop:aspect id=\"processRequestAspect\" ref=\"statisticsCollectorAspect\"\u003e\n            \u003caop:pointcut id=\"processRequest\" expression=\"execution(public !static * ru.open..*.processRequest(..))\" /\u003e\n            \u003caop:around pointcut-ref=\"processRequest\" method=\"requestProcessed\" /\u003e\n        \u003c/aop:aspect\u003e\n    \u003c/aop:config\u003e\n\n\u003c/beans\u003e\n```\n\n\n### \u003ca name=\"StatisticsCollectorJDBCDescription\" /\u003e Statistics Collector JDBC\n\nМодуль [Statistics Collector JDBC](#StatisticsCollectorJDBCDescription) предназначен для сбора статистики о выполнении запросов к БД и обработке результатов, полученных в результате исполнения запросов.\n\n#### \u003ca name=\"StatisticsCollectorJDBCConnection\" /\u003e Подключение к приложению\n\nДля подключения данного сборщика статистики к вашему приложению необходимо, прежде всего, в зависимости проекта добавить зависимость от данного модуля.\n\n```xml\n    \u003cdependency\u003e\n        \u003cgroupId\u003eio.github.esirotkin\u003c/groupId\u003e\n        \u003cartifactId\u003estatistics-collector-jdbc\u003c/artifactId\u003e\n        \u003cversion\u003e1.1.6\u003c/version\u003e\n    \u003c/dependency\u003e\n```\n\nДалее необходимо подгрузить необходимые `Spring`-контексты.\n\n```xml\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\n\u003cbeans xmlns=\"http://www.springframework.org/schema/beans\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n       xsi:schemaLocation=\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd\"\u003e\n\n    \u003cimport resource=\"classpath:/META-INF/spring/monitor-context.xml\" /\u003e\n    \u003cimport resource=\"classpath:/META-INF/spring/monitor-jdbc-context.xml\" /\u003e\n    \u003cimport resource=\"classpath:/META-INF/spring/monitor-zabbix-context.xml\" /\u003e\n\n\u003c/beans\u003e\n```\n\nА в приложении необходимо каждый JDBC `Connection` обернуть в [ConnectionWrapper](https://github.com/esirotkin/statistics-subsystem/blob/master/statistics-collector-jdbc/src/main/java/ru/open/monitor/statistics/jdbc/ConnectionWrapper.java) (как показано ниже).\n\n```java\n    @Autowired\n    private ConnectionWrapperFactory wrapperFactory;\n\n    public Connection createConnection() throws SQLException, ClassNotFoundException, IllegalAccessException, InstantiationException {\n        Connection connection = ...; // some implementation\n        return wrapperFactory.wrapConnection(connection);\n    }\n```\n\nИ дальше использовать полученную обёртку в вашем приложении, как обычный JDBC `Connection`.\n\n\n### \u003ca name=\"StatisticsExposerJMXDescription\" /\u003e Statistics Exposer JMX\n\nМодуль [Statistics Exposer JMX](#StatisticsExposerJMXDescription) предназначен для экспорта собранной статистики в [JMX](http://en.wikipedia.org/wiki/Java_Management_Extensions)-бины.\n\nВ JMX-бины транслируется *полная* статистика, собранная от момента последнего обнуления статистики.\n\nДля взаимодействия с этими JMX-бинами можно воспользоваться инструментом [JConsole](http://docs.oracle.com/javase/8/docs/technotes/guides/management/jconsole.html), поставляемым в комплекте с [JDK](http://ru.wikipedia.org/wiki/Java_Development_Kit).\n\nПри инициализации Spring-контекста данного модуля в JMX экспортируются 3 бина:\n\n* `ru.open.monitor.statistics:ProcessedEvents` -- предоставляет информацию об обработанных вашим приложением событиях;\n* `ru.open.monitor.statistics:PublishedEvents` -- предоставляет информацию об опубликованных вашим приложением событиях;\n* `ru.open.monitor.statistics:StatisticsCleaner` -- предоставляет возможность обнуления статистики вашего приложения посредством вызова метода `clearStatistics()`.\n\nБины `ProcessedEvents` и `PublishedEvents` статистику об обработанных и опубликованных событиях предоставляют в виде атрибутов, имена которых соответствуют полному имени Java-класса события.\n\n##### ProcessedEvents\n\nТипы обработанных событий (атрибуты JMX-бина), по которым информация будет отображаться в бине `ProcessedEvents`, должны быть указаны в свойстве `statistics.monitor.jmx.interestProcessedEvents` в виде полных имён Java-классов, перечисленных через запятую.\n\nПо каждому типу события (в виде составного типа данных) предоставляется следующая информация (в последовательности нижеследующего списка):\n\n* имя класса потребителя событий (в виде префикса аттрибута);\n* количество обработанных событий -- суффикс `count`;\n* минимальное время обработки события в *секундах* (суффикс `min`);\n* среднее время обработки события в *секундах* (суффикс `avg`);\n* максимальное время обработки события в *секундах* (суффикс `max`);\n* последнее время обработки события в *секундах* (суффикс `last`).\n\nТак же данный бин предоставляет возможность получить список всех типов обрабатываемых данным приложением событий посредством вызова метода `getProcessedEventsClasses()`.\n\nТак же есть возможность получить список *интересующих* событий (тех, что перечислены в свойстве `statistics.monitor.jmx.interestProcessedEvents`) посредством вызова метода `getInterestEventsClasses()`.\n\n##### PublishedEvents\n\nТипы опубликованных событий (атрибуты JMX-бина), по которым информация будет отображаться в бине `PublishedEvents`, должны быть указаны в свойстве `statistics.monitor.jmx.interestPublishedEvents` в виде полных имён Java-классов, перечисленных через запятую.\n\nПо каждому типу события (в виде составного типа данных) предоставляется следующая информация:\n\n* имя класса публикатора событий (в виде префикса аттрибута);\n* количество опубликованных событий -- суффикс `count`.\n\nТак же данный бин предоставляет возможность получить список всех типов публикуемых данным приложением событий посредством вызова метода `getPublishedEventsClasses()`.\n\nТак же есть возможность получить список *интересующих* событий (тех, что перечислены в свойстве `statistics.monitor.jmx.interestPublishedEvents`) посредством вызова метода `getInterestEventsClasses()`.\n\n#### \u003ca name=\"StatisticsExposerJMXConnection\" /\u003e Подключение к приложению\n\nДля подключения JMX-exposer'а к вашему приложению необходимо в зависимости проекта добавить зависимость от данного модуля и подгрузить его Spring-контекст.\n\n```xml\n    \u003cdependency\u003e\n        \u003cgroupId\u003eio.github.esirotkin\u003c/groupId\u003e\n        \u003cartifactId\u003estatistics-exposer-jmx\u003c/artifactId\u003e\n        \u003cversion\u003e1.1.6\u003c/version\u003e\n    \u003c/dependency\u003e\n```\n\n```xml\n    \u003cimport resource=\"classpath:/META-INF/spring/monitor-jmx-context.xml\" /\u003e\n```\n\n#### \u003ca name=\"StatisticsExposerJMXToZabbix\" /\u003e Получение статистики в Zabbix\n\nДля организации мониторинга Java-приложения (средствами JMX) в [Zabbix](http://www.zabbix.com/ru/) наиболее распространены 2 подхода:\n\n* использование нативного [Zabbix Java Gateway](http://www.zabbix.com/documentation/3.0/ru/manual/concepts/java), выступающего в роли Zabbix-прокси;\n* использование JMX-HTTP моста [Jolokia](http://jolokia.org/), [предоставляющего доступ к атрибутам JMX-бинов черех HTTP](http://habrahabr.ru/post/137641/).\n\n##### Zabbix Java Gateway\n\nДля [получения в Zabbix значений JMX-атрибутов посредством Java Gateway](http://www.zabbix.com/documentation/3.0/ru/manual/config/items/itemtypes/jmx_monitoring) ключ атрибута будет выглядеть следующим образом:\n\n* `jmx[\"ru.open.monitor.statistics:name=ProcessedEvents\",\"\u003ceventTypeEscaped\u003e.\u003chandlerSimpleType\u003e\\.count\"]` -- для получения количества обработанных обработчиком `handlerType` событий типа `eventType`;\n* `jmx[\"ru.open.monitor.statistics:name=ProcessedEvents\",\"\u003ceventTypeEscaped\u003e.\u003chandlerSimpleType\u003e\\.min\"]` -- для получения минимального времени обработки события типа `eventType` (в *секундах*) обработчиком `handlerType`;\n* `jmx[\"ru.open.monitor.statistics:name=ProcessedEvents\",\"\u003ceventTypeEscaped\u003e.\u003chandlerSimpleType\u003e\\.avg\"]` -- для получения среднего времени обработки события типа `eventType` (в *секундах*) обработчиком `handlerType`;\n* `jmx[\"ru.open.monitor.statistics:name=ProcessedEvents\",\"\u003ceventTypeEscaped\u003e.\u003chandlerSimpleType\u003e\\.max\"]` -- для получения максимального времени обработки события типа `eventType` (в *секундах*) обработчиком `handlerType`;\n* `jmx[\"ru.open.monitor.statistics:name=ProcessedEvents\",\"\u003ceventTypeEscaped\u003e.\u003chandlerSimpleType\u003e\\.last\"]` -- для получения последнего времени обработки события типа `eventType` (в *секундах*) обработчиком `handlerType`;\n* `jmx[\"ru.open.monitor.statistics:name=PublishedEvents\",\"\u003ceventTypeEscaped\u003e.\u003cpublisherSimpleType\u003e\\.count\"]` -- для получения количества опубликованных публикатором `publisherType` событий типа `eventType`.\n\nСуффикс `Escaped` означает, что \"точки\" `.` в полном имени Java-класса события должны быть экранированы (заменены на `\\.`).\nСуффикс `Simple` означает, что имя класса обработчика/публикатора представлено в простой форме (без указания пакета).\n\n\n### \u003ca name=\"StatisticsExposerZabbixDescription\" /\u003e Statistics Exposer Zabbix\n\nМодуль [Statistics Exposer Zabbix](#StatisticsExposerZabbixDescription) предназначен для отправки статистики в Zabbix.\n\nВ Zabbix статистика отправляется за *тайм-фрейм* -- промежуток времени, определяемый свойством `statistics.monitor.timeFrame`.\n\nВ отличии от вышеописанного варианта получения статистики об обработанных и опубликованных событиях в Zabbix средствами Zabbix Java Gateway через JMX, данный модуль сам отправляет статистику в Zabbix по таймеру (определяемому свойством `statistics.monitor.timeFrame`), а не ожидает, когда его Zabbix опросит.\n\nСледует отметить, что средствами `ZabbixSender` в Zabbix отправляется статистика только о *количестве* обработанных и опубликованных сообщений. Дополнительная статистика о времени обработки сообщения обновляется на сервере Zabbix средствами Zabbix Java Gateway.\n\n#### \u003ca name=\"StatisticsExposerZabbixConnection\" /\u003e Подключение к приложению\n\nДля подключения данного модуля к вашему приложению необходимо в зависимости проекта добавить зависимость от данного модуля, подгрузить его Spring-контекст и определить несколько свойств.\n\n```xml\n    \u003cdependency\u003e\n        \u003cgroupId\u003eio.github.esirotkin\u003c/groupId\u003e\n        \u003cartifactId\u003estatistics-exposer-zabbix\u003c/artifactId\u003e\n        \u003cversion\u003e1.1.6\u003c/version\u003e\n    \u003c/dependency\u003e\n```\n\n```xml\n    \u003cimport resource=\"classpath:/META-INF/spring/monitor-zabbix-context.xml\" /\u003e\n```\n\nКонфигурационные свойства:\n\n* `statistics.monitor.zabbix.enable` -- свойство, включающее/отключающее отправку статистики в Zabbix средствами `ZabbixSender`;\n* `statistics.monitor.zabbix.server.host` -- DNS-имя или IP-адрес сервера Zabbix;\n* `statistics.monitor.zabbix.sender.port` -- номер порта сервера Zabbix для взаимодействия по протоколу ZBX посредством [Zabbix Sender](http://www.zabbix.com/documentation/3.0/ru/manual/concepts/sender) (параметр *необязательный*: значение по умолчанию = 10051);\n* `statistics.monitor.zabbix.api.port` -- номер порта сервера Zabbix для взаимодействия по протоколу [Zabbix API](http://www.zabbix.com/documentation/3.0/ru/manual/api) (параметр *необязательный*: значение по умолчанию = 80);\n* `statistics.monitor.zabbix.server.user` -- имя пользователя Zabbix, обладающего правами просмотра и создания новых хостов (hosts), интерфейсов (host interfaces), приложений (applications) и элементов (items);\n* `statistics.monitor.zabbix.server.password` -- пароль вышеобозначенного пользователя Zabbix;\n* `statistics.monitor.zabbix.proxy.list` -- список хостов (и портов) [Zabbix Proxy](http://www.zabbix.com/documentation/3.0/ru/manual/concepts/proxy) в нотации IPv4, перечисляемых через запятую (параметр *необязательный*: в случае отсутствия будет использовано значение `statistics.monitor.zabbix.server.host`:`statistics.monitor.zabbix.sender.port`);\n* `statistics.monitor.zabbix.onDemandSendRhythm` -- ритм (периодичность) отправки значений *по требованию* в Zabbix (параметр *необязательный*: значение по умолчанию = 500 мс);\n* `statistics.monitor.zabbix.host.group` -- имя группы хостов (host group), к которой принадлежит данный сервер (на котором запущено данное приложение);\n* `statistics.monitor.zabbix.simpleNames` -- использовать простые имена для элементов данных (item) в Zabbix (параметр *необязательный*: значение по умолчанию = `true`);\n* `statistics.monitor.zabbix.applyTemplates` -- применять ли перечисленные в параметре `statistics.monitor.zabbix.templates` шаблоны к данному хосту (параметр *необязательный*: значение по умолчанию = `false`);\n* `statistics.monitor.zabbix.templates` -- имена шаблонов Zabbix (например, `Template JMX Generic`), перечисленные через запятую, которые должны быть применены к данному хосту (параметр *необязательный*);\n* `statistics.monitor.zabbix.configureJvmMonitor` -- настраивать ли в Zabbix *элементы данных*, *триггеры* и *графики* для базового мониторинга JVM (параметр *необязательный*: значение по умолчанию = `false`);\n* `statistics.monitor.zabbix.api.url` -- URL Zabbix API (параметр *необязательный*: при отсутствии значения URL будет сформирован на основе `statistics.monitor.zabbix.server.host` и `statistics.monitor.zabbix.api.port`);\n* `statistics.monitor.zabbix.agent.subnet` -- [IPv4](http://ru.wikipedia.org/wiki/IPv4)-подсеть в нотации [CIDR](http://ru.wikipedia.org/wiki/%D0%91%D0%B5%D1%81%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%BE%D0%B2%D0%B0%D1%8F_%D0%B0%D0%B4%D1%80%D0%B5%D1%81%D0%B0%D1%86%D0%B8%D1%8F) для автоматического определения IP-адреса данного `ZabbixSender`'а (параметр *необязательный*: значение по умолчанию = 10.0.0.0/8);\n* `statistics.monitor.zabbix.agent.app` -- имя приложения для идентификации отправителя в Zabbix (вместо данного параметра можно определить свойство `spring.application.name`);\n* `statistics.monitor.zabbix.agent.host` -- IP адрес или доменное имя хоста, видимого Zabbix серверу (или прокси) для случая запуска приложения в контейнере с внутренней подсетью (параметр *необязательный*: значение по умолчанию = `java.rmi.server.hostname` или автоматически определённый IP адрес локального хоста);\n* `statistics.monitor.zabbix.agent.hostname` -- имя хоста, передаваемое Zabbix при конфигурировании хоста (параметр *необязательный*: значение по умолчанию = `hostname`);\n* `statistics.monitor.zabbix.interestProcessedEvents` -- типы обрабатываемых событий, перечисленных через запятую, по которым статистика должна отправляться в Zabbix (параметр *необязательный*: по умолчанию статистика в Zabbix будет отправляться по всем обработанным событиям);\n* `statistics.monitor.zabbix.interestPublishedEvents` -- типы публикуемых событий, перечисленных через запятую, по которым статистика должна отправляться в Zabbix (параметр *необязательный*: по умолчанию статистика в Zabbix будет отправляться по всем опубликованным событиям);\n* `statistics.monitor.zabbix.interestDatabaseStatements` -- имена (идентификаторы) запросов к БД, перечисленных через запятую, по которым статистика должна отправляться в Zabbix (параметр *необязательный*: по умолчанию статистика в Zabbix будет отправляться по всем запросам к базе данных);\n* `statistics.monitor.jmx.interestProcessedEvents` -- типы обрабатываемых событий, перечисленных через запятую, для которых в Zabbix будет настроен их мониторинг средствами Zabbix Java Gateway (параметр *необязательный*: при отсутствии таковых JMX-мониторинг для обрабатываемых событий настраиваться НЕ будет);\n* `statistics.monitor.jmx.interestPublishedEvents` -- типы публикуемых событий, перечисленных через запятую, для которых в Zabbix будет настроен их мониторинг средствами Zabbix Java Gateway (параметр *необязательный*: при отсутствии таковых JMX-мониторинг для публикуемых событий настраиваться НЕ будет);\n* `statistics.monitor.zabbix.includeEventsExposedToJmx` -- конфигурировать Zabbix для получения статистики по событиям, перечисленным только в параметрах `statistics.monitor.jmx.interestProcessedEvents` и `statistics.monitor.jmx.interestPublishedEvents` (параметр *необязательный*: значение по умолчанию = `false`);\n* `statistics.monitor.zabbix.jmx.delay` -- периодичность (в *секундах*) обновления значений, отслеживаемых Zabbix'ом средствами Zabbix Java Gateway (параметр *необязательный*: значение по умлочанию = 30 *секунд*);\n* `statistics.monitor.zabbix.attemptCount` -- количество попыток, которые будут предприняты для отправки статистики в Zabbix (параметр *необязательный*: значение по умолчанию = 5 попыток);\n* `statistics.monitor.zabbix.attemptInterval` -- интервал времени, определяющий периодичность (после первой неудачной) попыток отправки статистики в Zabbix (параметр *необязательный*: значение по умолчанию = 500 *миллисекунд*);\n* `statistics.monitor.zabbix.numberOfConfigurationAttempts` -- количество попыток, предпринимаемых для конфигурирования сервера Zabbix (параметр *необязательный*: значение по умолчанию = 5 попыток);\n* `java.rmi.server.hostname` -- [IPv4](http://ru.wikipedia.org/wiki/IPv4)-адрес сервера, на которм запущено данное приложение (параметр *необязательный*: при отсутствии значения IP-адрес будет запрошен у операционной системы с фильтрацией по `statistics.monitor.zabbix.agent.subnet`);\n* `com.sun.management.jmxremote.port` -- номер порта JMX данного приложения;\n* `statistics.monitor.zabbix.deleteObsoleteItems` -- удалять из Zabbix устаревшие элементы данных (параметр *необязательный*: значение по умолчанию = `true`);\n* `statistics.monitor.zabbix.numberOfEmptyDaysForObsoleteItem` -- количество дней, по истечении которых элементы данных (items) следует считать неактуальными (при отсутствии \"свежих\" значений) и удалять (параметр *необязательный*: значение по умолчанию = 90 дней);\n* `statistics.monitor.zabbix.protectedItemNames` -- имена (или их части) элементов данных Zabbix (перечисленные через запятую), защищённых от удаления (параметр *необязательный*).\n\n#### Автоматическое конфигурирование Zabbix для отправки статистики на сервер\n\nПри включенном свойстве `statistics.monitor.zabbix.enable` в `true` [ZabbixConfigurer](https://github.com/esirotkin/statistics-subsystem/blob/master/statistics-exposer-zabbix/src/main/java/ru/open/monitor/statistics/zabbix/config/ZabbixConfigurerImpl.java) перед отправкой статистики в Zabbix средствами `ZabbixSender` производит конфигурирование сервера Zabbix для приёма отправляемой вашим приложением статистики.\n\nКонфигурирование состоит из следующих этапов:\n\n* проверки сконфигурированного хоста с соответствующим JMX-интерфейсом -- при отсутствии таковых они создаются;\n* применении шаблонов Zabbix, перечисленных через запятую в свойстве `statistics.monitor.zabbix.templates` к данному хосту;\n* проверки сконфигурированных групп элементов (`Application` в терминологии Zabbix): `ProcessedEvents` и `PublishedEvents`, `QueueStatistics`, `ExecutedStatements` и `ProcessedResultSets` -- при отсутствии таковых они создаются;\n* проверки сконфигурированных элементов (`Item` в терминологии Zabbix) -- по элементу на каждый статистический показатель -- при отсутствии таковых (или добавлении нового) они создаются.\n\nПри этом следует отметить, что средствами `ZabbixSender` (с периодичностью, определённой в свойстве `statistics.monitor.timeFrame`) отправляется статистика лишь о количестве и среднем за *тайм-фрейм* времени обработки обработанных и количестве опубликованных событий, а так же статистика о работе очереди обработки событий (при наличии таковой).\nИные показатели, такие как минимальное, максимальное и последнее зафиксированное время обработки события даже в случае, если данный тип события указан в свойстве `statistics.monitor.zabbix.interestProcessedEvents`, будут обновляться в Zabbix'е средствами Zabbix Java Gateway (JMX) с той периодичностью, кот. определена в свойстве `statistics.monitor.zabbix.jmx.delay`.\nЭто целесообразно с точки зрения оптимизации трафика.\n\n#### \u003ca name=\"StatisticsExposerZabbixKeyValue\" /\u003e Формат сообщения\n\n[ZabbixSender](http://github.com/hengyunabc/zabbix-sender) отправляет на сервер Zabbix сообщения в [JSON](http://ru.wikipedia.org/wiki/JSON)-формате, где ключ `key` -- это соответствующий атрибут, а `value` -- его значение.\n\n##### ProcessedEvents\n\nСтатистика об обработанных сообщениях каждого типа отправляются в Zabbix в виде пары `key`/`value`:\n\n* `host`: `\u003czabbixApplicationHost\u003e`\n    * `zabbixApplicationHost` -- имя приложения из свойства `statistics.monitor.zabbix.agent.app` или `spring.application.name`\n* `key`: `ProcessedEvents.\u003ceventSimpleClass\u003e.\u003chandlerSimpleClass\u003e.\u003citemName\u003e`\n    * `eventSimpleClass` -- простое (без префикса пакета) имя Java-класса обрабатываемого события\n    * `handlerSimpleClass` -- простое (без префикса пакета) имя Java-класса обработчика события\n    * `itemName` -- имя элемента данных (используются: `count` или `avg`)\n* `value`: `\u003ceventCount\u003e` или `\u003cavgTime\u003e`\n    * `eventCount` -- количество обработанных сообщений данного типа (пересчитанное на 1 секунду)\n    * `avgTime` -- среднее за *тайм-фрейм* время в *секундах* обработки события данного типа\n\n##### PublishedEvents\n\nСтатистика об опубликованных сообщениях каждого типа отправляются в Zabbix в виде пары `key`/`value`:\n\n* `host`: `\u003czabbixApplicationHost\u003e`\n    * `zabbixApplicationHost` -- имя приложения из свойства `statistics.monitor.zabbix.agent.app` или `spring.application.name`\n* `key`: `PublishedEvents.\u003ceventSimpleClass\u003e.\u003cpublisherSimpleClass\u003e.\u003citemName\u003e`\n    * `eventSimpleClass` -- простое (без префикса пакета) имя Java-класса публикуемого события\n    * `publisherSimpleClass` -- простое (без префикса пакета) имя Java-класса публикатора события\n    * `itemName` -- имя элемента данных (используется: `count`)\n* `value`: `\u003ceventCount\u003e`\n    * `eventCount` -- количество опубликованных сообщений данного типа (пересчитанное на 1 секунду)\n\n##### QueueStatistics\n\nСтатистика о работе очереди обработки событий (при наличии таковой) отправляются в Zabbix в виде пары `key`/`value`:\n\n* `host`: `\u003czabbixApplicationHost\u003e`\n    * `zabbixApplicationHost` -- имя приложения из свойства `statistics.monitor.zabbix.agent.app` или `spring.application.name`\n* `key`: `QueueStatistics.\u003cparameterName\u003e.\u003citemName\u003e`\n    * `parameterName` -- имя параметра: `QueuedEvent` или `ProcessedEvent`\n    * `itemName` -- имя элемента данных (используется: `count`)\n* `value`: `\u003cprocessedEventCount\u003e` или `\u003cqueuedEventCount\u003e`\n    * `queuedEventCount` -- количество сообщений (необработанных), оставшихся в очереди обработки событий\n    * `processedEventCount` -- общее количество обработанных за *тайм-фрейм* сообщений (пересчитанное на 1 секунду)\n\n##### ExecutedStatements\n\nСтатистика о выполненных запросах к БД отправляются в Zabbix в виде пары `key`/`value`:\n\n* `host`: `\u003czabbixApplicationHost\u003e`\n    * `zabbixApplicationHost` -- имя приложения из свойства `statistics.monitor.zabbix.agent.app` или `spring.application.name`\n* `key`: `ExecutedStatements.\u003cstatement\u003e.\u003citemName\u003e`\n    * `statement` -- имя (идентификатор) запроса к БД (без перечисления параметров, пробелы заменены знаком `_`)\n    * `itemName` -- имя элемента данных (используются: `count` или `avg`)\n* `value`: `\u003cexecutionCount\u003e` или `\u003cavgTime\u003e`\n    * `executionCount` -- количество исполнений запроса / вызова процедуры (пересчитанное на 1 секунду)\n    * `avgTime` -- среднее за *тайм-фрейм* время в *секундах* выполнения запроса\n\n##### ProcessedResults\n\nСтатистика обработки записей, полученных в результате выполнения запросов к БД, отправляются в Zabbix в виде пары `key`/`value`:\n\n* `host`: `\u003czabbixApplicationHost\u003e`\n    * `zabbixApplicationHost` -- имя приложения из свойства `statistics.monitor.zabbix.agent.app` или `spring.application.name`\n* `key`: `ProcessedResultSets.\u003cstatement\u003e.\u003cresultSetNumber\u003e.\u003citemName\u003e`\n    * `statement` -- имя (идентификатор) запроса к БД (без перечисления параметров, пробелы заменены знаком `_`)\n    * `resultSetNumber` -- порядковый номер `ResultSet`а (нумерация с `0`)\n    * `itemName` -- имя элемента данных (используются: `count` или `avg`)\n* `value`: `\u003crecordCount\u003e` или `\u003cavgTime\u003e`\n    * `recordCount` -- количество обработанных записей БД в рамках данного `ResultSet`а (пересчитанное на 1 секунду)\n    * `avgTime` -- среднее за *тайм-фрейм* время в *секундах* обработки каждой записи\n\n#### \u003ca name=\"StatisticsExposerZabbixOnDemanSender\" /\u003e Отправка в Zabbix \"неопределённых\" данных \"по требованию\"\n\nИногда возникает необходимость отправления в Zabbix *неопределённых* (то есть, не фиксированных каким-либо форматом или соглашением) данных *по требованию* (то есть, не по таймеру, а в момент возникновения такой необходимости).\n\nТакая возможность предусмотрена в данном модуле.\n\nДля того, чтобы ей воспользоваться, необходимо в вашем `Spring`-контексте дополнительно инициализировать бин `OnDemandZabbixSender` как показано ниже.\n\n```xml\n    \u003cimport resource=\"classpath:/META-INF/spring/monitor-zabbix-context.xml\" /\u003e\n\n    \u003cbean id=\"onDemandZabbixSender\" class=\"ru.open.monitor.statistics.zabbix.OnDemandZabbixSender\" /\u003e\n```\n\nИ, заинжектив его в своё приложение, отправлять в Zabbix *неопределённые* данные, реализующие интерфейс [ExternalItem](https://github.com/esirotkin/statistics-subsystem/blob/master/statistics-exposer-zabbix/src/main/java/ru/open/monitor/statistics/zabbix/config/item/ExternalItem.java).\n\n```java\n    @Autowired\n    private OnDemandZabbixSender zabbixSender;\n\n    public void sendToZabbix(SomeExternalItem item) {\n        zabbixSender.sendToZabbix(item);\n    }\n```\n\n\n### \u003ca name=\"StatisticsExposerLogDescription\" /\u003e Statistics Exposer Log\n\nМодуль [Statistics Exposer Log](#StatisticsExposerLogDescription) предназначен для периодического вывода статистики в лог.\n\nВ лог может выводиться как *полная* статистика (от момента последнего обнуления статистики), так и статистика *за промежуток времени* / *тайм-фрейм*, определённый свойством `statistics.monitor.timeFrame`.\n\n#### \u003ca name=\"StatisticsExposerLogConnection\" /\u003e Подключение к приложению\n\nДля подключения данного модуля к вашему приложению необходимо в зависимости проекта добавить зависимость от данного модуля, подгрузить его Spring-контекст, определить несколько свойств и настроить вывод в лог.\n\n```xml\n    \u003cdependency\u003e\n        \u003cgroupId\u003eio.github.esirotkin\u003c/groupId\u003e\n        \u003cartifactId\u003estatistics-exposer-log\u003c/artifactId\u003e\n        \u003cversion\u003e1.1.6\u003c/version\u003e\n    \u003c/dependency\u003e\n```\n\n```xml\n    \u003cimport resource=\"classpath:/META-INF/spring/monitor-log-context.xml\" /\u003e\n```\n\nДля логирования *полной* статистики необходимо настроить логирование класса `ru.open.monitor.statistics.log.FullStatisticsLogger`, уровень логирования указать в соответствии со свойством `statistics.monitor.log.fullLoggerLevel`.\n\n```xml\n    \u003cproperty name=\"LOG_PATH\" value=\"${LOG_PATH:-./log}\" /\u003e\n    \u003clogger name=\"ru.open.monitor.statistics.log.FullStatisticsLogger\" level=\"TRACE\" additivity=\"false\"\u003e\n        \u003cappender class=\"ru.open.monitor.statistics.log.logback.layout.appender.StateFileAppender\"\u003e\n            \u003cfile\u003e${LOG_PATH}/statistics/statistics-full.log\u003c/file\u003e\n            \u003cencoder\u003e\n                \u003cpattern\u003e%d{dd.MM.yyyy HH:mm:ss.SSS} | %msg%n\u003c/pattern\u003e\n                \u003cimmediateFlush\u003etrue\u003c/immediateFlush\u003e\n            \u003c/encoder\u003e\n        \u003c/appender\u003e\n    \u003c/logger\u003e\n```\n\nДля логирования статистики *за тайм-фрейм* необходимо настроить логирование класса `ru.open.monitor.statistics.log.FramedStatisticsLogger`, уровень логирования указать в соответствии со свойством `statistics.monitor.log.framedLoggerLevel`.\n\n```xml\n    \u003cproperty name=\"LOG_PATH\" value=\"${LOG_PATH:-./log}\" /\u003e\n    \u003clogger name=\"ru.open.monitor.statistics.log.FramedStatisticsLogger\" level=\"DEBUG\" additivity=\"false\"\u003e\n        \u003cappender class=\"ch.qos.logback.core.rolling.RollingFileAppender\"\u003e\n            \u003crollingPolicy class=\"ch.qos.logback.core.rolling.TimeBasedRollingPolicy\"\u003e\n                \u003cfileNamePattern\u003e${LOG_PATH}/statistics/statistics-framed-${ROLLING_PATTERN}\u003c/fileNamePattern\u003e\n                \u003cmaxHistory\u003e10\u003c/maxHistory\u003e\n            \u003c/rollingPolicy\u003e\n            \u003cappend\u003etrue\u003c/append\u003e\n            \u003cencoder\u003e\n                \u003cpattern\u003e%d{dd.MM.yyyy HH:mm:ss.SSS} | %msg%n\u003c/pattern\u003e\n                \u003cimmediateFlush\u003etrue\u003c/immediateFlush\u003e\n            \u003c/encoder\u003e\n        \u003c/appender\u003e\n    \u003c/logger\u003e\n```\n\nДля логирования статистики обработки пачки событий очередью `CoreEventQueue` необходимо настроить логирование класса `ru.open.monitor.statistics.log.EventBatchStatisticsLogger`, уровень логирования указать в соответствии со свойством `statistics.monitor.log.framedLoggerLevel`.\n\n```xml\n    \u003cproperty name=\"LOG_PATH\" value=\"${LOG_PATH:-./log}\" /\u003e\n    \u003clogger name=\"ru.open.monitor.statistics.log.EventBatchStatisticsLogger\" level=\"DEBUG\" additivity=\"false\"\u003e\n        \u003cappender class=\"ch.qos.logback.core.rolling.RollingFileAppender\"\u003e\n            \u003crollingPolicy class=\"ch.qos.logback.core.rolling.TimeBasedRollingPolicy\"\u003e\n                \u003cfileNamePattern\u003e${LOG_PATH}/statistics/statistics-batch-${ROLLING_PATTERN}\u003c/fileNamePattern\u003e\n                \u003cmaxHistory\u003e10\u003c/maxHistory\u003e\n            \u003c/rollingPolicy\u003e\n            \u003cappend\u003etrue\u003c/append\u003e\n            \u003cencoder\u003e\n                \u003cpattern\u003e%d{dd.MM.yyyy HH:mm:ss.SSS} | %msg%n\u003c/pattern\u003e\n                \u003cimmediateFlush\u003etrue\u003c/immediateFlush\u003e\n            \u003c/encoder\u003e\n        \u003c/appender\u003e\n    \u003c/logger\u003e\n```\n\nДля логирования статистики *за тайм-фрейм* в формате [CSV](http://ru.wikipedia.org/wiki/CSV) необходимо добавить следующие логгеры:\n\n* `ru.open.monitor.statistics.log.FramedStatisticsQueuedLoggerCsv`;\n* `ru.open.monitor.statistics.log.FramedStatisticsProcessedLoggerCsv`;\n* `ru.open.monitor.statistics.log.FramedStatisticsPublishedLoggerCsv`;\n* `ru.open.monitor.statistics.log.FramedStatisticsQueueLoggerCsv`.\n\n```xml\n    \u003cproperty name=\"LOG_PATH\" value=\"${LOG_PATH:-./log}\" /\u003e\n    \u003cproperty name=\"ROLLING_PATTERN_CSV\" value=\"%d{yyyy-MM-dd}.csv.gz\" /\u003e\n    \u003clogger name=\"ru.open.monitor.statistics.log.FramedStatisticsQueuedLoggerCsv\" level=\"DEBUG\" additivity=\"false\"\u003e\n        \u003cappender class=\"ru.open.monitor.statistics.log.logback.rolling.ProcessedEventStatisticsRollingFileAppender\"\u003e\n            \u003crollingPolicy class=\"ch.qos.logback.core.rolling.TimeBasedRollingPolicy\"\u003e\n                \u003cfileNamePattern\u003e${LOG_PATH}/statistics/queued-events-${ROLLING_PATTERN_CSV}\u003c/fileNamePattern\u003e\n                \u003cmaxHistory\u003e10\u003c/maxHistory\u003e\n            \u003c/rollingPolicy\u003e\n            \u003cappend\u003etrue\u003c/append\u003e\n            \u003cencoder class=\"ch.qos.logback.core.encoder.LayoutWrappingEncoder\"\u003e\n                \u003clayout class=\"ru.open.monitor.statistics.log.logback.layout.CsvLayout\"\u003e\n                    \u003clineSeparator\u003eUNIX\u003c/lineSeparator\u003e\n                \u003c/layout\u003e\n                \u003cimmediateFlush\u003etrue\u003c/immediateFlush\u003e\n            \u003c/encoder\u003e\n        \u003c/appender\u003e\n    \u003c/logger\u003e\n    \u003clogger name=\"ru.open.monitor.statistics.log.FramedStatisticsProcessedLoggerCsv\" level=\"DEBUG\" additivity=\"false\"\u003e\n        \u003cappender class=\"ru.open.monitor.statistics.log.logback.rolling.ProcessedEventStatisticsRollingFileAppender\"\u003e\n            \u003crollingPolicy class=\"ch.qos.logback.core.rolling.TimeBasedRollingPolicy\"\u003e\n                \u003cfileNamePattern\u003e${LOG_PATH}/statistics/processed-events-${ROLLING_PATTERN_CSV}\u003c/fileNamePattern\u003e\n                \u003cmaxHistory\u003e10\u003c/maxHistory\u003e\n            \u003c/rollingPolicy\u003e\n            \u003cappend\u003etrue\u003c/append\u003e\n            \u003cencoder class=\"ch.qos.logback.core.encoder.LayoutWrappingEncoder\"\u003e\n                \u003clayout class=\"ru.open.monitor.statistics.log.logback.layout.CsvLayout\"\u003e\n                    \u003clineSeparator\u003eUNIX\u003c/lineSeparator\u003e\n                \u003c/layout\u003e\n                \u003cimmediateFlush\u003etrue\u003c/immediateFlush\u003e\n            \u003c/encoder\u003e\n        \u003c/appender\u003e\n    \u003c/logger\u003e\n    \u003clogger name=\"ru.open.monitor.statistics.log.FramedStatisticsPublishedLoggerCsv\" level=\"DEBUG\" additivity=\"false\"\u003e\n        \u003cappender class=\"ru.open.monitor.statistics.log.logback.rolling.PublishedEventStatisticsRollingFileAppender\"\u003e\n            \u003crollingPolicy class=\"ch.qos.logback.core.rolling.TimeBasedRollingPolicy\"\u003e\n                \u003cfileNamePattern\u003e${LOG_PATH}/statistics/published-events-${ROLLING_PATTERN_CSV}\u003c/fileNamePattern\u003e\n                \u003cmaxHistory\u003e10\u003c/maxHistory\u003e\n            \u003c/rollingPolicy\u003e\n            \u003cappend\u003etrue\u003c/append\u003e\n            \u003cencoder class=\"ch.qos.logback.core.encoder.LayoutWrappingEncoder\"\u003e\n                \u003clayout class=\"ru.open.monitor.statistics.log.logback.layout.CsvLayout\"\u003e\n                    \u003clineSeparator\u003eUNIX\u003c/lineSeparator\u003e\n                \u003c/layout\u003e\n                \u003cimmediateFlush\u003etrue\u003c/immediateFlush\u003e\n            \u003c/encoder\u003e\n        \u003c/appender\u003e\n    \u003c/logger\u003e\n    \u003clogger name=\"ru.open.monitor.statistics.log.FramedStatisticsQueueLoggerCsv\" level=\"DEBUG\" additivity=\"false\"\u003e\n        \u003cappender class=\"ru.open.monitor.statistics.log.logback.rolling.QueueStatisticsRollingFileAppender\"\u003e\n            \u003crollingPolicy class=\"ch.qos.logback.core.rolling.TimeBasedRollingPolicy\"\u003e\n                \u003cfileNamePattern\u003e${LOG_PATH}/statistics/queue-statistics-${ROLLING_PATTERN_CSV}\u003c/fileNamePattern\u003e\n                \u003cmaxHistory\u003e10\u003c/maxHistory\u003e\n            \u003c/rollingPolicy\u003e\n            \u003cappend\u003etrue\u003c/append\u003e\n            \u003cencoder class=\"ch.qos.logback.core.encoder.LayoutWrappingEncoder\"\u003e\n                \u003clayout class=\"ru.open.monitor.statistics.log.logback.layout.CsvLayout\"\u003e\n                    \u003clineSeparator\u003eUNIX\u003c/lineSeparator\u003e\n                \u003c/layout\u003e\n                \u003cimmediateFlush\u003etrue\u003c/immediateFlush\u003e\n            \u003c/encoder\u003e\n        \u003c/appender\u003e\n    \u003c/logger\u003e\n```\n\nКонфигурационные свойства:\n\n* `statistics.monitor.log.rate` -- периодичность вывода *полной* статистики в лог в *миллисекундах* (параметр *необязательный*: значение по умолчанию = 30000);\n* `statistics.monitor.log.interestProcessedEvents` -- типы обрабатываемых событий, перечисленных через запятую, по которым статистика должна выводиться в лог (параметр *необязательный*: по умолчанию в лог будет выводиться статистика по всем типам обрабатываемых событий);\n* `statistics.monitor.log.interestPublishedEvents` -- типы публикуемых событий, перечисленных через запятую, по которым статистика должна выводиться в лог (параметр *необязательный*: по умолчанию в лог будет выводиться статистика по всем типам публикуемых событий);\n* `statistics.monitor.log.fullLoggerLevel` -- уровень логирования для вывода *полной* статистики (параметр *необязательный*: значение по умолчанию = `TRACE`);\n* `statistics.monitor.log.framedLoggerLevel` -- уровень логирования для вывода статистики *за промежуток времени* (параметр *необязательный*: значение по умолчанию = `DEBUG`).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fesirotkin%2Fstatistics-subsystem","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fesirotkin%2Fstatistics-subsystem","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fesirotkin%2Fstatistics-subsystem/lists"}