Java Agent 설치
1. 모듈 설명
exem-java-agent는 Java VM 기반 프로세스에서 실행되는 WAS의 트랜잭션, SQL, 예외, 리소스 사용량을 수집하여 ExemONE 수집 서버(Receiver)로 전송하는 모니터링 에이전트입니다.
2. 지원 환경
| 항목 | 내용 |
|---|---|
| Runtime | JDK 8 ~ 26 (JDK 8 미만은 별도 문의 — 지원 불가가 아니라 에이전트 수정 후 배포 가능. JDK 26 은 v3.0.25.9+ 는 그 이전은 JDK 8~23) |
| Platform | On-premise Docker Kubernetes |
| WAS | Tmaxsoft JEUS Apache Tomcat IBM WebSphere Red Hat JBoss Oracle WebLogic Undertow Atlassian 제품군 Liferay |
| Framework | Servlet (javax) Servlet (jakarta) Apache Camel Spring WebFlux (reactive) Vert.x Kafka (consume) (x.advice 의 consume 엔트리는 기본 주석 — 환경에 따라 선택 활성화해 사용. 에이전트 내부에 kafka consume 을 트랜잭션으로 처리하는 로직 존재) |
| DB | MongoDB driver v2.x/v3.x Oracle PostgreSQL MySQL MariaDB MSSQL DB2 Informix Sybase SAP HANA Altibase PPAS CUBRID Tibero Apache Cassandra ClickHouse |
| Protocol | TCP 9010 → Receiver |
| Prereq | JVM 기반 WAS 중 하나 필요 |
3. 통신 포트
| 출발지 | 도착지 | 프로토콜 | 포트 | 용도 |
|---|---|---|---|---|
| 모니터링 대상 서버 (WAS) | ExemONE 수집 서버 (Receiver) | TCP | 9010 | 에이전트-수집서버 통신 |
모니터링 대상 서버에서 ExemONE 수집 서버 방향으로 9010 포트가 개방되어 있어야 합니다.
4. 설치 방법
환경에 따라 3가지 설치 방식을 지원합니다.
| 설치 방식 | 적합 환경 | 특징 |
|---|---|---|
| On-Premise 설치 | 물리 서버, VM | tar.gz 압축 해제 후 JVM 옵션 설정 |
| InitContainer 방식 | Kubernetes | 애플리케이션 재빌드 없이 initContainer로 설치 |
| Dockerfile Rebuild 방식 | Kubernetes, Docker | Dockerfile에 에이전트를 포함하여 이미지 빌드 |
4-1. On-Premise 설치
1. 패키지 압축 해제
tar xvzf EXEM-JAVA-AGENT-[version].tar.gz
2. Receiver 연결 설정
{설치 경로}/exem/java/cfg/agent/java.conf 파일의 RECEIVER_ADDR에 ExemONE 수집 서버 주소를 입력합니다.
RECEIVER_ADDR=<수집서버 IP>:9010
3. JVM 옵션 설정
WAS 시작 스크립트에 아래 JVM 옵션을 추가합니다. 설정은 WAS 재기동 후 적용됩니다.
Tomcat 예시 ($CATALINA_HOME/bin/catalina.sh 또는 setenv.sh):
JAVA_OPTS="$JAVA_OPTS -Dexem.groupid=default -Dexem.agent.name=tomcat_agent -Dexem.bid=$(hostname) -javaagent:/home/exem/java/lib/exem-java-agent.jar"
JVM 옵션 설명:
| JVM 옵션 | 설명 | 비고 |
|---|---|---|
-Dexem.groupid | ExemONE Setting > Application > WAS Group 이름 | |
-Dexem.agent.name | ExemONE 화면에 표시될 WAS 이름 | |
-Dexem.bid | exem-host-agent와 연결하기 위한 키. 보통 $(hostname) 사용 | 리소스 연동 시 필요 |
-javaagent | exem-java-agent.jar 파일의 절대 경로 | 필수 |
JDK 9 이상 필수 추가 옵션:
JDK 9부터 Java 모듈화로 인해 CPU/Memory 사용량 수집에 아래 옵션을 추가해야 합니다.
--add-opens jdk.management/com.sun.management.internal=ALL-UNNAMED
HTTP 외부호출 수집 옵션 (선택):
Java 기본 패키지를 통한 HTTP 외부호출 데이터 수집이 필요한 경우 아래 옵션을 추가합니다.
--add-opens=java.base/sun.net.www.http=ALL-UNNAMED
--add-opens=java.base/sun.net.www.protocol.http=ALL-UNNAMED
--add-exports=java.base/sun.net.www=ALL-UNNAMED
JDK 9 이상 전체 예시:
JAVA_OPTS="$JAVA_OPTS -Dexem.groupid=default -Dexem.agent.name=tomcat_agent -Dexem.bid=$(hostname) -javaagent:/home/exem/java/lib/exem-java-agent.jar --add-opens jdk.management/com.sun.management.internal=ALL-UNNAMED"
4-2. InitContainer 방식 (Kubernetes)
애플리케이션을 재빌드하지 않고 Pod의 initContainer로 에이전트를 설치하는 방법입니다.
사전 조건:
- kubectl 명령어를 실행할 수 있는 환경이 필요합니다.
- 설치 대상 Deployment YAML에 ExemONE 환경변수를 추가해야 합니다.
설치 패키지 구성:
| 파일 | 용도 |
|---|---|
exem-java-agent-inst_x.x.x.x.tgz | initContainer용 Docker 이미지 |
configmap.yml | 환경변수·설정파일 ConfigMap 정의 |
1. ConfigMap 생성
아래 두 개의 ConfigMap을 생성합니다.
exem-java-agent-env (JVM 옵션 환경변수):
apiVersion: v1
kind: ConfigMap
metadata:
name: exem-java-agent-env
namespace: {{namespace 지정}}
data:
startup_opt: "-javaagent:/exem/java/lib/exem-java-agent.jar -Dexem.run.on.container=true"
exem-java-agent-config (에이전트 설정파일):
apiVersion: v1
kind: ConfigMap
metadata:
name: exem-java-agent-config
namespace: {{namespace 지정}}
data:
java.conf: |
RECEIVER_ADDR={{수집서버 주소 지정}}
db.alias: |
# ip.port.databasename=alias
local.advice: |
!javax/servlet/http/HttpServlet.*
2. Deployment YAML 수정
기존 Deployment YAML의 spec.template.spec에 아래 내용을 추가합니다.
spec:
template:
spec:
volumes:
- name: exem-volume
emptyDir: {}
- name: config-volume-java-agent
configMap:
name: exem-java-agent-config
initContainers:
- name: install-exem-java-agent
image: exem-java-agent-inst:x.x.x
imagePullPolicy: IfNotPresent
volumeMounts:
- name: exem-volume
mountPath: /exem
- name: config-volume-java-agent
mountPath: "/exem-config"
readOnly: true
containers:
- name: <application-name>
volumeMounts:
- name: exem-volume
mountPath: /exem
env:
- name: EXEM_GROUP_ID
value: "{{group id 지정}}"
- name: EXEM_RUN_ON_CONTAINER
value: "true"
- name: EXEMWID
valueFrom:
fieldRef:
fieldPath: metadata.uid
- name: EXEM_JAVA_AGENT_NAME
value: "{{agent name 지정}}"
환경변수 설명:
| 환경변수 | 설명 | 비고 |
|---|---|---|
EXEM_GROUP_ID | WAS 그룹 ID | 미설정 시 default |
EXEM_RUN_ON_CONTAINER | 컨테이너 환경 동작 여부 | 컨테이너: true, On-Premise: false(기본값) |
EXEMWID | 컨테이너 연계를 위한 키 | EXEM_RUN_ON_CONTAINER=true 설정 시에만 적용 |
EXEM_JAVA_AGENT_NAME | WAS 이름 | v3.0.24.16부터 환경변수 지원 |
EXEM_RECEIVER_ADDR | 수집 서버 주소 (IP:포트) | v3.0.24.16부터 환경변수 지원 |
설정값 우선순위:
JVM 옵션, 환경변수, 설정 파일 3가지 방식으로 지정할 수 있으며 아래 순서로 우선합니다.
| 설정 항목 | 우선순위 (높음 → 낮음) |
|---|---|
| GROUP_ID | -Dexem.groupid= > EXEM_GROUP_ID > 설정 파일 |
| RUN_ON_CONTAINER | -Dexem.run.on.container= > EXEM_RUN_ON_CONTAINER > 설정 파일 |
| AGENT_NAME | -Dexem.agent.name= > EXEM_JAVA_AGENT_NAME > 설정 파일(EXEM_AGENT_NAME) |
| RECEIVER_ADDR | -Dexem.receiver.addr= > EXEM_RECEIVER_ADDR > 설정 파일(RECEIVER_ADDR) |
3. Tomcat 사용 시 (선택)
제공된 exem-java-agent-env ConfigMap을 사용하여 CATALINA_OPTS에 에이전트 옵션을 적용합니다.
4-3. Dockerfile Rebuild 방식
설치 대상 애플리케이션의 Dockerfile에 에이전트를 포함하여 이미지를 빌드하는 방식입니다.
1. 패키지 업로드 및 압축 해제
이미지를 재빌드하는 서버에 패키지를 업로드한 후 압축을 해제합니다.
tar -xvzf EXEM-JAVA-AGENT-3.x.x.tar.gz
rm -f EXEM-JAVA-AGENT-3.x.x.tar.gz
2. Dockerfile에 에이전트 설정 추가
COPY {패키지_경로}/exem {애플리케이션내경로}/exem
ENV EXEM_GROUP_ID={group_id}
ENV EXEM_RECEIVER_ADDR={IP:PORT}
ENV JAVA_OPTS={JAVA_OPTS}
예시:
COPY /home/exemone/exem /home/exem
ENV EXEM_GROUP_ID=default
ENV EXEM_RECEIVER_ADDR=<수집서버 IP>:9010
ENV JAVA_OPTS="$JAVA_OPTS -Dexem.groupid=$EXEM_GROUP_ID -Dexem.agent.name=tomcat_agent -javaagent:/exem/java/lib/exem-java-agent.jar -Dexem.run.on.container=true"
3. Docker 이미지 빌드
docker build --tag {docker-user-id}/{repository-name} .
4. Deployment 적용
Deployment YAML에 ExemONE 환경변수를 추가한 후 배포합니다.
kubectl apply -f app-deployment.yaml
5. 설치 확인
5-1. Agent 로그 확인
에이전트 로그에서 정상 기동 여부를 확인합니다.
tail -f {설치경로}/exem/java/logs/exem-java-agent[버전].log
정상 기동 시 아래와 같은 로그가 출력됩니다.
[INFO ] [main] LOAD [com.exemone.ext.XM_BOUND_X]
[INFO ] [main] LOAD [com.exemone.ext.XM_RT]
[INFO ] [main] EXEM AGENT EXT [...]
[INFO ] [main] 3.0.23
5-2. ExemONE 화면 확인
Application > WAS 화면에서 해당 WAS가 Active 상태인지 확인합니다.
WAS가 Active 상태가 아닌 경우 수집 서버 ↔ WAS 서버 간 네트워크 및 9010 포트 방화벽 설정을 확인하세요.