, Johann Schmitz

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
}

Links