Java Agent 설치하기
exem-java-agent는 Java VM 기반 프로세스에서 실행되는 WAS의 트랜잭션, SQL, 예외, 리소스 사용량을 수집하여 ExemONE 수집 서버(Receiver)로 전송하는 모니터링 에이전트입니다.
지원 환경
Java 버전
| 항목 | 지원 버전 |
|---|---|
| JDK | 8 이상, 23 이하 |
애플리케이션 서버
| WAS | 지원 버전 |
|---|---|
| Tmaxsoft JEUS | 7.x 이상 |
| Oracle WebLogic | 12.x 이상 |
| Apache Jakarta Tomcat | 8.x 이상 |
| IBM WebSphere | 8.5.x 이상 |
| Red Hat JBoss | 7.x 이상 |
| Undertow | 지원 |
SQL 추적 지원 데이터베이스
| 데이터베이스 |
|---|
| Oracle Database |
| PostgreSQL |
| MySQL |
| MariaDB |
| Microsoft SQL Server |
| DB2 |
| Informix |
| Sybase |
| SAP HANA |
| Altibase |
| PPAS |
| CUBRID |
| Tibero |
| MongoDB |
| Apache Cassandra |
| ClickHouse |
통신 포트
| 출발지 | 도착지 | 프로토콜 | 포트 | 용도 |
|---|---|---|---|---|
| 모니터링 대상 서버 (WAS) | ExemONE 수집 서버 (Receiver) | TCP | 9010 | 에이전트-수집서버 통신 |
모니터링 대상 서버에서 ExemONE 수집 서버 방향으로 9010 포트가 개방되어 있어야 합니다.
설치 방법
환경에 따라 3가지 설치 방식을 지원합니다.
| 설치 방식 | 적합 환경 | 특징 |
|---|---|---|
| On-Premise 설치 | 물리 서버, VM | tar.gz 압축 해제 후 JVM 옵션 설정 |
| InitContainer 방식 | Kubernetes | 애플리케이션 재빌드 없이 initContainer로 설치 |
| Dockerfile Rebuild 방식 | Kubernetes, Docker | Dockerfile에 에이전트를 포함하여 이미지 빌드 |
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"
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에 에이전트 옵션을 적용합니다.
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
설치 확인
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
ExemONE 화면 확인
Application > WAS 화면에서 해당 WAS가 Active 상태인지 확인합니다.
WAS가 Active 상태가 아닌 경우 수집 서버 ↔ WAS 서버 간 네트워크 및 9010 포트 방화벽 설정을 확인하세요.