Пример HttpSessionListener - мониторинг
1. обзор
В этом руководстве будет показано, какregister a javax.servlet.http.HttpSessionListener и отслеживать количество активных сеансов в веб-приложении с помощьюmetrics.
2. Определение слушателя
Мы можем зарегистрировать прослушиватель HTTP-сеанса вweb.xml:
org.example.web.SessionListenerWithMetrics
В качестве альтернативы, в среде Servlet 3,we can use the @WebListener также регистрирует слушателя. В этом случае нам нужно аннотировать основной классSpringBootApplication с помощью@ServletComponentScan.
Наконец, мы также можем зарегистрировать слушателя, используя конфигурацию Javaby declaring a ServletListenerRegistrationBean bean:
@Bean
public ServletListenerRegistrationBean sessionListenerWithMetrics() {
ServletListenerRegistrationBean listenerRegBean =
new ServletListenerRegistrationBean<>();
listenerRegBean.setListener(new SessionListenerWithMetrics());
return listenerRegBean;
}
3. Базовый слушатель
Простой слушатель всегда будетkeep track of the number of active sessions:
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();
}
}
Слушатель сеанса будет запущен при создании сеанса -sessionCreated:
HttpSession session = request.getSession();
И уничтожено -sessionDestroyed:
session.invalidate();
Этот механизм позволяет получить текущее количество сеансов от слушателя, но для того, чтобы иметьreal-time monitoring and transparency, нам нужна дополнительная логика для фактического получения значения и его публикации.
Здесь на помощь приходит библиотека метрик - она поставляется сseveral out of the box reporters, что позволяет публиковать эту метрику с минимальными усилиями.
4. Слушатель с метриками
Таким образом, вместо развертывания собственного решения для мониторинга мы будем использоватьthe metrics library; нам нужно добавить его в наш pom:
com.codahale.metrics
metrics-core
3.0.1
Поскольку ядро метрик доступно в пути к классам, мы можем записать тот жеHttpSessionListener, используя объект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();
}
}
MetricRegistry - центральный реестр всех показателей приложения - просто указывается в статическом поле всего приложения:
public final class MetricRegistrySingleton {
public static final MetricRegistry metrics = new MetricRegistry();
}
Публикация этого показателя и обеспечение его доступности для мониторинга - например, в стандартной системе ведения журналов приложения - проста:
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. Заключение
В этом руководстве показано, как зарегистрироватьHttpSessionListener в дескрипторе развертывания веб-приложения и как отслеживать активное количество сеансов с помощью двух механизмов. Первый механизм - это счетчик, свернутый вручную, а второй основан на зрелой библиотекеmetrics.
Реализацию можно найти вthe example github project.