Перейти к основному содержимому

@Timed аннотация с использованием показателей и AspectJ

· 3 мин. чтения

Задача: Наибольшая подстрока палиндром

Для заданной строки s, верните наибольшую подстроку палиндром входящую в s. Подстрока — это непрерывная непустая последовательность символов внутри строки. Стока является палиндромом, если она читается одинаково в обоих направлениях...

ANDROMEDA 42

1. Введение

Мониторинг очень полезен для поиска ошибок и оптимизации производительности. Мы могли бы вручную настроить наш код, чтобы добавить таймеры и ведение журнала, но это привело бы к большому количеству отвлекающих шаблонов.

С другой стороны, мы можем использовать систему мониторинга, управляемую аннотациями, например Dropwizard Metrics .

В этом руководстве мы создадим простой класс, используя Metrics AspectJ и аннотацию Dropwizard Metrics @ Timed .

2. Настройка Мавена

Прежде всего, давайте добавим в наш проект зависимости Metrics AspectJ Maven:

<dependency>
<groupId>io.astefanutti.metrics.aspectj</groupId>
<artifactId>metrics-aspectj</artifactId>
<version>1.2.0</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.astefanutti.metrics.aspectj</groupId>
<artifactId>metrics-aspectj-deps</artifactId>
<version>1.2.0</version>
</dependency>

Мы используем metrics-aspectj для предоставления метрик через аспектно-ориентированное программирование и metrics-aspectj-deps для предоставления его зависимостей.

Нам также нужен плагин aspectj-maven-plugin для настройки обработки аннотаций метрик во время компиляции:

<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.8</version>
<configuration>
<complianceLevel>1.8</complianceLevel>
<source>1.8</source>
<target>1.8</target>
<aspectLibraries>
<aspectLibrary>
<groupId>io.astefanutti.metrics.aspectj</groupId>
<artifactId>metrics-aspectj</artifactId>
</aspectLibrary>
</aspectLibraries>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
</plugin>

Теперь наш проект готов к инструментированию Java-кода.

3. Инструментарий аннотации

Во-первых, давайте создадим метод и аннотируем его аннотацией @Timed . Мы также заполним свойство name именем нашего таймера :

import com.codahale.metrics.annotation.Timed;
import io.astefanutti.metrics.aspectj.Metrics;

@Metrics(registry = "objectRunnerRegistryName")
public class ObjectRunner {

@Timed(name = "timerName")
public void run() throws InterruptedException {
Thread.sleep(1000L);
}
}

Мы используем аннотацию @Metrics на уровне класса , чтобы платформа Metrics AspectJ знала, что у этого класса есть методы для мониторинга. Мы помещаем @Timed в метод для создания таймера.

Кроме того, @Metrics создает реестр, используя предоставленное имя реестра — в данном случае objectRunnerRegistryName — для хранения метрик.

Код нашего примера просто засыпает на одну секунду, чтобы эмулировать операцию.

Теперь давайте определим класс для запуска приложения и настройки нашего MetricsRegistry :

public class ApplicationMain {
static final MetricRegistry registry = new MetricRegistry();

public static void main(String args[]) throws InterruptedException {
startReport();

ObjectRunner runner = new ObjectRunner();

for (int i = 0; i < 5; i++) {
runner.run();
}

Thread.sleep(3000L);
}

static void startReport() {
SharedMetricRegistries.add("objectRunnerRegistryName", registry);

ConsoleReporter reporter = ConsoleReporter.forRegistry(registry)
.convertRatesTo(TimeUnit.SECONDS)
.convertDurationsTo(TimeUnit.MILLISECONDS)
.outputTo(new PrintStream(System.out))
.build();
reporter.start(3, TimeUnit.SECONDS);
}
}

В методе startReport ApplicationMain мы устанавливаем экземпляр реестра в SharedMetricRegistries, используя то же имя реестра, что и в @Metrics .

После этого мы создаем простой ConsoleReporter , чтобы сообщать о наших метриках из аннотированного метода @Timed . Следует отметить, что существуют и другие типы репортеров .

Наше приложение вызовет метод timed пять раз. Давайте скомпилируем его с помощью Maven, а затем выполним:

-- Timers ----------------------------------------------------------------------
ObjectRunner.timerName
count = 5
mean rate = 0.86 calls/second
1-minute rate = 0.80 calls/second
5-minute rate = 0.80 calls/second
15-minute rate = 0.80 calls/second
min = 1000.49 milliseconds
max = 1003.00 milliseconds
mean = 1001.03 milliseconds
stddev = 1.10 milliseconds
median = 1000.54 milliseconds
75% <= 1001.81 milliseconds
95% <= 1003.00 milliseconds
98% <= 1003.00 milliseconds
99% <= 1003.00 milliseconds
99.9% <= 1003.00 milliseconds

Как мы видим, инфраструктура Metrics предоставляет нам подробную статистику для очень небольшого изменения кода метода, который мы хотим инструментировать.

Следует отметить, что запуск приложения без сборки Maven — например, через IDE — может не привести к приведенному выше результату. Нам нужно убедиться, что плагин компиляции AspectJ включен в сборку, чтобы это работало.

4. Вывод

В этом руководстве мы рассмотрели, как настроить простое Java-приложение с помощью Metrics AspectJ.

Мы обнаружили, что аннотации Metrics AspectJ являются хорошим способом инструментирования кода без необходимости использования крупной среды приложений, такой как Spring, JEE или Dropwizard. Вместо этого, используя аспекты, мы могли добавлять перехватчики во время компиляции.

Как всегда, полный исходный код примера доступен на GitHub .