Exemplo HttpSessionListener - Monitoramento

Exemplo HttpSessionListener - Monitoramento

*1. Visão geral *

Este tutorial mostrará como* registrar um javax.servlet.http.HttpSessionListener *e rastrear o número de sessões ativas no aplicativo da Web usando metrics.

===* 2. Definindo o Ouvinte *

*Podemos registrar o ouvinte de sessão HTTP no _web.xml _:*
<web-app ...>
    <listener>
        <listener-class>org..web.SessionListenerWithMetrics</listener-class>
    </listener>
</web-app>

Como alternativa, em um ambiente do Servlet 3, podemos usar o _ @ WebListener_ para registrar o ouvinte também. Nesse caso, precisamos anotar a classe SpringBootApplication principal com https://www..com/spring-servletcomponentscan [@ServletComponentScan] .

Por fim, também podemos registrar o ouvinte usando a configuração Java *declarando um bean ServletListenerRegistrationBean:

@Bean
public ServletListenerRegistrationBean<SessionListenerWithMetrics> sessionListenerWithMetrics() {
   ServletListenerRegistrationBean<SessionListenerWithMetrics> listenerRegBean =
     new ServletListenerRegistrationBean<>();

   listenerRegBean.setListener(new SessionListenerWithMetrics());
   return listenerRegBean;
}

===* 3. O ouvinte básico *

O ouvinte simples* manterá o controle do número de sessões ativas *o tempo todo:

public class SessionListenerWithMetrics implements HttpSessionListener {

    private final AtomicInteger activeSessions;

    public SessionListenerWithMetrics() {
        super();

        activeSessions = new AtomicInteger();
    }

    public int getTotalActiveSession() {
        return activeSessions.get();
    }

    public void sessionCreated(final HttpSessionEvent event) {
        activeSessions.incrementAndGet();
    }
    public void sessionDestroyed(final HttpSessionEvent event) {
        activeSessions.decrementAndGet();
    }
}

O ouvinte da sessão será acionado quando a sessão for criada - sessionCreated:

HttpSession session = request.getSession();

E destruído - sessionDestroyed:

session.invalidate();

Esse mecanismo permite que a contagem de sessões atual seja recuperada do ouvinte, mas, para ter* monitoramento e transparência em tempo real *, precisamos de lógica adicional para recuperar o valor e publicá-lo.

É aqui que entra a biblioteca de métricas - vem com vários repórteres prontos para uso que permitem que essa métrica seja publicada com muito pouco esforço.

*4. O ouvinte com métricas *

Portanto, em vez de lançar nossa própria solução de monitoramento personalizado, aproveitaremos* a biblioteca de métricas *; precisamos adicioná-lo ao nosso pom:

<dependency>
    <groupId>com.codahale.metrics</groupId>
    <artifactId>metrics-core</artifactId>
    <version>3.0.1</version>
</dependency>

Com o núcleo de métricas disponível no caminho de classe, podemos escrever o mesmo HttpSessionListener usando um objeto Counter:

public class SessionListenerWithMetrics implements HttpSessionListener {

    private final Counter counterOfActiveSessions;

    public SessionListenerWithMetrics() {
        super();
        counterOfActiveSessions = MetricRegistrySingleton.metrics.counter("web.sessions.active.count");
    }

    public void sessionCreated(final HttpSessionEvent event) {
        counterOfActiveSessions.inc();
    }
    public void sessionDestroyed(final HttpSessionEvent event) {
        counterOfActiveSessions.dec();
    }
}

O MetricRegistry - o registro central de todas as métricas de aplicativos - é simplesmente referenciado em um campo estático amplo do aplicativo:

public final class MetricRegistrySingleton {
    public static final MetricRegistry metrics = new MetricRegistry();
}

A publicação dessa métrica e a disponibilidade imediata para o monitoramento - por exemplo, no sistema de registro padrão do aplicativo - são simples:

Logger logger = LoggerFactory.getLogger("org..monitoring");
Slf4jReporter reporter = Slf4jReporter.forRegistry(metrics).outputTo(logger).
  convertRatesTo(TimeUnit.SECONDS).convertDurationsTo(TimeUnit.MILLISECONDS).build();
reporter.start(5, TimeUnit.MINUTES);

5. Conclusão

Este tutorial ilustrou como registrar um HttpSessionListener no descritor de implementação do aplicativo Web e como monitorar o número ativo de sessões usando dois mecanismos. O primeiro mecanismo é um contador feito à mão e o segundo é baseado na biblioteca metrics madura.

A implementação pode ser encontrada em o exemplo de projeto do github.