NO | 단계 | 확인사항 |
---|---|---|
1 | 모니터링 운영관리 도구(monitoring-web.war) Deploy | jarfile is not loaded 항목 |
2 | 모니터링 운영관리 도구 설정 | web.xml 실행 Servlet 추가 확인 |
3 | Database Table 생성 | |
4 | 모니터링 대상 등록(Web UI 통해 서버/컨테이너 등록) | JNDI Port 통신 확인 |
5 | 모니터링 아키텍처 및 문제 해결 가이드 |
서버가 Tomcat일 경우 war파일 배포방법은 다음과 같다.
[CATALINA_HOME]\webapps 폴더 하위에 다운로드한 monitoring-web.war 파일을 복사한다.
Tomcat 서버를 기동하면 자동으로 monitoring-web.war가 배포되며 [CATALINA_HOME]\webapps\monitoring-web 폴더가 생성된다.
Tomcat이외의 어플리케이션 서버의 배포방법에 대해서는 해당 어플리케이션 서버의 메뉴얼을 참고한다.
<servlet> <servlet-name>EgovMBCManagerServlet</servlet-name> <servlet-class>egovframework.oe2.svr.mbean.mbeanmanager.service.EgovMBCManagerServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet> <servlet-name>infraRedListenerServlet</servlet-name> <servlet-class>egovframework.oe2.svr.collector.base.InfraRedListenerServlet</servlet-class> <init-param> <param-name>port</param-name> <param-value>7777</param-value> </init-param> <init-param> <param-name>resetCacheInterval</param-name> <param-value>1800</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>infraRedListenerServlet</servlet-name> <url-pattern>/infraRedListenerServlet</url-pattern> </servlet-mapping> <servlet> <servlet-name>AgentManagerServlet</servlet-name> <servlet-class>egovframework.oe2.agt.aggregator.base.AgentManagerServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>AgentManagerServlet</servlet-name> <url-pattern>/AgentManagerServlet</url-pattern> </servlet-mapping>
JEUSMain.xml
<engine-container> <command-option> -Djeus.jndi.rmi.useRmiRegistry=true -Dsun.rmi.transport.tcp.connectionPool=true </command-option>
어플리케이션 모니터링데이타 저장주기 및 어플리케이션 모니터링 항목에 대한 임계치를 조정한다.
<표 1.1.1 모니터링 서버 속성>
Property | Description | Default Value |
---|---|---|
persist-interval | 실시간으로 전송된 모니터링 데이타를 데이타베이스에 저장하는 주기이다. ms단위로 설정한다. | 30000 |
threshold.http | 어플리케이션의 http 실행에 대한 모니터링 임계치를 정의한다. | 3000 |
threshold.application | 어플리케이션 API 실행에 대한 모니터링 임계치를 정의한다. | 3000 |
threshold.jdbc | 어플리케이션의 JDBC 실행에 대한 모니터링 임계치를 정의한다. | 3000 |
threshold.sql | 어플리케이션의 sql 실행에 대한 모니터링 임계치를 정의한다. | 2000 |
위의 기본값을 포함하고 있는 설정파일 infrared-web.properties의 내용은 다음과 같다.
#The sample infrared-web.properties persist-interval=30000 threshold.http=3000 threshold.application=3000 threshold.jdbc=3000 threshold.sql=2000
종류 | 권장버전 |
---|---|
HSQLDB | 1.8.0 |
Mysql | 5.1.30 |
Tmax Tibero | 3.0(sp2) |
Altibase DBMS Server | 5.1.3.18 |
Oracle | 10g |
globals.properties 파일을 수정한다.
Globals.DbType = oracle
모니터링 대상 서버의 정보를 등록한다. 서버 등록참조
모니터링 대상 컨테이너 정보를 등록한다. 컨테이너 등록참조
모니터링 대상 어플리케이션 정보를 등록한다. 어플리케이션 등록참조
* Mbean 에이전트 설정참조
* 어플리케이션 에이전트 설정참조
모니터링 도구는 모니터링 대상 서버에 노출되어 있는 MBean에 접속하여 데이터를 가져오는 Mechanism으로 구성되어 있어 정보를 갖고 오기 위해서는 노출된 MBean 명을 알아야 한다.
MBean은 JDK, WAS에 따라서 export 명이 다를 수 있는데 모니터링 서버 개발 시 유연하게 사용하기 위하여 최대한 시스템에 정의된 export 명을 사용하도록 하였으며 JDK 버전에 따라서 export명이 다른 경우(예:Garbage Collection)거나 WAS에서 동일한 패턴의 export 명을 사용하는 경우 mbean.properties 파일에 MBean export 명을 정의 하였다.
모니터링 대상 서버가 정상적으로 모니터링 되지 않을 때는 아래와 같은 방식으로 확인 가능하다.
순서 | 확인 대상 | 방법 |
---|---|---|
1 | 모니터링 대상 서버 통신 확인 | jconsole 통해 RMI 접속 확인 |
2 | MBean Export Name 확인 | jconsole/POJO 통해 Export 명 확인 및 mbean.properties 확인 |
3 | jar Library 확인 | 버전에 맞는 Library 사용 권장 |
jconsole에 Server IP 및 RMI Port 등을 정확히 입력하고 접속이 가능하지 확인해본다.
JAVA SDK에 내장된 jconsole.exe를 실행하고 “Advanced” 탭 JMX URL란에 “service:jmx:rmi:///jndi/rmi://서버IP:RMI포트/jmxrmi” 입력하여 접속 후 테스트 수행한다.
모니터링 도구에서 프레임워크 모니터링 데이터를 수집하기 위해 Mbean export name을 사용한다. 현재까지 테스트 된 환경을 통해 수집된 default export name을 모니터링 도구에서 사용하고 있다.
Mbean export name
MBean 종류 | default export name | 모니터링 도구 내의 mbean 구현 방법 |
---|---|---|
Operating System | java.lang:type=OperatingSystem | ManagementFactory.OPERATING_SYSTEM_MXBEAN_NAME |
Runtime | java.lang:type=Runtime | ManagementFactory.RUNTIME_MXBEAN_NAME |
Compilation | java.lang:type=Compilation | ManagementFactory.COMPILATION_MXBEAN_NAME |
Memory | java.lang:type=Memory | ManagementFactory.MEMORY_MXBEAN_NAME |
Loaded Class | java.lang:type=ClassLoading | ManagementFactory.CLASS_LOADING_MXBEAN_NAME |
Minor GC(Sun JDK) | java.lang:type=GarbageCollector,name=Copy | mbean.properties에 정의(sun_minorGC+”,name=”+sun_minorGC_name) |
Major GC(Sun JDK) | java.lang:type=GarbageCollector,name=MarkSweepCompact | mbean.properties에 정의(sun_majorGC+”,name=”+sun_majorGC_name ) |
GC(IBM JDK) | java.lang:type=GarbageCollector,name=J9 GC | mbean.properties에 정의(ibm_GC, ibm_GC_name) |
Minor GC(Sun JDK) | java.lang:type=GarbageCollector,name=PS MarkSweep | mbean.properties에 정의(hp_minorGC+”,name=”+hp_minorGC_name) |
Major GC(Sun JDK) | java.lang:type=GarbageCollector,name=PS Scavenge | mbean.properties에 정의(hp_majorGC+”,name=”+hp_majorGC_name) |
Session(Tomcat) | Catalina:type=Manager,path | mbean.properties에 정의(tomcat_[톰캣 버전]_session필드) |
Thread(Tomcat) | Catalina:type=ThreadPool,name=http | mbean.properties에 정의(tomcat_[톰캣 버전]_thread+”,name=”+tomcat_[톰캣 버전]_thread_name) |
Session(JBoss) | jboss.web:type=Manager,path | mbean.properties에 정의(jboss_[JBoss버전]_session) |
Thread(JBoss) | jboss.web:type=ThreadPool,name=http | mbean.properties에 정의(jboss_[JBoss버전]_thread+”,name=”+jboss_[JBoss버전]_thread_name) |
JDBC(JBoss) | jboss.jca:service=ManagedConnectionPool,name | mbean.properties에 정의(jboss_[JBoss버전]_jdbc) |
Session(JEUS) | JEUS:j2eeType=JeusService,jeusType=WebEngine,JMXManager=[컨테이너명]… | 프로그램내에 정의 |
Thread(JEUS) | JEUS:j2eeType=JeusService,jeusType=ThreadPool,JMXManager=[컨테이너명]… | 프로그램내에 정의 |
JDBC(JEUS) | JEUS:j2eeType=JDBCResource,JMXManager=[컨테이너명]… | 프로그램내에 정의 |
Thread(WebLogic) | com.bea:Name=ThreadPoolRuntime,ServerRuntime=[Server 명]… | 프로그램내에 정의 |
JDBC(WebLogic) | com.bea:Name=[Server 명]…Type=JDBCServiceRuntime | 프로그램내에 정의 |
ModelExtract | bean:name=EgovModelExtractMBean | mbean.properties(spring_model) 및 context-monitoring-mbean.xml |
Schedule | bean:name=EgovScheduleExtractMBean | mbean.properties(spring_schedule) 및 context-monitoring-mbean.xml |
EhCache | bean:name=EgovCacheInfoMBean | mbean.properties(spring_cache) 및 context-monitoring-mbean.xml |
프레임워크 모니터링 항목에 해당하는 각각의 export name을 알기 위해서는 JConsole이나 POJO 프로그램을 이용한다. JConsole을 사용하거나 POJO 프로그램을 이용하여 모니터링 대상 서버에 export 된 MBean List를 획득 후 default export MBean 명과 비교해보고, 제공하는 MBean export 명이 다른 경우 MBean.properties 파일을 수정하여야 한다.
Properties 명 | 위치 |
---|---|
MBean.properties | monitoring-web.war 의 monitoring-web/WEB-INF/classes/egovframework/egovProps |
context-monitoring-MBean.xml | 실행환경의 egovframework/spring/ |
2-1. Jconsole 을 이용하여 JVM에 노출된 MBean Export Name 확인하는 방법
2-2. Java POJO 프로그램을 이용하여 WAS에 노출된 Export Name 확인하는 방법
POJO 실행명령 javac -classpath .:[was library|none] JvmMBean.java java -classpath .:[was library|none] JvmBean 127.0.0.1 8992
import java.io.IOException; import java.lang.management.ManagementFactory; import java.util.Hashtable; import java.util.Iterator; import java.util.Set; import javax.management.AttributeNotFoundException; import javax.management.InstanceNotFoundException; import javax.management.MBeanException; import javax.management.MBeanServerConnection; import javax.management.MalformedObjectNameException; import javax.management.ObjectInstance; import javax.management.ObjectName; import javax.management.ReflectionException; import javax.management.remote.JMXConnector; import javax.management.remote.JMXServiceURL; import javax.naming.InitialContext; import javax.naming.NamingException; public class JvmMBean { public static void main(String[] args) throws IOException, NamingException, MalformedObjectNameException, NullPointerException, InterruptedException { // args[0] : server IP // args[1] : rmi port JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://"+args[0]+":"+args[1]+"/jmxrmi"); JMXConnector conn = javax.management.remote.JMXConnectorFactory.connect(url, null); MBeanServerConnection mbsc = conn.getMBeanServerConnection(); Set jvmMBean = mbsc.queryMBeans(null, null); for (Iterator i = jvmMBean.iterator(); i.hasNext();) { ObjectName objName = ((ObjectInstance) i.next()).getObjectName(); System.out.println("[JMX MBean] " + objName); } } }
JVM, JEUS, JBoss, Tomcat, WebLogic Export Name 확인을 위한 POJO 프로그램: mbean_pojo.zip
✔ 주의: JDK 또는 WAS에 모니터링 대상 항목을 아예 노출하지 않은 경우 즉, MBean Export 항목 없을 경우에는 모니터링 할 수가 없으므로 대상에서 제외하여야 한다.
현재 테스트 된 WAS는 아래와 같으며 war파일에도 이와 동일한 버전의 Library가 포함되어 있다. 위의 jconsole, MBean POJO 테스트를 수행하고도 모니터링이 비정상적으로 수행 될 경우 버전에 맞는 Library를 사용하기를 권장한다.
이름 | 권장버전 | 자바호환성 |
---|---|---|
Tmax JEUS | 6.0.5 | clientcontainer.jar |
javaee.jar | ||
jclient.jar | ||
jeus.jar | ||
jeusapi.jar | ||
jeusjaxb.jar | ||
jeusmp.jar | ||
jeusutil.jar | ||
jms.jar | ||
jmxremote.jar | ||
Oracle WebLogic Server | 9.2 | weblogic.jar |
wlclient.jar | ||
wljmxclient.jar | ||
10g(10.2) | wlfullclient.jar | |
wlclient.jar | ||
wljmxclient.jar | ||
11g(10.3) | wlfullclient.jar | |
wlclient.jar | ||
wljmxclient.jar | ||
Jboss application platform | 4.3.0 | jbossall-client.jar |
jnpserver.jar | ||
jms.jar | ||
5.1.0 | jbossall-client.jar | |
jbossjmx-ant.jar | ||
jbosssx-as-client.jar | ||
jboss-client.jar | ||
jboss-common-core.jar | ||
jboss-integration.jar | ||
jboss-j2se.jar | ||
jboss-logging-jdk.jar | ||
jboss-logging-log4j.jar | ||
jboss-logging-spi.jar | ||
jboss-metadata.jar | ||
jboss-remoting.jar | ||
jboss-security-spi.jar | ||
jboss-serialization.jar | ||
jmx-client.jar | ||
jmx-invoker-adaptor-client.jar | ||
jnp-client.jar | ||
6.0.0 M5 | jbossall-client.jar | |
jboss-client.jar | ||
jboss-common-core.jar | ||
jboss-integration.jar | ||
jobss-j2se.jar | ||
jboss-jms-api_1.1_spec.jar | ||
jboss-jmx.jar | ||
jboss-jmx-annotations.jar | ||
jbossjmx-ant.jar | ||
jboss-metadata-client.jar | ||
jboss-metadata-common.jar | ||
jboss-metadata-ear.jar | ||
jboss-metadata-ejb.jar | ||
jboss-metadata-rar.jar | ||
jboss-metadata-war.jar | ||
jboss-remoting.jar | ||
jboss-remoting-3.jar | ||
jboss-security-spi.jar | ||
jboss-serialization.jar | ||
jbosssx-as-client.jar | ||
jbosssx-client.jar | ||
jboss-system-client.jar | ||
jboss-system-jmx-client.jar | ||
jmx-invoker-adaptor-client.jar | ||
jnp-client.jar | ||
Apache Tomcat | 6.0.29 |
✔ 주의: 모니터링 운영 서버는 같은 WAS의 서로 다른 버전을 모니터링 하는 경우 즉 JEUS 5.0, JEUS6.0 등이 혼재된 상황에서는 수행이 되지 않는다.
웹 어플리케이션 서버 기동시 jarfile is not loaded 라는 에러 메시지가 나오면 해당 라이브러리를 Wide Library폴더로 이동해야 한다.
*WAS 별 Wide Library
WAS | Wide Library |
---|---|
jeus | JEUS_HOME/lib/application |
tomcat | CATALINA_HOME/lib |
jboss | JBOSS_HOME/lib |
weblogic | WEBLOGIC_HOME/lib |
Selvlet 2.4 Spec SRV.9.7.2 Web Application Class Loader 참조 |
---|
SRV.9.7.2 Web Application Class Loader |
The class loader that a container uses to load a servlet in a WAR must allow the developer to load any resources contained in library JARs within the WAR following normal J2SE semantics using getResource. As described in the J2EE license agreement, servlet containers that are not part of a J2EE product should not allow the application to override J2SE platform classes, such as those in the java.*and javax.* namespaces, that J2SE does not allow to be modified. Also, servlet containers that are part of a J2EE product should not allow the application to override J2SE or J2EE platform classes, such as those in java.* and javax.* namespaces, that either J2SE or J2EE do not allow to be modified. The container should not allow applications to override or access the container’s implementation classes. It is recommended also that the application class loader be implemented so that classes and resources packaged within the WAR are loaded in preference to classes and resources residing in container-wide library JARs. |