Modern altyapı metriklere heavily bağımlıdır, ancak kurumsal kritik yol işlevselliğinin önemli bir kısmı hala eski uygulamalarda çalışmaktadır. Bu sistemler—genellikle onlarca yıl önce oluşturulmuşlardır—sıklıkla şeffaf değildir ve modern gözlemlenebilirlik araçları için yerel API uç noktalarına sahip değildir. Bu boşluk, beklenmeyen kesintilere ve performans düşüşlerine yol açan kör noktalar yaratır. Bu kılavuzda, özel Prometheus exporter'ları oluşturarak bu boşluğu nasıl doldurabileceğimizi keşfedeceğiz. Eski mantığı bir metrik katmanına sararak, temel uygulama kodunu değiştirmeden mevcut Grafana ve Prometheus panolarınıza hayati sağlık göstergelerini açığa çıkarabilirsiniz.
Exporter Desenini Anlamak
Bir Prometheus exporter'ı, metrikleri Prometheus'un tarayabileceği bir biçimde açığa çıkaran ayrı bir hizmettir. Uygulamanın kendisi COBOL, Delphi veya eski bir Java sürümü gibi bir dilde yazılmış olabilirken, exporter ince bir sargı görevi görür. Mevcut arayüzler—SNMP, HTTP API'leri veya veritabanı sorguları gibi—üzerinden eski sistemle etkileşime girer ve bu yanıtları Prometheus ile uyumlu bir biçime dönüştürür.
Bu sorumluluk ayrımı çok önemlidir. Eski uygulamanın sağlığını, uygulama mantığından bağımsız olarak yönetmenizi sağlar. Exporter başarısız olursa, izleme yığınınız stabil kalır. Eski uygulama başarısız olursa, exporter sadece sıfır veya hata durumlarını rapor eder ve ekibinizi kullanıcılar bilmeden önce uyarır.
Doğru Dili Seçmek
Exporter oluştururken, programlama dili seçimi genellikle bakım kolaylığını ve performansı belirler. Bu alanda iki dil baskındır: Go ve Python.
Go, exporter yazmak için endüstri standardıdır. Resmi prometheus/client_golang kütüphanesi sağlamdır, tür güvenlidir ve tek bir statik ikili dosyaya derlenir; bu da konteyner ortamlarında dağıtımı basitleştirir. Yüksek performanslıdır ve eşzamanlılığı iyi yönetir.
Python, özellikle ekibiniz metrik birleştirme için Pandas gibi veri manipülasyonu kütüphanelerine aşinaysa, hızlı prototipleme için mükemmeldir. prometheus_client paketi kullanımı kolaydır ancak yüksek veri akışı senaryolarında daha yavaş olabilir.
Go ile Uygulama Örneği
Go kullanarak pratik bir örneğe bakalım. Stok seviyelerini saklayan eski bir envanter veritabanınız olduğunu varsayalım. Düşük stoklu öğelerin sayısını açığa çıkarmak istiyorsunuz. İşte exporter'ı nasıl yapılandırabileceğinize dair bir örnek:
package main
import (
"log"
"net/http"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
)
// LowStockCollector, prometheus.Collector arayüzünü uygular.
type LowStockCollector struct {
LowStockCount *prometheus.Desc
}
// NewLowStockCollector yeni bir toplayıcı başlatır.
func NewLowStockCollector() *LowStockCollector {
return &LowStockCollector{
LowStockCount: prometheus.NewDesc(
"legacy_inventory_low_stock",
"Eski veritabanında düşük stoklu öğelerin sayısı",
nil, nil,
),
}
}
// Describe, bu toplayıcıyla ilgili her Metrik için tanımlayıcıları gönderir.
func (c *LowStockCollector) Describe(ch chan<- *prometheus.Desc) {
ch <- c.LowStockCount
}
// Collect, metrikleri toplarken Prometheus kayıt defteri tarafından çağrılır.
func (c *LowStockCollector) Collect(ch chan<- prometheus.Metric) {
// Eski sistemden veri çekmeyi simüle edin
count := fetchLowStockCountFromLegacyDB()
ch <- prometheus.MustNewConstMetric(
c.LowStockCount,
prometheus.GaugeValue,
float64(count),
)
}
func main() {
registry := prometheus.NewRegistry()
collector := NewLowStockCollector()
registry.MustRegister(collector)
http.Handle("/metrics", promhttp.HandlerFor(registry, promhttp.HandlerOpts{}))
log.Fatal(http.ListenAndServe(":9100", nil))
}
func fetchLowStockCountFromLegacyDB() int {
// Eski DB'ye sorgu yapma mantığı buraya gelir
return 42
}
Bu örnekte, Describe ve Collect yöntemlerini uygulayan özel bir toplayıcı tanımlıyoruz. Collect yöntemi, eski sistemle etkileşime geçtiğiniz yerdir. Bunu /metrics üzerinde açığa çıkararak, Prometheus eski uygulamayı değiştirmeye gerek kalmadan verileri tarayabilir.
Kimlik Doğrulama ve Güvenliği Yönetme
Eski sistemler genellikle modern kimlik doğrulama mekanizmalarından yoksundur. Ancak, exporter'ın kendisi güvenli hale getirilmelidir. Exporter ayrı bir hizmet olduğundan, Nginx veya Apache gibi bir ters vekil sunucunun arkasına yerleştirip temel kimlik doğrulama veya mTLS ekleyebilirsiniz. Bu, eski arayüz güvensiz olsa bile metrik uç noktasının yetkisiz erişime karşı korunmasını sağlar.
Sonuç
Gözlemlenebilirliği eski uygulamalara genişletmek sadece teknik bir zorunluluk değil, aynı zamanda bir iş gerekliliğidir. Özel Prometheus exporter'ları oluşturarak, aksi takdirde kara kutu olarak kalacak sistemlerde görünürlük elde edersiniz. Performans için Go'yu veya basitlik için Python'u seçin; önemli olan exporter'ın hafif ve odaklı tutulmasıdır. Bu yaklaşım, kritik eski altyapınızın stabilitesini korurken izleme yığınızı kademeli olarak modernleştirmenize olanak tanır. Küçük başlayın, bir metrik açığa çıkarın ve oradan genişleyin.