JMX-Term-Exporter
|
|
Dieser Exporter kann sich per JMX zu Java-Prozessen verbinden und interne Metriken bereitstellen, z.B. Tomcat Threads oder DB Connection Pooling-Informationen.
Er wird auch eingesetzt, um Bean-Informationen aus dem INUBIT-Tomcat auszulesen.
Der Exporter basiert auf dem JMX-Term JAR und einer Adaption des Script-Exporters, um sich mit dem laufenden INUBIT-Tomcat zu verbinden.
Von dort kann es beliebige Beans auslesen.
Beispiel:
Voraussetzungen
-
Linux OS
-
JMX Remote Access
ist im INUBIT aktiviert und der Port steht auf 3333In der Datei
<tomcat-install-dir>/bin/setenv.sh
muss Folgendes eingefügt werden:#JMX: JVM_PARAMS="$JVM_PARAMS -Dcom.sun.management.jmxremote" JVM_PARAMS="$JVM_PARAMS -Dcom.sun.management.jmxremote.port=3333" JVM_PARAMS="$JVM_PARAMS -Dcom.sun.management.jmxremote.authenticate=true" JVM_PARAMS="$JVM_PARAMS -Dcom.sun.management.jmxremote.ssl=false" JVM_PARAMS="$JVM_PARAMS -Dcom.sun.management.jmxremote.host=localhost" JVM_PARAMS="$JVM_PARAMS -Dcom.sun.management.jmxremote.access.file=$CATALINA_BASE/bin/jmxremote.access" JVM_PARAMS="$JVM_PARAMS -Dcom.sun.management.jmxremote.password.file=$CATALINA_BASE/bin/jmxremote.password" JVM_PARAMS="$JVM_PARAMS -Djava.rmi.server.hostname=localhost"
Schreibrechte auf die Datei
<tomcat-install-dir>/bin/jmxremote.access
setzen:chmod 600 jmxremote.access
Inhalt der Datei
<tomcat-install-dir>/bin/jmxremote.access
anpassen:vimon readonly controlRoleUser readwrite \ create javax.management.monitor.*,javax.management.timer.* \ unregister
Schreibrechte auf der Datei
<tomcat-install-dir>/bin/jmxremote.access
entziehen:chmod 400 jmxremote.password
Falls der JMX-Port auch außerhalb von Details finden Sie unter https://docs.oracle.com/javadb/10.10.1.2/adminguide/radminjmxenablepwdssl.html. |
Konfiguration
Die Konfiguration für den JMX-Term-Exporter befindet sich in der Datei vimon/config/jmxterm_exporter/jmxterm_exporter.conf
#!/bin/bash
EXPORTERPORT=9470
BINDADDRESS=0.0.0.0
# INUBIT instance name. Used as job name parameter in the metric
SERVERNAME=VIRTIMO
# Prefix for the metric (for reference in prometheus)
METRIC_PREFIX=IBIS_Tomcat_ConnectionPool
-
Prüfen, ob der Port frei ist.
Falls nicht, einen freien Port angeben.
-
Einen Namen (Servernamen) des zu überwachenden Systems setzen.
-
Das Präfix ändern, falls gewünscht.
Sie können die gewünschten JMX-Metriken in dieser Datei ändern/anpassen:
vimon/config/jmxterm_exporter/jmxterm_exporter.jmx
open localhost:3333 -u vimon -p <password1>
domain tomcat.jdbc
bean tomcat.jdbc:class=org.apache.tomcat.jdbc.pool.DataSource,engine=Catalina,host=localhost,name="jdbc/IBISDB",path=/ibis,type=ConnectionPool
get Active
get Idle
get Size
get MaxActive
get WaitCount
get RemoveAbandonedCount
Für weitere Informationen siehe JMX-Term.
Über set
können z.B. auch bestimmte Parameter gesetzt werden:
vimon/config/jmxterm_exporter/jmxterm_exporter_tomcatThreads.jmx
open localhost:3333 -u vimon -p <password1>
domain Catalina
bean Catalina:name="http-nio-8000",type=ThreadPool
get -f currentThreadCount
get -f maxThreads
get -f currentThreadsBusy
# Uncomment, if HTTPS is activated. Both ports have their own thread pool
#bean Catalina:name="https-nio-8443",type=ThreadPool
#get -f currentThreadCount
#get -f maxThreads
#get -f currentThreadsBusy
Prometheus-Konfiguration
In der Datei prometheus.yml
müssen die Metriken aus den Skripten abgerufen werden.
Der abzurufende Pfad ist in diesem Fall wie beim Script-Exporter zu setzen.
Er weicht stark vom Pfad der anderen Exporter ab:
<server>:9470/probe?script=[script-name]
Beispiel für Darstellung in Grafana:
Grafana Board
{
"id": 42,
"gridPos": {
"h": 7,
"w": 12,
"x": 0,
"y": 72
},
"type": "graph",
"title": "Tomcat ConnectionPool $Server",
"repeat": "Server",
"datasource": "lokaler Prometheus",
"thresholds": [],
"pluginVersion": "8.1.2",
"links": [],
"legend": {
"avg": false,
"current": false,
"max": false,
"min": false,
"show": true,
"total": false,
"values": false
},
"aliasColors": {},
"bars": false,
"dashLength": 10,
"dashes": false,
"fill": 1,
"fillGradient": 0,
"hiddenSeries": false,
"lines": true,
"linewidth": 1,
"nullPointMode": "null",
"options": {
"alertThreshold": true
},
"percentage": false,
"pointradius": 5,
"points": false,
"renderer": "flot",
"seriesOverrides": [
{
"alias": "RemoveAbandonedCount",
"yaxis": 2
}
],
"spaceLength": 10,
"stack": false,
"steppedLine": false,
"targets": [
{
"expr": "IBIS_Tomcat_ConnectionPool{job=\"$Server\"}",
"format": "time_series",
"intervalFactor": 2,
"legendFormat": "{{item}}",
"refId": "A"
}
],
"timeFrom": null,
"timeRegions": [],
"timeShift": null,
"tooltip": {
"shared": true,
"sort": 0,
"value_type": "individual"
},
"xaxis": {
"buckets": null,
"mode": "time",
"name": null,
"show": true,
"values": []
},
"yaxes": [
{
"format": "none",
"label": null,
"logBase": 1,
"max": null,
"min": null,
"show": true
},
{
"format": "short",
"label": "Abandoned",
"logBase": 1,
"max": null,
"min": null,
"show": true
}
],
"yaxis": {
"align": false,
"alignLevel": null
},
"scopedVars": {
"Server": {
"text": "Prod",
"value": "Prod",
"selected": true
}
}
}
DB Connection Pool
Der JMX-Term-Exporter kann z.B. dafür genutzt werden, Tomcat.jdbc DB ConnectionPooling-Informationen auszulesen. Damit kann man im VIMON live den JDBC Connection Pool vom INUBIT oder BPC beobachten:
-
Active
-
Idle
-
MaxActive (statisch)
-
WaitCount
-
RemoveAbandonedCount
-
…
Seit INUBIT 8.0.9 ist dies bereits in INUBIT integriert.
Über den Exporter könnte man aber auch zur Laufzeit die RemoveAbandoned Einstellungen setzen und so ein INUBIT mit verstopftem Connection Pool ohne Neustart heilen oder auch andere JMX-Parameter abfragen/setzen.
Tomcat Thread Status
Mithilfe des JMX-Term-Exporters können Sie den Status der Tomcat-Threads auslesen, was bei der Fehlersuche von Performance-Problemen hilfreich sein kann:
-
Current Thread Count
-
Threads Busy
-
Max Threads
Im folgenden Bild wird ersichtlich, dass der Tomcat an seine Thread-Grenze gestoßen ist:
Interaktive Konfiguration
Man kann sich auch interaktiv über die Shell mit dem System (INUBIT, BPC, …) verbinden, um weitere Informationen/Aktionen über diesen Exporter zu implementieren.
Navigieren Sie dazu per SSH ins vimon
-Verzeichnis gehen und wie folgt vor:
Konsole-Log
virtimo@vimon-dev:~/vimon$ java11/bin/java -jar drivers/jmxterm-1.0.2-uber.jar
$>open localhost:3333
$>domains
#following domains are available
Catalina
IBIS
JMImplementation
Users
com.sun.management
com.sun.metro
java.lang
java.nio
java.util.logging
jdk.management.jfr
org.apache.camel
org.infinispan
tomcat.jdbc
$>domain tomcat.jdbc
#domain is set to tomcat.jdbc
$>beans
#domain = tomcat.jdbc:
tomcat.jdbc:class=org.apache.tomcat.jdbc.pool.DataSource,connections=PooledConnection[0],engine=Catalina,host=localhost,name="jdbc/IBISDB",path=/ibis,type=ConnectionPool
tomcat.jdbc:class=org.apache.tomcat.jdbc.pool.DataSource,connections=PooledConnection[1],engine=Catalina,host=localhost,name="jdbc/IBISJCRDB",path=/ibis,type=ConnectionPool
tomcat.jdbc:class=org.apache.tomcat.jdbc.pool.DataSource,connections=PooledConnection[2],engine=Catalina,host=localhost,name="jdbc/IBISDB",path=/ibis,type=ConnectionPool
tomcat.jdbc:class=org.apache.tomcat.jdbc.pool.DataSource,connections=PooledConnection[4],engine=Catalina,host=localhost,name="jdbc/IBISLOGSDB",path=/ibis,type=ConnectionPool
tomcat.jdbc:class=org.apache.tomcat.jdbc.pool.DataSource,connections=PooledConnection[5],engine=Catalina,host=localhost,name="jdbc/IBISLOGSDB",path=/ibis,type=ConnectionPool
tomcat.jdbc:class=org.apache.tomcat.jdbc.pool.DataSource,connections=PooledConnection[6],engine=Catalina,host=localhost,name="jdbc/IBISLOGSDB",path=/ibis,type=ConnectionPool
tomcat.jdbc:class=org.apache.tomcat.jdbc.pool.DataSource,connections=PooledConnection[7],engine=Catalina,host=localhost,name="jdbc/IBISJCRDB",path=/ibis,type=ConnectionPool
tomcat.jdbc:class=org.apache.tomcat.jdbc.pool.DataSource,engine=Catalina,host=localhost,name="jdbc/IBISDB",path=/ibis,type=ConnectionPool
tomcat.jdbc:class=org.apache.tomcat.jdbc.pool.DataSource,engine=Catalina,host=localhost,name="jdbc/IBISJCRDB",path=/ibis,type=ConnectionPool
tomcat.jdbc:class=org.apache.tomcat.jdbc.pool.DataSource,engine=Catalina,host=localhost,name="jdbc/IBISLOGSDB",path=/ibis,type=ConnectionPool
$>bean tomcat.jdbc:class=org.apache.tomcat.jdbc.pool.DataSource,engine=Catalina,host=localhost,name="jdbc/IBISDB",path=/ibis,type=ConnectionPool
#bean is set to tomcat.jdbc:class=org.apache.tomcat.jdbc.pool.DataSource,engine=Catalina,host=localhost,name="jdbc/IBISDB",path=/ibis,type=ConnectionPool
$>info
Die folgende Liste zeigt alle möglichen Metriken für die Standardeinstellungen:
JMX Metriken
%0 - AbandonWhenPercentageFull (int, rw)
%1 - AccessToUnderlyingConnectionAllowed (boolean, rw)
%2 - Active (int, r)
%3 - AlternateUsernameAllowed (boolean, rw)
%4 - BorrowedCount (long, r)
%5 - CommitOnReturn (boolean, rw)
%6 - ConnectionProperties (java.lang.String, rw)
%7 - CreatedCount (long, r)
%8 - DataSource (java.lang.Object, rw)
%9 - DataSourceJNDI (java.lang.String, rw)
%10 - DbProperties (java.util.Properties, rw)
%11 - DefaultAutoCommit (java.lang.Boolean, rw)
%12 - DefaultCatalog (java.lang.String, rw)
%13 - DefaultReadOnly (java.lang.Boolean, rw)
%14 - DefaultTransactionIsolation (int, rw)
%15 - DriverClassName (java.lang.String, rw)
%16 - FairQueue (boolean, rw)
%17 - Idle (int, r)
%18 - IgnoreExceptionOnPreLoad (boolean, rw)
%19 - InitSQL (java.lang.String, rw)
%20 - InitialSize (int, rw)
%21 - JdbcInterceptors (java.lang.String, rw)
%22 - JdbcInterceptorsAsArray ([Lorg.apache.tomcat.jdbc.pool.PoolProperties$InterceptorDefinition;, r)
%23 - JmxEnabled (boolean, rw)
%24 - LogAbandoned (boolean, rw)
%25 - LogValidationErrors (boolean, rw)
%26 - MaxActive (int, rw)
%27 - MaxAge (long, rw)
%28 - MaxIdle (int, rw)
%29 - MaxWait (int, rw)
%30 - MinEvictableIdleTimeMillis (int, rw)
%31 - MinIdle (int, rw)
%32 - Name (java.lang.String, rw)
%33 - NumActive (int, r)
%34 - NumIdle (int, r)
%35 - NumTestsPerEvictionRun (int, rw)
%36 - Password (java.lang.String, rw)
%37 - PoolName (java.lang.String, r)
%38 - PoolSweeperEnabled (boolean, r)
%39 - PropagateInterruptState (boolean, rw)
%40 - ReconnectedCount (long, r)
%41 - ReleasedCount (long, r)
%42 - ReleasedIdleCount (long, r)
%43 - RemoveAbandoned (boolean, rw)
%44 - RemoveAbandonedCount (long, r)
%45 - RemoveAbandonedTimeout (int, rw)
%46 - ReturnedCount (long, r)
%47 - RollbackOnReturn (boolean, rw)
%48 - Size (int, r)
%49 - SuspectTimeout (int, rw)
%50 - TestOnBorrow (boolean, rw)
%51 - TestOnConnect (boolean, rw)
%52 - TestOnReturn (boolean, rw)
%53 - TestWhileIdle (boolean, rw)
%54 - TimeBetweenEvictionRunsMillis (int, rw)
%55 - Url (java.lang.String, rw)
%56 - UseDisposableConnectionFacade (boolean, rw)
%57 - UseEquals (boolean, rw)
%58 - UseLock (boolean, rw)
%59 - UseStatementFacade (boolean, rw)
%60 - Username (java.lang.String, rw)
%61 - ValidationInterval (long, rw)
%62 - ValidationQuery (java.lang.String, rw)
%63 - ValidationQueryTimeout (int, rw)
%64 - Validator (org.apache.tomcat.jdbc.pool.Validator, rw)
%65 - ValidatorClassName (java.lang.String, rw)
%66 - WaitCount (int, r)
# operations
%0 - void checkAbandoned()
%1 - void checkIdle()
%2 - java.lang.Boolean isDefaultAutoCommit()
%3 - java.lang.Boolean isDefaultReadOnly()
%4 - void purge()
%5 - void purgeOnReturn()
%6 - void resetStats()
%7 - void testIdle()
# notifications
%0 - javax.management.Notification(INIT FAILED,CONNECTION FAILED,CONNECTION ABANDONED,SLOW QUERY,FAILED QUERY,SUSPECT CONNECTION ABANDONED,POOL EMPTY,SUSPECT CONNECTION RETURNED)