SpitfireYük Testi ve Gözlemlenebilirlikv1.4.9 · Yenilikler

Sürüm: 1.4.9Bu dokümantasyon Spitfire 1.4.9 içindir.

Altyapı izleme — Java uygulama sunucuları (Beta)

Tomcat, WildFly, WebLogic, WebSphere Liberty ve herhangi bir JVM (Spring Boot vb.) için heap, GC, thread'ler, istekler, thread pool, JDBC pool ve session'lar okunur. Her sunucu bir izlenen sistemdir; aynı izlenen sisteme virgülle birden çok adres girilebilir (app1:9404,app2:9404).

Tomcat

Hızlı kurulum

  1. Tomcat sunucusunda çalıştırın, soruları yanıtlayın.
    bash
    curl -fsSL "https://<spitfire>/api/v1/setup/ds/tomcat.sh?t=<token>&lang=tr" -o /tmp/sf-tomcat.sh && bash /tmp/sf-tomcat.sh
  2. OK: ... satırını görünce bitti.
Not

Betik javaagent'ı ve kural dosyasını /opt/spitfire/jmx'e koyar, bin/setenv.sh'e tek satır ekler (önce setenv.sh.spitfire.bak yedeği), Tomcat'i sormadan yeniden başlatmaz. Exporter yalnız JMX okur. Üründe bu satır adres ve yeni bir token ile hazır gelir.

Elle kurulum

  1. javaagent'ı indirin.
    bash
    sudo mkdir -p /opt/spitfire/jmx && sudo curl -fsSL -o /opt/spitfire/jmx/jmx_prometheus_javaagent.jar https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/1.0.1/jmx_prometheus_javaagent-1.0.1.jar
  2. Kural dosyasını yazın.
    bash
    sudo tee /opt/spitfire/jmx/spitfire-tomcat.yml >/dev/null <<'SPITFIRE_YML'
    # Spitfire tomcat: Prometheus JMX exporter javaagent 1.0.1 rules (read-only).
    lowercaseOutputName: false
    includeObjectNames:
      - "java.lang:type=Memory"
      - "java.lang:type=GarbageCollector,*"
      - "java.lang:type=Threading"
      - "java.lang:type=ClassLoading"
      - "java.lang:type=OperatingSystem"
      - "Catalina:type=GlobalRequestProcessor,*"
      - "Catalina:type=ThreadPool,*"
      - "Catalina:type=Manager,*"
      - "Catalina:type=DataSource,*"
      - "Tomcat:type=GlobalRequestProcessor,*"
      - "Tomcat:type=ThreadPool,*"
      - "Tomcat:type=Manager,*"
      - "Tomcat:type=DataSource,*"
      - "com.zaxxer.hikari:*"
    rules:
      - pattern: 'java.lang<type=Memory><HeapMemoryUsage>used'
        name: java_heap_used_bytes
        type: GAUGE
      - pattern: 'java.lang<type=Memory><HeapMemoryUsage>max'
        name: java_heap_max_bytes
        type: GAUGE
      - pattern: 'java.lang<type=Memory><NonHeapMemoryUsage>used'
        name: java_nonheap_used_bytes
        type: GAUGE
      - pattern: 'java.lang<type=Memory><NonHeapMemoryUsage>max'
        name: java_nonheap_max_bytes
        type: GAUGE
      - pattern: 'java.lang<(?=(?:[^>]*, )?type=GarbageCollector[,>])(?=(?:[^>]*, )?name="?([^",>]+)"?[,>])[^>]*><>CollectionCount'
        name: java_gc_count
        type: GAUGE
        labels:
          name: "$1"
      - pattern: 'java.lang<(?=(?:[^>]*, )?type=GarbageCollector[,>])(?=(?:[^>]*, )?name="?([^",>]+)"?[,>])[^>]*><>CollectionTime'
        name: java_gc_seconds
        type: GAUGE
        valueFactor: 0.001
        labels:
          name: "$1"
      - pattern: 'java.lang<type=Threading><>ThreadCount'
        name: java_threads_live
        type: GAUGE
      - pattern: 'java.lang<type=Threading><>DaemonThreadCount'
        name: java_threads_daemon
        type: GAUGE
      - pattern: 'java.lang<type=ClassLoading><>LoadedClassCount'
        name: java_classes_loaded
        type: GAUGE
      - pattern: 'java.lang<type=OperatingSystem><>ProcessCpuLoad'
        name: java_cpu_load
        type: GAUGE
      - pattern: '(?:Catalina|Tomcat)<(?=(?:[^>]*, )?type=GlobalRequestProcessor[,>])(?=(?:[^>]*, )?name="?([^",>]+)"?[,>])[^>]*><>requestCount'
        name: java_requests
        type: GAUGE
        labels:
          connector: "$1"
      - pattern: '(?:Catalina|Tomcat)<(?=(?:[^>]*, )?type=GlobalRequestProcessor[,>])(?=(?:[^>]*, )?name="?([^",>]+)"?[,>])[^>]*><>errorCount'
        name: java_request_errors
        type: GAUGE
        labels:
          connector: "$1"
      - pattern: '(?:Catalina|Tomcat)<(?=(?:[^>]*, )?type=GlobalRequestProcessor[,>])(?=(?:[^>]*, )?name="?([^",>]+)"?[,>])[^>]*><>processingTime'
        name: java_request_seconds
        type: GAUGE
        valueFactor: 0.001
        labels:
          connector: "$1"
      - pattern: '(?:Catalina|Tomcat)<(?=(?:[^>]*, )?type=ThreadPool[,>])(?=(?:[^>]*, )?name="?([^",>]+)"?[,>])[^>]*><>currentThreadsBusy'
        name: java_threadpool_busy
        type: GAUGE
        labels:
          connector: "$1"
      - pattern: '(?:Catalina|Tomcat)<(?=(?:[^>]*, )?type=ThreadPool[,>])(?=(?:[^>]*, )?name="?([^",>]+)"?[,>])[^>]*><>maxThreads'
        name: java_threadpool_max
        type: GAUGE
        labels:
          connector: "$1"
      - pattern: '(?:Catalina|Tomcat)<(?=(?:[^>]*, )?type=ThreadPool[,>])(?=(?:[^>]*, )?name="?([^",>]+)"?[,>])[^>]*><>currentThreadCount'
        name: java_threadpool_size
        type: GAUGE
        labels:
          connector: "$1"
      - pattern: '(?:Catalina|Tomcat)<(?=(?:[^>]*, )?type=Manager[,>])(?=(?:[^>]*, )?context="?([^",>]+)"?[,>])(?=(?:[^>]*, )?host="?([^",>]+)"?[,>])[^>]*><>activeSessions'
        name: java_sessions_active
        type: GAUGE
        labels:
          context: "$1"
          host: "$2"
      - pattern: '(?:Catalina|Tomcat)<(?=(?:[^>]*, )?type=DataSource[,>])(?=(?:[^>]*, )?name="?([^",>]+)"?[,>])[^>]*><>numActive'
        name: java_jdbc_active
        type: GAUGE
        labels:
          datasource: "$1"
      - pattern: '(?:Catalina|Tomcat)<(?=(?:[^>]*, )?type=DataSource[,>])(?=(?:[^>]*, )?name="?([^",>]+)"?[,>])[^>]*><>numIdle'
        name: java_jdbc_idle
        type: GAUGE
        labels:
          datasource: "$1"
      - pattern: '(?:Catalina|Tomcat)<(?=(?:[^>]*, )?type=DataSource[,>])(?=(?:[^>]*, )?name="?([^",>]+)"?[,>])[^>]*><>(?:maxTotal|maxActive)'
        name: java_jdbc_max
        type: GAUGE
        labels:
          datasource: "$1"
      - pattern: '(?:Catalina|Tomcat)<(?=(?:[^>]*, )?type=DataSource[,>])(?=(?:[^>]*, )?name="?([^",>]+)"?[,>])[^>]*><>waitCount'
        name: java_jdbc_waiting
        type: GAUGE
        labels:
          datasource: "$1"
      - pattern: 'com.zaxxer.hikari<type=Pool \(([^)]+)\)><>ActiveConnections'
        name: java_jdbc_active
        type: GAUGE
        labels:
          datasource: "$1"
      - pattern: 'com.zaxxer.hikari<type=Pool \(([^)]+)\)><>IdleConnections'
        name: java_jdbc_idle
        type: GAUGE
        labels:
          datasource: "$1"
      - pattern: 'com.zaxxer.hikari<type=Pool \(([^)]+)\)><>TotalConnections'
        name: java_jdbc_size
        type: GAUGE
        labels:
          datasource: "$1"
      - pattern: 'com.zaxxer.hikari<type=Pool \(([^)]+)\)><>ThreadsAwaitingConnection'
        name: java_jdbc_waiting
        type: GAUGE
        labels:
          datasource: "$1"
      - pattern: 'com.zaxxer.hikari<type=PoolConfig \(([^)]+)\)><>MaximumPoolSize'
        name: java_jdbc_max
        type: GAUGE
        labels:
          datasource: "$1"
    SPITFIRE_YML
  3. JVM seçeneğini setenv.sh'e ekleyin.
    bash
    grep -q jmx_prometheus_javaagent /opt/tomcat/bin/setenv.sh 2>/dev/null || echo 'CATALINA_OPTS="$CATALINA_OPTS -javaagent:/opt/spitfire/jmx/jmx_prometheus_javaagent.jar=9404:/opt/spitfire/jmx/spitfire-tomcat.yml"' | sudo tee -a /opt/tomcat/bin/setenv.sh
  4. Tomcat'i yeniden başlatın.
    bash
    sudo systemctl restart tomcat
  5. İzlenen sistemi ekleyin: Altyapı izleme → Tomcat, adres <host>:9404.
  6. Exporter'ı kontrol edin.
    bash
    curl -fsS http://localhost:9404/metrics | grep -q java_heap_used_bytes && echo "OK: tomcat"

Windows (PowerShell)

  1. PowerShell'i Administrator olarak açıp çalıştırın.
    powershell
    Invoke-WebRequest -UseBasicParsing -Uri "https://<spitfire>/api/v1/setup/ds/tomcat.ps1?t=<token>&lang=tr" -OutFile "$env:TEMP\sf-tomcat.ps1"; powershell -NoProfile -ExecutionPolicy Bypass -File "$env:TEMP\sf-tomcat.ps1"
  2. OK: ... satırını görünce bitti.

Elle kurulum (Windows):

  1. javaagent'ı indirin.
    powershell
    New-Item -ItemType Directory -Force C:\spitfire\jmx | Out-Null; Invoke-WebRequest -UseBasicParsing -Uri https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/1.0.1/jmx_prometheus_javaagent-1.0.1.jar -OutFile C:\spitfire\jmx\jmx_prometheus_javaagent.jar
  2. Kural dosyasını yazın.
    powershell
    $Rules = @'
    # Spitfire tomcat: Prometheus JMX exporter javaagent 1.0.1 rules (read-only).
    lowercaseOutputName: false
    includeObjectNames:
      - "java.lang:type=Memory"
      - "java.lang:type=GarbageCollector,*"
      - "java.lang:type=Threading"
      - "java.lang:type=ClassLoading"
      - "java.lang:type=OperatingSystem"
      - "Catalina:type=GlobalRequestProcessor,*"
      - "Catalina:type=ThreadPool,*"
      - "Catalina:type=Manager,*"
      - "Catalina:type=DataSource,*"
      - "Tomcat:type=GlobalRequestProcessor,*"
      - "Tomcat:type=ThreadPool,*"
      - "Tomcat:type=Manager,*"
      - "Tomcat:type=DataSource,*"
      - "com.zaxxer.hikari:*"
    rules:
      - pattern: 'java.lang<type=Memory><HeapMemoryUsage>used'
        name: java_heap_used_bytes
        type: GAUGE
      - pattern: 'java.lang<type=Memory><HeapMemoryUsage>max'
        name: java_heap_max_bytes
        type: GAUGE
      - pattern: 'java.lang<type=Memory><NonHeapMemoryUsage>used'
        name: java_nonheap_used_bytes
        type: GAUGE
      - pattern: 'java.lang<type=Memory><NonHeapMemoryUsage>max'
        name: java_nonheap_max_bytes
        type: GAUGE
      - pattern: 'java.lang<(?=(?:[^>]*, )?type=GarbageCollector[,>])(?=(?:[^>]*, )?name="?([^",>]+)"?[,>])[^>]*><>CollectionCount'
        name: java_gc_count
        type: GAUGE
        labels:
          name: "$1"
      - pattern: 'java.lang<(?=(?:[^>]*, )?type=GarbageCollector[,>])(?=(?:[^>]*, )?name="?([^",>]+)"?[,>])[^>]*><>CollectionTime'
        name: java_gc_seconds
        type: GAUGE
        valueFactor: 0.001
        labels:
          name: "$1"
      - pattern: 'java.lang<type=Threading><>ThreadCount'
        name: java_threads_live
        type: GAUGE
      - pattern: 'java.lang<type=Threading><>DaemonThreadCount'
        name: java_threads_daemon
        type: GAUGE
      - pattern: 'java.lang<type=ClassLoading><>LoadedClassCount'
        name: java_classes_loaded
        type: GAUGE
      - pattern: 'java.lang<type=OperatingSystem><>ProcessCpuLoad'
        name: java_cpu_load
        type: GAUGE
      - pattern: '(?:Catalina|Tomcat)<(?=(?:[^>]*, )?type=GlobalRequestProcessor[,>])(?=(?:[^>]*, )?name="?([^",>]+)"?[,>])[^>]*><>requestCount'
        name: java_requests
        type: GAUGE
        labels:
          connector: "$1"
      - pattern: '(?:Catalina|Tomcat)<(?=(?:[^>]*, )?type=GlobalRequestProcessor[,>])(?=(?:[^>]*, )?name="?([^",>]+)"?[,>])[^>]*><>errorCount'
        name: java_request_errors
        type: GAUGE
        labels:
          connector: "$1"
      - pattern: '(?:Catalina|Tomcat)<(?=(?:[^>]*, )?type=GlobalRequestProcessor[,>])(?=(?:[^>]*, )?name="?([^",>]+)"?[,>])[^>]*><>processingTime'
        name: java_request_seconds
        type: GAUGE
        valueFactor: 0.001
        labels:
          connector: "$1"
      - pattern: '(?:Catalina|Tomcat)<(?=(?:[^>]*, )?type=ThreadPool[,>])(?=(?:[^>]*, )?name="?([^",>]+)"?[,>])[^>]*><>currentThreadsBusy'
        name: java_threadpool_busy
        type: GAUGE
        labels:
          connector: "$1"
      - pattern: '(?:Catalina|Tomcat)<(?=(?:[^>]*, )?type=ThreadPool[,>])(?=(?:[^>]*, )?name="?([^",>]+)"?[,>])[^>]*><>maxThreads'
        name: java_threadpool_max
        type: GAUGE
        labels:
          connector: "$1"
      - pattern: '(?:Catalina|Tomcat)<(?=(?:[^>]*, )?type=ThreadPool[,>])(?=(?:[^>]*, )?name="?([^",>]+)"?[,>])[^>]*><>currentThreadCount'
        name: java_threadpool_size
        type: GAUGE
        labels:
          connector: "$1"
      - pattern: '(?:Catalina|Tomcat)<(?=(?:[^>]*, )?type=Manager[,>])(?=(?:[^>]*, )?context="?([^",>]+)"?[,>])(?=(?:[^>]*, )?host="?([^",>]+)"?[,>])[^>]*><>activeSessions'
        name: java_sessions_active
        type: GAUGE
        labels:
          context: "$1"
          host: "$2"
      - pattern: '(?:Catalina|Tomcat)<(?=(?:[^>]*, )?type=DataSource[,>])(?=(?:[^>]*, )?name="?([^",>]+)"?[,>])[^>]*><>numActive'
        name: java_jdbc_active
        type: GAUGE
        labels:
          datasource: "$1"
      - pattern: '(?:Catalina|Tomcat)<(?=(?:[^>]*, )?type=DataSource[,>])(?=(?:[^>]*, )?name="?([^",>]+)"?[,>])[^>]*><>numIdle'
        name: java_jdbc_idle
        type: GAUGE
        labels:
          datasource: "$1"
      - pattern: '(?:Catalina|Tomcat)<(?=(?:[^>]*, )?type=DataSource[,>])(?=(?:[^>]*, )?name="?([^",>]+)"?[,>])[^>]*><>(?:maxTotal|maxActive)'
        name: java_jdbc_max
        type: GAUGE
        labels:
          datasource: "$1"
      - pattern: '(?:Catalina|Tomcat)<(?=(?:[^>]*, )?type=DataSource[,>])(?=(?:[^>]*, )?name="?([^",>]+)"?[,>])[^>]*><>waitCount'
        name: java_jdbc_waiting
        type: GAUGE
        labels:
          datasource: "$1"
      - pattern: 'com.zaxxer.hikari<type=Pool \(([^)]+)\)><>ActiveConnections'
        name: java_jdbc_active
        type: GAUGE
        labels:
          datasource: "$1"
      - pattern: 'com.zaxxer.hikari<type=Pool \(([^)]+)\)><>IdleConnections'
        name: java_jdbc_idle
        type: GAUGE
        labels:
          datasource: "$1"
      - pattern: 'com.zaxxer.hikari<type=Pool \(([^)]+)\)><>TotalConnections'
        name: java_jdbc_size
        type: GAUGE
        labels:
          datasource: "$1"
      - pattern: 'com.zaxxer.hikari<type=Pool \(([^)]+)\)><>ThreadsAwaitingConnection'
        name: java_jdbc_waiting
        type: GAUGE
        labels:
          datasource: "$1"
      - pattern: 'com.zaxxer.hikari<type=PoolConfig \(([^)]+)\)><>MaximumPoolSize'
        name: java_jdbc_max
        type: GAUGE
        labels:
          datasource: "$1"
    '@
    [IO.File]::WriteAllText('C:\spitfire\jmx\spitfire-tomcat.yml', $Rules + "`n")
  3. JVM seçeneğini Tomcat servisine ekleyin (servis adı Tomcat10).
    powershell
    & "C:\Program Files\Apache Software Foundation\Tomcat 10.1\bin\tomcat10.exe" //US//Tomcat10 ++JvmOptions "-javaagent:C:\spitfire\jmx\jmx_prometheus_javaagent.jar=9404:C:\spitfire\jmx\spitfire-tomcat.yml"
  4. Servisi yeniden başlatın.
    powershell
    Restart-Service Tomcat10
  5. Exporter'ı kontrol edin.
    powershell
    if ((Invoke-WebRequest -UseBasicParsing http://localhost:9404/metrics).Content -match 'java_heap_used_bytes') { 'OK: tomcat' }

WildFly

Hızlı kurulum

  1. WildFly sunucusunda, WildFly'ı çalıştıran kullanıcıyla çalıştırın.
    bash
    curl -fsSL "https://<spitfire>/api/v1/setup/ds/wildfly.sh?t=<token>&lang=tr" -o /tmp/sf-wildfly.sh && bash /tmp/sf-wildfly.sh
  2. OK: ... satırını görünce bitti.
Not

WildFly /metrics'i yönetim portunda (9990) zaten sunar; javaagent gerekmez. Betik Undertow ve data source statistics'i açar, reload'u önce sorar. Tower başka makinedeyse yönetim arayüzünü 0.0.0.0'a bağlamayı da sorar; 9990'ı yalnız Tower'a açın. Undertow hata sayısı yalnız 5xx yanıtları sayar.

Elle kurulum

  1. Undertow statistics'i açın.
    bash
    /opt/wildfly/bin/jboss-cli.sh --connect --command='/subsystem=undertow:write-attribute(name=statistics-enabled,value=true)'
  2. Data source statistics'i açın (ExampleDS yerine kendi data source'unuz).
    bash
    /opt/wildfly/bin/jboss-cli.sh --connect --command='/subsystem=datasources/data-source=ExampleDS:write-attribute(name=statistics-enabled,value=true)'
  3. Reload edin.
    bash
    /opt/wildfly/bin/jboss-cli.sh --connect --command=':reload'
  4. İzlenen sistemi ekleyin: Altyapı izleme → WildFly, adres <host>:9990.
  5. /metrics'i kontrol edin.
    bash
    curl -fsS http://localhost:9990/metrics | grep -q base_memory_usedHeap_bytes && echo "OK: wildfly"

WebLogic

Beta: yalnız WebLogic MBean'lerinin taklidiyle test edildi, gerçek bir WebLogic'te denenmedi.

Hızlı kurulum

  1. WebLogic sunucusunda çalıştırın; her sunucu (AdminServer, managed server) için bir kez.
    bash
    curl -fsSL "https://<spitfire>/api/v1/setup/ds/weblogic.sh?t=<token>&lang=tr" -o /tmp/sf-weblogic.sh && bash /tmp/sf-weblogic.sh
  2. OK: ... satırını görünce bitti.
Not

Exporter com.bea runtime MBean'lerini platform MBean server'dan okur (domain'de "Platform MBean Server Used" açık olmalı, 10.3.3'ten beri varsayılan). Kullanıcı adı ya da parola sorulmaz. Aynı makinedeki her sunucuya ayrı exporter portu verin (9404, 9405…).

Elle kurulum

  1. javaagent'ı indirin.
    bash
    sudo mkdir -p /opt/spitfire/jmx && sudo curl -fsSL -o /opt/spitfire/jmx/jmx_prometheus_javaagent.jar https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/1.0.1/jmx_prometheus_javaagent-1.0.1.jar
  2. Kural dosyasını yazın.
    bash
    sudo tee /opt/spitfire/jmx/spitfire-weblogic.yml >/dev/null <<'SPITFIRE_YML'
    # Spitfire weblogic: Prometheus JMX exporter javaagent 1.0.1 rules (read-only).
    lowercaseOutputName: false
    includeObjectNames:
      - "java.lang:type=Memory"
      - "java.lang:type=GarbageCollector,*"
      - "java.lang:type=Threading"
      - "java.lang:type=ClassLoading"
      - "java.lang:type=OperatingSystem"
      - "com.bea:Type=ServerRuntime,*"
      - "com.bea:Type=ThreadPoolRuntime,*"
      - "com.bea:Type=JDBCDataSourceRuntime,*"
      - "com.bea:Type=JMSDestinationRuntime,*"
      - "com.bea:Type=WebAppComponentRuntime,*"
    rules:
      - pattern: 'java.lang<type=Memory><HeapMemoryUsage>used'
        name: java_heap_used_bytes
        type: GAUGE
      - pattern: 'java.lang<type=Memory><HeapMemoryUsage>max'
        name: java_heap_max_bytes
        type: GAUGE
      - pattern: 'java.lang<type=Memory><NonHeapMemoryUsage>used'
        name: java_nonheap_used_bytes
        type: GAUGE
      - pattern: 'java.lang<type=Memory><NonHeapMemoryUsage>max'
        name: java_nonheap_max_bytes
        type: GAUGE
      - pattern: 'java.lang<(?=(?:[^>]*, )?type=GarbageCollector[,>])(?=(?:[^>]*, )?name="?([^",>]+)"?[,>])[^>]*><>CollectionCount'
        name: java_gc_count
        type: GAUGE
        labels:
          name: "$1"
      - pattern: 'java.lang<(?=(?:[^>]*, )?type=GarbageCollector[,>])(?=(?:[^>]*, )?name="?([^",>]+)"?[,>])[^>]*><>CollectionTime'
        name: java_gc_seconds
        type: GAUGE
        valueFactor: 0.001
        labels:
          name: "$1"
      - pattern: 'java.lang<type=Threading><>ThreadCount'
        name: java_threads_live
        type: GAUGE
      - pattern: 'java.lang<type=Threading><>DaemonThreadCount'
        name: java_threads_daemon
        type: GAUGE
      - pattern: 'java.lang<type=ClassLoading><>LoadedClassCount'
        name: java_classes_loaded
        type: GAUGE
      - pattern: 'java.lang<type=OperatingSystem><>ProcessCpuLoad'
        name: java_cpu_load
        type: GAUGE
      - pattern: 'com.bea<(?=(?:[^>]*, )?Type=ServerRuntime[,>])(?=(?:[^>]*, )?Name="?([^",>]+)"?[,>])[^>]*><>StateVal'
        name: java_server_state
        type: GAUGE
        labels:
          server: "$1"
      - pattern: 'com.bea<(?=(?:[^>]*, )?Type=ServerRuntime[,>])(?=(?:[^>]*, )?Name="?([^",>]+)"?[,>])[^>]*><>State: RUNNING'
        name: java_server_running
        type: GAUGE
        value: 1
        labels:
          server: "$1"
      - pattern: 'com.bea<(?=(?:[^>]*, )?Type=ServerRuntime[,>])(?=(?:[^>]*, )?Name="?([^",>]+)"?[,>])[^>]*><>State: '
        name: java_server_running
        type: GAUGE
        value: 0
        labels:
          server: "$1"
      - pattern: 'com.bea<(?=(?:[^>]*, )?Type=ThreadPoolRuntime[,>])(?=(?:[^>]*, )?ServerRuntime="?([^",>]+)"?[,>])[^>]*><>StuckThreadCount'
        name: java_stuck_threads
        type: GAUGE
        labels:
          server: "$1"
      - pattern: 'com.bea<(?=(?:[^>]*, )?Type=ThreadPoolRuntime[,>])(?=(?:[^>]*, )?ServerRuntime="?([^",>]+)"?[,>])[^>]*><>HoggingThreadCount'
        name: java_hogging_threads
        type: GAUGE
        labels:
          server: "$1"
      - pattern: 'com.bea<(?=(?:[^>]*, )?Type=ThreadPoolRuntime[,>])(?=(?:[^>]*, )?ServerRuntime="?([^",>]+)"?[,>])[^>]*><>PendingUserRequestCount'
        name: java_requests_pending
        type: GAUGE
        labels:
          server: "$1"
      - pattern: 'com.bea<(?=(?:[^>]*, )?Type=ThreadPoolRuntime[,>])(?=(?:[^>]*, )?ServerRuntime="?([^",>]+)"?[,>])[^>]*><>CompletedRequestCount'
        name: java_requests
        type: GAUGE
        labels:
          server: "$1"
      - pattern: 'com.bea<(?=(?:[^>]*, )?Type=ThreadPoolRuntime[,>])(?=(?:[^>]*, )?ServerRuntime="?([^",>]+)"?[,>])[^>]*><>ExecuteThreadTotalCount'
        name: java_threadpool_size
        type: GAUGE
        labels:
          server: "$1"
      - pattern: 'com.bea<(?=(?:[^>]*, )?Type=ThreadPoolRuntime[,>])(?=(?:[^>]*, )?ServerRuntime="?([^",>]+)"?[,>])[^>]*><>ExecuteThreadIdleCount'
        name: java_threadpool_idle
        type: GAUGE
        labels:
          server: "$1"
      - pattern: 'com.bea<(?=(?:[^>]*, )?Type=JDBCDataSourceRuntime[,>])(?=(?:[^>]*, )?Name="?([^",>]+)"?[,>])[^>]*><>ActiveConnectionsCurrentCount'
        name: java_jdbc_active
        type: GAUGE
        labels:
          datasource: "$1"
      - pattern: 'com.bea<(?=(?:[^>]*, )?Type=JDBCDataSourceRuntime[,>])(?=(?:[^>]*, )?Name="?([^",>]+)"?[,>])[^>]*><>NumAvailable'
        name: java_jdbc_idle
        type: GAUGE
        labels:
          datasource: "$1"
      - pattern: 'com.bea<(?=(?:[^>]*, )?Type=JDBCDataSourceRuntime[,>])(?=(?:[^>]*, )?Name="?([^",>]+)"?[,>])[^>]*><>CurrCapacity'
        name: java_jdbc_size
        type: GAUGE
        labels:
          datasource: "$1"
      - pattern: 'com.bea<(?=(?:[^>]*, )?Type=JDBCDataSourceRuntime[,>])(?=(?:[^>]*, )?Name="?([^",>]+)"?[,>])[^>]*><>WaitingForConnectionCurrentCount'
        name: java_jdbc_waiting
        type: GAUGE
        labels:
          datasource: "$1"
      - pattern: 'com.bea<(?=(?:[^>]*, )?Type=JMSDestinationRuntime[,>])(?=(?:[^>]*, )?Name="?([^",>]+)"?[,>])[^>]*><>MessagesCurrentCount'
        name: java_jms_messages
        type: GAUGE
        labels:
          destination: "$1"
      - pattern: 'com.bea<(?=(?:[^>]*, )?Type=JMSDestinationRuntime[,>])(?=(?:[^>]*, )?Name="?([^",>]+)"?[,>])[^>]*><>MessagesPendingCount'
        name: java_jms_pending
        type: GAUGE
        labels:
          destination: "$1"
      - pattern: 'com.bea<(?=(?:[^>]*, )?Type=WebAppComponentRuntime[,>])(?=(?:[^>]*, )?Name="?([^",>]+)"?[,>])[^>]*><>OpenSessionsCurrentCount'
        name: java_sessions_active
        type: GAUGE
        labels:
          app: "$1"
    SPITFIRE_YML
  3. JVM seçeneğini AdminServer için setUserOverrides.sh'e ekleyin.
    bash
    grep -q "spitfire AdminServer" /u01/oracle/user_projects/domains/base_domain/bin/setUserOverrides.sh 2>/dev/null || echo 'if [ "${SERVER_NAME:-}" = "AdminServer" ]; then JAVA_OPTIONS="$JAVA_OPTIONS -javaagent:/opt/spitfire/jmx/jmx_prometheus_javaagent.jar=9404:/opt/spitfire/jmx/spitfire-weblogic.yml"; fi # spitfire AdminServer' >> /u01/oracle/user_projects/domains/base_domain/bin/setUserOverrides.sh
  4. AdminServer'ı yeniden başlatın.
    bash
    /u01/oracle/user_projects/domains/base_domain/bin/stopWebLogic.sh; nohup /u01/oracle/user_projects/domains/base_domain/bin/startWebLogic.sh >/dev/null 2>&1 &
  5. İzlenen sistemi ekleyin: Altyapı izleme → WebLogic, adres <host>:9404.
  6. Exporter'ı kontrol edin.
    bash
    curl -fsS http://localhost:9404/metrics | grep -q java_server_state && echo "OK: weblogic"

Windows (PowerShell)

  1. PowerShell'i Administrator olarak açıp çalıştırın.
    powershell
    Invoke-WebRequest -UseBasicParsing -Uri "https://<spitfire>/api/v1/setup/ds/weblogic.ps1?t=<token>&lang=tr" -OutFile "$env:TEMP\sf-weblogic.ps1"; powershell -NoProfile -ExecutionPolicy Bypass -File "$env:TEMP\sf-weblogic.ps1"
  2. OK: ... satırını görünce bitti.

Elle kurulum (Windows):

  1. javaagent'ı indirin.
    powershell
    New-Item -ItemType Directory -Force C:\spitfire\jmx | Out-Null; Invoke-WebRequest -UseBasicParsing -Uri https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/1.0.1/jmx_prometheus_javaagent-1.0.1.jar -OutFile C:\spitfire\jmx\jmx_prometheus_javaagent.jar
  2. Kural dosyasını yazın.
    powershell
    $Rules = @'
    # Spitfire weblogic: Prometheus JMX exporter javaagent 1.0.1 rules (read-only).
    lowercaseOutputName: false
    includeObjectNames:
      - "java.lang:type=Memory"
      - "java.lang:type=GarbageCollector,*"
      - "java.lang:type=Threading"
      - "java.lang:type=ClassLoading"
      - "java.lang:type=OperatingSystem"
      - "com.bea:Type=ServerRuntime,*"
      - "com.bea:Type=ThreadPoolRuntime,*"
      - "com.bea:Type=JDBCDataSourceRuntime,*"
      - "com.bea:Type=JMSDestinationRuntime,*"
      - "com.bea:Type=WebAppComponentRuntime,*"
    rules:
      - pattern: 'java.lang<type=Memory><HeapMemoryUsage>used'
        name: java_heap_used_bytes
        type: GAUGE
      - pattern: 'java.lang<type=Memory><HeapMemoryUsage>max'
        name: java_heap_max_bytes
        type: GAUGE
      - pattern: 'java.lang<type=Memory><NonHeapMemoryUsage>used'
        name: java_nonheap_used_bytes
        type: GAUGE
      - pattern: 'java.lang<type=Memory><NonHeapMemoryUsage>max'
        name: java_nonheap_max_bytes
        type: GAUGE
      - pattern: 'java.lang<(?=(?:[^>]*, )?type=GarbageCollector[,>])(?=(?:[^>]*, )?name="?([^",>]+)"?[,>])[^>]*><>CollectionCount'
        name: java_gc_count
        type: GAUGE
        labels:
          name: "$1"
      - pattern: 'java.lang<(?=(?:[^>]*, )?type=GarbageCollector[,>])(?=(?:[^>]*, )?name="?([^",>]+)"?[,>])[^>]*><>CollectionTime'
        name: java_gc_seconds
        type: GAUGE
        valueFactor: 0.001
        labels:
          name: "$1"
      - pattern: 'java.lang<type=Threading><>ThreadCount'
        name: java_threads_live
        type: GAUGE
      - pattern: 'java.lang<type=Threading><>DaemonThreadCount'
        name: java_threads_daemon
        type: GAUGE
      - pattern: 'java.lang<type=ClassLoading><>LoadedClassCount'
        name: java_classes_loaded
        type: GAUGE
      - pattern: 'java.lang<type=OperatingSystem><>ProcessCpuLoad'
        name: java_cpu_load
        type: GAUGE
      - pattern: 'com.bea<(?=(?:[^>]*, )?Type=ServerRuntime[,>])(?=(?:[^>]*, )?Name="?([^",>]+)"?[,>])[^>]*><>StateVal'
        name: java_server_state
        type: GAUGE
        labels:
          server: "$1"
      - pattern: 'com.bea<(?=(?:[^>]*, )?Type=ServerRuntime[,>])(?=(?:[^>]*, )?Name="?([^",>]+)"?[,>])[^>]*><>State: RUNNING'
        name: java_server_running
        type: GAUGE
        value: 1
        labels:
          server: "$1"
      - pattern: 'com.bea<(?=(?:[^>]*, )?Type=ServerRuntime[,>])(?=(?:[^>]*, )?Name="?([^",>]+)"?[,>])[^>]*><>State: '
        name: java_server_running
        type: GAUGE
        value: 0
        labels:
          server: "$1"
      - pattern: 'com.bea<(?=(?:[^>]*, )?Type=ThreadPoolRuntime[,>])(?=(?:[^>]*, )?ServerRuntime="?([^",>]+)"?[,>])[^>]*><>StuckThreadCount'
        name: java_stuck_threads
        type: GAUGE
        labels:
          server: "$1"
      - pattern: 'com.bea<(?=(?:[^>]*, )?Type=ThreadPoolRuntime[,>])(?=(?:[^>]*, )?ServerRuntime="?([^",>]+)"?[,>])[^>]*><>HoggingThreadCount'
        name: java_hogging_threads
        type: GAUGE
        labels:
          server: "$1"
      - pattern: 'com.bea<(?=(?:[^>]*, )?Type=ThreadPoolRuntime[,>])(?=(?:[^>]*, )?ServerRuntime="?([^",>]+)"?[,>])[^>]*><>PendingUserRequestCount'
        name: java_requests_pending
        type: GAUGE
        labels:
          server: "$1"
      - pattern: 'com.bea<(?=(?:[^>]*, )?Type=ThreadPoolRuntime[,>])(?=(?:[^>]*, )?ServerRuntime="?([^",>]+)"?[,>])[^>]*><>CompletedRequestCount'
        name: java_requests
        type: GAUGE
        labels:
          server: "$1"
      - pattern: 'com.bea<(?=(?:[^>]*, )?Type=ThreadPoolRuntime[,>])(?=(?:[^>]*, )?ServerRuntime="?([^",>]+)"?[,>])[^>]*><>ExecuteThreadTotalCount'
        name: java_threadpool_size
        type: GAUGE
        labels:
          server: "$1"
      - pattern: 'com.bea<(?=(?:[^>]*, )?Type=ThreadPoolRuntime[,>])(?=(?:[^>]*, )?ServerRuntime="?([^",>]+)"?[,>])[^>]*><>ExecuteThreadIdleCount'
        name: java_threadpool_idle
        type: GAUGE
        labels:
          server: "$1"
      - pattern: 'com.bea<(?=(?:[^>]*, )?Type=JDBCDataSourceRuntime[,>])(?=(?:[^>]*, )?Name="?([^",>]+)"?[,>])[^>]*><>ActiveConnectionsCurrentCount'
        name: java_jdbc_active
        type: GAUGE
        labels:
          datasource: "$1"
      - pattern: 'com.bea<(?=(?:[^>]*, )?Type=JDBCDataSourceRuntime[,>])(?=(?:[^>]*, )?Name="?([^",>]+)"?[,>])[^>]*><>NumAvailable'
        name: java_jdbc_idle
        type: GAUGE
        labels:
          datasource: "$1"
      - pattern: 'com.bea<(?=(?:[^>]*, )?Type=JDBCDataSourceRuntime[,>])(?=(?:[^>]*, )?Name="?([^",>]+)"?[,>])[^>]*><>CurrCapacity'
        name: java_jdbc_size
        type: GAUGE
        labels:
          datasource: "$1"
      - pattern: 'com.bea<(?=(?:[^>]*, )?Type=JDBCDataSourceRuntime[,>])(?=(?:[^>]*, )?Name="?([^",>]+)"?[,>])[^>]*><>WaitingForConnectionCurrentCount'
        name: java_jdbc_waiting
        type: GAUGE
        labels:
          datasource: "$1"
      - pattern: 'com.bea<(?=(?:[^>]*, )?Type=JMSDestinationRuntime[,>])(?=(?:[^>]*, )?Name="?([^",>]+)"?[,>])[^>]*><>MessagesCurrentCount'
        name: java_jms_messages
        type: GAUGE
        labels:
          destination: "$1"
      - pattern: 'com.bea<(?=(?:[^>]*, )?Type=JMSDestinationRuntime[,>])(?=(?:[^>]*, )?Name="?([^",>]+)"?[,>])[^>]*><>MessagesPendingCount'
        name: java_jms_pending
        type: GAUGE
        labels:
          destination: "$1"
      - pattern: 'com.bea<(?=(?:[^>]*, )?Type=WebAppComponentRuntime[,>])(?=(?:[^>]*, )?Name="?([^",>]+)"?[,>])[^>]*><>OpenSessionsCurrentCount'
        name: java_sessions_active
        type: GAUGE
        labels:
          app: "$1"
    '@
    [IO.File]::WriteAllText('C:\spitfire\jmx\spitfire-weblogic.yml', $Rules + "`n")
  3. JVM seçeneğini AdminServer için setUserOverrides.cmd'ye ekleyin.
    powershell
    Add-Content -Encoding ASCII C:\Oracle\Middleware\Oracle_Home\user_projects\domains\base_domain\bin\setUserOverrides.cmd 'if "%SERVER_NAME%"=="AdminServer" set "JAVA_OPTIONS=%JAVA_OPTIONS% -javaagent:C:\spitfire\jmx\jmx_prometheus_javaagent.jar=9404:C:\spitfire\jmx\spitfire-weblogic.yml" & rem spitfire AdminServer'
  4. AdminServer'ı yeniden başlatın, sonra exporter'ı kontrol edin.
    powershell
    if ((Invoke-WebRequest -UseBasicParsing http://localhost:9404/metrics).Content -match 'java_server_state') { 'OK: weblogic' }

WebSphere Liberty

Yalnız Liberty (Open Liberty, WebSphere Liberty). Geleneksel WebSphere Application Server desteklenmez.

Hızlı kurulum

  1. Liberty sunucusunda çalıştırın.
    bash
    curl -fsSL "https://<spitfire>/api/v1/setup/ds/websphere.sh?t=<token>&lang=tr" -o /tmp/sf-websphere.sh && bash /tmp/sf-websphere.sh
  2. OK: ... satırını görünce bitti.
Not

Betik configDropins/overrides/spitfire-metrics.xml dosyasını yazar; Liberty onu yeniden başlatmadan okur, server.xml değişmez. /metrics HTTP portunda kimlik doğrulamasız açılır; portu yalnız Tower'a açın. mpMetrics özelliği kurulu değilse: featureUtility installFeature mpMetrics-5.1. Liberty thread pool üst sınırını ve deadlock'ları yayınlamaz. Betik mpMetrics sürümünü server.xml'den seçer: Jakarta EE 10+ için 5.1, EE 9.1 için 4.0, Java EE 8 (javaee-8.0) için 3.0. Elle kurulumda aynısını kullanın; uyuşmazlıkta Liberty CWWKF0033E yazar ve özelliklerini kaldırır.

Elle kurulum

  1. mpMetrics dropin'ini yazın.
    bash
    sudo mkdir -p /opt/wlp/usr/servers/defaultServer/configDropins/overrides && sudo tee /opt/wlp/usr/servers/defaultServer/configDropins/overrides/spitfire-metrics.xml >/dev/null <<'SPITFIRE_XML'
    <?xml version="1.0" encoding="UTF-8"?>
    <server>
        <featureManager>
            <feature>mpMetrics-5.1</feature>
        </featureManager>
        <mpMetrics authentication="false"/>
    </server>
    SPITFIRE_XML
  2. İzlenen sistemi ekleyin: Altyapı izleme → WebSphere Liberty, adres <host>:9080.
  3. /metrics'i kontrol edin.
    bash
    curl -fsS http://localhost:9080/metrics | grep -q memory_usedHeap_bytes && echo "OK: websphere"

Java / JMX (Spring Boot)

Hızlı kurulum

  1. Uygulamanın sunucusunda çalıştırın.
    bash
    curl -fsSL "https://<spitfire>/api/v1/setup/ds/jmx.sh?t=<token>&lang=tr" -o /tmp/sf-jmx.sh && bash /tmp/sf-jmx.sh
  2. OK: ... satırını görünce bitti.
Not

systemd servisinde betik bir drop-in ile JAVA_TOOL_OPTIONS ekler ve yeniden başlatmayı sorar; başka türlü çalışan uygulamada seçeneği ekrana yazar. Spring Boot'ta gömülü Tomcat ve HikariCP metrikleri için server.tomcat.mbeanregistry.enabled=true ve spring.datasource.hikari.register-mbeans=true gerekir.

Elle kurulum

  1. javaagent'ı indirin.
    bash
    sudo mkdir -p /opt/spitfire/jmx && sudo curl -fsSL -o /opt/spitfire/jmx/jmx_prometheus_javaagent.jar https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/1.0.1/jmx_prometheus_javaagent-1.0.1.jar
  2. Kural dosyasını yazın.
    bash
    sudo tee /opt/spitfire/jmx/spitfire-jmx.yml >/dev/null <<'SPITFIRE_YML'
    # Spitfire jmx: Prometheus JMX exporter javaagent 1.0.1 rules (read-only).
    lowercaseOutputName: false
    includeObjectNames:
      - "java.lang:type=Memory"
      - "java.lang:type=GarbageCollector,*"
      - "java.lang:type=Threading"
      - "java.lang:type=ClassLoading"
      - "java.lang:type=OperatingSystem"
      - "Catalina:type=GlobalRequestProcessor,*"
      - "Catalina:type=ThreadPool,*"
      - "Catalina:type=Manager,*"
      - "Catalina:type=DataSource,*"
      - "Tomcat:type=GlobalRequestProcessor,*"
      - "Tomcat:type=ThreadPool,*"
      - "Tomcat:type=Manager,*"
      - "Tomcat:type=DataSource,*"
      - "com.zaxxer.hikari:*"
    rules:
      - pattern: 'java.lang<type=Memory><HeapMemoryUsage>used'
        name: java_heap_used_bytes
        type: GAUGE
      - pattern: 'java.lang<type=Memory><HeapMemoryUsage>max'
        name: java_heap_max_bytes
        type: GAUGE
      - pattern: 'java.lang<type=Memory><NonHeapMemoryUsage>used'
        name: java_nonheap_used_bytes
        type: GAUGE
      - pattern: 'java.lang<type=Memory><NonHeapMemoryUsage>max'
        name: java_nonheap_max_bytes
        type: GAUGE
      - pattern: 'java.lang<(?=(?:[^>]*, )?type=GarbageCollector[,>])(?=(?:[^>]*, )?name="?([^",>]+)"?[,>])[^>]*><>CollectionCount'
        name: java_gc_count
        type: GAUGE
        labels:
          name: "$1"
      - pattern: 'java.lang<(?=(?:[^>]*, )?type=GarbageCollector[,>])(?=(?:[^>]*, )?name="?([^",>]+)"?[,>])[^>]*><>CollectionTime'
        name: java_gc_seconds
        type: GAUGE
        valueFactor: 0.001
        labels:
          name: "$1"
      - pattern: 'java.lang<type=Threading><>ThreadCount'
        name: java_threads_live
        type: GAUGE
      - pattern: 'java.lang<type=Threading><>DaemonThreadCount'
        name: java_threads_daemon
        type: GAUGE
      - pattern: 'java.lang<type=ClassLoading><>LoadedClassCount'
        name: java_classes_loaded
        type: GAUGE
      - pattern: 'java.lang<type=OperatingSystem><>ProcessCpuLoad'
        name: java_cpu_load
        type: GAUGE
      - pattern: '(?:Catalina|Tomcat)<(?=(?:[^>]*, )?type=GlobalRequestProcessor[,>])(?=(?:[^>]*, )?name="?([^",>]+)"?[,>])[^>]*><>requestCount'
        name: java_requests
        type: GAUGE
        labels:
          connector: "$1"
      - pattern: '(?:Catalina|Tomcat)<(?=(?:[^>]*, )?type=GlobalRequestProcessor[,>])(?=(?:[^>]*, )?name="?([^",>]+)"?[,>])[^>]*><>errorCount'
        name: java_request_errors
        type: GAUGE
        labels:
          connector: "$1"
      - pattern: '(?:Catalina|Tomcat)<(?=(?:[^>]*, )?type=GlobalRequestProcessor[,>])(?=(?:[^>]*, )?name="?([^",>]+)"?[,>])[^>]*><>processingTime'
        name: java_request_seconds
        type: GAUGE
        valueFactor: 0.001
        labels:
          connector: "$1"
      - pattern: '(?:Catalina|Tomcat)<(?=(?:[^>]*, )?type=ThreadPool[,>])(?=(?:[^>]*, )?name="?([^",>]+)"?[,>])[^>]*><>currentThreadsBusy'
        name: java_threadpool_busy
        type: GAUGE
        labels:
          connector: "$1"
      - pattern: '(?:Catalina|Tomcat)<(?=(?:[^>]*, )?type=ThreadPool[,>])(?=(?:[^>]*, )?name="?([^",>]+)"?[,>])[^>]*><>maxThreads'
        name: java_threadpool_max
        type: GAUGE
        labels:
          connector: "$1"
      - pattern: '(?:Catalina|Tomcat)<(?=(?:[^>]*, )?type=ThreadPool[,>])(?=(?:[^>]*, )?name="?([^",>]+)"?[,>])[^>]*><>currentThreadCount'
        name: java_threadpool_size
        type: GAUGE
        labels:
          connector: "$1"
      - pattern: '(?:Catalina|Tomcat)<(?=(?:[^>]*, )?type=Manager[,>])(?=(?:[^>]*, )?context="?([^",>]+)"?[,>])(?=(?:[^>]*, )?host="?([^",>]+)"?[,>])[^>]*><>activeSessions'
        name: java_sessions_active
        type: GAUGE
        labels:
          context: "$1"
          host: "$2"
      - pattern: '(?:Catalina|Tomcat)<(?=(?:[^>]*, )?type=DataSource[,>])(?=(?:[^>]*, )?name="?([^",>]+)"?[,>])[^>]*><>numActive'
        name: java_jdbc_active
        type: GAUGE
        labels:
          datasource: "$1"
      - pattern: '(?:Catalina|Tomcat)<(?=(?:[^>]*, )?type=DataSource[,>])(?=(?:[^>]*, )?name="?([^",>]+)"?[,>])[^>]*><>numIdle'
        name: java_jdbc_idle
        type: GAUGE
        labels:
          datasource: "$1"
      - pattern: '(?:Catalina|Tomcat)<(?=(?:[^>]*, )?type=DataSource[,>])(?=(?:[^>]*, )?name="?([^",>]+)"?[,>])[^>]*><>(?:maxTotal|maxActive)'
        name: java_jdbc_max
        type: GAUGE
        labels:
          datasource: "$1"
      - pattern: '(?:Catalina|Tomcat)<(?=(?:[^>]*, )?type=DataSource[,>])(?=(?:[^>]*, )?name="?([^",>]+)"?[,>])[^>]*><>waitCount'
        name: java_jdbc_waiting
        type: GAUGE
        labels:
          datasource: "$1"
      - pattern: 'com.zaxxer.hikari<type=Pool \(([^)]+)\)><>ActiveConnections'
        name: java_jdbc_active
        type: GAUGE
        labels:
          datasource: "$1"
      - pattern: 'com.zaxxer.hikari<type=Pool \(([^)]+)\)><>IdleConnections'
        name: java_jdbc_idle
        type: GAUGE
        labels:
          datasource: "$1"
      - pattern: 'com.zaxxer.hikari<type=Pool \(([^)]+)\)><>TotalConnections'
        name: java_jdbc_size
        type: GAUGE
        labels:
          datasource: "$1"
      - pattern: 'com.zaxxer.hikari<type=Pool \(([^)]+)\)><>ThreadsAwaitingConnection'
        name: java_jdbc_waiting
        type: GAUGE
        labels:
          datasource: "$1"
      - pattern: 'com.zaxxer.hikari<type=PoolConfig \(([^)]+)\)><>MaximumPoolSize'
        name: java_jdbc_max
        type: GAUGE
        labels:
          datasource: "$1"
    SPITFIRE_YML
  3. Uygulamayı javaagent ile başlatın.
    bash
    java -javaagent:/opt/spitfire/jmx/jmx_prometheus_javaagent.jar=9404:/opt/spitfire/jmx/spitfire-jmx.yml -Dserver.tomcat.mbeanregistry.enabled=true -Dspring.datasource.hikari.register-mbeans=true -jar /opt/app/app.jar
  4. İzlenen sistemi ekleyin: Altyapı izleme → Java / JMX, adres <host>:9404.
  5. Exporter'ı kontrol edin.
    bash
    curl -fsS http://localhost:9404/metrics | grep -q java_heap_used_bytes && echo "OK: jmx"

Eşik bulguları

Bulgu Kaynak Önem
Hedef yanıt vermiyor (up = 0) Hepsi Kritik
Heap %85'in üstünde / %95'in üstünde Hepsi Uyarı / kritik
Deadlock'lu thread var Tomcat, WebLogic, Java / JMX Kritik
Thread pool %90'ın üstünde dolu Tomcat, WildFly, Java / JMX Uyarı
JDBC pool %90'ın üstünde dolu Tomcat, WildFly, Java / JMX Uyarı
JDBC pool'da bağlantı bekleyen var Tomcat, WebLogic, Java / JMX, WildFly, Liberty Uyarı
İstek hataları arttı Tomcat, WildFly, Liberty, Java / JMX Uyarı
WebLogic stuck thread var WebLogic Kritik
WebLogic sunucusu RUNNING değil WebLogic Kritik

Başarı kontrolü

  1. Sunucuda ilgili curl komutu OK: ... yazıyor.
  2. Son test = Bağlandı, 1-2 dakika içinde dashboard'da heap ve thread çizgileri var.