В любом приложении Java, развернутом для мониторинга, важно правильно настроить инфраструктуру мониторинга/оповещения.
Помимо мониторинга инфраструктуры, важно настроить показатели JVM, а также мониторинг приложений.
Когда я говорю “мониторинг приложений”, это означает мониторинг бизнес-транзакций, таких как количество заказов/транзакций, успешные заказы, неудачные заказы, регистрация пользователей, срабатывание электронной почты и т.д.
Для этого мы должны генерировать события из нашего приложения. Обычно их называют бизнес-метриками.
Dropwizard metrics – это одна из стандартных библиотек, которая позволяет вам генерировать события.
События могут быть отправлены в различные хранилища данных, наиболее популярными из которых являются Графит и Influxdb
Наиболее популярными типами показателей являются:
Счетчики – Счетчик измеряет скорость событий с течением времени. Также называется запросами в секунду или TPS (транзакции в секунду). Счетчики также отслеживают 1-, 5- и 15-минутные скользящие средние, также называемые
m1_rate
,m5_rate
иm15_rate
. Счетчики имеют методmark
для указания события.Счетчики – Счетчик используется для отслеживания подсчетов. Например, ожидающие выполнения задания и общее количество запросов. Общее количество запросов и т.д. Обычно является бесполезным параметром, но такие инструменты, как graphite/influxdb, могут предоставлять производную функцию поверх счетчиков, что может дать нам дополнительную функциональность счетчиков, использующих счетчики.
Таймер – Таймер измеряет как скорость вызова определенного фрагмента кода, так и распределение его продолжительности. Обычно, если вы используете таймер, вам не нужен счетчик или счетчик, поскольку эти функции также реализуются таймером. Хорошей практикой является наличие таймера для вашего обычного выполнения и счетчика/счетчика для сценариев исключений, чтобы вы могли визуализировать количество ошибок или частоту ошибок. Таймер также обеспечивает процентильное время, используя переменные
p50
,p75
,p95
,р98
,p99
и стандартное отклонение.
При использовании Spring framework , Spring metrics обеспечивает тесную интеграцию с Dropwizard metrics
Важно отметить, что metrics-spring – это библиотека, отличная от Spring metrics , которая является частью самого Spring framework.
Приведенный ниже код демонстрирует простой способ начальной загрузки приложения spring для мониторинга с использованием Dropwizard metrics и метрики-весна
buildscript { ext { } repositories { mavenCentral() } dependencies { classpath 'org.springframework.boot:spring-boot-gradle-plugin:1.5.16.RELEASE' } } group 'metrics-example' version '1.0-SNAPSHOT' apply plugin: 'java' apply plugin: 'org.springframework.boot' sourceCompatibility = 1.8 repositories { mavenCentral() } dependencies { compile("org.springframework.boot:spring-boot-starter-web") compile 'org.projectlombok:lombok:1.16.12' compile group: 'io.dropwizard.metrics', name: 'metrics-core', version: '4.1.0' compile group: 'io.dropwizard.metrics', name: 'metrics-graphite', version: '4.1.0' compile group: 'com.ryantenney.metrics', name: 'metrics-spring', version: '3.1.3' compile group: 'com.codahale.metrics', name: 'metrics-jvm', version: '3.0.2' testCompile group: 'junit', name: 'junit', version: '4.12' }
package app; import com.codahale.metrics.ConsoleReporter; import com.codahale.metrics.Counter; import com.codahale.metrics.JmxReporter; import com.codahale.metrics.Meter; import com.codahale.metrics.MetricFilter; import com.codahale.metrics.MetricRegistry; import com.codahale.metrics.graphite.Graphite; import com.codahale.metrics.graphite.GraphiteReporter; import com.codahale.metrics.jvm.GarbageCollectorMetricSet; import com.codahale.metrics.jvm.MemoryUsageGaugeSet; import com.codahale.metrics.jvm.ThreadStatesGaugeSet; import com.ryantenney.metrics.spring.config.annotation.MetricsConfigurerAdapter; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; import java.net.InetSocketAddress; import java.util.concurrent.TimeUnit; @Component public abstract class MetricsConfig extends MetricsConfigurerAdapter{ private final MetricRegistry metrics = new MetricRegistry(); Meter publishMeter = metrics.meter("publish.meter"); Counter publishCounter = metrics.counter("publish.counter"); @Value("${graphite.host}") private String graphiteHost; @Value("${graphite.port}") private int graphitePort; @Value("${graphite.amount.of.time.between.polls}") private long graphiteAmountOfTimeBetweenPolls; private String graphitePrefix; @PostConstruct public void run() { ConsoleReporter reporter = ConsoleReporter.forRegistry(metrics) .convertRatesTo(TimeUnit.SECONDS) .convertDurationsTo(TimeUnit.MILLISECONDS) .build(); reporter.start(1, TimeUnit.SECONDS); } abstract protected void configureReporters(); protected void configureReporters(String graphitePrefix) { this.graphitePrefix = graphitePrefix; configureReporters(metrics); } @Override public void configureReporters(MetricRegistry metricRegistry) { registerReporter(JmxReporter.forRegistry(metricRegistry) .build()).start(); GraphiteReporter graphiteReporter = getGraphiteReporterBuilder(metricRegistry) .build(getGraphite()); registerReporter(graphiteReporter); graphiteReporter.start(graphiteAmountOfTimeBetweenPolls, TimeUnit.MILLISECONDS); } private GraphiteReporter.Builder getGraphiteReporterBuilder(MetricRegistry metricRegistry) { metricRegistry.register("gc", new GarbageCollectorMetricSet()); metricRegistry.register("memory", new MemoryUsageGaugeSet()); metricRegistry.register("threads", new ThreadStatesGaugeSet()); return GraphiteReporter.forRegistry(metricRegistry) .convertRatesTo(TimeUnit.SECONDS) .convertDurationsTo(TimeUnit.MILLISECONDS) .filter(MetricFilter.ALL) .prefixedWith(graphitePrefix); } private Graphite getGraphite() { return new Graphite(new InetSocketAddress(graphiteHost, graphitePort)); } }
package app; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; @Component public class ProdMetricsConfig extends MetricsConfig { private static final String GRAPHITE_PREFIX = "collectd/graphite-monitoring-example/production"; @Override protected void configureReporters() { configureReporters(GRAPHITE_PREFIX); } @PostConstruct() public void init() { configureReporters(); } }
Вот пример панели мониторинга, визуализированной в Grafana
Приведенный выше полный проект доступен в моем репозитории github
Репозиторий содержит докеризованное приложение spring boot, grafana и экземпляр graphite.
Предполагая, что у вас установлен docker, просто выполните приведенные ниже команды, чтобы запустить проект.
./gradlew build docker build -t metrics-example . docker-compose up -d
Использование http://localhost:3000
чтобы просмотреть портал grafana и настроить свои информационные панели.
Пожалуйста, дайте мне знать, если у вас есть какие-либо предложения/обратная связь
Оригинал: “https://dev.to/madhur/setting-up-java-project-for-monitoring-3j12”