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>
모니터링 운영관리 도구의 Main 화면에서 보여지는 어플리케이션 모니터링 항목의 임계치는 infrared-web.properties에서 관리하고 있다.
따라서 infrared-web.properties에는 어플리케이션 모니터링데이타 저장주기 및 어플리케이션 모니터링 항목에 대한 임계치가 기본값으로 설정되어 있으며 필요할 시 파일에서 그 값을를 조정한다.
<표 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
모니터링 운영관리 도구에 필요한 정보를 저장하거나 관리하기 위해 표에서 나열된 Database 테이블 생성 Script를 제공하고 있다. dbscript.zip다운로드
종류 | 권장버전 | 비고 |
---|---|---|
HSQLDB | 1.8.0 | HSQLDB는 In-process로 동작 |
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 에이전트가 운영관리 도구에 전송할 정보(Cpu, memory,Thread,Session,jdbc)의 모니터령 여부와 전송주기, 임계치 설정 등의 기능과 어플리케이션 에이전트 property 경로, 각 layser별 모니터링 여부 및 전송주기 등을 설정하는 기능을 제공한다.
* Mbean 에이전트 설정참조
* 어플리케이션 에이전트 설정참조
모니터링 도구는 모니터링 대상 서버에서 export된 MBean에 접속하여 데이터를 가져오는 아키텍처로 구성되어 있고 정보를 갖고 오기 위해서는 export된 MBean 명을 알아야 한다.
MBean은 JMX에 제시된 표준에 따라 구현해야 하나, 벤더별 JDK, WAS에 따라서 일부 서비스의 Mbean export 명이 달라, 동일한 서비스 정보(예:cpu 사용현황)를 갖고 오기 위해서 각 JDK나 WAS별로 제공하는 표준화되지 않은 export 명을 사용하여야 한다.
따라서, 표준화된 export 명이 아닌 경우는 mbean.properties 파일에 jdk별, was별로 MBean export 명을 정의하여 운영관리도구에서 데이타 수신시 mbean.properties 에 정의된
export 명을 참조하여 각각을 구분하여 데이타를 수신하도록 구성하였다.
모니터링 대상 서버가 정상적으로 모니터링 되지 않을 때는 원인을 찾기 위해 아래와 같은 방식으로 확인한다.
순서 | 대상 | 절차 | 방법 |
---|---|---|---|
1 | 모니터링 대상 서버 | RMI 통신 확인 | 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” 입력하여 접속 후 테스트 수행한다.
접속이 되지 않는다면 WAS의 RMI 서비스가 작동중인지, 설정이 정상적으로 되었는지 확인해 본다.
모니터링 도구에서 모니터링 대상 서버의 데이터를 수집하기 위해 Mbean export name을 사용한다. 현재까지 테스트된 환경을 통해 수집된 default export name을 모니터링 도구에서 사용하고 있다.
Mbean export name
서비스정보 | 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) |
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 | wlclient.jar |
wljmxclient.jar | ||
10g(10.2) | wlclient.jar | |
wljmxclient.jar | ||
11g(10.3) | 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폴더로 이동해야 한다. ( Ex. javaee.jar, clientcontainer.jar, jclient.jar )
*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. |