제니퍼 아키텍처는 엔터프라이즈 자바 애플리케이션을 부하없이 실시간으로 모니터링하는 것을 기본적인 목표로 한다.
제니퍼의 기본 구조
제니퍼는 제니퍼 에이전트, 제니퍼 독립 에이전트, 제니퍼 서버, 그리고 제니퍼 클라이언트로 구성되어 있다.
제니퍼 에이전트와 제니퍼 독립 에이전트는 다양한 성능 데이터를 수집하고 이를 제니퍼 서버에 전송한다. 제니퍼 서버는 제니퍼 에이전트와 제니퍼 독립 에이전트로부터 전송받은 성능 데이터를 가공하여 파일과 데이터베이스에 저장하고, 사용자, 권한 그리고 메뉴 등에 대한 구성 정보를 관리한다. 마지막으로 제니퍼 클라이언트는 성능 데이터를 직관적으로 모니터링하는데 적합한 웹 기반의 사용자 인터페이스를 제공한다.
제니퍼 자바 에이전트
제니퍼 에이전트는 다양한 성능 데이터를 수집하고 이를 제니퍼 서버에 전송하는 일을 담당한다. 제니퍼 자바 에이전트가 수집하는 성능 데이터의 출처는 자바 애플리케이션인데 일반적으로는 Web Application Server에서 동작하는 웹 애플리케이션이다.
Web Application Server에서 동작하는 자바 애플리케이션 뿐만 아니라 독립적으로 동작하는 자바 애플리케이선도 제니퍼 에이전트로 모니터링할 수 있다.(단, JDK 1.3 이상).
따라서 제니퍼 에이전트는 자바 애플리케이션과 내부적으로 결합해서(embeded) 동작한다. 즉, 제니퍼 에이전트와 자바 애플리케이션은 동일한 자바 가상 머신(Java VIrtual Machine, 이하 JVM) 프로세스 위에서 동작한다.
제니퍼 자바 에이전트는 내부적으로 3가지 모듈, 즉 Instrumentation, Native, Base 모듈로 구성된다.
Instrumentation 모듈 - 모니터링을 하려는 자바 애플리케이션의 소스 코드를 수정하지 않고 성능 데이터 수집에 필요한 추적 코드와 프로파일 정보 추출 코드를 자바 애플리케이션을 구성하는 클래스에 삽입할 수 있어야 한다. Instrumentation 모듈은 이를 담당하는데 제니퍼에서는 LWST(Light Weight StackTrace) 모듈으로도 불린다.
Native 모듈 - JNI(Java Native Interface)로 호출하는 C 라이브러리이다. 이 모듈은 제니퍼 에이전트를 설치한 자바 애플리케이션이 운영되는 하드웨어의 CPU 사용률과 시스템 메모리 사용량 등을 수집하는 역할을 담당한다. Native 모듈은 운영 체계에 맞추어 컴파일되어 so 혹은 dll 파일 형식으로 제니퍼 패키지에 포함되어 있다.
Base 모듈 - 다양한 성능 데이터를 수집하고 수집한 성능 데이터를 일차적으로 가공하여 제니퍼 서버에 전송하는 역할을 담당한다.
제니퍼 닷넷 에이전트
닷넷 에이전트는 다양한 성능 데이터를 수집하고 이를 제니퍼 서버에 전송하는 일을 담당한다.
컴파일된 모듈은 DLL로 구성되며, IIS(Internet Information Services)에서 동작하는 웹 애플리케이션을 모니터링하는 하는 경우 w3wp.exe 프로세스의 같은 주소 공간내에서 웹 애플리케이션과 함께 동작한다.
닷넷 에이전트는 내부적으로 크게 2가지 모듈, 즉 IL 코드를 직접 변경하는 .NET Profiler COM 개체와 제니퍼 서버와의 통신을 담당하는 닷넷 에이전트 모듈로 구성된다.
.NET Profiler COM 개체 - Native 모듈로, CLR 에서 제공되는 Profiler COM 인터페이스를 구현하고 IL 코드를 변경하는 역할을 한다.
닷넷 에이전트 모듈 - .NET Profiler COM 개체에 의해 실행시에 동적으로 프로파일링 대상이 되는 응용 프로그램과 연결되어, AppDomain 단위로 다양한 성능 데이터를 수집, 가공하여 제니퍼 서버에 전송하는 역할을 담당한다.
제니퍼 독립 에이전트
제니퍼 에이전트는 모니터링을 하려는 자바 애플리케이션과 내부적으로 결합해서 동작한다. 하지만 자바 애플리케이션과는 상관이 없는 다른 영역에서 성능 데이터를 수집할 필요도 있다. 예를 들어, 업무 데이터베이스가 운영되는 하드웨어의 CPU 사용률이나 임의의 운영 체계에서 특정 스크립트를 실행해서 얻은 결과 등을 성능 데이터로 수집할 필요가 있을 수 있다. 바로 이를 가능하게 해주는 것이 제니퍼 독립 에이전트이다.
제니퍼 독립 에이전트는 미리 정의된 규약과 형식이 없는 비정형 성능 데이터를 수집한다.
제니퍼 독립 에이전트는 어떤 것을 구체적으로 지칭하는 것이 아니라 WMOND, REMON, LogWatcher 등의 모듈들을 논리적으로 지칭하는 용어이다.
WMOND
임의의 하드웨어에 대한 시스템 CPU 사용률 데이터를 수집하는 모듈이다. 이 모듈은 C언어로 개발되어 있고 사용 방법이 간단하다.
REMON
비정형 성능 데이터를 수집하는 경우에 데이터의 출처에 따라서 데이터를 수집하는 방법은 달라지지만, 수집한 데이터를 관리하고 제니퍼 서버에 전송하는 것은 공통 모듈로 해결할 수 있다. 바로 REMON이 성능 데이터의 수집 방법을 유연하게 확장하게 하고, 수집된 성능 데이터를 제니퍼 서버로 전송하는 역할을 하는 공통적인 서비스이다.
REMON을 사용하면, 임의의 운영 체계에서 임의의 스크립트를 실행시키거나, 임의의 데이터베이스에 대해서 임의의 SQL을 수행시키거나, 특정 자바 인터페이스를 구현한 자바 클래스를 실행시키는 방법으로 비정형 성능 데이터를 간편하게 수집하여 제니퍼 서버에 전송할 수 있다.
REMON 자체는 자바 언어로 구현된 애플리케이션이다.
LogWatcher
로그 감시기의 역할을 수행하는 모듈이다. LogWatcher는 텍스트 로그 파일에서 임의로 지정한 패턴을 검출하고 이벤트를 발생시켜서 관련 데이터를 제니퍼 서버에 전송하는 역할을 담당한다. 그러면 사용자는 제니퍼 서버를 통해서 이를 감지할 수 있게 된다.
제니퍼 서버
제니퍼 서버는 제니퍼 에이전트와 제니퍼 독립 에이전트로부터 전송받은 성능 데이터를 가공하여 파일과 데이터베이스에 저장하고, 사용자, 권한 그리고 메뉴 등에 대한 구성 정보를 관리한다.
하나의 제니퍼 서버가 담당하는 제니퍼 에이전트의 숫자가 많을 수 있다. 따라서 제니퍼 서버는 이런 상황에서 발생하는 높은 부하를 적절하게 처리할 수 있도록 설계되어 있다. 이를 위해서 제니퍼 서버는 내부적으로 크게 3가지 모듈, 즉 Agent Data Collector, Data Manager, Client Service Provider 모듈로 구성된다.
Agent Data Collector 모듈 - 제니퍼 에이전트와 제니퍼 독립 에이전트가 UDP로 보내는 성능 데이터를 수신하고, 10분마다 반복적으로 개별 제니퍼 에이전트에 TCP 요청을 보내서 애플리케이션 처리 현황 통계 데이터를 수집하는 역할을 담당하는 모듈이다.
Data Manager 모듈 - Agent Data Collector 모듈이 수집한 성능 데이터를 파일과 데이터베이스에 저장하는 역할을 담당한다. 기본적으로 제니퍼 서버는 내장 데이터베이스(아파치 더비)를 사용하는데, 상황에 따라서 오라클 데이터베이스나 IBM DB2 등을 사용 할 수도 있다.
Client Service Providor 모듈 - 제니퍼 클라이언트가 사용자 인터페이스를 구성하는데필요한 서비스와 데이터를 제공하는 역할을 담당한다.
제니퍼 서버는 3가지 주요 모듈 이외에도 스케줄러, 보고서, 구성 관리 모듈 등을 포함하고 있다.
제니퍼 클라이언트
제니퍼는 성능 데이터를 직관적으로 모니터링하는데 적합한 사용자 인터페이스를 제공하고 있으며 이를 제니퍼 클라이언트라고 한다. 기본적으로 제니퍼 클라이언트는 접근성을 높이기 위해서 XHTML, CSS, 자바스크립트, AJAX 등의 기술로 구현한 웹에 기반하고 있기 때문에 사용자는 웹 브라우저를 통해서 제니퍼를 사용한다.
그리고 성능 데이터의 변화 추이를 실시간으로 모니터링하는데 적합한 다양한 차트를 자바 애플릿으로 구현하여 제공한다. 따라서 제니퍼 클라이언트를 사용하려면 자바 플러그인 6.0 이상을 설치한 웹 브라우저가 필요하다.
제니퍼 서버와 제니퍼 클라이언트의 시간이 일치하지 않는 경우에, 제니퍼 클라이언트에 표시되는 데이터의 시간은 제니퍼 서버의 시간을 기준으로 한다.