Пример HttpSessionListener - Мониторинг

Пример 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.