Java μ ν리μΌμ΄μ μ μ΄μνλ©΄μ κ°μ₯ μ€μν κ² μ€ νλλ λͺ¨λν°λ§μ λλ€. νΉν λ©λͺ¨λ¦¬ μ¬μ©λ, μ€λ λ μν, κ°λΉμ§ 컬λ μ μ±λ₯ λ±μ μ€μκ°μΌλ‘ μΆμ νλ κ²μ μμ€ν μμ μ±μ νμμ μ΄μ£ .
μ€λμ JMX(Java Management Extensions)μ Datadogμ μ°λνμ¬ Java μ ν리μΌμ΄μ μ ν΅μ¬ λ©νΈλ¦μ μμ§νλ λ°©λ²μ λ¨κ³λ³λ‘ μμλ³΄κ² μ΅λλ€. π‘

λ¨Όμ 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}"
π‘ μ°Έκ³ : νλ‘λμ νκ²½μμλ 보μμ μν΄ μΈμ¦κ³Ό SSLμ νμ±ννλ κ²μ κΆμ₯ν©λλ€.
μ΄μ Datadog μμ΄μ νΈκ° JMX λ©νΈλ¦μ μμ§νλλ‘ μ€μ ν΄λ΄ μλ€.
Datadog μμ΄μ νΈμ JMX μ€μ νμΌμ λ€μ κ²½λ‘μ μμ΅λλ€:
/etc/datadog-agent/conf.d/jmx.d/conf.yaml
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 μ ν리μΌμ΄μ μ μ±λ₯μ μ λλ‘ λͺ¨λν°λ§νλ €λ©΄ λ€μκ³Ό κ°μ μμμ λ©νΈλ¦μ΄ νμν©λλ€:
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
# μ€λ λ κ΄λ ¨ μ 보
- 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
# 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
# ν΄λμ€ λ‘λ μ 보
- 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
# 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
# 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
sudo systemctl restart datadog-agent
sudo datadog-agent jmx list_matching_attributes
sudo datadog-agent jmx list_collected_metrics
μ΄μ μμ§λ λ©νΈλ¦μ Datadog λμ보λμμ μκ°νν΄λ΄ μλ€:
JMXμ Datadogμ μ°λνμ¬ Java μ ν리μΌμ΄μ μ λͺ¨λν°λ§νλ λ°©λ²μ μμλ΄€μ΅λλ€. μ΄λ κ² μ€μ νλ©΄:
λͺ¨λν°λ§μ ν λ² μ€μ νκ³ λμ΄ μλλΌ μ§μμ μΌλ‘ λ©νΈλ¦μ λΆμνκ³ μκ³κ°μ μ‘°μ ν΄λκ°λ κ³Όμ μ λλ€. μ¬λ¬λΆμ μ ν리μΌμ΄μ μ λ§κ² λ©νΈλ¦μ 컀μ€ν°λ§μ΄μ§νκ³ , νμκ² μ μ©ν λμ보λλ₯Ό λ§λ€μ΄λ³΄μΈμ! π
μ΄ κΈμ΄ λμμ΄ λμ ¨λ€λ©΄ λκΈλ‘ κ²½νμ 곡μ ν΄μ£ΌμΈμ. λ ꡬ체μ μΈ μ§λ¬Έμ΄λ λ€λ₯Έ λͺ¨λν°λ§ λꡬμ λν λ΄μ©λ μΈμ λ νμν©λλ€! π