Java VM Monitoring mit Jolokia und collectd

Posted on Sat 24 May 2014 in monitoring

Java Applikationen benötigen sehr viel Arbeitsspeicher, sind träge und werden in allen Unternehmen eingesetzt.

Irgendetwas passt dort nicht zusammen! Das Java VMs sich viel Speicher zusichern ist richtig. Ebenso richtig ist aber, dass man das als Sysadmin verstehen und kontrollieren sollte.

Da ich einige Performance-Optimierungen an meinem Confluence vornehmen möchte war es wieder einmal Zeit einen genaueren Blick auf [(]collectd](http://collectd.org/) und jolokia zu werfen.

Nach der Installation von Jolokia, zum Beispiel als WAR für Tomcat, kann man Daten über die Java VM im JSON Format abfragen und auswerten.

Jolokia richtig nutzen - Informationen finden

Die erste Hürde ist zu identifizieren, welche Daten man für das Monitoring nutzen kann. Um sich eine Übersicht zu verschaffen empfiehlt es sich eine Übersicht über alle verfügbaren Informationen in eine Datei zu schreiben. Beispielsweise mit curl http://localhost:8090/jolokia/list > jolokia.json.

Diese Informationen kann man mit dem JSON Parser der Wahl in eine lesbare Form bringen.

Confluence bietet beispielsweise Informationen zu den einzelnen Requests an. Durch die einfache Struktur der JSON Informationen kann man so auch nachvollziehen, dass RequestsServed als Integer zurückgegeben wird. Damit kann collectd arbeiten:

Jolokia JSON Confluence

Bei der Auswahl der benötigten Werte ist darauf zu achten, dass diese auch als Integer, Long, Boolean oder javax.management.openmbean.CompositeData zurückgegeben werden.

Confluence Update kann als String von collectd nicht verarbeitet werden:

Jolokia JSON Confluence Uptime

In diesem Fall bin ich nach kurzer suche auf den Uptime-Wert der JavaVM gestoßen:

Jolokia JSON Java Uptime

Abfrage der Werte

Wie werden diese Informationen denn nun abgefragt? Als Beispiel verwende ich hier den o.g. Java VM Uptime Wert.

Die Base URL besteht immer aus IP, Port, dem Installationspfad von Jolokia und der Aktion, welche man ausführen möchte:

http://localhost:8090/jolokia/read/

Im ANschluss folgt der Hauptpunkt aus den dargestellten JSON Daten. Dem Hauptpunkt folgt ein Doppelpunkt:

http://localhost:8090/jolokia/read/java.lang:

Anschließend gibt es zwei Optionen. Entweder es folgt direkt der Typ oder Name, Typ:

http://localhost:8090/jolokia/read/java.lang:type=Runtime
http://localhost:8090/jolokia/read/java.lang:name=G1%20Old%20Gen,type=MemoryPool

Zum Abschluss wird das Attribut angefügt. Das ist durch den / vor dem Attributnamen erkennbar:

http://localhost:8090/jolokia/read/java.lang:type=Runtime/Uptime
http://localhost:8090/jolokia/read/java.lang:name=G1%20Old%20Gen,type=MemoryPool/Usage

Das erste Beispiel sollte jeder mit curl abrufen können und dabei JSON Daten zurückerhalten:

{"timestamp":1400927651,"status":200,"request":{"mbean":"java.lang:type=Runtime","attribute":"Uptime","type":"read"},"value":74492742}

Das zweite Beispiel setzt voraus, dass man den G1 Garbage Collector einsetzt. Das ist standardmäßig nicht der Fall. Daher könnte stattdessen ein Name wie PS Perm Gen vorhanden.

Der JSON Parser hilft auch hier wieder, damit im nächsten Schritt collectd eingerichtet werden kann.

collectd mit dem curl_json plugin

collectd ist in diesem Fall interessant, das man sehr schnell und einfach die abzufragenden Informationen angeben kann. Für Munin müsste hier unter Umständen ein eigenes Script geschrieben werden.

In der etc/collectd/collectd.conf muss neben curl_json Plugin eine Definition der abzufragenden Werte erfolgen. Hier zwei Beispiele:

collectd.conf

Durch anzugebenden Key definiert man, welcher Wert aus den JSON Daten in die RRD Datei geschrieben werden soll. Bei dem Verbrauch des Old Generation Speichers der Java VM sind mehrere Werte vorhanden. Genutzt werden die Werte Used und Max.

Grafische Darstellung

Nach dem Neustart von collectd werden die Informationen gesammelt und können beispielsweise von CGP dargestellt werden.

collectd curl_json EdenSpace

Sehr stabil hält sich beispielsweise der OldGen:

collectd curl_json EdenSpace