Рубрики
Без рубрики

Настройка Java-проекта для мониторинга

Настройка Java-проекта для мониторинга. Помеченный java.

В любом приложении 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”