💻 백엔드

🔍 JMX와 Datadog을 활용한 Java 애플리케이션 모니터링 가이드

twoweekhee 2025. 6. 11. 15:10

Java 애플리케이션을 운영하면서 가장 중요한 것 중 하나는 모니터링입니다. 특히 메모리 사용량, 스레드 상태, 가비지 컬렉션 성능 등을 실시간으로 추적하는 것은 시스템 안정성에 필수적이죠.

오늘은 JMX(Java Management Extensions)와 Datadog을 연동하여 Java 애플리케이션의 핵심 메트릭을 수집하는 방법을 단계별로 알아보겠습니다. 💡

📋 목차

  1. JMX 설정하기
  2. Datadog 에이전트 구성
  3. 모니터링할 핵심 메트릭
  4. 마무리

⚙️ 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 대시보드에서 시각화해봅시다:

  1. JVM 힙 메모리 사용률 그래프 생성
  2. GC 발생 빈도와 소요 시간 추이 분석
  3. 스레드 수 변화 모니터링
  4. CPU 사용률과 메모리 사용률의 상관관계 분석

🚨 알림 설정 권장사항

  • 힙 메모리 사용률이 80% 이상일 때
  • GC 소요 시간이 평소의 2배 이상일 때
  • 스레드 수가 급격히 증가할 때
  • CPU 사용률이 90% 이상을 5분간 유지할 때

🎯 마무리

JMX와 Datadog을 연동하여 Java 애플리케이션을 모니터링하는 방법을 알아봤습니다. 이렇게 설정하면:

  • 📊 실시간으로 애플리케이션 상태를 파악할 수 있어요
  • 🔍 성능 병목 지점을 빠르게 발견할 수 있어요
  • 📧 문제 발생 시 즉시 알림을 받을 수 있어요
  • 📈 장기적인 성능 트렌드를 분석할 수 있어요

모니터링은 한 번 설정하고 끝이 아니라 지속적으로 메트릭을 분석하고 임계값을 조정해나가는 과정입니다. 여러분의 애플리케이션에 맞게 메트릭을 커스터마이징하고, 팀에게 유용한 대시보드를 만들어보세요! 🎉


이 글이 도움이 되셨다면 댓글로 경험을 공유해주세요. 더 구체적인 질문이나 다른 모니터링 도구에 대한 내용도 언제든 환영합니다! 😊