No ano passado, nosso projeto fez uma transformação na arquitetura de microsserviço 1.0, mas a parte de monitoramento de serviço não acompanhou. Não, recentemente me foi atribuída a tarefa de monitorar todos os nossos principais aplicativos de microsserviço. Como nossos aplicativos de microsserviço são todos aplicativos Spring Boot, pensamos naturalmente no módulo Atuador com a ajuda do Spring Boot.
Este artigo é um resumo do meu aprendizado e aplicação do módulo Spring Boot Actuator após concluir esta ordem de serviço. Neste artigo, você pode aprender:
1 Início rápido para o atuador de inicialização por mola 2 Introdução de alguns pontos finais importantes do Spring Boot Actuator 3) Como visualizar as informações de despejo de encadeamento do aplicativo atual em tempo real através do módulo Atuador 4) Como visualizar as informações da pilha do aplicativo atual em tempo real através do módulo Atuador 5) Como modificar o nível atual de impressão do log do aplicativo em tempo real através do módulo Atuador 6 ...
Também apresentarei mais tarde:
TODO: Integração de aplicativos de microsserviço SpringBoot Prometheus + Grafana para obter monitoramento e alarme
O módulo Spring Boot Actuator fornece funções no nível de produção, como verificações de integridade, auditorias, coleta de métricas, rastreamento HTTP, etc., para nos ajudar a monitorar e gerenciar aplicativos Spring Boot, carregamento de bean, variáveis de ambiente, informações de log, informações de encadeamento, informações de heap da JVM, etc. . Este módulo é um módulo que coleta as informações internas do aplicativo e as expõe ao exterior.As funções acima podem ser acessadas através de HTTP e JMX.
Devido às características da exposição de informações internas, o Actuator também pode ser integrado a alguns sistemas externos de monitoramento de aplicativos (Prometheus, Grafite, DataDog, Influx, Wavefront, New Relic, etc.). Esses sistemas de monitoramento fornecem excelentes painéis, gráficos, análises e alertas que podem ajudá-lo a monitorar e gerenciar seus aplicativos por meio de uma interface unificada e amigável.
O atuador usa o micrômetro para integrar-se a esses sistemas externos de monitoramento de aplicativos. Dessa forma, o sistema de monitoramento externo pode ser facilmente integrado com poucas configurações.
O Micrometer fornece uma API comum para a coleta de dados de desempenho na plataforma Java. Os aplicativos precisam apenas usar a API comum do Micrometer para coletar indicadores de desempenho. O micrômetro será responsável pelo trabalho de adaptação com diferentes sistemas de monitoramento. Isso facilita a troca de sistemas de monitoramento.
Compare a posição do Slf4j no Java Logger.
Primeiro, criamos um aplicativo de demonstração.
Você pode criar através do Spring Boot CLI:
spring init -d = rede, atuador -n = demo-atuador atuador-demoOu crie via Spring Initializr:
Dependência correspondente do maven:
< dependências > ... < dependência > < groupId > org.springframework.boot < / groupId > < artifactId > atuador de partida de inicialização de mola < / artifactId > < / dependência > ... < / dependências >Dependências Gradle correspondentes:
dependências {compile ("org.springframework.boot: spring-boot-starter-actuator")}O Spring Boot fornece os chamados endpoints (traduzidos a seguir como endpoints) para acesso externo e interação com aplicativos.
Por exemplo, o terminal / health fornece algumas informações básicas sobre a integridade do aplicativo. O terminal de métricas fornece algumas métricas úteis de aplicativos (uso de memória da JVM, uso de CPU do sistema etc.).
Os terminais que esses módulos do Atuador já possuem são chamados de terminais nativos. De acordo com o papel dos terminais, podemos dividir-se em três categorias:
Classe de configuração do aplicativo: Obtenha informações de configuração relacionadas aos aplicativos Spring Boot, como configuração do aplicativo, variáveis de ambiente e relatórios de configuração automatizados carregados no aplicativo.
Métricas: Obtenha métricas usadas para monitoramento durante a execução do aplicativo, como informações de memória, informações do conjunto de encadeamentos e estatísticas de solicitação HTTP.
Classe de controle de operação: Forneça funções de operação, como fechar o aplicativo.
Para uma introdução detalhada dos pontos de extremidade nativos, consulte o site oficial e não vou entrar em detalhes aqui.
Note-se que:
1 Cada nó de extremidade pode ser desativado individualmente ou iniciado através da configuração
2 Ao contrário do Atuador 1.x, A maioria dos pontos de extremidade do Actuator 2.x é desativada por padrão . O terminal padrão no Actuator 2.x adiciona o prefixo / atuador. Os dois pontos de extremidade expostos por padrão são / atuador / saúde e / atuador / info
Podemos configurar os pontos de extremidade expostos por JMX e HTTP por meio da seguinte configuração.
PropertyDefaultmanagement.endpoints.jmx.exposure.exclude
management.endpoints.jmx.exposure.include * management.endpoints.web.exposure.exclude
gerenciamento.endpoints.web.exposure.includeinfo, healt
Pode abrir todos os pontos de monitoramento
management.endpoints.web.exposure.include = *Você também pode optar por abrir a peça, "*" significa expor todos os pontos de extremidade. Se você especificar vários pontos de extremidade, use "," para separar
management.endpoints.web.exposure.exclude = beans, rastreioO atuador padroniza que todos os caminhos do ponto de monitoramento estejam em / atuador / *. Obviamente, esse caminho também suporta a personalização, se necessário.
management.endpoints.web.base-path = / minitorApós definir e reiniciar, o acesso ao endereço novamente se tornará / minitor / *.
Agora configuramos da seguinte maneira:
# "*" Significa expor todos os pontos de extremidade. Se vários pontos de extremidade forem especificados, use "," para separar management.endpoints.web.exposure.include = * # As regras de atribuição são as mesmas que acima.Inicie o programa DEMO, visite http: // localhost: 8080 / atuador e verifique os pontos de extremidade expostos:
A exibição acima é porque o plug-in chrome-handle está instalado no navegador Chrome, que na verdade retorna uma grande quantidade de json
Abaixo, vou focar em alguns pontos finais mais importantes.
O terminal / health agregará os indicadores de saúde do seu programa para verificar a saúde do programa. As informações de integridade do aplicativo expostas pelo terminal dependem de:
management.endpoint.health.show-details = sempreEste atributo pode ser configurado com um dos seguintes valores:
NameDescriptionnever não exibe informações detalhadas, status ativo ou inativo, a configuração padrão quando informações detalhadas autorizadas serão exibidas para usuários autenticados. As funções autorizadas podem ser configuradas para sempre expor informações detalhadas a todos os usuários através de management.endpoint.health.roles
De acordo com a configuração acima, depois de configurar para sempre, iniciamos o projeto, visite o http: // localhost: 8080 / atuador / porta de integridade, você pode ver esta informação:
Parece que há pouca informação sobre saúde? Não se preocupe, porque criamos um projeto de demonstração mais básico que não depende de muitos componentes.
O terminal / health possui muitos indicadores de integridade configurados automaticamente: como redis, rabbitmq, db e outros componentes. Quando o seu projeto depende dos componentes correspondentes, esses indicadores de saúde são montados automaticamente e, em seguida, coletam as informações correspondentes. Por exemplo, as informações do nó diskSpace acima são que DiskSpaceHealthIndicator está funcionando.
As capturas de tela acima são tiradas de documentos oficiais
Essas são as informações do terminal / health para meu outro projeto.
Quando o componente acima tem um estado anormal, o estado geral do serviço de aplicativo fica inativo. Também podemos desativar o monitoramento de integridade de um componente através da configuração.
management.health.mongo.enabled: falseOu desative todos os indicadores de integridade configurados automaticamente:
management.health.defaults.enabled: false Indicador de integridade personalizadoObviamente, você também pode personalizar um Indicador de Integridade, basta implementar a interface HealthIndicator ou herdar a classe AbstractHealthIndicator.
/ ** * @autor Richard_yyf * @version 1.02020/1/16 * / @ Classe de componente Public CustomHealthIndicator estende AbstractHealthIndicator {@Override void protegido doHealthCheck (construtor Health.Builder) lança Exception {// Use o construtor para criar informações de status de saúde // Se você lançar uma exceção, o status será definido como DOWN, as informações da exceção serão registradas builder.up () .withDetail ("app", "Este projeto é muito íntegro") .withDetail ("error", "Nothing , Eu sou muito bom ");}}efeito final:
O terminal / metrics é usado para retornar várias métricas importantes do aplicativo atual, como informações de memória, informações de encadeamento, informações de coleta de lixo, tomcat e pool de conexões de banco de dados.
{"names": }Ao contrário do 1.x, o Atuador não vê informações específicas sobre indicadores nessa interface, mas apenas exibe uma lista de indicadores. Para obter informações detalhadas de um determinado indicador, podemos solicitar informações específicas sobre indicadores, como este:
http: // localhost: 8080 / atuador / métricas / {MetricName}Por exemplo, se eu visitar /actuator/metrics/jvm.memory.max, as informações retornadas serão as seguintes:
Você também pode usar o parâmetro de consulta para visualizar uma única área. Por exemplo, você pode visitar /actuator/metrics/jvm.memory.max?tag=id:Metaspace. O resultado é:
O ponto de extremidade / loggers expõe informações sobre todos os registradores configurados dentro do nosso programa. Podemos ver visitando / atuador / registradores,
Você também pode acessar um único logger das seguintes maneiras,
http: // localhost: 8080 / atuador / registrador / {nome}Por exemplo, agora visito o logger raiz, http: // localhost: 8080 / actuator / loggers / root
{"configureLevel": "INFO", "eficazLevel": "INFO"} Altere o ponto de extremidade do nível de log / loggers em tempo de execução. O que mais quero mencionar é essa função, que pode modificar dinamicamente seu nível de log.Por exemplo, podemos modificar o nível de log do logger raiz das seguintes maneiras. Precisamos apenas iniciar uma solicitação POST com a URL http: // localhost: 8080 / atuador / loggers / root; a mensagem POST é a seguinte:
{"configureLevel": "DEBUG"}Pense com cuidado se esse recurso é muito útil. Se em um ambiente de produção, você deseja que seu aplicativo produza algumas informações de Depuração para poder diagnosticar algumas condições anormais, é necessário modificá-las da maneira acima, sem reiniciar o aplicativo.
Se você deseja redefinir o valor padrão, altere o valor para null
O terminal / info pode ser usado para exibir informações sobre o seu programa. Eu entendo que é a informação básica de alguns programas. E você pode personalizar a configuração no arquivo de configuração application.properties de acordo com suas necessidades (por padrão, o nó de extremidade retornará apenas um conteúdo json vazio.):
info.app.name = atuador-teste-demoinfo.app.encoding = UTF-8info.app.java.source = 1.8info.app.java.target = 1.8 # No projeto maven, você pode consultar diretamente as propriedades do maven das seguintes maneiras O valor de # info.app.encoding = @ project.build.sourceEncoding @ # info.app.java.source = @ java.version @ # info.app.java.target = @ java.version @Inicie o projeto e visite http: // localhost: 8080 / atuador / info:
{"app": {"encoding": "UTF-8", "java": {"source": "1.8.0_131", "target": "1.8.0_131"}, "name": "atuador-teste -demo "}}O terminal / beans retornará os aliases, tipos, singletons e dependências de todos os beans no contêiner Spring.
Visite http: // localhost: 8080 / atuador / beans e retorne o seguinte:
Visite: http: // localhost: 8080 / actuator / heapdump gerará automaticamente um heapdump de arquivo de heap da JVM. Podemos usar a ferramenta de monitoramento da JVM VisualVM que acompanha o JDK para abrir esse arquivo e visualizar a captura instantânea da memória.
Pessoalmente, acho esse ponto de extremidade particularmente útil, para que possamos verificar o status do encadeamento ao localizar o problema diariamente. Mostra principalmente o nome, o ID e o status do encadeamento, se é necessário aguardar recursos de bloqueio, pilha de encadeamentos e outras informações. Pode não ser intuitivo para visualizar. Visite http: // localhost: 8080 / actuator / threaddump e retorne da seguinte forma:
Esse ponto de extremidade pertence ao ponto de extremidade da classe de controle de operação, que pode fechar normalmente o aplicativo Spring Boot. Para usar esta função, primeiro você precisa habilitá-la no arquivo de configuração:
management.endpoint.shutdown.enabled = trueDevido a A interface de desligamento suporta apenas solicitações POST por padrão , Iniciamos o projeto Demo e iniciamos uma solicitação POST para http: // localhost: 8080 / atuador / desligamento. mensagens retornadas:
{"message": "Desligando, tchau ..."}Então o aplicativo é fechado.
Como a operação de abrir e fechar o próprio aplicativo é uma muito perigoso O importante é que, quando o usamos on-line, precisamos adicionar alguns mecanismos de proteção, como: Personalize o caminho do terminal do Atuador e integre o Spring Security para verificação de segurança Esperar. (Se não for particularmente necessário, esse terminal não precisará ser aberto)
Como as informações do terminal e as interações geradas são muito sensíveis, o acesso externo não autorizado deve ser evitado. Se ele existir no seu aplicativo Spring Security Dependente, é usado por padrão Autenticação HTTP baseada em formulário Para proteger o terminal.
Caso contrário, basta adicionar as dependências correspondentes:
< dependência > < groupId > org.springframework.boot < / groupId > < artifactId > spring-boot-starter-security < / artifactId > < / dependência >Após a adição, precisamos definir regras de verificação de segurança para substituir a configuração padrão do Spring Security.
Aqui eu dou duas versões da configuração do modelo:
import org.springframework.boot.actuate.autoconfigure.security.servlet.EndpointRequest; import org.springframework.boot.actuate.context.ShutdownEndpoint; import org.springframework.boot.autoconfigure.security.servlet.PathRequest; import org.springframework. context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; / ** * @ autor @ Richard_yyf * / Classe Configurationpublic ActuatorSecurityConfig estende o WebSecurityConfigurerAdapter {/ * * version1: * 1. Restrinja o acesso aos pontos de extremidade '/ shutdown', permita apenas o acesso ACTUATOR_ADMIN * 2. Permita o acesso externo a outros pontos de extremidade * 3. Permita o acesso externo a outros recursos estáticos * 4. Permita o acesso externo '/' * 5. Outro acesso precisa ser verificado * version2: * 1. Restrinja o acesso a todos os terminais, permita apenas o acesso a ACTUATOR_ADMIN * 2. Permita o acesso externo a recursos estáticos * 3. Permita o acesso externo '/' * 4. Outros O acesso de S precisa ser verificado * / @Override O void configure protegido (HttpSecurity http) lança a exceção {// version1 // http // .authorizeRequests () // .requestMatchers (EndpointRequest.to (ShutdownEndpoint.class)) // .hasRole ("ACTUATOR_ADMIN") // .requestMatchers ( EndpointRequest.toAnyEndpoint ()) // .permitAll () // .requestMatchers (PathRequest.toStaticResources (). AtCommonLocations ()) // .permitAll () // .antMatchers ("/") // .permitAll () // .antMatchers ("/ **") // .authenticated () // .and () // .httpBasic (); // version2 http .authorizeRequests () .requestMatchers (EndpointRequest.toAnyEndpoint ()) .hasRole ("ACTUATOR_ADMIN ") .requestMatchers (PathRequest.toStaticResources (). atCommonLocations ()) .permitAll () .antMatchers (" / ") .permitAll () .antMatchers (" / ** ") .authenticated () .and () .httpBasic ( );}}A configuração relevante de application.properties é a seguinte:
# Spring Security Nome do usuário padrão e senhaspring.security.user.name = actuatorspring.security.user.password = actuatorspring.security.user.roles = ACTUATOR_ADMIN