Java 애플리케이션을 운영하면서 가장 중요한 것 중 하나는 모니터링입니다. 특히 메모리 사용량, 스레드 상태, 가비지 컬렉션 성능 등을 실시간으로 추적하는 것은 시스템 안정성에 필수적이죠.
오늘은 JMX(Java Management Extensions)와 Datadog을 연동하여 Java 애플리케이션의 핵심 메트릭을 수집하는 방법을 단계별로 알아보겠습니다. 💡

📋 목차
⚙️ JMX 설정하기
먼저 Java 애플리케이션에서 JMX를 활성화해야 합니다. JMX를 통해 애플리케이션의 내부 상태를 외부에서 모니터링할 수 있게 되죠.
애플리케이션 시작 시 다음과 같은 JVM 옵션을 추가해주세요:
war라면 톰캣/bin/setenv.sh
JMX_OPTS="-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=${JMX_PORT} \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-Dhikaricp.registerMbeans=true \
-Dhikari.registerMbeans=true \
-Dcom.zaxxer.hikari.registerMbeans=true \
-Djava.rmi.server.hostname=${SERVER_IP}"
🔧 설정 옵션 설명
- jmxremote.port: JMX 서버가 바인딩될 포트 번호
- jmxremote.authenticate=false: 인증을 비활성화 (개발/테스트 환경용)
- jmxremote.ssl=false: SSL 암호화를 비활성화
- hikaricp.registerMbeans=true: HikariCP 커넥션 풀 메트릭을 JMX에 등록
- java.rmi.server.hostname: RMI 서버의 호스트명 지정
💡 참고: 프로덕션 환경에서는 보안을 위해 인증과 SSL을 활성화하는 것을 권장합니다.
🐕 Datadog 에이전트 구성
이제 Datadog 에이전트가 JMX 메트릭을 수집하도록 설정해봅시다.
1. 설정 파일 위치
Datadog 에이전트의 JMX 설정 파일은 다음 경로에 있습니다:
/etc/datadog-agent/conf.d/jmx.d/conf.yaml
2. 기본 연결 설정
init_config:
is_jmx: true
collect_default_metrics: true
instances:
- host: localhost
port: ${JMX_PORT}
user: ${JMX_USER}
password: ${JMX_PASSWORD}
name: my-application-jmx
collect_default_jvm_metrics: true
🔐 보안 설정
실제 운영 환경에서는 다음과 같은 추가 보안 설정을 고려해보세요:
# SSL 설정
trust_store_path: /path/to/truststore.jks
trust_store_password: ${TRUST_STORE_PASSWORD}
rmi_registry_ssl: true
# 클라이언트 인증
key_store_path: /path/to/keystore.jks
key_store_password: ${KEY_STORE_PASSWORD}
📊 모니터링할 핵심 메트릭
이제 어떤 메트릭을 수집할지 정의해봅시다. Java 애플리케이션의 성능을 제대로 모니터링하려면 다음과 같은 영역의 메트릭이 필요합니다:
🧠 1. 메모리 관련 메트릭
conf:
# 힙 메모리 사용량
- include:
domain: java.lang
bean: java.lang:type=Memory
attribute:
HeapMemoryUsage.used:
metric_type: gauge
alias: jvm.heap_memory
NonHeapMemoryUsage.used:
metric_type: gauge
alias: jvm.non_heap_memory
# 메모리 풀 세부 정보
- include:
domain: java.lang
bean_regex: "java.lang:type=MemoryPool,name=.*"
attribute:
Usage:
metric_type: gauge
alias: jvm.memory_pool.usage
PeakUsage:
metric_type: gauge
alias: jvm.memory_pool.peak_usage
🧵 2. 스레드 상태 메트릭
# 스레드 관련 정보
- include:
domain: java.lang
bean: java.lang:type=Threading
attribute:
ThreadCount:
metric_type: gauge
alias: jvm.thread.count
DaemonThreadCount:
metric_type: gauge
alias: jvm.thread.daemon
PeakThreadCount:
metric_type: gauge
alias: jvm.thread.peak
TotalStartedThreadCount:
metric_type: counter
alias: jvm.thread.started
🗑️ 3. 가비지 컬렉션 메트릭
# GC 성능 모니터링
- include:
domain: java.lang
bean_regex: "java.lang:type=GarbageCollector,name=.*"
attribute:
CollectionCount:
metric_type: monotonic_count
alias: jvm.gc.collection_count
CollectionTime:
metric_type: gauge
alias: jvm.gc.collection_time
📚 4. 클래스 로딩 메트릭
# 클래스 로더 정보
- include:
domain: java.lang
bean: java.lang:type=ClassLoading
attribute:
LoadedClassCount:
metric_type: gauge
alias: jvm.classes.loaded
UnloadedClassCount:
metric_type: monotonic_count
alias: jvm.classes.unloaded
💻 5. 시스템 리소스 메트릭
# CPU 및 파일 디스크립터
- include:
domain: java.lang
bean: java.lang:type=OperatingSystem
attribute:
ProcessCpuLoad:
metric_type: gauge
alias: jvm.cpu.process_load
SystemCpuLoad:
metric_type: gauge
alias: jvm.cpu.system_load
OpenFileDescriptorCount:
metric_type: gauge
alias: jvm.fd.count
🌐 6. 애플리케이션별 메트릭 (Tomcat 예시)
# Tomcat 스레드 풀 모니터링
- include:
domain: Catalina
bean_regex: "Catalina:type=ThreadPool,name=.*"
attribute:
currentThreadCount:
metric_type: gauge
alias: tomcat.threads.count
currentThreadsBusy:
metric_type: gauge
alias: tomcat.threads.busy
🚀 설정 적용 및 확인
1. 설정 파일 저장 후 에이전트 재시작
sudo systemctl restart datadog-agent
2. 연결 상태 확인
sudo datadog-agent jmx list_matching_attributes
3. 메트릭 수집 확인
sudo datadog-agent jmx list_collected_metrics
📈 Datadog 대시보드 활용 팁
이제 수집된 메트릭을 Datadog 대시보드에서 시각화해봅시다:
- JVM 힙 메모리 사용률 그래프 생성
- GC 발생 빈도와 소요 시간 추이 분석
- 스레드 수 변화 모니터링
- CPU 사용률과 메모리 사용률의 상관관계 분석
🚨 알림 설정 권장사항
- 힙 메모리 사용률이 80% 이상일 때
- GC 소요 시간이 평소의 2배 이상일 때
- 스레드 수가 급격히 증가할 때
- CPU 사용률이 90% 이상을 5분간 유지할 때
🎯 마무리
JMX와 Datadog을 연동하여 Java 애플리케이션을 모니터링하는 방법을 알아봤습니다. 이렇게 설정하면:
- 📊 실시간으로 애플리케이션 상태를 파악할 수 있어요
- 🔍 성능 병목 지점을 빠르게 발견할 수 있어요
- 📧 문제 발생 시 즉시 알림을 받을 수 있어요
- 📈 장기적인 성능 트렌드를 분석할 수 있어요
모니터링은 한 번 설정하고 끝이 아니라 지속적으로 메트릭을 분석하고 임계값을 조정해나가는 과정입니다. 여러분의 애플리케이션에 맞게 메트릭을 커스터마이징하고, 팀에게 유용한 대시보드를 만들어보세요! 🎉
이 글이 도움이 되셨다면 댓글로 경험을 공유해주세요. 더 구체적인 질문이나 다른 모니터링 도구에 대한 내용도 언제든 환영합니다! 😊
'💻 백엔드' 카테고리의 다른 글
| 🔍 Spring Filter, Interceptor, AOP - 언제 뭘 써야 할까? (1) | 2025.06.14 |
|---|---|
| 🐬 MySQL Replication 구축하기: Docker로 간단하게 시작하는 데이터베이스 복제 (0) | 2025.06.12 |
| 🔐 Spring Boot로 소셜 로그인 완벽 구현하기 - OAuth2 + JWT 조합의 힘 (2) | 2025.06.10 |
| 🚀 SELECT FOR UPDATE SKIP LOCKED로 효율적인 작업 큐 구현하기 (5) | 2025.06.09 |
| 👀 Spring Boot에서 AWS S3에 이미지를 업로드하는 3가지 방법 완벽 비교 (1) | 2025.05.31 |