Prometheus, modern sistemlerin izlenmesinde devrim yaratan güçlü bir açık kaynak araçtır. “How To Query Prometheus on Ubuntu 14.04 Part 1” rehberimizde Prometheus sunucusunu, Node Exporter’ı kurmayı ve basit PromQL sorgularını çalıştırmayı öğrenmiş olmalısınız. Bu ikinci bölümde ise, Prometheus’un PromQL sorgu dilini kullanarak daha karmaşık verileri nasıl çekeceğinizi, bunları nasıl analiz edeceğinizi ve Grafana ile nasıl görselleştireceğinizi detaylı bir şekilde inceleyeceğiz. Ubuntu 14.04 gibi biraz daha eski bir işletim sistemi üzerinde bile bu tekniklerin nasıl uygulanabileceğini göstereceğiz.
Prometheus UI ile Gelişmiş PromQL Sorguları
Prometheus’un web arayüzü (genellikle http://localhost:9090/graph adresinde bulunur), PromQL sorgularınızı test etmek ve sonuçları anlık olarak görmek için harika bir yerdir. Part 1’de temel metrikleri sorgulamayı görmüştük. Şimdi daha derinlemesine PromQL yeteneklerine odaklanalım.
Zaman Serisi Seçimi ve Etiket Eşleştirme
Bir sorgu, temelde bir veya daha fazla zaman serisi seçimiyle başlar. Etiketler, seçiminizi daraltmak için kritik öneme sahiptir.
- Eşitlik Eşleştirme:
{label="value"} - Eşitsizlik Eşleştirme:
{label!="value"} - Regex Eşleştirme:
{label=~"value.*"} - Regex Eşitsizlik Eşleştirme:
{label!~"value.*"}
Örneğin, yalnızca belirli bir işten (job) veya belirli bir örnekten (instance) gelen metrikleri seçebilirsiniz:
node_cpu_seconds_total{job="node_exporter", instance="localhost:9100"}
Toplama Fonksiyonları (Aggregation Functions)
Prometheus, birden fazla zaman serisini tek bir sonuçta birleştirmek için çeşitli toplama fonksiyonları sunar. Bu fonksiyonlar genellikle by veya without anahtar kelimeleriyle birlikte kullanılır.
sum(): Tüm değerlerin toplamıavg(): Tüm değerlerin ortalamasıcount(): Zaman serisi sayısımin(): Minimum değermax(): Maksimum değerstddev(): Standart sapmastdvar(): Standart varyansgroup(): Tüm giriş serilerini tek bir çıkış serisinde birleştirir (değer 1).
Örnek: Tüm sunuculardaki toplam boşta CPU süresini almak:
sum(node_cpu_seconds_total{mode="idle"})
Eğer her bir sunucu için ayrı ayrı toplam boşta CPU süresini görmek isterseniz (instance etiketine göre gruplayarak):
sum by (instance) (node_cpu_seconds_total{mode="idle"})
Bu, her bir instance etiketi için ayrı bir zaman serisi döndürecektir.
Oran ve Değişim Fonksiyonları (Rate and Change Functions)
Sayaç (counter) tipi metrikler sürekli artar. Bunların değişim oranını veya belirli bir zaman dilimindeki artışını görmek için özel fonksiyonlar kullanırız.
rate(v[r]): Belirtilen zaman aralığındaki (r) saniye başına ortalama artış oranı. En yaygın kullanılan fonksiyondur.irate(v[r]): Belirtilen zaman aralığındaki son iki örnek kullanılarak anlık artış oranı. Hızlı değişen, ani yükselişler gösteren metrikler için daha duyarlıdır.increase(v[r]): Belirtilen zaman aralığındaki toplam artış.delta(v[r]): Belirtilen zaman aralığındaki değer farkı. Sayaç olmayan (gauge) metrikler için kullanılır.
Örnek: Son 5 dakikadaki CPU kullanım oranını hesaplama:
100 - avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100
Bu sorgu, her bir sunucu için boşta kalma süresinin oranını hesaplar ve 100’den çıkararak CPU kullanım yüzdesini verir.
Aritmetik İşlemler ve Karşılaştırmalar
PromQL, metrikler üzerinde standart aritmetik işlemleri (+, -, *, /, %) ve karşılaştırma operatörlerini (==, !=, >, <, >=, <=) destekler. Bu, daha karmaşık hesaplamalar yapmanıza olanak tanır.
Örnek: Belirli bir diskin kullanım yüzdesini hesaplama (varsayımsal node_disk_bytes_used ve node_disk_bytes_total metrikleri ile):
node_disk_bytes_used{device="/dev/sda1"} / node_disk_bytes_total{device="/dev/sda1"} * 100
Örnek: Bellek kullanımının %80’in üzerinde olduğu sunucuları bulma:
node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes > (node_memory_MemTotal_bytes * 0.80)
Bu sorgu, toplam bellekten kullanılabilir belleği çıkararak kullanılan belleği bulur ve bunun toplam belleğin %80’inden fazla olup olmadığını kontrol eder.
Prometheus Metriklerini Grafana ile Görselleştirme
Prometheus’un kendi UI’ı güçlü olsa da, karmaşık panolar oluşturmak ve uzun vadeli eğilimleri izlemek için Grafana gibi bir görselleştirme aracı vazgeçilmezdir. Grafana, Prometheus’u bir veri kaynağı olarak kullanır ve PromQL sorgularınızla dinamik, etkileşimli panolar oluşturmanıza olanak tanır.
Grafana Kurulumu (Ubuntu 14.04 için)
Ubuntu 14.04 için Grafana’yı kurmak, depodan yükleyerek veya manuel olarak indirilerek yapılabilir. Ancak 14.04 eski olduğu için, doğrudan resmi depolardan en yeni sürümü almak zor olabilir. Genellikle aşağıdaki adımlar izlenir:
# GPG anahtarını ekle
wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -
Grafana deposunu sources.list.d'ye ekle
Ubuntu 14.04 için 'stable' yerine 'main' veya belirli bir sürüm gerekebilir.
En güvenlisi, Grafana'nın kendi sitesinden .deb paketini indirmektir.
Örnek: wget https://dl.grafana.com/oss/release/grafana_9.x.x_amd64.deb
sudo dpkg -i grafana_9.x.x_amd64.deb
sudo apt-get update && sudo apt-get install grafana
Eğer depodan kuracaksanız (daha yeni Ubuntu sürümleri için daha uygun):
echo "deb https://packages.grafana.com/oss/deb stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list
sudo apt-get update
sudo apt-get install grafana
Grafana servisini başlat ve başlangıçta etkinleştir
sudo systemctl daemon-reload
sudo systemctl start grafana-server
sudo systemctl enable grafana-server
Kurulumdan sonra Grafana’ya genellikle http://localhost:3000 adresinden erişebilirsiniz. Varsayılan kullanıcı adı/şifre: admin/admin (ilk girişte değiştirmeniz istenecektir).
Prometheus’u Grafana’ya Veri Kaynağı Olarak Ekleme
- Grafana’ya giriş yapın.
- Sol menüden “Configuration” (Dişli çark simgesi) -> “Data Sources” seçeneğine tıklayın.
- “Add data source” butonuna tıklayın.
- Listeden “Prometheus”u seçin.
-
Aşağıdaki bilgileri doldurun:
- Name: Prometheus (veya istediğiniz bir isim)
- URL:
http://localhost:9090(Prometheus sunucunuzun adresi) - Diğer ayarları varsayılan olarak bırakabilirsiniz.
- “Save & Test” butonuna tıklayın. “Data source is working” mesajını görmelisiniz.
Grafana Paneli Oluşturma ve Sorgulama
- Sol menüden “Dashboards” (Dört kare simgesi) -> “New dashboard” -> “Add new panel” seçeneğine tıklayın.
- Panelin altındaki “Query” sekmesinde, “Data source” olarak eklediğiniz Prometheus’u seçin.
- “Prometheus” sorgu alanına PromQL sorgunuzu girin. Örneğin:
rate(node_network_receive_bytes_total{device="eth0"}[5m]) * 8
Bu sorgu, eth0 arayüzünden gelen ağ trafiğini (bit/saniye cinsinden) gösterecektir.
- Grafana, sorgunuzu otomatik olarak görselleştirecektir. Sağ taraftaki “Panel options” bölümünden grafik tipini (Graph, Stat, Gauge vb.), eksenleri, legend’i ve diğer görsel ayarları düzenleyebilirsiniz.
- “Apply” butonuna tıklayarak paneli dashboard’unuza ekleyin.
Değişkenler (Variables) ile Dinamik Panolar
Grafana’nın değişkenler özelliği, panolarınızı daha esnek ve etkileşimli hale getirir. Örneğin, bir açılır menüden sunucu seçerek tüm panonun o sunucuya göre güncellenmesini sağlayabilirsiniz.
- Dashboard’unuzdayken, sağ üstteki “Dashboard settings” (Dişli çark) simgesine tıklayın.
- Sol menüden “Variables” seçeneğini seçin.
- “Add variable” butonuna tıklayın.
-
Örnek bir
instancedeğişkeni oluşturalım:- Name:
instance - Type: Query
- Data source: Prometheus
- Query:
label_values(node_cpu_seconds_total, instance)(Bu,node_cpu_seconds_totalmetriğindeki tüminstanceetiket değerlerini çeker.) - Multi-value: Açık (Birden fazla sunucu seçimi için)
- Include All option: Açık (Tüm sunucuları seçme seçeneği için)
- Name:
- “Update” ve ardından “Save” butonlarına tıklayın.
Artık panellerinizde $instance değişkenini kullanabilirsiniz:
rate(node_cpu_seconds_total{instance="$instance", mode="idle"}[5m])
Dashboard’unuzun üstünde bir “instance” açılır menüsü belirecek ve seçiminize göre grafikler güncellenecektir.
Pratik İpuçları ve En İyi Uygulamalar
Sorgu Optimizasyonu
- Etiketleri Akıllıca Kullanın: Sorgularınızı mümkün olduğunca erken ve spesifik etiketlerle filtreleyin. Örneğin,
sum(rate(my_metric[5m])) by (job)yerinesum(rate(my_metric{job="my_app"}[5m])) by (instance)daha verimlidir. - Zaman Aralığına Dikkat Edin: Özellikle
rate(),irate()gibi fonksiyonlarda, zaman aralığı ([5m]) ne kadar uzun olursa sorgu o kadar fazla veri noktası işlemelidir. Gereksiz yere uzun aralıklar kullanmaktan kaçının. - Kardinaliteye Dikkat Edin: Çok yüksek kardinaliteye sahip (çok fazla benzersiz etiket kombinasyonu olan) metrikler Prometheus sunucusunu yavaşlatabilir. Gereksiz etiketlerden kaçının.
Kullanışlı PromQL Fonksiyonları
topk(k, vector): Bir vektördeki en yüksekkdeğere sahip öğeleri döndürür. Örneğin, en çok CPU kullanan 5 sunucuyu bulmak için:topk(5, sum by (instance) (rate(node_cpu_seconds_total{mode!="idle", mode!="iowait"}[5m])))bottomk(k, vector): Bir vektördeki en düşükkdeğere sahip öğeleri döndürür.histogram_quantile(phi, histogram_bucket_vector): Gecikme metrikleri gibi histogram kovalarından belirli bir yüzde (percentile) değerini hesaplamak için kullanılır. Örneğin, %99 gecikme:histogram_quantile(0.99, sum by (le) (rate(http_request_duration_seconds_bucket[5m])))
Metrik İsimlendirme Konvansiyonları
Tutarlı ve anlamlı metrik isimleri kullanmak, sorgulamayı ve izlemeyi çok daha kolay hale getirir. Prometheus topluluğu genellikle aşağıdaki konvansiyonları önerir:
- Metrik adları İngilizce, küçük harf ve alt çizgi ile ayrılmış olmalıdır (örn.
http_requests_total). - Birimler genellikle metrik adının sonunda belirtilir (örn.
_bytes,_seconds,_total). - Sayaçlar için
_totalsoneki kullanın.
Alerting ile Entegrasyon
Prometheus’un gücünün önemli bir kısmı, tanımladığınız PromQL sorgularına dayalı olarak uyarılar oluşturabilmesidir. Oluşturduğunuz karmaşık sorguları, ALERT kuralları olarak tanımlayarak sisteminizdeki anormallikler hakkında bilgilendirilebilirsiniz. Bu, genellikle alert.rules dosyalarında yapılır ve Alertmanager tarafından işlenir.
Sonuç ve Sıkça Sorulan Sorular (SSS)
Bu rehberde, Ubuntu 14.04 üzerinde çalışan Prometheus sunucunuzu kullanarak PromQL’nin daha gelişmiş özelliklerini nasıl kullanacağınızı ve Grafana ile nasıl etkili görselleştirmeler oluşturacağınızı öğrendiniz. Agregasyon fonksiyonları, oran hesaplamaları, aritmetik işlemler ve Grafana’nın dinamik panoları sayesinde sistemlerinizin sağlığı ve performansı hakkında derinlemesine içgörüler elde edebilirsiniz. Unutmayın ki izleme, sürekli bir süreçtir ve ihtiyaçlarınız değiştikçe sorgularınızı ve panolarınızı geliştirmeye devam etmelisiniz.
Sıkça Sorulan Sorular (SSS)
S1: Prometheus neden Ubuntu 14.04 gibi eski bir işletim sisteminde kullanılıyor?
C1: Bu rehber, belirli bir senaryoyu (Ubuntu 14.04) ele almak için oluşturulmuştur. Gerçek dünyada, genellikle daha yeni ve desteklenen işletim sistemleri tercih edilir. Ancak, Prometheus’un temel çalışma prensipleri ve PromQL sorgu dili işletim sisteminden bağımsızdır. Eski sistemlerde bile temel izleme ihtiyaçlarını karşılayabilir.
S2: Sorgularım neden yavaş çalışıyor veya çok fazla kaynak tüketiyor?
C2: Bunun birkaç nedeni olabilir:
- Yüksek Kardinalite: Çok fazla benzersiz etiket kombinasyonu olan metrikler.
- Geniş Zaman Aralığı: Çok uzun bir zaman dilimini kapsayan sorgular.
- Verimsiz Etiket Eşleştirme: Sorgunuzu erken filtrelememek.
- Yetersiz Prometheus Kaynakları: Prometheus sunucusunun RAM veya CPU’sunun yetersiz olması.
Sorgu optimizasyonu tekniklerini gözden geçirin ve Prometheus sunucunuzun kaynaklarını kontrol edin.
S3: Grafana’da Prometheus verilerini neden göremiyorum?
C3: Şunları kontrol edin:
- Prometheus sunucusu çalışıyor mu? (
sudo systemctl status prometheus) - Grafana veri kaynağı ayarlarında Prometheus URL’si doğru mu? (
http://localhost:9090veya doğru IP/port) - Grafana’da “Save & Test” başarılı oldu mu?
- PromQL sorgunuz doğru mu yazılmış? Prometheus UI’da test edin.
- Zaman aralığı Grafana’da doğru ayarlanmış mı? (Sağ üst köşedeki zaman seçici)
S4: rate() ve irate() arasındaki temel fark nedir?
C4: Her ikisi de sayaç metriklerinin değişim oranını hesaplar.
rate(): Belirtilen zaman aralığındaki tüm örnekleri kullanarak ortalama bir oran verir. Daha yumuşak bir eğri gösterir ve ani yükselişleri gizleyebilir. Uzun vadeli eğilimler için uygundur.irate(): Yalnızca zaman aralığındaki son iki örneği kullanarak anlık bir oran verir. Ani ve keskin değişimleri anında yakalar. Kısa vadeli, hızlı değişen metrikler (örn. anlık istek hızı) için daha uygundur.
S5: Hangi metrikleri izlemeliyim?
C5: İzlenecek metrikler uygulamanızın ve altyapınızın doğasına bağlıdır. Genellikle aşağıdaki kategorilerdeki metrikler kritik öneme sahiptir:
- Sistem Metrikleri: CPU kullanımı, bellek, disk G/Ç, ağ trafiği (Node Exporter sağlar).
- Uygulama Metrikleri: İstek sayısı, hata oranları, gecikmeler, kuyruk uzunlukları, veritabanı bağlantıları.
- Hata Metrikleri: Uygulama hataları, HTTP 5xx yanıtları, başarısız işlemler.
RED (Rate, Errors, Duration) veya USE (Utilization, Saturation, Errors) metodolojileri, hangi metrikleri izlemeniz gerektiği konusunda iyi bir başlangıç noktası sunar.