Prometheus'un kendi arayüzünde tek bir sorgu çalıştırıp grafiği görmek güzeldir ama sabah kahveni içerken sistemin genel durumuna bakmak istediğinde işe yaramaz. Sekiz ayrı sekme açıp sekiz sorgu yazmak sürdürülebilir değil. Grafana dashboard oluşturma tam olarak bu boşluğu doldurur: metriklerini tek ekranda, birbiriyle hizalı zaman ekseninde ve anlamlı birimlerle gösterir. Ama ilk kez oturup panel eklemeye başladığında karşına çıkan seçenek yığını da caydırıcı olabilir — düzinelerce panel tipi, transform seçeneği, eşik ayarı.
Bu rehberde Grafana'yı kurup Prometheus'u veri kaynağı olarak bağlamayı, ilk paneli sıfırdan oluşturmayı, hangi panel tipinin hangi soruya cevap verdiğini, değişkenlerle tek dashboard'u tüm sunucu filosuna uygulamayı, hazır dashboard'ları içe aktarıp kendine uyarlamayı ve en önemlisi dashboard'ları JSON olarak sürüm kontrolüne almayı anlatacağım. Sonunda da "panelim boş geliyor" diye saat harcatan klasik tuzakları toplayacağım.
Grafana Kurulumu ve Veri Kaynağı Bağlama#
Grafana'yı ister paket deposundan ister konteyner olarak kurabilirsin. İzleme yığınının kalanı zaten Docker'daysa Compose ile tek dosyada tutmak en pratiği olur:
# docker-compose.yml — Prometheus ile aynı ağda
services:
grafana:
image: grafana/grafana-oss:latest
container_name: grafana
restart: unless-stopped
ports:
- "127.0.0.1:3000:3000" # dışarı açma, ters vekil arkasına al
environment:
GF_SECURITY_ADMIN_PASSWORD: "buraya-guclu-bir-parola"
GF_USERS_ALLOW_SIGN_UP: "false"
GF_SERVER_ROOT_URL: "https://izleme.firmaniz.com"
volumes:
- grafana-data:/var/lib/grafana
volumes:
grafana-data:
Buradaki iki satır özellikle önemli. 127.0.0.1:3000:3000 bağlaması Grafana'yı yalnızca yerel arayüze açar; dışarıdan erişimi TLS sonlandıran bir Nginx ya da Caddy üzerinden vermelisin. grafana-data kalıcı birimi ise oluşturduğun her dashboard, kullanıcı ve ayarın saklandığı SQLite veritabanını tutar — bunu unutursan konteyneri her güncellediğinde tüm emeğin silinir. Kalıcı veri mantığını hiç kurcalamadıysan Docker volume ile veri yönetimi yazısı bu farkı net anlatıyor.
Kurulumdan sonra ilk iş veri kaynağını tanımlamaktır. Arayüzden Connections → Data sources → Add new data source → Prometheus yolunu izleyip URL alanına Prometheus'un adresini yazarsın. Compose ağındaysan bu adres http://prometheus:9090 olur, ayrı sunucudaysa özel ağ IP'si. Save & test düğmesi yeşil bir onay veriyorsa bağlantı hazırdır. Prometheus tarafını henüz kurmadıysan önce Prometheus kurulumu yazısındaki adımları tamamla; Grafana veri üretmez, yalnızca var olan veriyi çizer.
İlk Panelini Sıfırdan Oluşturmak#
Yeni bir dashboard açıp Add visualization dediğinde karşına sorgu düzenleyici çıkar. Grafana'nın Prometheus sorgu düzenleyicisi iki modda çalışır: Builder (açılır menülerle metrik seçersin) ve Code (doğrudan PromQL yazarsın). Öğrenirken Builder işini görür ama gerçek işi Code modunda yaparsın; menüler karmaşık ifadeleri kaldıramaz.
İlk panel olarak CPU kullanımını çizelim. Sorgu alanına şunu yaz:
100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
Ardından sağ paneldeki üç ayarı mutlaka değiştir, çünkü varsayılanlarıyla bırakılan panel okunmaz:
- Legend alanına
{{instance}}yaz. Aksi halde açıklamada uzun ve okunamayan tam metrik adı görünür. - Standard options → Unit kısmından
Percent (0-100)seç. Birim seçmezsen95.4sayısının yüzde mi milisaniye mi olduğu belli olmaz. - Standard options → Min/Max değerlerini
0ve100yap. Otomatik ölçekleme, yüzde 3 ile yüzde 4 arasındaki farkı dağ gibi gösterip seni boşuna telaşlandırır.
Eşik (threshold) ayarı da değerlidir: Thresholds bölümünden 80 için turuncu, 90 için kırmızı bir çizgi eklersen grafiğe bakan kişi sayıyı okumadan durumu anlar. Panel başlığını da net yaz — "CPU" değil, "CPU Kullanımı (%) — Web Sunucuları" gibi. Altı ay sonra o paneli açan kişi sen olmayabilirsin.
Hangi Panel Tipini Ne Zaman Kullanmalısın#
Grafana'daki panel tipi bolluğu ilk bakışta karar felci yaratır, ama pratikte günlük hayatta dördü beşi işini görür. Aşağıdaki tablo hangi sorunun hangi görselleştirmeye uyduğunu özetliyor:
| Panel tipi | Hangi soruyu cevaplar | Tipik kullanım |
|---|---|---|
| Time series | "Zaman içinde nasıl değişti?" | CPU, bellek, istek hızı, gecikme |
| Stat | "Şu an değeri kaç?" | Ayakta kalma süresi, aktif oturum sayısı |
| Gauge | "Sınırın ne kadarını kullandım?" | Disk doluluk yüzdesi, kota |
| Bar gauge | "Hangisi daha çok?" | Sunucu başına disk, endpoint başına hata |
| Table | "Ham liste lazım" | Hedef durumu, en yavaş sorgular |
| Heatmap | "Dağılım nasıl?" | Yanıt süresi histogramı |
| Logs | "O anda ne oldu?" | Loki sorgu sonuçları |
| State timeline | "Ne zaman bozuktu?" | Servis up/down geçmişi |
Sık yapılan bir tercih hatası, her şeyi Time series ile göstermeye çalışmaktır. Disk doluluğu gibi sınırı belli bir değeri Gauge ile göstermek tek bakışta bilgi verir; buna karşılık ağ trafiği gibi eğilimi önemli bir metriği Stat panele koyarsan, o an düşük görünen bir değerin beş dakika önce tavan yaptığını asla göremezsin. Kural basit: eğilim önemliyse Time series, sınıra yakınlık önemliyse Gauge, tekil an önemliyse Stat.
Log paneli özel bir durumdur; veri kaynağı Prometheus değil Loki olmalıdır. Metrik grafiğinin hemen altına aynı zaman aralığını gösteren bir log paneli koymak, "CPU neden yükseldi" sorusunu tek ekranda cevaplatır. Bu kurulumu yapmak için Loki ile merkezi log toplama yazısındaki adımları tamamlaman yeterli.
Değişkenlerle Tek Dashboard'u Tüm Filoya Uygulamak#
On sunucun varsa on ayrı dashboard yapmak en kötü çözümdür; biri değiştiğinde dokuzunu güncellemeyi unutursun. Grafana'nın değişken (variable) sistemi bu işi tek dashboard'a indirir. Dashboard settings → Variables → New variable yolundan Query tipinde bir değişken oluşturursun:
# Değişken adı: instance
# Type: Query, Data source: Prometheus
label_values(node_uname_info, instance)
Bu ifade Prometheus'a "elindeki tüm instance etiket değerlerini listele" der ve dashboard'un üstünde bir açılır menü belirir. Artık panel sorgularında sabit IP yazmak yerine değişkeni kullanırsın:
# Tek sunucu seçimi için
100 - (avg by(instance) (rate(node_cpu_seconds_total{instance="$instance", mode="idle"}[5m])) * 100)
# Çoklu seçim açıksa regex eşleşmesi kullan
node_memory_MemAvailable_bytes{instance=~"$instance"}
Dikkat edilecek nokta şu: çoklu seçim (Multi-value) açıksa = yerine =~ kullanmak zorundasın, çünkü Grafana birden fazla değeri web-01|web-02 biçiminde bir regex olarak yerine koyar. Eşitlik operatörüyle bu ifade hiçbir seriyle eşleşmez ve panel boş gelir — Grafana'da en sık rastladığım "boş panel" sebebi budur. Aynı mantıkla env, job ya da mountpoint için de değişken tanımlayabilir, hatta bir değişkeni diğerine bağlayabilirsin (önce ortam seç, sonra o ortamdaki sunucular listelensin).
Hazır Dashboard İçe Aktarmak ve Uyarlamak#
Sıfırdan panel çizmek öğretici ama her şeyi elle yapmak gereksiz. Grafana'nın topluluk dashboard kütüphanesinde Node Exporter, Nginx, MySQL, Docker gibi yaygın kaynaklar için hazır ve olgun panolar var. İçe aktarma üç adımdır: Dashboards → New → Import, ardından dashboard kimlik numarasını (ya da JSON dosyasını) yapıştır, son olarak veri kaynağını seç.
Hazır dashboard'ları olduğu gibi bırakmak yerine mutlaka şu üç uyarlamayı yap:
- Gereksiz panelleri sil. Kırk panelli bir pano etkileyici görünür ama kimse kırk paneli okumaz. Ekibinin gerçekten baktığı sekiz on paneli bırak.
- Zaman aralığını ve yenileme sıklığını sabitle. Varsayılan olarak kaydettiğin aralık, panoyu açan herkesin gördüğü aralıktır; duvar ekranı için 6 saat ve 1 dakikalık yenileme iyi bir başlangıçtır.
- Sürümü kendine kopyala. İçe aktardığın panoyu doğrudan güncellersen üstteki değişikliklerin kaybolabilir; Save as ile kendi kopyanı oluştur.
Bir uyarı: hazır panolar genellikle belirli bir exporter sürümünün metrik adlarına göre yazılmıştır. Panellerin bir kısmı boş geliyorsa panik yapma, panelin sorgusunu aç ve metrik adını kendi Prometheus'unda ara. Node Exporter tarafında hangi metriklerin gerçekten geldiğini görmek için Node Exporter ile sunucu metrikleri yazısındaki metrik tablosu iyi bir kontrol listesidir.
Dashboard'u JSON ile Sürüm Kontrolüne Almak#
Arayüzden yapılan her değişiklik Grafana'nın veritabanına yazılır ve kimin ne zaman ne değiştirdiği pratikte kaybolur. Ciddi bir kurulumda dashboard'ları kod gibi ele almalısın: JSON olarak dışa aktar, depoya koy, provisioning ile otomatik yükle.
# /etc/grafana/provisioning/dashboards/default.yml
apiVersion: 1
providers:
- name: 'firmaniz-dashboards'
orgId: 1
folder: 'Üretim'
type: file
disableDeletion: false
# Arayüzden düzenlemeyi kapat: tek doğru kaynak depo olsun
allowUiUpdates: false
options:
path: /var/lib/grafana/dashboards
Veri kaynağını da aynı şekilde dosyadan tanımlayabilirsin; böylece sıfırdan kurulan bir Grafana açılır açılmaz hazır gelir:
# /etc/grafana/provisioning/datasources/prometheus.yml
apiVersion: 1
datasources:
- name: Prometheus
type: prometheus
access: proxy
url: http://prometheus:9090
isDefault: true
editable: false
Dashboard JSON'unu dışa aktarırken Export for sharing externally seçeneğini işaretle; bu, veri kaynağı kimliğini sabit bir değer yerine ${DS_PROMETHEUS} yer tutucusuna çevirir ve dosyanın başka bir kurulumda da çalışmasını sağlar. JSON dosyalarını depoya koymadan önce biçimlendirmek istersen JSON formatlayıcı aracımız diff'leri okunabilir tutar.
Sık Yapılan Hatalar ve Tuzaklar#
Panel boş geliyor ama sorgu Prometheus'ta çalışıyor. Neredeyse her zaman zaman aralığı ya da değişken sorunudur. Önce sağ üstteki aralığı "Last 6 hours" yapıp dene; veri yalnızca son yarım saatte varsa daha geniş bir pencerede kaybolmaz ama dar bir pencerede hiç görünmeyebilir. Sonra değişkende = yerine =~ kullanıp kullanmadığını kontrol et.
rate() aralığını kazıma aralığından küçük vermek. scrape_interval 30 saniyeyse rate(...[15s]) yazmak hiçbir şey döndürmez, çünkü pencerede iki örnek bulunmaz. Genel kural: rate penceresi kazıma aralığının en az dört katı olsun; 15 saniyelik kazımada [1m] ya da [5m] güvenli tercihlerdir.
Her paneli farklı zaman aralığına ayarlamak. Grafana panel bazında aralık geçersiz kılmaya izin verir ama bunu kullandığın anda panolar arası karşılaştırma imkânsız hale gelir. Bir olayı incelerken tüm panellerin aynı pencereyi göstermesi, dashboard'un asıl değeridir.
Birimi ayarlamamak. Bayt cinsinden bir değeri birim seçmeden bırakırsan 3221225472 gibi bir sayı görürsün. bytes(IEC) seçtiğinde aynı değer 3.0 GiB olur. Bu tek ayar, panoyu okunabilir yapan en ucuz iyileştirmedir.
Grafana'yı doğrudan internete açmak. Varsayılan admin/admin kimlik bilgisiyle açık bir Grafana, altyapının tamamının haritasıdır. Ters vekil arkasına al, TLS kullan, kayıt olmayı kapat ve yönetici parolasını şifre üretici ile ürettiğin güçlü bir değerle değiştir.
Uyarıları dashboard'a bakarak yapmak. Grafana panoları teşhis içindir, alarm için değil. Kimse ekrana yirmi dört saat bakmaz; eşik aşımlarını Alertmanager ya da Grafana'nın kendi uyarı motoruna devret.
Sıkça Sorulan Sorular#
Grafana ücretsiz mi, hangi sürümü kullanmalıyım#
Grafana OSS sürümü AGPLv3 lisansıyla tamamen ücretsizdir ve bu rehberdeki her şeyi karşılar: sınırsız dashboard, sınırsız veri kaynağı, uyarı motoru ve kullanıcı yönetimi. Ücretli Enterprise sürümü kurumsal kimlik doğrulama, rapor gönderimi ve bazı ticari veri kaynağı eklentileri gibi ek özellikler getirir. Küçük ve orta ölçekli bir altyapı için OSS sürümünden çıkman gereken bir sebep genellikle oluşmaz.
Grafana verileri kendi içinde mi saklıyor#
Hayır, Grafana bir veri deposu değil bir görselleştirme katmanıdır. Metriklerin Prometheus'ta, logların Loki ya da Elasticsearch'te durur; Grafana panel açıldığında bu kaynaklara sorgu gönderip sonucu çizer. Grafana'nın kendi veritabanı yalnızca dashboard tanımlarını, kullanıcıları, uyarı kurallarını ve ayarları tutar. Bu yüzden yedeklemen gereken şey /var/lib/grafana dizinidir, metriklerin değil.
Dashboard'umu başka bir sunucuya nasıl taşırım#
En temiz yol JSON dışa aktarımıdır. Dashboard ayarlarından Export seçeneğini kullan ve "Export for sharing externally" kutusunu işaretle; bu, veri kaynağı referansını sabit bir kimlik yerine değişkene çevirir. Oluşan JSON dosyasını yeni kurulumda Import ile içeri al ve veri kaynağını seç. Kalıcı bir çözüm istiyorsan bu dosyaları bir git deposunda tutup provisioning ile otomatik yüklet.
Panelde "No data" yazıyor, nereden başlamalıyım#
Sırayla üç şeyi kontrol et. Önce aynı sorguyu Prometheus'un kendi arayüzünde çalıştır; orada da sonuç yoksa sorun Grafana'da değil metrik toplamadadır. Sonuç geliyorsa zaman aralığını genişlet, çünkü seçili pencerede veri olmayabilir. Son olarak sorguda değişken kullanıyorsan çoklu seçim için =~ operatörünü kullandığından emin ol; = ile yazılmış bir çoklu değişken hiçbir seriyle eşleşmez.
Kaç panel koymalıyım, dashboard'u nasıl bölmeliyim#
Pratik kural, tek bir dashboard'un tek bir soruya cevap vermesidir. "Sunucu sağlığı" panosunda CPU, bellek, disk ve ağ olur; "uygulama sağlığı" panosunda istek hızı, hata oranı ve gecikme olur. Bir panoyu kaydırmadan okuyabiliyorsan boyutu doğrudur. On beş paneli geçtiğin anda, ikinci bir pano açmayı ya da panelleri satır (row) altında gruplayıp varsayılan olarak kapalı bırakmayı düşün.
Grafana uyarılarını mı Alertmanager'ı mı kullanmalıyım#
İkisi de çalışır ama seçim yığınının geri kalanına bağlıdır. Zaten Prometheus kural dosyaları yazıyorsan uyarıları da orada tutup Alertmanager ile yönetmek daha tutarlıdır; kurallar metriklerle aynı depoda durur ve Grafana çökse bile uyarılar çalışmaya devam eder. Yalnızca Grafana kullanan ve birden çok veri kaynağı üzerinden uyarı kurmak isteyen ekipler için Grafana'nın yerleşik uyarı motoru daha pratiktir.
Kapanış#
Grafana'da iyi bir dashboard, çok panel koyandan değil doğru soruyu soran panoyu kurandan çıkar. Aklında tutman gereken dört alışkanlık şunlar: her panele birim ve anlamlı bir başlık ver, sabit IP yerine değişken kullan ve çoklu seçimde =~ operatörünü unutma, hazır panoları içe aktardıktan sonra ihtiyacın olmayan panelleri sil, ve panolarını JSON olarak sürüm kontrolüne alıp provisioning ile yükle. Bu dördü oturduğunda pano yönetimi bakım yükü olmaktan çıkar.
Grafana ve Prometheus'u birlikte çalıştırmak tam root erişimi ve kalıcı disk ister; bu yığın için VDS ya da bulut sunucu paketlerimiz uygun bir zemin sağlar. İzleme yığınını kurmak ve uyarı kurallarını ayarlamak için vakit ayıramıyorsan sunucu yönetimi hizmetimiz bu işi sizin yerinize üstlenir; panolarını dış dünyaya açacaksan SSL sertifikası ile ters vekili baştan doğru kurmayı ihmal etme.