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
- Tomcat sunucusunda çalıştırın, soruları yanıtlayın.
curl -fsSL "https://<spitfire>/api/v1/setup/ds/tomcat.sh?t=<token>&lang=tr" -o /tmp/sf-tomcat.sh && bash /tmp/sf-tomcat.sh OK: ...satırını görünce bitti.
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
- javaagent'ı indirin.
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 - Kural dosyasını yazın.
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 - JVM seçeneğini
setenv.sh'e ekleyin.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 - Tomcat'i yeniden başlatın.
sudo systemctl restart tomcat - İzlenen sistemi ekleyin: Altyapı izleme → Tomcat, adres
<host>:9404. - Exporter'ı kontrol edin.
curl -fsS http://localhost:9404/metrics | grep -q java_heap_used_bytes && echo "OK: tomcat"
Windows (PowerShell)
- PowerShell'i Administrator olarak açıp çalıştırın.
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" OK: ...satırını görünce bitti.
Elle kurulum (Windows):
- javaagent'ı indirin.
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 - Kural dosyasını yazın.
$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") - JVM seçeneğini Tomcat servisine ekleyin (servis adı
Tomcat10).& "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" - Servisi yeniden başlatın.
Restart-Service Tomcat10 - Exporter'ı kontrol edin.
if ((Invoke-WebRequest -UseBasicParsing http://localhost:9404/metrics).Content -match 'java_heap_used_bytes') { 'OK: tomcat' }
WildFly
Hızlı kurulum
- WildFly sunucusunda, WildFly'ı çalıştıran kullanıcıyla çalıştırın.
curl -fsSL "https://<spitfire>/api/v1/setup/ds/wildfly.sh?t=<token>&lang=tr" -o /tmp/sf-wildfly.sh && bash /tmp/sf-wildfly.sh OK: ...satırını görünce bitti.
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
- Undertow statistics'i açın.
/opt/wildfly/bin/jboss-cli.sh --connect --command='/subsystem=undertow:write-attribute(name=statistics-enabled,value=true)' - Data source statistics'i açın (
ExampleDSyerine kendi data source'unuz)./opt/wildfly/bin/jboss-cli.sh --connect --command='/subsystem=datasources/data-source=ExampleDS:write-attribute(name=statistics-enabled,value=true)' - Reload edin.
/opt/wildfly/bin/jboss-cli.sh --connect --command=':reload' - İzlenen sistemi ekleyin: Altyapı izleme → WildFly, adres
<host>:9990. /metrics'i kontrol edin.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
- WebLogic sunucusunda çalıştırın; her sunucu (AdminServer, managed server) için bir kez.
curl -fsSL "https://<spitfire>/api/v1/setup/ds/weblogic.sh?t=<token>&lang=tr" -o /tmp/sf-weblogic.sh && bash /tmp/sf-weblogic.sh OK: ...satırını görünce bitti.
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
- javaagent'ı indirin.
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 - Kural dosyasını yazın.
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 - JVM seçeneğini AdminServer için
setUserOverrides.sh'e ekleyin.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 - AdminServer'ı yeniden başlatın.
/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 & - İzlenen sistemi ekleyin: Altyapı izleme → WebLogic, adres
<host>:9404. - Exporter'ı kontrol edin.
curl -fsS http://localhost:9404/metrics | grep -q java_server_state && echo "OK: weblogic"
Windows (PowerShell)
- PowerShell'i Administrator olarak açıp çalıştırın.
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" OK: ...satırını görünce bitti.
Elle kurulum (Windows):
- javaagent'ı indirin.
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 - Kural dosyasını yazın.
$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") - JVM seçeneğini AdminServer için
setUserOverrides.cmd'ye ekleyin.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' - AdminServer'ı yeniden başlatın, sonra exporter'ı kontrol edin.
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
- Liberty sunucusunda çalıştırın.
curl -fsSL "https://<spitfire>/api/v1/setup/ds/websphere.sh?t=<token>&lang=tr" -o /tmp/sf-websphere.sh && bash /tmp/sf-websphere.sh OK: ...satırını görünce bitti.
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
- mpMetrics dropin'ini yazın.
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 - İzlenen sistemi ekleyin: Altyapı izleme → WebSphere Liberty, adres
<host>:9080. /metrics'i kontrol edin.curl -fsS http://localhost:9080/metrics | grep -q memory_usedHeap_bytes && echo "OK: websphere"
Java / JMX (Spring Boot)
Hızlı kurulum
- Uygulamanın sunucusunda çalıştırın.
curl -fsSL "https://<spitfire>/api/v1/setup/ds/jmx.sh?t=<token>&lang=tr" -o /tmp/sf-jmx.sh && bash /tmp/sf-jmx.sh OK: ...satırını görünce bitti.
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
- javaagent'ı indirin.
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 - Kural dosyasını yazın.
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 - Uygulamayı javaagent ile başlatın.
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 - İzlenen sistemi ekleyin: Altyapı izleme → Java / JMX, adres
<host>:9404. - Exporter'ı kontrol edin.
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ü
- Sunucuda ilgili
curlkomutuOK: ...yazıyor. - Son test = Bağlandı, 1-2 dakika içinde dashboard'da heap ve thread çizgileri var.