1. 개요

이 예제은 어떻게 javax.servlet.http.HttpSessionListener 를 등록하고 메트릭  을 사용하여 웹 애플리케이션의 활성 세션 수를 추적 하는지 보여줄 것 입니다.

2. 리스너 정의하기

web.xml 에 HTTP 세션 수신기를 등록할 수 있습니다 .

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

또는 Servlet 3 환경 에서 @WebListener 를 사용 하여 리스너도 등록할 수 있습니다. 이 경우 @ServletComponentScan 으로 기본 SpringBootApplication 클래스 에 어노테이션을 달아야 합니다.

마지막으로 ServletListenerRegistrationBean을 선언 하여 Java 구성을 사용하여 수신기를 등록할 수도 있습니다 .

@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>

메트릭 코어를 클래스 경로에서 사용할 수 있으므로 Counter 개체 를 사용하여 동일한 HttpSessionListener 를 작성할 수 있습니다.

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.baeldung.monitoring");
Slf4jReporter reporter = Slf4jReporter.forRegistry(metrics).outputTo(logger).
  convertRatesTo(TimeUnit.SECONDS).convertDurationsTo(TimeUnit.MILLISECONDS).build();
reporter.start(5, TimeUnit.MINUTES);

5. 결론

이 예제 에서는 웹 애플리케이션의 배치 디스크립터에 HttpSessionListener 를 등록하는 방법과 두 가지 메커니즘을 사용하여 활성 세션 수를 모니터링하는 방법을 설명했습니다. 첫 번째 메커니즘은 수동 카운터이고 두 번째 메커니즘은 성숙한 메트릭 라이브러리를 기반으로 합니다.

구현은 예제 GitHub 프로젝트 에서 찾을 수 있습니다 .

REST footer banner