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.