Conhecendo o Actuator do Spring Boot
Tags: springboot, spring, java, braziliandevs
Published: 2021-06-14 22:26:32

---
title: Conhecendo o Actuator do Spring Boot
published: true
description: O que é e pra que serve o Actuator do Spring Boot
tags: springboot, spring, java, braziliandevs
cover_image: https://devkico.itexto.com.br/wp-content/uploads/2020/12/spring_actuator-480x346.jpg
---

<!-- wp:paragraph -->
<p>Um dos recursos que mais gosto no Spring Boot e que normalmente é negligenciado por quem usa o framework é o <a href="https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-features.html">Actuator</a>: natural, dado que o foco normalmente está no código sendo escrito e não após ter sido implantado. </p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>O Actuator é um recurso do Spring Boot que nos permite <strong>monitorar e gerenciar</strong> aplicações escritas neste framework em seu ambiente de implantação. É bastante rico e fácil de ser usado: já vêm com diversos recursos prontos pra uso sem que você precise escrever uma única linha de código e será nosso assunto aqui.</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2>A curiosa história deste texto e dos próximos</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Quando comecei a escrever este texto lembrei que pouca gente conhecia um recurso similar que temos no Java SE chamado JMX, então escrevi <a href="https://devkico.itexto.com.br/?p=3169">aquele post</a> apresentando a tecnologia. Quando finalmente voltei ao objetivo inicial o resultado foi um texto <strong>imenso</strong>. Sendo assim resolvi dividi-lo em partes: nesta primeira vou apresentar uma visão geral sobre o Actuator e nos restantes vamos ver os recursos que mais usamos em nosso dia a dia.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Vou te mostrar o que é o Actuator, suas principais aplicações (por alto, vou detalhar tudo isto nos posts mais a frente (já estão prontos, "só falta testar")), as principais configurações e, finalmente, pontos fundamentais relativos à segurança do seu projeto.</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":1} -->
<h1>O que é o Actuator?</h1>
<!-- /wp:heading -->

<!-- wp:image {"align":"full","id":3208,"sizeSlug":"large"} -->
<figure class="wp-block-image alignfull size-large"><img src="https://devkico.itexto.com.br/wp-content/uploads/2020/12/spring_boot_actuator-1024x398.jpg" alt="O que é o Spring Boot Actuator?" class="wp-image-3208"/></figure>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Talvez o Actuator não seja tão usado e conhecido pelo modo como é apresentado pela equipe do Spring Boot e traduzido para o português: <em>"production-ready features"</em>, aí traduzem como <em>"funcionalidades para o ambiente de produção"</em>. Pior: a maior parte dos livros em português tem como foco a escrita de código e no máximo a implantação, ignorando aquela que pra mim é a fase mais importante: <strong>a pós implantação</strong>.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>O Spring Boot oferece à equipe de desenvolvimento todo o ferramental necessário para que possa monitorar e gerenciar sua aplicação após ter sido implantada. Com ele você pode:</p>
<!-- /wp:paragraph -->

<!-- wp:list -->
<ul><li>Monitorar a aplicação, isto é, acompanhar diversos aspectos da sua execução após implantada.</li><li>Gerenciar a aplicação, ou seja, interagir com o sistema com ele em execução operando ações neste como, por exemplo, limpeza de cache, tarefas administrativas, alteração de configurações e muito mais.</li></ul>
<!-- /wp:list -->

<!-- wp:paragraph -->
<p>Ok, você leu o <a href="https://devkico.itexto.com.br/?p=3169">meu texto sobre JMX</a> e viu as mesmas frases. Então <strong>qual a diferença?</strong> Há algumas.</p>
<!-- /wp:paragraph -->

<!-- wp:list -->
<ul><li>O protocolo padrão é o HTTP usando REST como padrão, o que facilita seu uso (há riscos de segurança que vou ensinar a minimizar mais a frente).</li><li>Além do protocolo HTTP também pode usar JMX, que é o mecanismo padrão de instrumentação do Java.</li><li>Assim como o JMX já vêm com uma série de indicadores relativos ao funcionamento da JVM por padrão, o Actuator trás <strong>diversas outras categorias de indicadores</strong>, a maior parte <strong>voltados para o contexto de aplicações web</strong>.</li><li>Tem como base o Spring Boot - está amarrado ao framework portanto, você não conseguirá usá-lo de forma fácil em outros frameworks.</li><li>Fornece a plataforma para que diversos módulos do Spring Boot possam fornecer seus próprios.</li></ul>
<!-- /wp:list -->

<!-- wp:paragraph -->
<p>Resumindo: o Actuator nos dá todos os recursos que precisamos para monitorar e gerenciar aplicações no contexto web, o que é vital se você implementa uma arquitetura baseada em micro serviços.</p>
<!-- /wp:paragraph -->

<!-- wp:pullquote -->
<figure class="wp-block-pullquote"><blockquote><p>Lembra do texto do Martin Fowler que popularizou os micro serviços? Um dos pontos fundamentais era justamente o monitoramento, e o Actuator entra exatamente aí. Não leu o texto? Aqui o <a href="https://martinfowler.com/articles/microservices.html">link</a>.</p></blockquote></figure>
<!-- /wp:pullquote -->

<!-- wp:heading -->
<h2>Monitorar o que?</h2>
<!-- /wp:heading -->

<!-- wp:image {"align":"full","id":3210,"sizeSlug":"large"} -->
<figure class="wp-block-image alignfull size-large"><img src="https://devkico.itexto.com.br/wp-content/uploads/2020/12/spring_cockpit-1024x382.jpg" alt="Monitorar o que?" class="wp-image-3210"/></figure>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Toda esta conversa sobre monitoramento é muito bonita mas talvez você se sinta perdido pois há inúmeras opções. Que aspectos relativos à execução do seu projeto interessam ser monitorados? Quais novos indicadores o Actuator trás pra nós? </p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3>Indicadores customizados pelo desenvolvedor</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Se você leu <a href="https://devkico.itexto.com.br/?p=3169">meu texto sobre JMX</a>, temos aqui o mesmo conceito dos MBeans. Você pode implementar beans aqui capazes de oferecer as seguintes funcionalidades:</p>
<!-- /wp:paragraph -->

<!-- wp:list -->
<ul><li>Obtenção de dados - verificar espaço em disco, por exemplo.</li><li>Executar ações - tarefas administrativas como limpeza de cache, remoção de arquivos temporários ou qualquer outro tipo de funcionalidade administrativa que você precise em produção.</li></ul>
<!-- /wp:list -->

<!-- wp:paragraph -->
<p>Sua imaginação e necessidade são os limites aqui. Você poderia implementar isto como endpoints convencionais do Spring que executassem estas operações, é verdade, mas para o caso de tarefas administrativas o ideal é que até por questões de segurança seja um código isolado.</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3>Checagem de qualidade de serviço (health checks)</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Talvez meu uso favorito do Actuator: código de health checking é aquele responsável por verificar se o sistema está executando em condições adequadas. Vamos a alguns exemplos:</p>
<!-- /wp:paragraph -->

<!-- wp:list -->
<ul><li>Verificar espaço em disco.</li><li>Quantidade de memória disponível.</li><li>Acesso ao banco de dados (checagem dos data sources).</li><li>Se você realiza interação com outros serviços externos, se consegue se conectar a estes.</li><li>Integridade do sistema de arquivos.</li></ul>
<!-- /wp:list -->

<!-- wp:paragraph -->
<p>Um dos textos desta série é justamente sobre health checking. É interessante aqui observar que diversos módulos do Spring Boot (como Redis, JPA e muitos outros) adicionam seus próprios testes de verificação de qualidade sem que você precise escrever uma linha de código sequer. A imagem a seguir expõe um exemplo de health checking detalhado usando o que já vêm com o módulo JPA:</p>
<!-- /wp:paragraph -->

<!-- wp:image {"align":"center","id":3213,"sizeSlug":"large"} -->
<div class="wp-block-image"><figure class="aligncenter size-large"><img src="https://devkico.itexto.com.br/wp-content/uploads/2020/12/image-8.png" alt="health checking em ação" class="wp-image-3213"/></figure></div>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Bem legal hein? E eu não escrevi uma linha sequer de código pra verificar se o acesso ao banco de dados está funcionando. Observe que também há um teste sobre espaço em disco: também não escrevi este teste, veio de graça com o Actuator!</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>E eu te contei que você pode escrever seus próprios testes? Vamos ver isto no próximo post!</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3>Logging</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>O Actuator pode facilitar bastante o acesso ao conteúdo do arquivo de log da aplicação. E este é um uso bastante útil, essencialmente, para ver o log principal da aplicação você apenas acessa o endpoint <em>/actuator/logfile </em>e <strong>boom:</strong> o log principal da aplicação está ali. Abaixo você pode ver um exemplo de saída:</p>
<!-- /wp:paragraph -->

<!-- wp:image {"align":"center","id":3214,"sizeSlug":"large"} -->
<div class="wp-block-image"><figure class="aligncenter size-large"><img src="https://devkico.itexto.com.br/wp-content/uploads/2020/12/image-9.png" alt="saída de log" class="wp-image-3214"/></figure></div>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>É possível até mesmo usando o comando curl obter a sua própria versão do "tail", veja este exemplo:</p>
<!-- /wp:paragraph -->

<!-- wp:preformatted -->
<pre class="wp-block-preformatted">curl 'http://localhost:8080/actuator/logfile' -i -X GET</pre>
<!-- /wp:preformatted -->

<!-- wp:paragraph -->
<p>É possível também ver a lista de todos os loggers presentes na aplicação, assim como seus níveis de acesso.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Não pretendo me aprofundar neste tema, mas se você quiser, este é o <a href="https://docs.spring.io/spring-boot/docs/2.4.1/actuator-api/htmlsingle/#logfile-retrieving">link a seguir</a>.</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3>Métricas (metrics) - profilando sua aplicação</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>No caso das métricas temos aqui a medição de um aspecto da aplicação específico (consumo de CPU, memória, conexões ativas com banco de dados, etc), no momento atual. Essencialmente este indicador responde a seguinte questão: "<strong>qual o valor do indicador X agora?</strong>".</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Isto te permite montar gráficos que possibilitam acompanhar ao longo do tempo o desempenho destes componentes, tal como o gráfico abaixo, que expõe o uso de CPU ao longo do tempo:</p>
<!-- /wp:paragraph -->

<!-- wp:image {"id":3216,"sizeSlug":"large"} -->
<figure class="wp-block-image size-large"><img src="https://devkico.itexto.com.br/wp-content/uploads/2020/12/image-10-1024x443.png" alt="" class="wp-image-3216"/></figure>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p>Infelizmente o Actuator não vêm com o ferramental que produz este tipo de gráfico, mas provê conectores para diversas ferramentas que podem gerar isto para você, tais como JMX, New Relic, Datadog, Dynatrace, Elastic e muitos outros que você pode ver <a href="https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-features.html#production-ready-metrics">neste link</a>.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><strong>Mas não acaba aí! </strong>Você também pode monitorar o tempo de resposta dos seus endpoints com estas métricas. Veja o exemplo a seguir, real, extraído da API do /dev/All:</p>
<!-- /wp:paragraph -->

<!-- wp:image {"id":3217,"sizeSlug":"large"} -->
<figure class="wp-block-image size-large"><img src="https://devkico.itexto.com.br/wp-content/uploads/2020/12/image-11.png" alt="" class="wp-image-3217"/></figure>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p>Quando adicionamos a anotação @Timed (io.micrometer.core.annotation.Timed) na classe do nosso controlador, podemos extrair métricas como número de requisições recebidas, tempo máximo de processamento e outros detalhes, apenas acessando o endereço /actuator/metrics/site (notou que "site" é o valor que passei pra anotação @Timed?). Veja o print a seguir: </p>
<!-- /wp:paragraph -->

<!-- wp:image {"align":"center","id":3218,"sizeSlug":"large"} -->
<div class="wp-block-image"><figure class="aligncenter size-large"><img src="https://devkico.itexto.com.br/wp-content/uploads/2020/12/image-12.png" alt="" class="wp-image-3218"/></figure></div>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p>É possível anotar apenas alguns endpoints também, o que te permite acompanhar a evolução do desempenho dos mesmos. Notou que obtive tudo isto incluindo apenas <strong>uma</strong> anotação? Pode aguardar que tem post detalhando este assunto vindo.</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3>Informações genéricas (Info)</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Outro grupo de informações muito útil é o info: quem nunca precisou verificar qual a versão da aplicação está em produção? Mas não se limita a apenas isto: você pode incluir literalmente qualquer coisa aqui, até mesmo informações relativas ao Git. </p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Sim, há um post só sobre este ponto aqui saindo no futuro. Neste primeiro momento pense nas informações genéricas como "a sua base chave/valor de dados no Actuator".</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3>Menções honrosas</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Meu objetivo neste e nos próximos posts é mostrar quais os recursos do Actuator que acho mais interessantes com base na minha experiência. Mas há alguns outros recursos providos por padrão que devem ser mencionados:</p>
<!-- /wp:paragraph -->

<!-- wp:list -->
<ul><li><strong>Auditoria</strong> - te possibilita registrar e monitorar eventos de autenticação bem ou mal sucedida e acesso não autorizado aos seus endpoints. Muito útil, leia mais <a href="https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-features.html#production-ready-auditing">neste link</a>.</li><li><strong>Listagem de rotas</strong> - muito útil, especialmente quando você está lidando com sistemas pré-existentes. Mais detalhes <a href="https://docs.spring.io/spring-boot/docs/2.4.1/actuator-api/htmlsingle/#mappings">aqui</a>.</li><li><strong>Gestão do processo principal</strong> - sabia que você pode <strong>finalizar</strong> o processo da sua aplicação pelo Actuator? Yeap, você pode: é o endpoint <strong>/actuator/shutdown</strong>. Em momentos críticos pode te ajudar bastante (pense num bug bruto em produção gerando prejuízos por segundo). Leia mais <a href="https://docs.spring.io/spring-boot/docs/2.4.1/actuator-api/htmlsingle/#shutdown">aqui</a>.</li></ul>
<!-- /wp:list -->

<!-- wp:heading {"level":1} -->
<h1>Actuator na prática</h1>
<!-- /wp:heading -->

<!-- wp:image {"align":"full","id":3221,"sizeSlug":"large"} -->
<figure class="wp-block-image alignfull size-large"><img src="https://devkico.itexto.com.br/wp-content/uploads/2020/12/starting-1024x343.jpg" alt="Iniciando" class="wp-image-3221"/></figure>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>O Actuator está presente desde a primeira versão do Spring Boot. Neste texto estou falando da última versão do framework (2.4.1), e incluí-lo em sua aplicação é muito simples. Se está usando Maven, basta incluir a dependência a seguir:</p>
<!-- /wp:paragraph -->

<!-- wp:preformatted -->
<pre class="wp-block-preformatted">&lt;dependency&gt; 
   &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; 
   &lt;artifactId&gt;spring-boot-starter-actuator&lt;/artifactId&gt; 
&lt;/dependency&gt;</pre>
<!-- /wp:preformatted -->

<!-- wp:paragraph -->
<p>Usa Gradle? Tão fácil quanto: inclua a dependência tal como no exemplo a seguir:</p>
<!-- /wp:paragraph -->

<!-- wp:preformatted -->
<pre class="wp-block-preformatted">dependencies { 
   implementation 'org.springframework.boot:spring-boot-starter-actuator' 
}</pre>
<!-- /wp:preformatted -->

<!-- wp:paragraph -->
<p>Inicie seu projeto e, na sequência, acesse este endereço: http://localhost:8080/actuator (imaginando que seu contexto seja "/"). Você verá uma resposta similar a esta:</p>
<!-- /wp:paragraph -->

<!-- wp:image {"align":"center","id":3222,"sizeSlug":"large"} -->
<div class="wp-block-image"><figure class="aligncenter size-large"><img src="https://devkico.itexto.com.br/wp-content/uploads/2020/12/image-13.png" alt="endereços essenciais" class="wp-image-3222"/></figure></div>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Super legal: o Actuator está te mostrando quais os endpoints de monitoramento/gerenciamento disponíveis. Por padrão estão visíveis apenas os endpoints de saúde (health) e informações gerais (info). Experimente navegar por eles, será uma experiência frustrante após ter lido este meu texto, pois você não vê nada do que prometi. Vamos resolver isto agora.</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2>Endpoints - expostos vs habilitados</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>A unidade base do Actuator é o endpoint. Qualquer ação que você realize no Actuator envolve o acesso a um dos endereços disponibilizados pelo framework. Por segurança não temos todos os endpoints expostos, especialmente por que estamos usando um protocolo que, por padrão, não é seguro, o HTTP (não confundir com HTTPS, que também não é tão seguro assim quanto as propagandas da internet ("Ops!") vendem).</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Sendo assim é necessário alterar as configurações do Spring Boot (não sabe como fazer com segurança? Já escrevi sobre elas <a href="https://devkico.itexto.com.br/?p=3157">aqui</a>) para identificar quais os itens que serão expostos. Quer expor todos? Então mude o valor da configuração management.endpoints.web.exposure.include com o valor * tal como no exemplo abaixo:</p>
<!-- /wp:paragraph -->

<!-- wp:preformatted -->
<pre class="wp-block-preformatted">management.endpoints.web.exposure.include=*</pre>
<!-- /wp:preformatted -->

<!-- wp:paragraph -->
<p>Atenção: se sua configuração estiver no formato yaml, digite '*' ao invés de *. Acesse novamente o endereço base do Actuator: http://localhost:8080/actuator</p>
<!-- /wp:paragraph -->

<!-- wp:image {"align":"center","id":3223,"sizeSlug":"large"} -->
<div class="wp-block-image"><figure class="aligncenter size-large"><img src="https://devkico.itexto.com.br/wp-content/uploads/2020/12/image-14.png" alt="Listagem dos endpoints" class="wp-image-3223"/></figure></div>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Olha aí um monte de endpoints disponíveis pra você agora (inclusive o "shutdown", que habilitei de propósito e é desabilitado por padrão). Há dois conceitos aqui:</p>
<!-- /wp:paragraph -->

<!-- wp:list -->
<ul><li><strong>Endpoints ativos</strong> - todos (com exceção de um (então não são todos, qual é este? é o shutdown)) são ativos por padrão, isto é, podem ser executados.</li><li><strong>Endpoints expostos</strong> - são os endpoints que podem ser acessados remotamente por HTTP ou JMX.</li></ul>
<!-- /wp:list -->

<!-- wp:paragraph -->
<p>O endpoint pode estar visível por essencialmente dois protocolos quando estamos tratando do Actuator: JMX ou HTTP. Neste post vamos falar só de HTTP, mas você pode aprender mais sobre o que é o JMX <a href="https://devkico.itexto.com.br/?p=3169">neste meu texto</a> e como trabalhar com JMX e Actuator <a href="https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-features.html#production-ready-jmx">neste link</a> da documentação.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Não é uma boa ideia expor todos os endpoints. O ideal é que você exponha <strong>apenas o que realmente faz sentido</strong>, pois quanto mais pontos de monitoramento estiverem visíveis, maior é a área de ataque aos seus sistemas. Sendo assim entra um novo conceito aqui: o <strong>identificador do endpoint.</strong></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Todo indicador (endpoint) no Actuator tem seu próprio identificador. A lista dos identificadores padrão pode ser conferida neste <a href="https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-features.html#production-ready-endpoints">link</a>.</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3>Como ativar endpoints</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Você deve seguir a seguinte sintaxe para ativar um endpoint individualmente:</p>
<!-- /wp:paragraph -->

<!-- wp:preformatted -->
<pre class="wp-block-preformatted">management.endpoint.[identificador do endpoint].enabled=(true|false)</pre>
<!-- /wp:preformatted -->

<!-- wp:paragraph -->
<p>Vamos a alguns exemplos, habilitando o info e desabilitando o shutdown:</p>
<!-- /wp:paragraph -->

<!-- wp:preformatted -->
<pre class="wp-block-preformatted">management.endpoint.info.enabled=true<br>management.endpoint.shutdown.enabled=false</pre>
<!-- /wp:preformatted -->

<!-- wp:paragraph -->
<p>Como mencionei agora há pouco, todos os endpoints estão ativados por padrão com exceção do "shutdown". Mas e se você não quiser este comportamento? E se quiser habilitar um a um os endpoints que deseja? Aí basta alterar a configuração management.endpoints.enabled-by-default tal como no exemplo a seguir:</p>
<!-- /wp:paragraph -->

<!-- wp:preformatted -->
<pre class="wp-block-preformatted"># pronto, agora você vai ter de definir um a um os endpoints ativos<br>management.endpoints.enabled-by-default=false</pre>
<!-- /wp:preformatted -->

<!-- wp:heading {"level":3} -->
<h3>Como expor endpoints</h3>
<!-- /wp:heading -->

<!-- wp:image {"align":"wide","id":3226,"sizeSlug":"large"} -->
<figure class="wp-block-image alignwide size-large"><img src="https://devkico.itexto.com.br/wp-content/uploads/2020/12/hidden.jpg" alt="Expondo e ocultando endpoints" class="wp-image-3226"/></figure>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p>Por padrão apenas os endpoints info e health estão expostos por padrão ao protocolo HTTP. É muito importante que você leve <strong>segurança</strong> em consideração aqui, sendo assim recomendo que você exponha apenas os endpoints que sejam <strong>realmente importantes</strong> para sua equipe.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Novamente, vamos lidar com algumas configurações do Spring Boot aqui. A primeira delas diz quais os endpoints que você quer expor: management.endpoints.web.exposure.include. Ela pode receber dois valores: "*" ou a lista de identificadores separados por vírgula, tal como no exemplo a seguir:</p>
<!-- /wp:paragraph -->

<!-- wp:preformatted -->
<pre class="wp-block-preformatted"># expondo todos os endpoints<br>management.endpoints.web.exposure.include=*<br># expondo apenas os endpoints que nos interessam: health, info, metrics<br>management.endpoints.web.exposure.include=health,info,metrics</pre>
<!-- /wp:preformatted -->

<!-- wp:paragraph -->
<p>Mas pra complicar (ou não) um pouquinho as coisas há outra propriedade que também define os endpoints que desejamos <strong>ocultar</strong>. É a configuração management.endpoints.web.exposure.exclude. Exclude tem precedência sobre o que será exposto. E a mesma sintaxe que temos para o include, temos para o exclude.</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":1} -->
<h1>Segurança</h1>
<!-- /wp:heading -->

<!-- wp:image {"align":"full","id":3227,"sizeSlug":"large"} -->
<figure class="wp-block-image alignfull size-large"><img src="https://devkico.itexto.com.br/wp-content/uploads/2020/12/seguranca-1024x422.jpg" alt="Segurança" class="wp-image-3227"/></figure>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Tudo muito bonito: com o Actuator podemos ver praticamente tudo sobre o estado corrente da nossa aplicação e também o ambiente no qual ela está sendo executada. E com as configurações padrão inclusive <strong>quem não deveria ter acesso a estas informações</strong>. </p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Alguém interessado em lhe causar problemas sabe tudo sobre sua aplicação: quais pontos da aplicação podem não estar funcionando corretamente (healthcheck), quanta memória está disponível, idem espaço de armazenamento, quantas requisições por segundo sua aplicação recebe, o que sai no log, como está seu banco de dados... enfim, é o prato cheio pra quem quer invadir sua plataforma. E claro, usando um protocolo disponível a todos: HTTP. Com um browser qualquer descubro como lhe causar pesadelos. Vejamos como evitar isto.</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2>Spring Security</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Se sua aplicação usa Spring Security (use), é relativamente fácil limitar o acesso aos endpoints do Actuator com base nas permissões do usuário. O caminho mais popular é estender a classe de configuração WebSecurityConfigurerAdapter sobrescrevendo o método configure tal como no exemplo a seguir:</p>
<!-- /wp:paragraph -->

<!-- wp:preformatted -->
<pre class="wp-block-preformatted">@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
   @Override
   protected void configure(HttpSecurity http) throws Exception {
     http
       .sessionManagement()
       .sessionCreationPolicy(SessionCreationPolicy.NEVER)
       .and()
         .authorizeRequests()
         <strong>.antMatchers("/actuator/</strong>").hasAuthority("ROLE_ADMIN")
         .anyRequest().authenticated()
      .and()
        .csrf().disable();
   }
}</pre>
<!-- /wp:preformatted -->

<!-- wp:paragraph -->
<p>Observe, este é um código de mera referência, vai dar um pouquinho mais de trabalho no seu projeto, pegue apenas a ideia geral. Neste caso, apenas os usuários com a permissão (authority) ROLE_ADMIN terão acesso aos endpoints.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Caso queira mais exemplos, sugiro que você confira <a href="https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-features.html#production-ready-endpoints-security">este</a> e <a href="https://stackoverflow.com/questions/56117631/how-to-secure-actuator-endpoints-with-role-in-spring-boot-2">este</a> link. Mas o ponto é: <strong>restrinja o acesso</strong>.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Caso o Spring Security não seja uma opção, há outras: você pode implementar um filtro, por exemplo, e neste adotar outro tipo de autenticação, como Basic Auth (não recomendo) por exemplo ou mesmo headers de API Keys.</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2>Mude as configurações padrão</h2>
<!-- /wp:heading -->

<!-- wp:heading {"level":3} -->
<h3>Mudando o base path padrão </h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Se eu quiser varrer sua rede em busca de informações sobre sua infra a primeira coisa que farei é buscar endereços padrão. O endereço padrão do Actuator é "/actuator". Sendo assim, vamos mudar esta configuração? É simples, você usa a chave management.endpoints.web.base-path , tal como no exemplo abaixo:</p>
<!-- /wp:paragraph -->

<!-- wp:preformatted -->
<pre class="wp-block-preformatted"># mudando de /actuator para /segredos<br>management.endpoints.web.base-path=/segredos</pre>
<!-- /wp:preformatted -->

<!-- wp:paragraph -->
<p>Recomendo que você use sua criatividade neste nome, o que pelo menos irá dar um pouco mais de trabalho para quem estiver tentando encontrar seu endereço base do Actuator.</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3>Use outra porta</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Esta é outra boa dica. Você pode configurar o Actuator para usar uma porta diferente daquela adotada por sua aplicação. Sendo assim sua API poderia operar na porta 443 (HTTPS) por exemplo, e o Actuator na porta 1979. Com isto, configurando seu firewall (ou regras de acesso a portas do seu serviço cloud) você consegue limitar quais endereços poderão ter acesso ao Actuator na porta customizada. A chave de configuração usada é a management.server.port. O exemplo abaixo define a porta 1979 para o Actuator:</p>
<!-- /wp:paragraph -->

<!-- wp:preformatted -->
<pre class="wp-block-preformatted">management.server.port=1979</pre>
<!-- /wp:preformatted -->

<!-- wp:paragraph -->
<p>Tente acessar o Actuator pela porta padrão da aplicação e o que você recebe? 404!</p>
<!-- /wp:paragraph -->

<!-- wp:image {"align":"center","id":3229,"sizeSlug":"large"} -->
<div class="wp-block-image"><figure class="aligncenter size-large"><img src="https://devkico.itexto.com.br/wp-content/uploads/2020/12/image-15.png" alt="" class="wp-image-3229"/></figure></div>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p></p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2>Configure CORS</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Se você quer que código JavaScript cliente acesse seus endpoints do Actuator (tem certeza disto?) é possível habilitar CORS para os endpoints usando as chaves expostas no exemplo a seguir:</p>
<!-- /wp:paragraph -->

<!-- wp:preformatted -->
<pre class="wp-block-preformatted"># as origens
<strong>management.endpoints.web.cors.allowed-origins</strong>=https://itexto.com.br
# quais métodos
<strong>management.endpoints.web.cors.allowed-methods</strong>=GET,POST</pre>
<!-- /wp:preformatted -->

<!-- wp:paragraph -->
<p>Não sabe o que é CORS? Leia este <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS">texto</a>. Mais detalhes sobre o uso de CORS na documentação oficial do Actuator <a href="https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-features.html#production-ready-endpoints-cors">aqui</a>.</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2>SSL</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Já que você definiu uma porta diferente pro seu servidor, por que não jogar um certificado SSL no mesmo pra deixar a coisa ainda mais segura?</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>A configuração a seguir expõe exatamente isto:</p>
<!-- /wp:paragraph -->

<!-- wp:preformatted -->
<pre class="wp-block-preformatted"># a porta customizada do servidor
<strong>management.server.port</strong>=1979 
# habilitando SSL nesta porta
<strong>management.server.ssl.enabled</strong>=true 
# o keystore que contém seu certificado
<strong>management.server.ssl.key-store</strong>=classpath:management.jks 
# a senha de acesso ao keystore
<strong>management.server.ssl.key-password</strong>=secret</pre>
<!-- /wp:preformatted -->

<!-- wp:paragraph -->
<p>Maiores detalhes neste <a href="https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-features.html#production-ready-management-specific-ssl">link</a>.</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":1} -->
<h1>Concluindo a introdução e preparando a jornada</h1>
<!-- /wp:heading -->

<!-- wp:image {"align":"full","id":3231,"sizeSlug":"large"} -->
<figure class="wp-block-image alignfull size-large"><img src="https://devkico.itexto.com.br/wp-content/uploads/2020/12/finalizando.jpg" alt="Finalizando" class="wp-image-3231"/></figure>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Nosso caminho com Actuator está só começando. Meu objetivo neste post foi te mostrar o que é esta ferramenta, abrir seus olhos para algumas das possibilidades que ela nos dá e, principalmente, te preparar para o maior risco que vêm com ela: a exposição de dados sensíveis a partir dos endpoints disponibilizados.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>A partir de agora meu objetivo é ir pra prática: vou te ensinar a implementar seus próprios endpoints de health checking, como enriquecer as informações apresentadas pelo seu sistema, lidar com auditoria e implementar seus próprios endpoints.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>Até lá!</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2>Para saber mais</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p><strong>Documentação oficial do Actuator</strong> - <a href="https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-features.html ">https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-features.html </a></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><strong>API do Actuator</strong> - te expõe todos os detalhes sobre os endpoints padrão disponibilizados pela ferramenta - <a href="https://docs.spring.io/spring-boot/docs/2.4.1/actuator-api/htmlsingle/">https://docs.spring.io/spring-boot/docs/2.4.1/actuator-api/htmlsingle/</a></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><strong>Entendendo as configurações do Spring Boot</strong> - é fundamental que você entenda como as configurações do Spring Boot funcionam. Então escrevi <a href="https://devkico.itexto.com.br/?p=3157">este texto</a>.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><strong>Conheça JMX</strong> - o texto que nasceu deste aqui e que contém muitos conceitos que você deve conhecer também. Leia <a href="https://devkico.itexto.com.br/?p=3169">aqui</a>.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><strong>Documentação oficial do Spring Security</strong> - <a href="https://docs.spring.io/spring-security/site/docs/5.4.2/reference/html5/">https://docs.spring.io/spring-security/site/docs/5.4.2/reference/html5/</a></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p></p>
<!-- /wp:paragraph -->