OpenJDK CentOS 8.2 Datadog Monitoring
Comprehensive guide for installing, configuring, and monitoring OpenJDK applications on CentOS 8.2 with Datadog agent integration.
Prerequisites​
System Requirements​
cat /etc/redhat-release
uname -r
free -h
df -h
OpenJDK Installation​
1. Check Available OpenJDK Versions​
dnf list java*openjdk*
dnf search openjdk
alternatives --display java
2. Install OpenJDK 8​
sudo dnf install java-1.8.0-openjdk
sudo dnf install java-1.8.0-openjdk-devel
sudo dnf install java-1.8.0-openjdk-headless
3. Install OpenJDK 11​
sudo dnf install java-11-openjdk
sudo dnf install java-11-openjdk-devel
sudo dnf install java-11-openjdk-headless
4. Install OpenJDK 17​
sudo dnf install java-17-openjdk
sudo dnf install java-17-openjdk-devel
sudo dnf install java-17-openjdk-headless
Java Environment Configuration​
5. Set Default Java Version​
sudo alternatives --config java
sudo alternatives --config javac
sudo alternatives --install /usr/bin/java java /usr/lib/jvm/java-11-openjdk/bin/java 1
6. Configure JAVA_HOME​
echo 'export JAVA_HOME=/usr/lib/jvm/java-11-openjdk' >> ~/.bashrc
echo 'export PATH=$JAVA_HOME/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
echo $JAVA_HOME
7. Verify Java Installation​
java -version
javac -version
which java
readlink -f $(which java)
JVM Monitoring Setup​
8. Enable JMX for Monitoring​
java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -jar your-app.jar
java -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.rmi.port=9999 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=localhost -jar your-app.jar
9. JVM Memory Configuration​
java -Xms512m -Xmx2g -XX:+UseG1GC -jar your-app.jar
java -Xms1g -Xmx4g -XX:+UseParallelGC -XX:+UseParallelOldGC -jar your-app.jar
java -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:/var/log/gc.log -jar your-app.jar
Datadog Agent Configuration​
10. Install Datadog Agent​
DD_AGENT_MAJOR_VERSION=7 DD_API_KEY=your_api_key DD_SITE="datadoghq.com" bash -c "$(curl -L https://s3.amazonaws.com/dd-agent/scripts/install_script.sh)"
sudo systemctl enable datadog-agent
sudo systemctl start datadog-agent
sudo systemctl status datadog-agent
11. Configure JMX Integration​
sudo cp /etc/datadog-agent/conf.d/jmx.d/conf.yaml.example /etc/datadog-agent/conf.d/jmx.d/conf.yaml
sudo vim /etc/datadog-agent/conf.d/jmx.d/conf.yaml
JMX Configuration Content:
init_config:
is_jmx: true
collect_default_metrics: true
instances:
- host: localhost
port: 9999
tags:
- env:production
- service:java-app
12. Configure Java Integration​
sudo cp /etc/datadog-agent/conf.d/java.d/conf.yaml.example /etc/datadog-agent/conf.d/java.d/conf.yaml
sudo vim /etc/datadog-agent/conf.d/java.d/conf.yaml
Java Integration Configuration:
init_config:
instances:
- host: localhost
port: 9999
name: java-app
tags:
- env:production
- java_version:11
13. Restart Datadog Agent​
sudo systemctl restart datadog-agent
sudo systemctl status datadog-agent
sudo datadog-agent status
Java Application Monitoring​
14. Check Java Processes​
ps aux | grep java
jps -v
jps -l
pgrep -f java
15. Monitor JVM Memory Usage​
jstat -gc $(pgrep java) 1s
jstat -gcutil $(pgrep java) 5s
jmap -heap $(pgrep java)
jmap -histo $(pgrep java) | head -20
16. Monitor JVM Thread Usage​
jstack $(pgrep java)
jstack $(pgrep java) | grep "java.lang.Thread.State" | sort | uniq -c
top -H -p $(pgrep java)
17. JVM Performance Analysis​
jstat -compiler $(pgrep java)
jstat -class $(pgrep java)
jcmd $(pgrep java) VM.uptime
jcmd $(pgrep java) VM.system_properties
Log Configuration​
18. Configure Java Application Logging​
java -Djava.util.logging.config.file=logging.properties -jar your-app.jar
java -Dlogback.configurationFile=logback.xml -jar your-app.jar
java -Dlog4j.configuration=log4j.properties -jar your-app.jar
19. Datadog Log Collection​
sudo vim /etc/datadog-agent/conf.d/java.d/conf.yaml
Add logging configuration:
logs:
- type: file
path: "/var/log/java/application.log"
service: "java-app"
source: "java"
sourcecategory: "sourcecode"
tags:
- env:production
20. Enable Log Collection​
sudo vim /etc/datadog-agent/datadog.yaml
Enable logs:
logs_enabled: true
sudo systemctl restart datadog-agent
Performance Monitoring​
21. CPU and Memory Monitoring​
top -p $(pgrep java)
htop -p $(pgrep java)
pidstat -p $(pgrep java) 1
iostat -x 1
22. Network Monitoring​
ss -tulnp | grep java
netstat -tulnp | grep java
lsof -i -P | grep java
tcpdump -i any port 8080
23. File Descriptor Monitoring​
lsof -p $(pgrep java) | wc -l
cat /proc/$(pgrep java)/limits | grep "Max open files"
ls -la /proc/$(pgrep java)/fd | wc -l
Health Checks​
24. Application Health Checks​
curl -f http://localhost:8080/health
curl -s http://localhost:8080/actuator/health | jq
curl -s http://localhost:8080/metrics | grep jvm
wget --spider -q http://localhost:8080/health && echo "OK" || echo "FAIL"
25. JMX Health Monitoring​
jconsole localhost:9999
jcmd $(pgrep java) GC.run
jcmd $(pgrep java) VM.classloader_stats
jcmd $(pgrep java) Thread.print
Troubleshooting​
26. Common Java Issues​
jcmd $(pgrep java) VM.flags
jinfo $(pgrep java)
jmap -dump:format=b,file=/tmp/heapdump.hprof $(pgrep java)
kill -3 $(pgrep java)
27. Datadog Agent Debugging​
sudo datadog-agent status
sudo datadog-agent check jmx
sudo datadog-agent check java
sudo tail -f /var/log/datadog/agent.log
28. JMX Connection Testing​
telnet localhost 9999
nc -zv localhost 9999
jcmd $(pgrep java) ManagementAgent.status
Security Configuration​
29. JMX Security Setup​
java -Dcom.sun.management.jmxremote.password.file=/path/to/jmxremote.password -Dcom.sun.management.jmxremote.access.file=/path/to/jmxremote.access -jar your-app.jar
Create password file:
echo "monitor readonly" > /etc/java/jmxremote.password
echo "control readwrite" >> /etc/java/jmxremote.password
chmod 600 /etc/java/jmxremote.password
30. Firewall Configuration​
sudo firewall-cmd --permanent --add-port=9999/tcp
sudo firewall-cmd --permanent --add-port=8080/tcp
sudo firewall-cmd --reload
sudo firewall-cmd --list-ports
Automated Monitoring Scripts​
31. Java Process Monitor Script​
#!/bin/bash
# java_monitor.sh
JAVA_PID=$(pgrep java)
if [ -z "$JAVA_PID" ]; then
echo "Java process not running"
exit 1
fi
echo "Java PID: $JAVA_PID"
echo "Memory Usage:"
jstat -gc $JAVA_PID 1 1
echo "Thread Count:"
jstack $JAVA_PID | grep "java.lang.Thread.State" | wc -l
32. Health Check Script​
#!/bin/bash
# health_check.sh
APP_URL="http://localhost:8080/health"
RESPONSE=$(curl -s -o /dev/null -w "%{http_code}" $APP_URL)
if [ $RESPONSE -eq 200 ]; then
echo "Application healthy"
exit 0
else
echo "Application unhealthy: HTTP $RESPONSE"
exit 1
fi
33. GC Log Analysis​
tail -f /var/log/gc.log | grep "Full GC"
awk '/Full GC/ {print $1, $2, $NF}' /var/log/gc.log
grep "Total time for which application threads were stopped" /var/log/gc.log
Performance Tuning​
34. JVM Tuning Parameters​
java -XX:+UseG1GC -XX:MaxGCPauseMillis=100 -XX:G1HeapRegionSize=16m -jar your-app.jar
java -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 -jar your-app.jar
java -XX:+UnlockExperimentalVMOptions -XX:+UseZGC -jar your-app.jar
35. Memory Optimization​
java -XX:NewRatio=3 -XX:SurvivorRatio=8 -jar your-app.jar
java -XX:+UseStringDeduplication -jar your-app.jar
java -XX:+UseCompressedOops -XX:+UseCompressedClassPointers -jar your-app.jar
Monitoring Dashboard Setup​
36. Custom Metrics Collection​
Create custom metrics configuration:
# /etc/datadog-agent/conf.d/jmx.d/conf.yaml
init_config:
is_jmx: true
instances:
- host: localhost
port: 9999
conf:
- include:
domain: java.lang
type: Memory
attribute:
HeapMemoryUsage.used:
alias: jvm.heap_memory.used
metric_type: gauge
HeapMemoryUsage.max:
alias: jvm.heap_memory.max
metric_type: gauge
37. Application Performance Monitoring​
java -javaagent:/opt/datadog/dd-java-agent.jar -jar your-app.jar
export DD_SERVICE_NAME="java-app"
export DD_ENV="production"
export DD_VERSION="1.0.0"
Quick Reference Commands​
38. Essential Java Commands​
java -version
ps aux | grep java
jps -v
jstat -gc $(pgrep java)
jstack $(pgrep java)
jmap -heap $(pgrep java)
sudo systemctl status datadog-agent
sudo datadog-agent status
curl http://localhost:8080/health
telnet localhost 9999
Quick Reference Table​
| Task | Command |
|---|---|
| Check Java version | java -version |
| List Java processes | jps -v |
| Monitor GC | jstat -gc $(pgrep java) |
| Thread dump | jstack $(pgrep java) |
| Heap dump | jmap -dump:file=heap.hprof $(pgrep java) |
| Datadog status | sudo datadog-agent status |
| Check JMX | telnet localhost 9999 |
| Application health | curl http://localhost:8080/health |
| GC logs | tail -f /var/log/gc.log |
| Memory usage | jmap -heap $(pgrep java) |
| JVM flags | jcmd $(pgrep java) VM.flags |
| Thread analysis | jstack $(pgrep java) | grep State | sort | uniq -c |
Related Documentation​
- Datadog Agent Setup - Datadog agent installation
- Service Management - Systemctl service commands
- Proxy Configuration - Datadog proxy setup
- Proxy Testing - Network diagnostics