Перейти к основному содержимому

Пример HttpSessionListener — мониторинг

· 3 мин. чтения

1. Обзор

В этом руководстве показано, как зарегистрировать javax.servlet.http.HttpSessionListener и отслеживать количество активных сеансов в веб-приложении с помощью метрик .

2. Определение слушателя

Мы можем зарегистрировать прослушиватель HTTP-сессии в файле web.xml :

<web-app ...>
<listener>
<listener-class>com.foreach.web.SessionListenerWithMetrics</listener-class>
</listener>
</web-app>

В качестве альтернативы, в среде Servlet 3 мы также можем использовать @WebListener для регистрации прослушивателя. В этом случае нам нужно аннотировать основной класс SpringBootApplication с помощью @ServletComponentScan .

Наконец, мы также можем зарегистрировать слушателя, используя конфигурацию Java , объявив bean -компонент ServletListenerRegistrationBean :

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

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

3. Базовый слушатель

Простой слушатель будет постоянно отслеживать количество активных сеансов :

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

Этот механизм позволяет получать текущее количество сеансов от прослушивателя, но для обеспечения мониторинга и прозрачности в реальном времени нам нужна дополнительная логика для фактического получения значения и его публикации.

Здесь на помощь приходит библиотека метрик — она поставляется с несколькими готовыми генераторами отчетов, которые позволяют опубликовать эту метрику с минимальными усилиями.

4. Слушатель с метриками

Таким образом, вместо развертывания собственного решения для мониторинга мы будем использовать библиотеку метрик ; нам нужно добавить его в наш pom:

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

Поскольку ядро метрик доступно в пути к классам, мы можем написать тот же 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("com.foreach.monitoring");
Slf4jReporter reporter = Slf4jReporter.forRegistry(metrics).outputTo(logger).
convertRatesTo(TimeUnit.SECONDS).convertDurationsTo(TimeUnit.MILLISECONDS).build();
reporter.start(5, TimeUnit.MINUTES);

5. Вывод

В этом руководстве показано, как зарегистрировать HttpSessionListener в дескрипторе развертывания веб-приложения и как отслеживать количество активных сеансов с помощью двух механизмов. Первый механизм представляет собой ручной счетчик, а второй основан на зрелой библиотеке метрик .

Реализацию можно найти в примере проекта GitHub .