Skip to main content

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​

TaskCommand
Check Java versionjava -version
List Java processesjps -v
Monitor GCjstat -gc $(pgrep java)
Thread dumpjstack $(pgrep java)
Heap dumpjmap -dump:file=heap.hprof $(pgrep java)
Datadog statussudo datadog-agent status
Check JMXtelnet localhost 9999
Application healthcurl http://localhost:8080/health
GC logstail -f /var/log/gc.log
Memory usagejmap -heap $(pgrep java)
JVM flagsjcmd $(pgrep java) VM.flags
Thread analysisjstack $(pgrep java) | grep State | sort | uniq -c