πŸ” JMX와 Datadog을 ν™œμš©ν•œ Java μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λͺ¨λ‹ˆν„°λ§ κ°€μ΄λ“œ

TwoweekheeΒ·2025λ…„ 5μ›” 20일

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 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λͺ¨λ‹ˆν„°λ§ν•˜λŠ” 방법을 μ•Œμ•„λ΄€μŠ΅λ‹ˆλ‹€. μ΄λ ‡κ²Œ μ„€μ •ν•˜λ©΄:

  • πŸ“Š μ‹€μ‹œκ°„μœΌλ‘œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μƒνƒœλ₯Ό νŒŒμ•…ν•  수 μžˆμ–΄μš”
  • πŸ” μ„±λŠ₯ 병λͺ© 지점을 λΉ λ₯΄κ²Œ λ°œκ²¬ν•  수 μžˆμ–΄μš”
  • πŸ“§ 문제 λ°œμƒ μ‹œ μ¦‰μ‹œ μ•Œλ¦Όμ„ 받을 수 μžˆμ–΄μš”
  • πŸ“ˆ μž₯기적인 μ„±λŠ₯ νŠΈλ Œλ“œλ₯Ό 뢄석할 수 μžˆμ–΄μš”

λͺ¨λ‹ˆν„°λ§μ€ ν•œ 번 μ„€μ •ν•˜κ³  끝이 μ•„λ‹ˆλΌ μ§€μ†μ μœΌλ‘œ λ©”νŠΈλ¦­μ„ λΆ„μ„ν•˜κ³  μž„κ³„κ°’μ„ μ‘°μ •ν•΄λ‚˜κ°€λŠ” κ³Όμ •μž…λ‹ˆλ‹€. μ—¬λŸ¬λΆ„μ˜ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ— 맞게 λ©”νŠΈλ¦­μ„ μ»€μŠ€ν„°λ§ˆμ΄μ§•ν•˜κ³ , νŒ€μ—κ²Œ μœ μš©ν•œ λŒ€μ‹œλ³΄λ“œλ₯Ό λ§Œλ“€μ–΄λ³΄μ„Έμš”! πŸŽ‰


이 글이 도움이 λ˜μ…¨λ‹€λ©΄ λŒ“κΈ€λ‘œ κ²½ν—˜μ„ κ³΅μœ ν•΄μ£Όμ„Έμš”. 더 ꡬ체적인 μ§ˆλ¬Έμ΄λ‚˜ λ‹€λ₯Έ λͺ¨λ‹ˆν„°λ§ 도ꡬ에 λŒ€ν•œ λ‚΄μš©λ„ μ–Έμ œλ“  ν™˜μ˜ν•©λ‹ˆλ‹€! 😊

profile
κ°œλ°œν•˜λŠ” 감자, 이세상 감자 λͺ¨μ—¬λΌ~

0개의 λŒ“κΈ€