티스토리 뷰

728x90
반응형

 포스팅은 JavaMelody에 대해 알아보겠습니다.


WAS를 모니터링하거나, profiling하기위해 Javamelody를 사용합니다.

참조) https://github.com/javamelody/javamelody/wiki

 

목적

Javamelody는 QA및 운영환경에서 JavaEE애플리케이션을 모니터링하는데 목적이 있다. 운영환경에 따른 애플리케이션의 실환경에 대한 통계를 측정하고 계산하는 도구이다.

 

구현 및 특징
자바 멜로디는 오픈 소스이고 대부분의 어플리케이션에 통합시키기 쉽고 가볍다이다.

타 모니터링 프로파일러와 다르게 DB저장소가 없다.

 

필요성
QA및 운영환경에서 다음과 같은 경우 사용한다.
•평균 응답 시간 및 실행 횟수에 대한 정보를 제공한다.
•문제가 심각해 지기 전에 장애를 사전에 감지할 수 있게 도움을 준다.
•보다 제한된 응답 시간을 기반으로 최적화한다.
•응답 시간의 근본 원인을 찾는다.
•최적화 후 실제 개선 사항을 확인한다.

 


그럼 실제로 테스트를 수행해 보겠습니다.

1. 테스트 환경

(*) 환경 

- version

1) JEUS 6.0 (Fix#9)

2) JEUS 7.0 (fix#4) 

- OS : any

- library : javamelody-1.0.0.jar

 

(*) 개요

- Spring Framework에서 제공하는 javamelody라는 성능측정 API application에서 사용시 JEUS의 설정 방법을 가이드 합니다.

 

2. JEUS6.0.0.9 sample

(a) jar file 복사

Javamelody.jar 및 jrobin-1.5.9.jar파일을 모니터링할 Appliation의 WEB-INF/lib 디렉토리에 복사합니다. 또는 Maven을 사용하는 경우 webapp의 pom.xml파일에 javamelodycorerependence를 추가합니다.

 

(b) web.xml 설정

-> jeus7.0에서는 지원이 되지만, jeus6.0에서는 지원이 되지 않는 tag가 있습니다.

-> 아래 빨간색 주석처리부분은 JEUS6.0에서 기동 시에 servlet spec이 달라서 지원하지 않는 tag로 확인됩니다.

<?xml version="1.0" encoding="UTF-8"?>

<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee">

 

        <filter>

                <filter-name>monitoring</filter-name>

                <filter-class>net.bull.javamelody.MonitoringFilter</filter-class>

             <!--    <async-supported>true</async-supported> -->

        </filter>

        <filter-mapping>

                <filter-name>monitoring</filter-name>

                <url-pattern>/*</url-pattern>

 

                <!--

                <dispatcher>REQUEST</dispatcher>

                <dispatcher>ASYNC</dispatcher>

                -->

        </filter-mapping>

        <listener>

                <listener-class>net.bull.javamelody.SessionListener</listener-class>

        </listener>

 

</web-app>

 

(c)JEUSMain.xml 설정

-> 기존 web application 설정을 잡는 것과 동일 함.

-> /user/nrson/test/WEB-INF/lib 에 해당 javamelody jar파일을 위치 하면 됩니다.

<application>

        <name>test</name>

        <path>/user/nrson/test</path>

        <deployment-type>COMPONENT</deployment-type>

        <web-component>

                <context-root>/</context-root>

        </web-component>

        <deployment-target>

            <target>

                <engine-container-name>infrasvr_container1</engine-container-name>

            </target>

        </deployment-target>

    </application>

 

2.1 테스트 결과



3. JEUS7.0.0.4 sample

(a)web.xml 설정

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="http://java.sun.com/xml/ns/javaee"

      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

      xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">

<display-name>cxf</display-name>

<servlet>

                <description>Apache CXF Endpoint</description>

                <display-name>cxf</display-name>

                <servlet-name>cxf</servlet-name>

                <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>

                <load-on-startup>1</load-on-startup>

        </servlet>

        <servlet-mapping>

                <servlet-name>cxf</servlet-name>

                <url-pattern>/services/*</url-pattern>

        </servlet-mapping>

 

<filter>

                <filter-name>monitoring</filter-name>

                <filter-class>net.bull.javamelody.MonitoringFilter</filter-class>

                <async-supported>true</async-supported>

</filter>

        <filter-mapping>

                <filter-name>monitoring</filter-name>

                <url-pattern>/*</url-pattern>

                <dispatcher>REQUEST</dispatcher>

                <dispatcher>ASYNC</dispatcher>

        </filter-mapping>

        <listener>

                <listener-class>net.bull.javamelody.SessionListener</listener-class>

        </listener>

..생략..

</web-app>

 

3.1 JEUS6 ~ JEUS70.0.3  JEUS7.0.0.4의 차이점

-> JEUS7.0 fix4버전부터는 JEUS Logger에서 로그내용을 AsyncHandler에게 전달 한 후, AsyncHandler file에 로그내용을 Async하게 wirte()합니다.

-> JEUS7.0 fix4 버전 이전은 JEUS Logger가 로그내용을 핸들러에게 전달하는 과정은 동일하나해당 핸들러가 file write()하는 동작을 Sync하게 작동합니다.

-> 따라서 javamelody lib. 필터가 JEUS Logger 핸들러를 추가할 때 AsyncHandler와 충돌이 발생하면서오류가 발생합니다.

 

3.2 JEUS7.0.0.4 이후에 적용 방법

Javamelody를 사용 하려면, JEUS7.0.0.4 이전과 동일하게 AsynHandler 인터페이스를 설정해 주어야 합니다.

jvm-options(command-option) 으로 -Djeus.logging.useAsync=false 를 추가해 주면 됩니다.

-Djeus.logging.useAsync=false 옵션을 추가하지 않을 경우 아래와 같은 Exception이 발생 합니다.

..생략..

 

           at jeus.util.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:1261)

           at java.lang.Thread.run(Thread.java:745)

Caused by: java.lang.RuntimeException: javax.servlet.ServletException: Loading the class net.bull.javamelody.MonitoringFilter failed.

           at jeus.servlet.engine.ServletManager.initFilter(ServletManager.java:1250)

           at jeus.servlet.engine.ServletManager.startFilters(ServletManager.java:1230)

           at jeus.servlet.engine.Context.distributeInternal(Context.java:1550)

           ... 15 more

Caused by: javax.servlet.ServletException: Loading the class net.bull.javamelody.MonitoringFilter failed.

           at jeus.servlet.loader.ContainerManagedInstanceReloader.checkAndInitInstance(ContainerManagedInstanceReloader.java:89)

           at jeus.servlet.loader.ContainerManagedInstanceReloader.getInstance(ContainerManagedInstanceReloader.java:60)

           at jeus.servlet.filter.FilterWrapper.getFilter(FilterWrapper.java:18)

           at jeus.servlet.filter.FilterConfigImpl.getFilter(FilterConfigImpl.java:123)

           at jeus.servlet.engine.ServletManager.initFilter(ServletManager.java:1237)

           ... 17 more

Caused by: java.lang.SecurityException: Async logging doesn't allow to use general handlers but AsyncHandler (file, console).

           at jeus.util.logging.JeusLogger.addHandler(JeusLogger.java:858)

           at net.bull.javamelody.LoggingHandler.register(LoggingHandler.java:82)

           at net.bull.javamelody.FilterContext.initLogs(FilterContext.java:279)

           at net.bull.javamelody.FilterContext.<init>(FilterContext.java:70)

           at net.bull.javamelody.MonitoringFilter.init(MonitoringFilter.java:112)

           at jeus.servlet.loader.FilterReloader.doInitInstance(FilterReloader.java:18)

           at jeus.servlet.loader.ContainerManagedInstanceReloader.checkAndInitInstance(ContainerManagedInstanceReloader.java:79)

           ... 21 more

Root Exception stack trace:

java.lang.SecurityException: Async logging doesn't allow to use general handlers but AsyncHandler (file, console).

           at jeus.util.logging.JeusLogger.addHandler(JeusLogger.java:858)

           at net.bull.javamelody.LoggingHandler.register(LoggingHandler.java:82)

           at net.bull.javamelody.FilterContext.initLogs(FilterContext.java:279)

           at net.bull.javamelody.FilterContext.<init>(FilterContext.java:70)

           at net.bull.javamelody.MonitoringFilter.init(MonitoringFilter.java:112)

           at jeus.servlet.loader.FilterReloader.doInitInstance(FilterReloader.java:18)

           at jeus.servlet.loader.ContainerManagedInstanceReloader.checkAndInitInstance(ContainerManagedInstanceReloader.

..생략..

 

3.3 테스트 결과

JEUS6.0 과 동일한 jar(API)를 사용 한 화면 입니다.



JavaMelody를 활용하여 WAS를 모니터링하거나, profiling하기위해 사용하시기 바랍니다.

고맙습니다.

728x90
반응형