Exemple HttpSessionListener - Surveillance

Exemple HttpSessionListener - Surveillance

1. Vue d'ensemble

Ce didacticiel montrera commentregister a javax.servlet.http.HttpSessionListener et suivre le nombre de sessions actives dans l'application Web à l'aide demetrics.

2. Définition de l'auditeur

Nous pouvons enregistrer l'écouteur de session HTTP dans lesweb.xml:


    
        org.example.web.SessionListenerWithMetrics
    

Sinon, dans un environnement Servlet 3,we can use the @WebListener pour enregistrer également l'écouteur. Dans ce cas, nous devons annoter la classe principaleSpringBootApplication avec@ServletComponentScan.

Enfin, nous pouvons également enregistrer l'écouteur en utilisant la configuration Javaby declaring a ServletListenerRegistrationBean bean:

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

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

3. L'auditeur de base

L'auditeur simple ferakeep track of the number of active sessions à tout moment:

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();
    }
}

L'écouteur de session sera déclenché lors de la création de la session -sessionCreated:

HttpSession session = request.getSession();

Et détruit -sessionDestroyed:

session.invalidate();

Ce mécanisme permet de récupérer le nombre de sessions en cours à partir de l'écouteur, mais pour avoirreal-time monitoring and transparency, nous avons besoin d'une logique supplémentaire pour récupérer réellement la valeur et la publier.

C'est là que la bibliothèque de métriques entre en jeu - elle est fournie avecseveral out of the box reporters qui permettent à cette métrique d'être publiée avec très peu d'effort.

4. L'auditeur avec des métriques

Ainsi, au lieu de déployer notre propre solution de surveillance personnalisée, nous utiliseronsthe metrics library; nous devrons l'ajouter à notre pom:


    com.codahale.metrics
    metrics-core
    3.0.1

Avec metrics core est disponible sur le classpath, nous pouvons écrire les mêmesHttpSessionListener en utilisant un objetCounter:

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();
    }
}

LeMetricRegistry - le registre central de toutes les métriques d'application - est simplement référencé dans un champ statique à l'échelle de l'application:

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

Publier cette métrique et la rendre facilement disponible pour la surveillance - par exemple dans le système de journalisation standard de l'application - est simple:

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

5. Conclusion

Ce didacticiel a illustré comment enregistrer unHttpSessionListener dans le descripteur de déploiement de l'application Web et comment surveiller le nombre actif de sessions à l'aide de deux mécanismes. Le premier mécanisme est un compteur roulé à la main et le second est basé sur la bibliothèque maturemetrics.

L'implémentation peut être trouvée dansthe example github project.