Monitoramento do serviço Spring Boot, verificação de integridade, informações de encadeamento, informações de heap da JVM

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

1. O que é o Spring Boot Actuator

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.

2. Início rápido, crie uma demonstração do Spring Boot Actuator

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-demo

Ou 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")}

3. Introdução de pontos finais

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

Quatro, configuração de exposição de terminal

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, rastreio

O 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 = / minitor

Apó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.

V. Análise de pontos finais importantes

Ponto final de saúde / 5.1

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 = sempre

Este 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: false

Ou desative todos os indicadores de integridade configurados automaticamente:

management.health.defaults.enabled: false Indicador de integridade personalizado

Obviamente, 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:

Ponto final 5.2 / metrics

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 é:

Ponto final 5.3 / loggers

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

5.4 / ponto final de informações

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 "}}

Ponto final 5.5 / beans

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:

Ponto final 5.6 / heapdump

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.

Ponto final 5.7 / threaddump

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:

Ponto final 5.8 / shutdown

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 = true

Devido 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)

Seis, integre o Spring Security para executar a verificação de segurança no terminal

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
Sob epidemia! empresas de Internet doméstica que trabalham horas Síntese
Anterior
O que indica o ajuste da estrutura da organização técnica das principais empresas de Internet da China?
Próximo