JMX-Term-Exporter

  • Linux

  • Windows

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:

jmxterm exporter

Voraussetzungen

  • Linux OS

  • JMX Remote Access ist im INUBIT aktiviert und der Port steht auf 3333

    In 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 localhost erreichbar sein soll, dann muss TLS aktiviert werden.

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
  1. Prüfen, ob der Port frei ist.

    Falls nicht, einen freien Port angeben.

  2. Einen Namen (Servernamen) des zu überwachenden Systems setzen.

  3. 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.

jmx tomcat connection pool

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:

jmx tomcat threads

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)