Monitorando uma aplicação Spring Boot (2.x) utilizando Actuator, Micrometer, Prometheus e Grafana (1ª Parte — Actuator)
Com o Spring Boot, podemos criar aplicações corporativas que podem ir para produção em pouco tempo.
Considerando uma arquitetura distribuída é essencial podermos observar e monitorar o comportamento de uma aplicação em produção.
Para auxiliar nessa tarefa temos o Spring Actuator, que é uma biblioteca do próprio spring para coletar métricas, entender o trafego e o estado da aplicação. Com esse carinha tudo isso acaba se tornando fácil e trivial.
A ideia desse post é dar uma introdução sobre o monitoramento de uma aplicação spring boot.
Então, dividi isso em 2 partes:
- Utilização do Spring Boot Actuator e explicação de alguns endpoints por ele fornecidos.
- Visualização e monitoramento da aplicação utilizando ferramentas que se integram com o Actuator. (Próximo post)
Para utilizar como exemplo neste post criei uma aplicação bem básica, utilizando como dependências:
- MongoDB como banco de dados;
- Lombok para produtividade e eliminação de verbosidade;
- Spring boot Web, para criar a API REST;
- Actuator para permitir o monitoramento da aplicação;
O código do fonte do projeto pode ser encontrado neste link;
Actuator
Os endpoints do actuator é que vão permitir o monitoramento da aplicação, fornecendo informações tais como: health-check, coleta de métricas, http trace etc..
Essas funcionalidades podem ser acessadas via endpoints JMX e HTTP.
Para habilita-lo podemos adicionar sua dependência no projeto maven:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
Após iniciar a aplicação, podemos ver que alguns endpoints padrões do actuator já estão disponíveis. Eles podem ser acessados no endpoint http://localhost:8087/actuator
Health
Mostra o status da aplicação, que será UP se a aplicação estiver integra e DOWN caso não esteja saudável devido a qualquer problema, como conectividade com banco de dados ou falta de espaço em disco por exemplo.
Podemos habilitar também os detalhes de health da estrutura do projeto (nesse caso, mongodb e espaço em disco), através do arquivo de propriedades:
A partir daí é possível visualizar a integridade da estrutura:
Agora, com o serviço do mongodb fora do ar:
Eu poderia também desativar o indicador de integridade do mongodb através da propriedade:
management.health.mongo.enabled=false
O actuator vem com alguns indicadores de health já pré-definidos, como por exemplo o MongoHealthIndicator e o DiskSpaceHealthIndicator.
O interessante ainda é que eu posso criar meu próprio indicador de health:
@Component
public class CustomHealthIndicator extends AbstractHealthIndicator { @Override
protected void doHealthCheck(Health.Builder builder) throws Exception {
builder.up()
.withDetail("app", "Tudo OK");
}
}
Após isso, ele já esta disponível no meu endpoint health:
Info
O endpoint info basicamente expõe algumas informações sobre a aplicação.
Também é possível adicionar algumas propriedades no application.yml:
info:
app:
name: @project.name@
Que traz o seguinte resultado acessando o http://localhost:8087/actuator/info
Expondo mais endpoints do actuator
Por padrão somente os endpoints health e info são expostos via HTTP, mas isso pode ser configurado:
# Expondo todos os endpoins disponíveis no actuator
management:
endpoints:
web:
exposure:
include: '*'
O resultado é semelhante a isso:
Podemos configurar a exposição do health e info novamente de forma manual:
management:
endpoints:
web:
exposure:
include: health, info
Vale a muito a pena consultar a Documentação Oficial do spring boot actuator, lá temos uma série de métricas que podem ser configurados para utilizarmos na nossa aplicação.
Micrometer
O micrometer atua como um façade, e a partir do spring boot 2.0 é a biblioteca padrão para exportação de métricas. Isso acaba facilitando adicionarmos qualquer sistema de monitoramento sem muito esforço.
Ele suporta várias ferramentas de monitoramento, tais como: Prometheus, datalog, Atlas e outros.
No próximo postvou criar a configuração do Micrometer para Prometheus (acesso das métricas via api e acesso via interface e gráfica) e por fim a configuração e acesso diretamente pelo Grafana.
A segunda parte do artigo encontra-se aqui.
O código do fonte do projeto pode ser encontrada neste link;