Giriş: Prometheus ve İzleme Dünyasına Adım
Modern BT altyapılarında sistemlerin ve uygulamaların sürekli izlenmesi, olası sorunları proaktif bir şekilde tespit etmek ve performansı optimize etmek için hayati öneme sahiptir. Bu bağlamda, Prometheus, zaman serisi veritabanı tabanlı, açık kaynaklı bir izleme ve uyarı aracı olarak öne çıkmaktadır. Güçlü sorgulama dili PromQL sayesinde, toplanan metriklerden anlamlı bilgiler çıkarmak ve karmaşık sistem davranışlarını analiz etmek mümkündür.
Bu rehberin ilk bölümünde, Ubuntu 14.04 gibi eski ama hala belirli ortamlarda kullanılan sistemlerde Prometheus’u nasıl sorgulayacağınızı adım adım inceleyeceğiz. Ubuntu 14.04’ün seçimi, Prometheus’un çeşitli Linux dağıtımlarında tutarlı bir şekilde çalıştığını göstermekle birlikte, eski sistemlerdeki potansiyel uyumluluk veya kurulum farklılıklarını da akılda tutmayı gerektirir. Ancak PromQL’in kendisi platformdan bağımsızdır ve bu rehberdeki sorgular diğer Linux sürümlerinde veya farklı işletim sistemlerinde de geçerlidir.
Amacımız, Prometheus’un temel kavramlarını tanıtmak, PromQL’in sözdizimini açıklamak ve yaygın izleme senaryoları için pratik sorgu örnekleri sunmaktır. Bu rehberin sonunda, Prometheus arayüzünü kullanarak sistemleriniz hakkında bilgi edinebilecek ve temel sorun giderme adımları atabileceksiniz.
Prometheus ve Metrik Temelleri
Prometheus, öncelikle bir zaman serisi veritabanı olarak işlev görür. Bu, topladığı tüm verilerin zamana göre etiketlendiği anlamına gelir. Prometheus’un çalışma prensibi “çekme” (pull) modeline dayanır; yani izlenecek hedeflerden (sunucular, uygulamalar, servisler) düzenli aralıklarla metrikleri çeker (scrape eder).
Metrik Nedir?
Metrikler, sistem veya uygulama hakkında ölçülebilir verilerdir. Prometheus’ta her metrik bir isim ve isteğe bağlı etiketler (labels) kümesinden oluşur. Etiketler, metriği daha spesifik hale getiren anahtar-değer çiftleridir. Örneğin, http_requests_total bir metrik ismiyken, http_requests_total{method="GET", path="/api/users", status="200"} bu metriğin belirli bir HTTP GET isteği, belirli bir yol ve başarılı bir durum kodu için değerini temsil eder.
Metrik Türleri
Prometheus dört ana metrik türünü destekler:
- Counter (Sayaç): Sadece artan, sıfırlanabilen bir değerdir. Örneğin, toplam HTTP isteği sayısı veya bir sistemin açıldığı andan itibaren geçen toplam CPU süresi.
- Gauge (Gösterge): Rastgele artıp azalabilen bir değerdir. Örneğin, mevcut RAM kullanımı, CPU sıcaklığı veya bir kuyruktaki öğe sayısı.
- Histogram: Gözlemlenen değerlerin belirli aralıklarda dağılımını (bucket) ve toplam sayısını/toplamını örnekleyen karmaşık bir türdür. Özellikle istek süreleri veya yanıt boyutları gibi dağılımı önemli olan metrikler için kullanılır.
- Summary (Özet): Histogram’a benzer ancak istemci tarafında yapılandırılabilir yüzdelik dilimler (quantiles) hesaplar.
Bu metrik türlerini anlamak, PromQL sorgularını doğru bir şekilde yazmak için kritik öneme sahiptir.
Prometheus Arayüzüne Erişim
Prometheus genellikle varsayılan olarak 9090 portundan web arayüzü sunar. Ubuntu 14.04 sunucunuzda Prometheus kurulu ve çalışır durumdaysa, bir web tarayıcısı üzerinden http:// adresine giderek arayüze erişebilirsiniz. Bu arayüz, PromQL sorgularınızı yazabileceğiniz ve sonuçları tablo veya grafik olarak görebileceğiniz ana çalışma alanınızdır.
PromQL’e Giriş ve Temel Sorgular
PromQL (Prometheus Query Language), Prometheus’un zaman serisi verilerini sorgulamak için kullandığı güçlü ve esnek bir dildir. Metrikleri seçmek, etiketlere göre filtrelemek, zaman aralıklarını belirlemek ve matematiksel işlemler yapmak için kullanılır.
Temel Sözdizimi
PromQL’in temel yapı taşı, metrik seçicileridir. Bir metrik seçici, bir metrik ismini ve isteğe bağlı etiket eşleştiricilerini içerir:
metric_name{label_name="label_value", another_label=~"regex.*"}
metric_name: Sorgulamak istediğiniz metriğin adı.{...}: Etiket filtrelerini içerir.label_name="label_value": Tam eşleşme.label_name!="label_value": Tam eşleşmeyen.label_name=~"regex": Regex ile eşleşen.label_name!~"regex": Regex ile eşleşmeyen.
Anlık Vektörler (Instant Vectors) ve Aralık Vektörleri (Range Vectors)
- Anlık Vektör: Belirli bir zaman noktasındaki bir dizi zaman serisinin en son değerini temsil eder. Çoğu PromQL sorgusu varsayılan olarak anlık vektör döndürür.
upBu sorgu, tüm hedeflerin o anki durumunu (1=yukarı, 0=aşağı) döndürür.
- Aralık Vektörü: Belirli bir zaman aralığındaki bir dizi zaman serisinin değerlerini temsil eder. Metrik isminin sonuna köşeli parantez içinde bir süre belirtilerek oluşturulur (örneğin,
[5m]5 dakika,[1h]1 saat). Aralık vektörleri genelliklerate(),sum_over_time()gibi fonksiyonlarla birlikte kullanılır.node_cpu_seconds_total[5m]Bu sorgu, son 5 dakikadaki
node_cpu_seconds_totalmetriğinin tüm değerlerini döndürür.
Temel Sorgu Örnekleri
Prometheus arayüzündeki “Expression” kutucuğuna aşağıdaki sorguları yazıp “Execute” düğmesine tıklayarak sonuçları gözlemleyebilirsiniz.
1. Tüm Metrikleri Görüntüleme
Tüm metrikleri listelemek için boş bir sorgu yapamazsınız. Belirli bir metrik adını yazmanız gerekir.
up
Bu, tüm hedeflerin anlık sağlık durumunu gösterir (1 = sağlıklı, 0 = sağlıksız). Genellikle up metriği Prometheus’un kendi tarafından sağlanan bir metriktir.
2. Etiketlere Göre Filtreleme
Sadece belirli bir instance’a ait up metriklerini görmek için:
up{instance="localhost:9090"}
Veya belirli bir job’a ait metrikleri filtrelemek için:
node_cpu_seconds_total{job="node_exporter"}
3. Regex Kullanarak Filtreleme
eth ile başlayan tüm ağ arayüzlerine ait metrikleri görmek için:
node_network_receive_bytes_total{device=~"eth.*"}
4. Sayısal Karşılaştırmalar
Değeri 0’dan büyük olan up metriklerini görmek için (yani çalışan hedefleri):
up > 0
Pratik PromQL Sorgu Örnekleri
Şimdi daha karmaşık ve pratik senaryolar için PromQL sorgularına bakalım. Bu sorgular genellikle node_exporter tarafından sağlanan metrikleri kullanır. Eğer Ubuntu 14.04 sunucunuzda node_exporter kurulu değilse, bu metrikler görünmeyecektir.
1. CPU Kullanım Yüzdesi Hesaplama
CPU kullanımını yüzde olarak görmek, en yaygın izleme ihtiyaçlarından biridir. node_cpu_seconds_total metriği, CPU’nun farklı modlarda (idle, user, system vb.) harcadığı toplam süreyi saniye cinsinden tutan bir sayaçtır. rate() fonksiyonu, bu sayacın saniyedeki ortalama artış hızını hesaplar.
100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
Açıklama:
node_cpu_seconds_total{mode="idle"}[5m]: Son 5 dakikadaki boşta (idle) CPU süresini anlık olarak değil, bir aralık vektörü olarak alır.rate(...): Bu aralık vektörü üzerindeki saniyedeki ortalama artış hızını hesaplar.avg by (instance) (...): Her bir instance (sunucu) için ortalama idle CPU süresi oranını hesaplar.100 - (...): Toplam CPU süresinden boşta geçen süreyi çıkararak CPU kullanım yüzdesini verir.
2. Bellek Kullanım Yüzdesi Hesaplama
Sistem belleği kullanımını yüzde olarak görmek için:
((node_memory_MemTotal_bytes - node_memory_MemFree_bytes - node_memory_Cached_bytes - node_memory_Buffers_bytes) / node_memory_MemTotal_bytes) * 100
Açıklama:
node_memory_MemTotal_bytes: Toplam fiziksel bellek.node_memory_MemFree_bytes: Boşta olan bellek.node_memory_Cached_bytes: Önbelleğe alınmış bellek.node_memory_Buffers_bytes: Tamponlanmış bellek.- Bu sorgu, toplam bellekten boş, önbelleğe alınmış ve tamponlanmış belleği çıkararak kullanılan gerçek bellek miktarını bulur ve bunu toplam belleğe bölerek yüzdeyi hesaplar.
3. Disk G/Ç (I/O) Hızı
Belirli bir diskteki okuma işlemleri hızını saniyedeki okuma sayısı olarak görmek için:
rate(node_disk_reads_completed_total{device="sda"}[5m])
Açıklama:
node_disk_reads_completed_total: Tamamlanan disk okuma işlemlerinin toplam sayısı (sayaç).device="sda": Sadecesdadiski için filtreler.rate(...): Son 5 dakikadaki ortalama okuma hızını saniyede tamamlanan okuma sayısı olarak verir.
4. Ağ Trafiği Hızı
Belirli bir ağ arayüzündeki gelen bayt hızını görmek için:
rate(node_network_receive_bytes_total{device="eth0"}[5m])
Giden bayt hızı için:
rate(node_network_transmit_bytes_total{device="eth0"}[5m])
Açıklama:
node_network_receive_bytes_totalvenode_network_transmit_bytes_total: Toplam alınan ve gönderilen bayt sayısı (sayaçlar).device="eth0": Sadeceeth0arayüzü için filtreler.rate(...): Son 5 dakikadaki ortalama bayt hızını saniyede bayt olarak verir.
5. Yüksek Kardinaliteli Metriklerle Çalışma (irate())
rate() fonksiyonu, bir aralık üzerindeki ortalama hızı hesaplarken, irate() (instantaneous rate) ise sadece son iki örnek arasındaki artış hızını hesaplar. Özellikle çok sık değişen (yüksek kardinaliteli) metrikler veya ani sıçramaları yakalamak istediğiniz durumlarda irate() daha kullanışlı olabilir.
irate(node_network_receive_bytes_total{device="eth0"}[1m])
Açıklama: Son 1 dakikadaki en son iki örnek arasındaki ani ağ alım hızını gösterir. Ani trafik artışlarını veya düşüşlerini daha hızlı yakalamanıza yardımcı olur.
Prometheus ile Veri Analizi ve İpuçları
Prometheus UI sadece sorgu yazmakla kalmaz, aynı zamanda verileri görselleştirmenize de olanak tanır.
Graph (Grafik) Sekmesi
Sorgunuzu çalıştırdıktan sonra “Graph” sekmesine geçerek zaman serisi verilerinin grafiksel temsilini görebilirsiniz. Bu, trendleri, ani yükselişleri veya düşüşleri görsel olarak anlamak için çok faydalıdır. Grafik üzerinde zaman aralığını değiştirebilir, kaydırabilir ve yakınlaştırabilirsiniz.
Table (Tablo) Sekmesi
“Table” sekmesi, sorgunuzun döndürdüğü anlık vektörlerin veya aralık vektörlerinin ham sayısal değerlerini gösterir. Özellikle belirli bir zaman noktasındaki kesin değerleri veya etiketleri incelemek istediğinizde kullanışlıdır.
by ve without Operatörleri
PromQL’de toplama (aggregation) fonksiyonlarını kullanırken (sum(), avg(), count() vb.), by ve without operatörleri, sonuçları hangi etiketlere göre gruplayacağınızı veya hangi etiketleri göz ardı edeceğinizi belirtmenize olanak tanır.
sum by (instance) (rate(node_cpu_seconds_total[5m])): Her birinstanceiçin toplam CPU kullanım hızını hesaplar.sum without (mode) (rate(node_cpu_seconds_total[5m])):modeetiketi hariç diğer tüm etiketlere göre gruplayarak toplam CPU kullanım hızını hesaplar.
Zaman Aralıkları ve Çözünürlük
Sorgularınızdaki zaman aralıkları (örneğin, [5m], [1h]) Prometheus’un o aralıktaki verileri nasıl değerlendireceğini belirler. Daha kısa aralıklar daha yüksek çözünürlük sağlarken, daha uzun aralıklar daha genel trendleri gösterir. Prometheus’un veri saklama süresini (retention) ve scrape aralığını (scrape_interval) dikkate alarak sorgularınızı optimize etmeniz önemlidir.
Sonuç ve Sıkça Sorulan Sorular
Bu rehberin ilk bölümünde, Prometheus’un temel kavramlarını, metrik türlerini ve PromQL’in sözdizimini öğrendik. Ayrıca, CPU, bellek, disk ve ağ kullanımı gibi yaygın izleme senaryoları için pratik PromQL sorguları yazdık. Prometheus arayüzünü kullanarak verileri nasıl sorgulayacağınızı ve görselleştireceğinizi de inceledik.
Prometheus’un gücü, doğru PromQL sorgularını yazma yeteneğinizde yatmaktadır. Bu temel bilgileri kullanarak sistemlerinizin performansını anlamaya başlayabilir ve potansiyel sorunları erken aşamada tespit edebilirsiniz.
Rehberin ikinci bölümünde, daha gelişmiş PromQL konularına, uyarı kurallarına (alerting rules), kayıt kurallarına (recording rules) ve Grafana gibi dashboard araçları ile entegrasyona odaklanacağız.
Sıkça Sorulan Sorular (SSS)
1. Prometheus metrikleri neden görünmüyor?
Bunun birkaç nedeni olabilir:
- Hedef çalışmıyor: Prometheus’un izlediği hedef (örneğin,
node_exporter) çalışmıyor olabilir. - Prometheus hedefi scrape edemiyor: Prometheus yapılandırma dosyasında (
prometheus.yml) hedef doğru şekilde tanımlanmamış veya erişilemez durumda olabilir (güvenlik duvarı, ağ sorunu). Prometheus UI’daki “Status” -> “Targets” sayfasını kontrol edin. - Yanlış metrik adı/etiket: PromQL sorgunuzda yanlış bir metrik adı veya etiket kullanıyor olabilirsiniz.
- Veri yok: Prometheus henüz o metriği çekmemiş veya metrik henüz üretilmemiş olabilir.
2. PromQL sorgum neden hata veriyor?
PromQL sorgularında yaygın hatalar şunlardır:
- Sözdizimi hatası: Yanlış parantez kullanımı, eksik tırnak işaretleri veya yanlış operatörler.
- Metrik/etiket bulunamadı: Sorguladığınız metrik veya etiket Prometheus’ta mevcut değil.
- Geçersiz zaman aralığı: Özellikle aralık vektörlerinde
[5m]gibi süre belirtimlerinde hata. - Fonksiyon argümanları: Fonksiyonların beklediği argüman türüyle uyuşmayan değerler.
Hata mesajlarını dikkatlice okuyun; genellikle sorunun nerede olduğunu belirtirler.
3. Ubuntu 14.04’te Prometheus’u nasıl kurarım?
Bu rehber PromQL sorgulamaya odaklandığı için kurulum adımlarını içermemektedir. Ancak özetle, Prometheus ve Node Exporter’ın ikili dosyalarını indirmeli, uygun dizinlere yerleştirmeli, prometheus.yml yapılandırma dosyasını oluşturmalı ve systemd veya SysV init betikleri aracılığıyla servis olarak çalıştırmanız gerekir. Ubuntu 14.04’ün eski bir sürüm olması nedeniyle, modern Prometheus ikili dosyalarını doğrudan çalıştırmak yerine derlemeniz veya statik derlenmiş sürümleri kullanmanız gerekebilir. Prometheus’un resmi dokümantasyonu en güncel kurulum bilgilerini sağlar.
4. rate() ve irate() arasındaki fark nedir?
rate(): Belirtilen zaman aralığı boyunca bir sayacın saniyedeki ortalama artış hızını hesaplar. Daha yumuşak bir eğri sağlar ve kısa süreli dalgalanmaları filtreler.irate(): Yalnızca belirtilen aralıktaki son iki veri noktası arasındaki artış hızını hesaplar. Daha ani değişimleri yakalar ve ani yükselişleri/düşüşleri hızlıca gözlemlemek için kullanışlıdır. Yüksek kardinaliteli veya ani değer değişimleri olan metrikler için daha uygundur.
5. Prometheus’ta hangi port kullanılır?
Prometheus sunucusu varsayılan olarak 9090 portunu kullanır. Node Exporter gibi diğer exporter’lar ise genellikle 9100 gibi farklı portlarda çalışır. Bu portlar prometheus.yml dosyasında yapılandırılabilir.