Monitoring is very helpful for finding bugs and optimizing performance. Poderíamos instrumentar manualmente nosso código para adicionar temporizadores e registro, mas isso levaria a muitos clichês perturbadores.
Por outro lado, podemos usar uma estrutura de monitoramento, orientada por anotações, comoDropwizard Metrics.
Neste tutorial, iremos instrumentar uma classe simples usandoMetrics AspectJ, e a anotação Dropwizard Metrics @Timed.
2. Configuração do Maven
Em primeiro lugar, vamos adicionar as dependências do Metrics AspectJ Maven ao nosso projeto:
Agora, nosso projeto está pronto para ter algum código Java instrumentado.
3. Instrumentação de anotação
Em primeiro lugar, vamos criar um método e anotá-lo com a anotação@Timed. Também preencheremos a propriedadename com um nome para nosso cronômetro:
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);
}
}
Estamos usando@Metrics annotation at the class level para permitir que o framework Metrics AspectJ saiba que esta classe tem métodos a serem monitorados. We’re putting @Timed on the method para criar o cronômetro.
Além disso,@Metrics cria um registro usando o nome de registro fornecido -objectRunnerRegistryName neste caso - para armazenar as métricas.
Nosso código de exemplo dorme por um segundo para emular uma operação.
Agora, vamos definir uma classe para iniciar o aplicativo e configurar nossoMetricsRegistry:
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);
}
}
No métodostartReport deApplicationMain, configuramos a instância de registro paraSharedMetricRegistries usando o mesmo nome de registro usado em@Metrics.
Depois disso, criamos umConsoleReporter simples para relatar nossas métricas do método anotado@Timed. Devemos observar que existemother types of reporters available.
Nosso aplicativo chamará o método cronometrado cinco vezes. Vamos compilá-lo com o Maven e depois executá-lo:
Como podemos ver, a estrutura Metrics fornece estatísticas detalhadas para pouquíssimas alterações de código em um método que queremos instrumentar.
Devemos observar que a execução do aplicativo sem a compilação do Maven - por exemplo, por meio de um IDE - pode não obter a saída acima. We need to ensure the AspectJ compilation plugin is included in the build for this to work.
4. Conclusão
Neste tutorial, investigamoshow to instrument a simple Java application with Metrics AspectJ.
Achamos as anotações do Metrics AspectJ uma boa maneira de instrumentar o código sem precisar de uma grande estrutura de aplicativos como Spring, JEE ou Dropwizard. Em vez disso, usando aspectos, conseguimos adicionar interceptadores em tempo de compilação.
Como sempre, o código-fonte completo do exemplo está disponívelover on GitHub.