Spring Boot Actuator ile uygulamayı üretimde izlemek: sağlık, metrik ve güvenlik
Actuator ile sağlık kontrolü, Kubernetes probları, Micrometer metrikleri ve uç nokta güvenliğini adım adım nasıl yapılandıracağınızı öğrenin.
Actuator ne sağlar?
Spring Boot Actuator, çalışan bir uygulamanın durumunu dışarıya HTTP (ya da JMX) uç noktaları olarak açan bir modüldür. Bu uç noktalar; uygulamanın sağlıklı olup olmadığını, hangi metrikleri ürettiğini, ortam bilgisini, kayıtlı bean'leri ve günlük düzeylerini gösterebilir. Dağıtımdan sonra 'uygulama ayakta mı, yük altında nasıl davranıyor' sorusunu koda dokunmadan yanıtlamak için kullanılır.
Aktuatör farklı tüketicilere hizmet eder. Altyapı (yük dengeleyici, Kubernetes) sağlık uç noktasını sorgulayarak trafiği yönlendirir ya da uygulamayı yeniden başlatır. İzleme sistemleri ise metrik uç noktasını düzenli aralıklarla okuyarak grafik ve uyarı üretir. Bu tüketicilerin farklı ihtiyaçlara sahiptir: ilkine hızlı ve basit bir evet-hayır gerekir, ikincisine ayrıntılı ve zaman serisi veri.
Kurulum ve uç noktaları açmak
Projeye Actuator starter bağımlılığını ekledikten sonra Spring Boot belgesine göre güvenlik gerekçesiyle HTTP üzerinden varsayılan olarak yalnızca sağlık uç noktası açıktır. Diğer uç noktalar var olsa da dışarıdan görünmez. Hangilerinin açılacağı şu özelliklerle belirlenir:
management.endpoints.web.exposure.include=health,info,metrics management.endpoints.web.exposure.exclude=env,beans
Hariç tutma kuralı, dahil etme kuralından önceliklidir ve yıldız işareti tüm uç noktaları seçer; YAML'da yıldız özel anlam taşıdığı için tırnak içinde yazılmalıdır. Uç noktaları aç(ma)dan önce şunu sorun: bu uç nokta hassas bilgi içeriyor mu? Ortam değişkenlerini ya da bean yapısını gösteren uç noktalar saldırgana yol haritası verir. Belgenin önerdiği gibi, açtığınız uç noktaları ağ duvarı arkasında tutun ya da Spring Security gibi bir mekanizmayla koruyun.
Sağlık uç noktasını anlamlı yapmak
Sağlık uç noktası, tek tek 'sağlık göstergelerinin' (health indicator) sonucunu toplar. Veri tabanı, disk alanı ve bağlı olduğunuz dış sistemler için hazır göstergeler vardır; kendi göstergenizi de yazabilirsiniz:
@Component class PaymentHealth implements HealthIndicator { public Health health() { return paymentGatewayReachable() ? Health.up().build() : Health.down().withDetail("reason", "no response").build(); } }
Yanıttaki ayrıntı düzeyi management.endpoint.health.show-details ile ayarlanır. Varsayılan değer never: ayrıntı hiç gösterilmez. when-authorized ayrıntıyı yalnızca yetkili kullanıcıya gösterir, always ise herkese. Ayrıntıları herkese açık göstermek bağlantı adreslerini ve altyapı bilgisini sızdırabilir; yetkili gösterim daha güvenli bir orta yoldur.
Bir dış bağımlılığın sağlık kontrolünü uygulamanın ana sağlığına bağlamadan önce düşünün: ödeme sağlayıcısı geçici kapalıysa uygulamanın tamamı 'sağlıksız' sayılıp yeniden başlatılsın mı? Çoğu durumda hayır.
Kubernetes için liveness ve readiness
Kubernetes ayrı sorular sorar. Liveness: uygulama takıldı mı, yeniden başlatılmalı mı? Readiness: uygulama trafik almaya hazır mı? Spring Boot bu sorulara karşılık gelen sağlık gruplarını otomatik sunar: /actuator/health/liveness ve /actuator/health/readiness. Bu gruplar belgede belirtildiği üzere kendiliğinden etkindir; management.endpoint.health.probes.enabled özelliğiyle kapatılabilir.
Pod tanımında şöyle bağlanır:
livenessProbe: httpGet: path: /actuator/health/liveness port: MANAGEMENT_PORT readinessProbe: httpGet: path: /actuator/health/readiness port: MANAGEMENT_PORT
Yönetim için ayrı bir port kullanıyorsanız, probları ana sunucu portunda da erişilebilir kılmak için management.endpoint.health.probes.add-additional-paths özelliği vardır; bu durumda liveness /livez, readiness /readyz yolundan sunulur.
Önemli ilke: liveness grubuna veri tabanı gibi dış bağımlılıkları koymayın. Veri tabanı çöktüğünde tüm pod'lar liveness yüzünden yeniden başlatılırsa sorun büyür. Dış bağımlılıkların durumu readiness'e aittir.
Metrikler: Micrometer ve Prometheus
Actuator, metrikleri Micrometer üzerinden toplar. Metrics uç noktası, uygulamanın kaydettiği metriklerin adlarını ve değerlerini gösterir; JVM belleği, çöp toplama, HTTP istek süreleri ve veri tabanı havuzu gibi pek çok ölçüm hazır gelir.
Metrikleri bir izleme sistemine aktarmak için kayıt defteri bağımlılığı gerekir. Prometheus için belgeye göre micrometer-registry-prometheus bağımlılığı eklenir ve prometheus uç noktası açılır:
management.endpoints.web.exposure.include=health,metrics,prometheus
Prometheus bu adresi düzenli aralıklarla çeker; Grafana ile görselleştirilir. Kendi iş metrikleriniz için bir sayaç tanımlayabilirsiniz:
Counter.builder("orders.created").tag("channel", channel).register(registry).increment();
Etiket seçimine dikkat edin. Kullanıcı kimliği gibi sınırsız çeşitlilikte değerleri etiket yapmak, zaman serisi sayısını patlatıp izleme sistemini zorlar. Etiketler sınırlı kümeden gelmeli: kanal, durum, bölge gibi.
Üretim kontrol listesi
Actuator'ı üretime alırken şunları gözden geçirin:
- Yalnızca gereken uç noktalar açık mı? Dahil etme listesi açıkça yazılmış mı?
- Uç noktalar ağ düzeyinde ya da kimlik doğrulamayla korunuyor mu? Yönetim trafiği için ayrı bir port ve yalnızca iç ağdan erişim iyi bir yaklaşımdır.
- Sağlık ayrıntıları yetkisiz kullanıcıya gösterilmiyor mu?
- Liveness ve readiness grupları doğru bağımlılıklara bağlı mı?
- Temel uyarılar tanımlı mı: hata oranı, yanıt süresi, bellek baskısı, bağlantı havuzu doygunluğu?
- Günlük düzeyini çalışma zamanında değiştirme gibi güçlü uç noktalar kısıtlı mı?
- Metrik etiketlerinde yüksek çeşitlilik var mı?
- İzleme panosu, sorun yaşandığında gerçekten bakılan bir yerde mi?
Uç noktaları tek tek erişim izni açısından da yönetebilirsiniz: her uç nokta için erişim özelliği vardır; Spring Boot belgesine göre kapatma ve yığın dökümü hariç tüm uç noktalar kısıtsızdır ama bunlar zaten dışarıya açılmadıkça erişilemez.
Sık yapılan hatalar
- Her şeyi açmak (yıldız ile dahil etmek) ve korumayı unutmak.
- Liveness probuna dış bağımlılık koymak; kademeli çöküşe yol açar.
- Sağlık yanıtında ayrıntıyı herkese göstermek.
- Yalnızca 'ayakta mı' kontrolü yapıp, yavaşlama ve hata oranını izlememek. Uygulama ayakta olup kullanıcıya hata dönüyor olabilir.
- Metriklerde kullanıcıya özgü etiketler kullanmak.
- İzlemeyi uyarı kuralı olmadan kurmak. Pano, kimse bakmazsa sorunu bildirmez.
- Geliştirme ortamında açık bıraktığı uç noktaları üretime aynen taşımak. Ortam bazlı yapılandırma kullanın.
Bu beceriyi Mindset programlarında nerede çalışırsınız?
Java Spring Boot ile Backend programının son modülü Test, Aktuatör ve Üretim Hazırlığı başlığını taşıyor; yani bu sayfadaki sağlık, metrik ve üretime çıkış kontrolü konuları doğrudan o modüle denk düşüyor. Program, Spring ile servis yazıp bunu işletmeye de sahip çıkmak isteyen geliştiriciler ve platform ekipleri için uygun görünüyor.
İzleme tarafını Spring'den bağımsız olarak derinleştirmek isteyen ekipler için Prometheus ve Grafana ile İzleme programı, topladığınız metriklerin panoya ve uyarıya dönüştürülmesi açısından bu sayfayı tamamlar. Kurumsal ekiplerde sağlık göstergesi ve etiket standardını ortak yazmak, farklı servislerin aynı panoda karşılaştırılabilmesini sağlar.
İlgili Mindset programı
Java Spring Boot ile Backend
Sık sorulan sorular
Actuator uç noktalarını güvenli hale nasıl getiririm?
Yalnızca gereken uç noktaları dahil etme listesiyle açın, yönetim trafiğini ayrı bir porta ve iç ağa alın, ve Spring Security ile kimlik doğrulama ekleyin. Sağlık ayrıntısını when-authorized değeriyle yetkili kullanıcıya sınırlayın. Ortam ve bean gibi hassas uç noktaları üretimde açmayın.
Liveness ile readiness arasındaki fark nedir?
Liveness, uygulamanın kurtarılamaz biçimde takılıp takılmadığını sorar; cevap olumsuzsa pod yeniden başlatılır. Readiness ise uygulamanın trafik almaya hazır olup olmadığını sorar; olumsuzsa pod servis uç noktalarından geçici olarak çıkarılır ama yeniden başlatılmaz.
Prometheus ile nasıl bağlanırım?
Micrometer'ın Prometheus kayıt defteri bağımlılığını ekleyin ve prometheus uç noktasını açın. Prometheus sunucusunu bu adresi düzenli çekecek şekilde yapılandırın. Uç noktayı exposure.include özelliğine eklemeyi unutmayın; yoksa dışarıdan yalnızca sağlık uç noktası görünür. Metrik adresini herkese açık bırakmayıp yalnızca izleme sisteminin ulaşabildiği ağda tutun. Elde edilen metrikleri Grafana'da panoya ve uyarı kurallarına dönüştürebilirsiniz.
Kendi iş metriğimi nasıl eklerim?
Micrometer kayıt defterini enjekte edip sayaç, ölçer ya da zamanlayıcı tanımlarsınız; örneğin oluşturulan sipariş sayısı için bir sayaç. Etiketleri sınırlı değer kümesinden seçin ve metrik adlarında tutarlı bir adlandırma kullanın.
İlgili rehberler
İlgili eğitimler
Kategori: Yazılım Geliştirme, DevOps ve Bulut Teknolojileri