Skip to content

JMX - exporter

Docs

tomcat tags

Example tomcat

YAML
services:
  web:
    image: tomcat:jre21-temurin-jammy
      - JAVA_OPTS=-Xms1024m -Xmx2048m -Djava.rmi.server.hostname=monitoring.example.net -javaagent:/agent/jmx_prometheus_javaagent-1.0.1.jar=8100:/config/tomcat_jmx_exporter.yml
    logging:
      driver: "json-file"
      options:
        max-size: "500m"
        max-file: "10"
        compress: "true"
    ports:
      - "8081:8080"
      - "8100:8100"
    volumes:
      - ./config:/config
      - ./agent:/agent

tomcat_jmx_exporter.yml

Check

YAML
---
lowercaseOutputLabelNames: false
lowercaseOutputName: true
whitelistObjectNames: ["java.lang:type=OperatingSystem", "Catalina:*"]
blacklistObjectNames: []
# Configuration by Greg Eva ([email protected]) - please contact for questions or suggested changes/enhancements
# Eventually could put back whitelist, however are very specifically pulling only relevant attributes anyway
#whitelistObjectNames: ["java.lang:type=OperatingSystem", "java.lang:type=Memory", "java.lang:type=MemoryPool", "java.lang:type=Threading", "java.lang:type=GarbageCollector", "Catalina:*", "com.mchange.v2.c3p0:*" , "org.apache.commons.pool2:*"]
#blacklistObjectNames: []

rules:
  - pattern: 'Catalina<type=Server><>serverInfo: (.+)'
    name: tomcat_serverinfo
    value: 1
    labels:
      serverInfo: "$1"
    type: COUNTER
  - pattern: 'Catalina<type=GlobalRequestProcessor, name=\"(\w+-\w+)-(\d+)\"><>(\w+):'
    name: tomcat_$3_total
    labels:
      port: "$2"
      protocol: "$1"
    help: Tomcat global $3
    type: COUNTER
  - pattern: 'Catalina<j2eeType=Servlet, WebModule=//([-a-zA-Z0-9+&@#/%?=~_|!:.,;]*[-a-zA-Z0-9+&@#/%=~_|]), name=([-a-zA-Z0-9+/$%~_-|!.]*), J2EEApplication=none, J2EEServer=none><>(requestCount|processingTime|errorCount):'
    name: tomcat_servlet_$3_total
    labels:
      module: "$1"
      servlet: "$2"
    help: Tomcat servlet $3 total
    type: COUNTER
  - pattern: 'Catalina<type=ThreadPool, name="(\w+-\w+)-(\d+)"><>(currentThreadCount|currentThreadsBusy|keepAliveCount|connectionCount|acceptCount|acceptorThreadCount|pollerThreadCount|maxThreads|minSpareThreads):'
    name: tomcat_threadpool_$3
    labels:
      port: "$2"
      protocol: "$1"
    help: Tomcat threadpool $3
    type: GAUGE
  - pattern: 'Catalina<type=Manager, host=([-a-zA-Z0-9+&@#/%?=~_|!:.,;]*[-a-zA-Z0-9+&@#/%=~_|]), context=([-a-zA-Z0-9+/$%~_-|!.]*)><>(processingTime|sessionCounter|rejectedSessions|expiredSessions):'
    name: tomcat_session_$3_total
    labels:
      context: "$2"
      host: "$1"
    help: Tomcat session $3 total
    type: COUNTER
  - pattern: 'java.lang<type=OperatingSystem><>(committed_virtual_memory|free_physical_memory|free_swap_space|total_physical_memory|total_swap_space)_size:'
    name: os_$1_bytes
    type: GAUGE
    attrNameSnakeCase: true
  - pattern: 'java.lang<type=OperatingSystem><>((?!process_cpu_time)\w+):'
    name: os_$1
    type: GAUGE
    attrNameSnakeCase: true


  rules:
  ## JAVA VIRTUAL MACHINE ##
  - pattern: 'java.lang<type=OperatingSystem><>(ProcessCpuLoad|SystemCpuLoad|SystemLoadAverage|AvailableProcessors):'
    name: jvm_processor_$1
    help: Java Virtual Machine processor load for $1
    type: GAUGE

  - pattern: 'java.lang<type=OperatingSystem><>(\w+)FileDescriptorCount:'
    name: jvm_filedescriptor_$1_count
    help: Java Virtual Machine open and maximum file descriptors
    type: GAUGE

  - pattern: 'java.lang<type=OperatingSystem><>(TotalSwapSpace|FreeSwapSpace|TotalPhysicalMemorySize|FreePhysicalMemorySize):'
    name: jvm_memory_$1_bytes
    help: Java Virtual Machine memory for $1
    type: GAUGE

  - pattern: 'java.lang<type=Threading><>(CurrentThreadCpuTime|CurrentThreadUserTime):'
    name: jvm_threads_$1_total
    help: Java Virtual Machine threads for $1
    type: COUNTER

  - pattern: 'java.lang<type=Memory><(\w+)MemoryUsage>(\w+): (\d+)'
    name: jvm_memory_bytes_$2
    labels:
      area: "$1"  # Heap/NonHeap
      value: $3
    type: GAUGE

  # Skipping GC related metrics, as they come in with the Java agent exporter implementation (not HTTP server)
  # Ideally I would like these two metrics, but I cannot get the JMX query to work
  # LastGcInfo before and after memory details not needed as present on jvm_memory_pool_allocated_bytes_total
  #- pattern: 'java.lang<name=([-a-zA-Z0-9+/$%~_-|!.]*),type=GarbageCollector><LastGcInfo>(GcThreadCount|duration)'
  #  name: jvm_gc_$2
  #  labels:
  #    pool: $1
  #  help: Java Virtual Machine garbage collection for $1
  #  type: GAUGE

Download agent

Bash
wget https://repo.maven.apache.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/1.0.1/jmx_prometheus_javaagent-1.0.1.jar

prometheus rules

YAML
  - job_name: 'test'
    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.
    static_configs:
      - targets:
        - domain.name:8100
    # or IP
        - 173.16.16.xx:8100

Grafana JVM dashboard