Nesse artigo irei abordar o que é o Spring Actuator e como ele nos auxilia a expor informações sobre a saúde da nossa aplicação, logs, dentre outras funcionalidades.
Tem interesse em ter um monitoramento melhor a respeito da sua aplicação? Então continue lendo!
Afinal, o que é Spring Actuator?
Antes de começarmos a falar sobre o que é o Spring Actuator, vamos falar sobre o significado de Actuator.
Actuator para quem não conhece é um dispositivo mecânico capaz de movimentar ou controlar alguma coisa. Quando recebe um sinal de controle, um Actuator responde convertendo a energia da fonte em um movimento mecânico.
Agora que já sabemos um pouco sobre o que é um Actuator, já devemos conseguir imaginar o que é o Spring Actuator, certo? 🙂
O Spring Actuator irá nos fornecer todos os recursos necessários para que possamos monitorar e gerenciar a nossa aplicação. Abaixo iremos mostrar como é feita a configuração para o uso e suas principais funcionalidades.
Como configurar o Spring Actuator?
A configuração do Spring Actuator é bem simples. Para que possamos utilizá-lo em nossa aplicação, basta adicionar a sua dependência.
Maven:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
Gradle:
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-actuator'
}
Pronto, feito isso estamos preparados para utilizar o Spring Actuator.
Funcionalidades do Spring Actuator e como ela nos auxilia
Abaixo iremos ver uma lista de todos os endpoints disponíveis pelo Spring Actuator e uma breve descrição sobre cada um deles:
API | Descrição |
---|---|
auditevents | Expõe informações de eventos de auditoria para a aplicação atual. Detalhes de uso: Baeldung – Suporte de auditoria. |
beans | Exibe uma lista completa de todos os beans Spring em sua aplicação. |
caches | Expõe caches disponíveis. |
conditions | Mostra as condições que foram avaliadas nas classes de configuração e configuração automática, além dos motivos pelos quais elas corresponderam ou não. |
configprops | Exibe uma lista agrupada de todos os @ConfigurationProperties. |
env | Expõe propriedades de Spring’s ConfigurableEnvironment. |
flyway | Mostra todas as migrações de banco de dados Flyway que foram aplicadas. |
health | Mostra informações de integridade do aplicativo. Detalhes de uso: Baeldung – Health Indicators in Spring Boot. |
httptrace | Exibe informações de rastreamento HTTP (por padrão, as últimas 100 trocas de solicitação-resposta HTTP). Detalhes de uso: Baeldung – Logging HTTP Requests with Spring Boot Actuator HTTP Tracing. |
info | Exibe informações arbitrárias do aplicativo. Detalhes de uso: Baeldung – Custom Information in Spring Boot Info Endpoint. |
integrationgraph | Mostra o gráfico de integração do Spring. Requer uma dependência de spring-integration-core. |
loggers | Mostra e modifica a configuração dos loggers no aplicativo. Detalhes de uso: Baeldung – Changing the Logging Level Info Endpoint. |
liquibase | Mostra todas as migrações de banco de dados Liquibase que foram aplicadas. |
metrics | Mostra informações de ‘métricas’ para o aplicativo atual. Detalhes de uso: Baeldung – Metrics for your Spring REST API. |
mappings | Exibe uma lista agrupada de todas as APIs da sua aplicação. |
quartz | Mostra informações sobre os trabalhos do Quartz Scheduler. |
scheduledtasks | Exibe as tarefas agendadas em seu aplicativo. |
sessions | Permite a recuperação e exclusão de sessões de usuário de um armazenamento de sessão apoiado por Spring Session. Requer um aplicativo da web baseado em Servlet usando Spring Session. |
shutdown | Permite que você consiga desativar a sua aplicação. Vem desabilitado por padrão. |
startup | Mostra os dados das etapas de inicialização coletados pelo ApplicationStartup. |
threaddump | Executa um despejo de thread. |
Com grandes poderes, grandes responsabilidades
Como você pode ter visto, o Spring Actuator nos fornece um grande poder sobre a nossa aplicação, mas lembre-se: “Com grandes poderes, vem grandes responsabilidades” e por isso temos que ter o máximo de cuidado possível.
Por padrão temos apenas duas APIs que são expostas ao realizarmos a configuração do Spring Actuator na nossa aplicação, que seria o “info” e o “health”.
Eu particularmente nunca vi nenhuma aplicação que precisou expor todos os endpoints do Spring Actuator, cada funcionalidade depende do contexto da sua aplicação, então irei mostrar para vocês como expor para que possa saber o que, de fato, é necessário para a sua aplicação.
Usos mais comuns: Beans, Caches, Info, Health, Loggers, Metrics, Mappings, HttpTrace.
Necessário, somente o necessário
Como já dizia a música do Mogli, o menino lobo: “Necessário, eu uso somente o necessário”.
Agora iremos te mostrar como expor os endpoints para que você possa realizar o consumo através de uma requisição WEB. Para isso, basta inserirmos a seguinte linha no nosso application.properties:
Para expor todos os endpoints:
management.endpoints.web.exposure.include=*
Agora, para expor somente o necessário:
management.endpoints.web.exposure.include=health, info, mappings, ….
Além disso, da mesma forma que a gente consegue expor via WEB, também conseguimos parar de expor. Para isso basta adicionar a seguinte linha no nosso application.properties:
Para não expor todos os endpoints:
management.endpoints.web.exposure.exclude=*
Já para não expor somente o necessário:
management.endpoints.web.exposure.exclude=health, info, mappings, ….
Um outro ponto que vale ser citado, é que além dos endpoints estarem expostos, eles também precisam estar ativados.
Por padrão todos os endpoints vêm ativados, com exceção do shutdown (que é perigoso, mas pode te ajudar em alguns momentos extremamente críticos). Para que possamos habilitar ele, por exemplo, basta adicionar a seguinte linha no nosso application.properties:
management.endpoint.shutdown.enabled=true
Caso você queira que todos os endpoints não venham habilitados por default, você pode adicionar a seguinte linha:
management.endpoints.enabled-by-default=false
E adicione aos poucos, como é visto no comando abaixo:
management.endpoint.<API>.enabled=true
O Spring Actuator nos dá uma autonomia muito grande na nossa aplicação e dessa forma a gente consegue configurar ao nosso gosto. 🙂
Mas como falamos antes, vamos ficar de olho na segurança! Como diz um dos pilares da ZUP. #SomosGuardioes
De olho na segurança
Após falarmos de todos os pontos felizes e vermos o poder que o Spring Actuator nos fornece, chegou o momento de abordar sobre segurança ao expor as informações da nossa aplicação!
Uma das formas recomendadas pelo Spring para realizar a segurança das requisições dos nossos endpoints seria utilizar o Spring Security. Não vou entrar em muitos detalhes porque ele não é o foco do nossa conversa, mas abaixo veremos um exemplo do seu uso:
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true)
public class MySecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.NEVER)
.and()
.authorizeRequests()
.antMatchers("/actuator/").hasAuthority("ROLE_ADMIN")
.anyRequest().authenticated()
.and()
.csrf().disable();
}
}
No bloco de código acima, a gente deu permissão para que somente usuários que tem a ROLE_ADMIN consigam fazer chamadas nos endpoints referentes ao Spring Actuator. Essa é uma das formas mais abordadas pelo Spring para que possamos proteger as nossas APIs.
Uma outra forma interessante da gente proteger as nossas rotas do Spring Actuator seria mudar as configurações padrões. A seguir iremos ver alguns comandos bem interessantes para isso.
Mudando o base-path padrão:
management.endpoints.web.base-path=/portal-admin
Adicionando a linha acima no nosso application.properties a gente mudou a nossa API de /actuator para /portal-admin. Dessa forma, ficará mais difícil da pessoa que está querendo acessar a nossa aplicação, encontrar qual será a rota padrão.
Use outra porta:
management.server.port=1996
Adicionado a linha acima no nosso application.properties a gente muda qual será a porta padrão que o Spring Actuator irá executar, separando o mesmo até da nossa própria aplicação.
Além desses pontos de segurança que aplicamos, lembre-se também de expor somente o necessário para o gerenciamento da sua aplicação.
Conclusão
Neste artigo abordamos o que é o Spring Actuator e como ele nos auxilia no monitoramento da nossa aplicação.
A documentação oficial do Spring referente ao Actuator é muito boa e vale muito a pena ser conferida para maiores informações 🙂
Espero que você tenha gostado e qualquer dúvida ou sugestão é só comentar aqui abaixo! =)
Referências:
- Docs Spring – Spring Boot Actuator
- Baeldung – Suporte de auditoria
- Baeldung – Health Indicators in Spring Boot
- Baeldung – Logging HTTP Requests with Spring Boot Actuator HTTP Tracing
- Baeldung – Custom Information in Spring Boot Info Endpoint
- Baeldung – Changing the Logging Level Info Endpoint
- Baeldung – Metrics for your Spring REST API
- Educalingo – Significado de Actuator
- Dev/Kico – Conhecendo o Actuator