VisualVM yetmediğinde: otomasyona uygun izleme

Bir önceki yazıda VisualVM ile application server'ı elle, GUI üzerinden nasıl izleyeceğimizi anlatmıştım. Ama gerçek bir production ortamında sürekli birinin VisualVM açıp ekrana bakması pratik değil — izlemenin bir izleme sistemine (Zabbix, Grafana, Prometheus gibi) otomatik olarak akması gerekir. TROIA bunun için JMX (Java Management Extensions) desteği sunuyor; VisualVM'in "GUI'siz, programatik" karşılığı diyebiliriz.

JMX nedir

JMX, çalışan bir Java uygulamasının iç durumunu izlemek ve yönetmek için kullanılan standart bir Java teknolojisi. RAM/heap kullanımı, thread sayısı, garbage collection istatistikleri ve CPU kullanımı gibi JVM seviyesindeki metriklerin yanında, uygulamaya özgü metrikleri de MBean adı verilen nesneler üzerinden dışarı açabiliyor. TROIA'ya özgü MBean'ler için minimum build şartı 26.08.11-01 — daha eski bir build'de bu MBean'leri aramak boşa vakit kaybıdır.

JMX'i etkinleştirmek

Application server'ın başlatma parametrelerine (JVM argümanları) şunlar eklenir:

-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=PORTNUMARANIZ
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false

MBean'lerin aktif olması için hem com.sun.management.jmxremote hem de port parametresinin tanımlı olması gerekiyor. Production ortamında authenticate=false ve ssl=false ayarlarını olduğu gibi bırakmak ciddi bir güvenlik riskidir — bu port açıksa ve kimlik doğrulama kapalıysa, ağa erişimi olan herkes application server'ın iç durumunu (ve bazı JMX implementasyonlarında yönetim işlemlerini) görebilir/tetikleyebilir. Gerçek bir production kurulumunda bu portu güvenlik duvarı arkasında tutmak veya kimlik doğrulamayı/SSL'i açık bırakmak şart.

TROIA'ya özgü iki MBean

ApplicationServer MBean (com.ias.server.appserver.monitoring.jmx paketinde): ServerSessionCount, LoginDuration, TransactionOpeningDuration, DialogOpeningDuration, ClassCacheSize, DialogCacheSize gibi öznitelikler sunuyor. DialogOpeningDuration'ın sürekli yükseldiğini gözlemlemek, örneğin bir dialog'un BEFORE/AFTER olaylarında yavaşlayan bir kod parçası olduğuna işaret edebilir.

LicenseServer MBean (com.ias.server.controller.monitoring.jmx paketinde): MaxRegularUserCount, CurrentRegularUserCount, AvailableRegularUserCount ve portal kullanıcıları için karşılıkları. Birden fazla lisans varsa, her biri için tekil kimliklerle tekrar eden öznitelikler oluşuyor. AvailableRegularUserCount'un sık sık sıfıra düşmesi, lisans sayısının gerçek kullanıcı ihtiyacını karşılamadığının somut bir göstergesi.

MBean'leri kontrol etmek: JConsole

JDK ile birlikte gelen JConsole aracı, yerel ya da uzak bir process'e bağlanıp "MBeans" sekmesinden hem ApplicationServer hem LicenseServer MBean'lerini görüntülemenizi sağlıyor. VisualVM'e benzer bir bağlanma deneyimi sunar ama odak noktası tam olarak bu yönetilebilir özniteliklerdir.

Gerçek bir kullanım senaryosu: lisans tükenmesini önceden görmek

Bir müşteride "bazı kullanıcılar sabah 9'da sisteme giremiyor" şikayeti alırsanız, ilk şüphe genelde bir uygulama hatası olur. Ama LicenseServer MBean'inin AvailableRegularUserCount değerini bir izleme sistemine bağlayıp geçmişe bakarsanız, sorunun aslında sabah yoğun girişte lisans sayısının tükenmesi olduğunu saniyeler içinde görebilirsiniz — kod tarafında hiçbir hata olmadan.

Sık yapılan hatalar

  • JMX portunu güvenlik duvarı olmadan dışarı açmak — yukarıda değindiğim gibi, authenticate=false ile açık bırakılan bir JMX portu, application server hakkında hassas bilgiye (ve bazı senaryolarda kontrole) yetkisiz erişim riski taşır.
  • Eski build'de MBean aramak — TROIA'ya özgü MBean'ler belirli bir build'den itibaren var; "MBean görünmüyor" şikayetinin ilk kontrol noktası build numarasıdır.
  • Sadece anlık değere bakıp trend'i gözden kaçırmak — ServerSessionCount ya da DialogOpeningDuration gibi metrikleri tek seferlik okumak yerine zaman içinde bir izleme aracına aktarıp trend görmek, "şu an normal ama saatler içinde kötüleşen" sorunları yakalamanın tek yolu.
  • JMX ile VisualVM'i rakip sanmak — ikisi birbirini tamamlıyor: geliştirme/teşhis sırasında elle derin analiz için VisualVM, production'da sürekli/otomatik izleme için JMX + bir izleme aracı.

Sıradaki adım

İzleme araçlarından biraz uzaklaşıp, bir sonraki yazıda dialog yaşam döngüsüne (BEFORE, AFTER, ONSHOW) ve zamanlayıcılara (SETTIMER) döneceğim.