Die JVM (zumindest die Sun-Implementierung) bietet von Haus aus Unterstützung für das Monitoren aller wichtigen Werte per SNMP. Im Folgenden ist beschrieben, wie man die JVM (im speziellen die von einem Tomcat) dafür konfigurieren muss.
Anforderungen
- net-analyzer/net-snmp
- dev-java/sun-jre-bin
Konfiguration
Damit der SNMPd überhaupt Anfragen animmt und beantwortet (und überhaupt startet), muss die Datei /etc/snmp/snmpd.conf konfiguriert werden:
com2sec local 127.0.0.1/32 MyCommunityPublicString
group MyROGroup v1 local
group MyROGroup v2c local
group MyROGroup usm local
view all included .1 80
access MyROGroup "" any noauth exact all none none
syslocation Chicago
syscontact John Doe <john.doe@xyzcompany.com>
proxy -m /usr/share/snmp/mibs/JVM-MANAGEMENT-MIB.txt -v 2c -c MyJVMCommunityString localhost:1161 .1.3.6.1.4.1.42.2.145
Diese Konfiguration erlaubt localhost unter der Verwendung des Community-Strings MyCommunityPublicString Werte abzufragen. Alle Anfragen an OIDs unterhalb von 1.3.6.1.4.1.42.2.145 werden unter der Verwendung der Community-Strings MyJVMCommunityString an den SNMP-Teil der zu monitorenden JVM weitergeleitet (Konfiguration s.u.).
Da der SNMPd per default auf dem UDP-Port 161 läuft, und die JVM auch einen braucht, müssen wir mit der JVM auf einen anderen Port ausweichen. Daher werden die Anfragen vom SNMPd zur JVM durchgeschleift.
Man muss noch von sun.com das passende MIB-File unter /usr/share/snmp/mibs/JVM-MANAGEMENT-MIB.txt ablegen.
Die Konfiguration der JVM habe ich unter /opt/sun-jre-bin-1.6.0.06/lib/snmp.properties mit folgendem Inhalt abgelegt:
com.sun.management.snmp.interface=127.0.0.1
com.sun.management.snmp.port=1161
#com.sun.management.snmp.acl=false
com.sun.management.snmp.acl.file=/opt/sun-jre-bin-1.6.0.06/lib/snmp.acl
Die definitierte ACL-Datei /opt/sun-jre-bin-1.6.0.06/lib/snmp.acl sieht wie folgt aus:
acl = {
{
communities = MyJVMCommunityString
access = read-only
managers = localhost
}
}
trap = {
{
trap-community = MyJVMCommunityString
hosts = localhost
}
}
Wichtig: Die Community-Strings müssen die sein, die man in der Proxy-Zeile der SNMPd-Config angegeben hat!
Damit die JVM die snmp.properties auch verwendet, muss man diese noch als System-Property beim starten der JVM übergeben, so z.B.:
java -Dcom.sun.management.config.file=/opt/sun-jre-bin-1.6.0.06/lib/snmp.properties ...
Unter Gentoo kann man das für einen Tomcat ganz elegent in der /etc/conf.d /tomcat-6 machen, indem man die Zeile JAVA_OPTS erweitert:
JAVA_OPTS="-Xms128m -Xmx256m -Dcom.sun.management.config.file=/opt/sun-jre-bin-1.6.0.06/lib/snmp.properties"
Nach einen Neustart des SNMPd und des Tomcats sollte man mittels
snmpwalk -v2c -c MyCommunityPublicString localhost 1.3.6.1.4.1.42.2.145.3.163.1.1.3.1
z.B. den ThreadCount der JVM abfragen können.
Nagios Konfiguration
Folgendes Shell-Script liefert als Performance Daten die aktuellen Heap/Non-Heap-Daten sowie den Thread-Count der JVM. Es kann noch erheblich erweitert werden. So fehlt z.B. noch eine Warn- bzw. Critical-Schwelle.
#!/bin/bash
SWALK=$(which snmpwalk);
if [ "$#" != "2" ]; then
echo "USAGE: $0 "
exit 3;
fi
if [ ! -n "$SWALK" ]; then
echo "No snmpwalk found!";
exit 3;
fi
host="$1";
community="$2";
perf_data="";
oid_threads="1.3.6.1.4.1.42.2.145.3.163.1.1.3.1";
oid_heap_used="1.3.6.1.4.1.42.2.145.3.163.1.1.2.11";
oid_heap_committed="1.3.6.1.4.1.42.2.145.3.163.1.1.2.12"
oid_heap_max="1.3.6.1.4.1.42.2.145.3.163.1.1.2.13";
oid_non_heap_used="1.3.6.1.4.1.42.2.145.3.163.1.1.2.21";
oid_non_heap_committed="1.3.6.1.4.1.42.2.145.3.163.1.1.2.22"
oid_non_heap_max="1.3.6.1.4.1.42.2.145.3.163.1.1.2.23";
# snmpwalk -v2c -c SNMPPubString localhost 1.3.6.1.4.1.42.2.145.3.163.1.1.3.1
value=$($SWALK -v2c -c $community $host $oid_threads | gawk '{ print $4 }');
perf_data="${perf_data}threads=$value;";
value=$($SWALK -v2c -c $community $host $oid_heap_used | gawk '{ print $4 }');
perf_data="${perf_data}heap_used=$value;";
value=$($SWALK -v2c -c $community $host $oid_heap_committed | gawk '{ print $4 }');
perf_data="${perf_data}heap_committed=$value;";
value=$($SWALK -v2c -c $community $host $oid_heap_max | gawk '{ print $4 }');
perf_data="${perf_data}heap_max=$value;";
value=$($SWALK -v2c -c $community $host $oid_non_heap_used | gawk '{ print $4 }');
perf_data="${perf_data}non_heap_used=$value;";
value=$($SWALK -v2c -c $community $host $oid_non_heap_committed | gawk '{ print $4 }');
perf_data="${perf_data}non_heap_committed=$value;";
value=$($SWALK -v2c -c $community $host $oid_non_heap_max | gawk '{ print $4 }');
perf_data="${perf_data}non_heap_max=$value;";
echo "JVM OK | $perf_data";
exit 0;
Nagios-Grapher Konfiguration
define ngraph{
service_name tomcat_jvm_status
graph_perf_regex threads=([0-9]*)
graph_value thread_count
graph_units pcs.
graph_legend Threads
graph_legend_eol left
graph_legend_max 30
rrd_plottype LINE
rrd_color 00a000
page Threads
y_scale 0
}
define ngraph{
service_name tomcat_jvm_status
graph_perf_regex heap_used=([0-9]*)
graph_value heap_used
graph_units Bytes
graph_legend Heap space used
graph_legend_eol left
graph_legend_max 30
rrd_plottype AREA
rrd_color 0000ff
page Heap space Space
}
define ngraph{
service_name tomcat_jvm_status
graph_perf_regex heap_committed=([0-9]*)
graph_value heap_com
graph_units Bytes
graph_legend Heap space committed
graph_legend_eol left
graph_legend_max 30
rrd_plottype LINE
rrd_color 00ff00
page Heap space Space
}
define ngraph{
service_name tomcat_jvm_status
graph_perf_regex heap_max=([0-9]*)
graph_value heap_max
graph_units Bytes
graph_legend Heap space Maximum
graph_legend_eol left
graph_legend_max 30
rrd_plottype LINE
rrd_color ff0000
page Heap space Space
}
define ngraph{
service_name tomcat_jvm_status
graph_perf_regex non_heap_used=([0-9]*)
graph_value non_heap_used
graph_units Bytes
graph_legend Non Heap space used
graph_legend_eol left
graph_legend_max 30
rrd_plottype AREA
rrd_color 0000ff
page Non Heap space
}
define ngraph{
service_name tomcat_jvm_status
graph_perf_regex non_heap_committed=([0-9]*)
graph_value non_heap_com
graph_units Bytes
graph_legend Non Heap space committed
graph_legend_eol left
graph_legend_max 30
rrd_plottype LINE
rrd_color 00ff00
page Non Heap space
}
define ngraph{
service_name tomcat_jvm_status
graph_perf_regex non_heap_max=([0-9]*)
graph_value non_heap_max
graph_units Bytes
graph_legend Non Heap space maximum
graph_legend_eol left
graph_legend_max 30
rrd_plottype LINE
rrd_color ff0000
page Non Heap space
}