InfluxDB ile Grafana Dashboard Kurulumu
Monitoring dünyasına adım atmak istiyorsanız ya da mevcut izleme altyapınızı bir üst seviyeye taşımak istiyorsanız, InfluxDB ve Grafana ikilisi tam size göre. Bu iki araç birlikte kullanıldığında sunucu metrikleri, uygulama performansı veya network trafiği gibi her türlü zaman serisi verisini toplayıp görselleştirebilirsiniz. Özellikle Telegraf ile üçlü bir ekip oluşturduğunuzda, “TIG Stack” olarak bilinen bu yapı production ortamlarda son derece yaygın kullanılmaktadır. Bu yazıda Ubuntu 22.04 üzerinde sıfırdan kurulum yapacağız, konfigürasyonları detaylıca inceleyeceğiz ve gerçek bir senaryo üzerinden dashboard oluşturacağız.
Genel Mimari ve Ön Gereksinimler
Kuruluma başlamadan önce neyin ne işe yaradığını netleştirelim.
- InfluxDB: Zaman serisi verilerini depolamak için optimize edilmiş bir veritabanıdır. Yüksek yazma hızı ve sorgulama performansı ile öne çıkar.
- Telegraf: InfluxDB’nin resmi veri toplama ajanıdır. 200’den fazla input plugin ile sunucu, uygulama ve servis metriklerini toplayıp InfluxDB’ye gönderir.
- Grafana: Toplanan verileri güzel ve interaktif dashboardlar ile görselleştiren açık kaynak bir platformdur.
Bu yazı için aşağıdaki ortamı kullanacağız:
- Ubuntu 22.04 LTS
- InfluxDB 2.x
- Telegraf 1.28+
- Grafana 10.x
- Minimum 2 GB RAM, 2 vCPU, 20 GB disk
Tüm kurulumu tek bir sunucuya yapacağız, ancak production ortamda InfluxDB ve Grafana’yı ayrı sunuculara almanızı öneririm.
InfluxDB 2.x Kurulumu
InfluxDB 2.x, 1.x sürümüne göre ciddi değişiklikler içeriyor. Flux sorgu dili, web tabanlı UI, token bazlı kimlik doğrulama ve bucket yapısı bunların başında geliyor. Kuruluma başlayalım.
# InfluxDB GPG anahtarını ekleyelim
curl --silent --location -O https://repos.influxdata.com/influxdata-archive.key
echo "943666881a1b8d9b849b74caebf02d3465d6beb716510d86a39f6c8e8dac7515 influxdata-archive.key" | sha256sum --check -
cat influxdata-archive.key | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/influxdata-archive.gpg > /dev/null
# Repository ekleme
echo 'deb [signed-by=/etc/apt/trusted.gpg.d/influxdata-archive.gpg] https://repos.influxdata.com/debian stable main' | sudo tee /etc/apt/sources.list.d/influxdata.list
# Kurulum
sudo apt-get update && sudo apt-get install influxdb2 -y
# Servisi başlatma ve enable etme
sudo systemctl enable influxdb
sudo systemctl start influxdb
sudo systemctl status influxdb
Servis ayağa kalktıktan sonra initial setup yapmanız gerekiyor. Bunu hem web UI üzerinden hem de CLI ile yapabilirsiniz. Ben CLI yolunu tercih ediyorum çünkü bu şekilde adımları otomatize etmek çok daha kolay.
# InfluxDB initial setup - interaktif mod
influx setup
# Ya da non-interaktif mod (scripting için ideal)
influx setup
--username admin
--password SuperGizliSifre123!
--org production-org
--bucket system-metrics
--retention 30d
--force
Setup tamamlandıktan sonra ~/.influxdbv2/credentials dosyasına token kaydedilir. Bu token’ı bir yere not edin, Telegraf ve Grafana konfigürasyonlarında kullanacaksınız.
# Mevcut token'ı görüntüleme
influx auth list
# Yeni bir token oluşturma (Telegraf için write-only token)
influx auth create
--org production-org
--write-buckets
--description "Telegraf write token"
Önemli not: Production ortamda Telegraf için ayrı bir write-only token, Grafana için ayrı bir read-only token oluşturun. En az yetki prensibi burada da geçerli.
Telegraf Kurulumu ve Konfigürasyonu
Telegraf, InfluxDB ile aynı repository’den geliyor, dolayısıyla repository’i zaten eklediğimiz için direkt kuruluma geçebiliriz.
sudo apt-get install telegraf -y
sudo systemctl enable telegraf
Telegraf’ın default konfigürasyon dosyası /etc/telegraf/telegraf.conf oldukça uzun ve detaylı yorumlar içeriyor. Production için bunu temizleyip minimal bir konfigürasyon oluşturalım.
# Orijinal konfigürasyonu yedekleyelim
sudo mv /etc/telegraf/telegraf.conf /etc/telegraf/telegraf.conf.backup
# Yeni minimal konfigürasyon oluşturalım
sudo nano /etc/telegraf/telegraf.conf
# /etc/telegraf/telegraf.conf içeriği
[agent]
interval = "10s"
round_interval = true
metric_batch_size = 1000
metric_buffer_limit = 10000
collection_jitter = "0s"
flush_interval = "10s"
flush_jitter = "0s"
precision = ""
hostname = "web-server-01"
omit_hostname = false
# InfluxDB v2 output
[[outputs.influxdb_v2]]
urls = ["http://localhost:8086"]
token = "BURAYA_TELEGRAF_TOKEN_YAZIN"
organization = "production-org"
bucket = "system-metrics"
# CPU metrikleri
[[inputs.cpu]]
percpu = true
totalcpu = true
collect_cpu_time = false
report_active = false
# Disk kullanımı
[[inputs.disk]]
ignore_fs = ["tmpfs", "devtmpfs", "devfs", "iso9660", "overlay", "aufs", "squashfs"]
# Disk I/O
[[inputs.diskio]]
# Memory
[[inputs.mem]]
# Network
[[inputs.net]]
interfaces = ["eth0", "ens3"]
# Sistem yükü
[[inputs.system]]
# Process sayısı
[[inputs.processes]]
# Swap kullanımı
[[inputs.swap]]
# Kernel istatistikleri
[[inputs.kernel]]
Konfigürasyonu kaydettikten sonra test edelim ve servisi başlatalım.
# Konfigürasyonu test et
sudo telegraf --config /etc/telegraf/telegraf.conf --test
# Servisi başlat
sudo systemctl start telegraf
sudo systemctl status telegraf
# Logları kontrol et
sudo journalctl -u telegraf -f
Eğer logda Successfully connected to output: influxdb_v2 mesajını görüyorsanız her şey yolunda demektir. Verilerin InfluxDB’ye ulaşıp ulaşmadığını doğrulamak için:
# InfluxDB'de veri sorgusu
influx query '
from(bucket: "system-metrics")
|> range(start: -5m)
|> filter(fn: (r) => r._measurement == "cpu")
|> limit(n: 10)
'
Bu sorgu sonucunda CPU metrikleri geliyorsa veri akışı sağlıklı çalışıyor demektir.
Grafana Kurulumu
Grafana’nın stable sürümünü resmi repository üzerinden kuracağız.
# Grafana GPG anahtarı ve repository ekleme
sudo apt-get install -y apt-transport-https software-properties-common wget
sudo mkdir -p /etc/apt/keyrings/
wget -q -O - https://apt.grafana.com/gpg.key | gpg --dearmor | sudo tee /etc/apt/keyrings/grafana.gpg > /dev/null
echo "deb [signed-by=/etc/apt/keyrings/grafana.gpg] https://apt.grafana.com stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list
# Kurulum
sudo apt-get update
sudo apt-get install grafana -y
# Servisi başlat
sudo systemctl enable grafana-server
sudo systemctl start grafana-server
sudo systemctl status grafana-server
Grafana varsayılan olarak 3000 portunda çalışır. Tarayıcınızdan http://sunucu-ip:3000 adresine gidip admin/admin ile giriş yapın. İlk girişte şifreyi değiştirmenizi isteyecek.
Grafana Güvenlik Ayarları
Production ortamda Grafana’yı doğrudan internete açmamak gerekir. Nginx reverse proxy arkasına alın.
sudo apt-get install nginx -y
# Nginx konfigürasyonu
sudo nano /etc/nginx/sites-available/grafana
server {
listen 80;
server_name monitoring.sirketiniz.com;
location / {
proxy_pass http://localhost:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
sudo ln -s /etc/nginx/sites-available/grafana /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx
Grafana’nın kendi konfigürasyon dosyasında da bazı ayarlar yapmamız gerekiyor.
sudo nano /etc/grafana/grafana.ini
Aşağıdaki değerleri bulup düzenleyin:
[server]
domain = monitoring.sirketiniz.com
root_url = https://monitoring.sirketiniz.com
[security]
admin_user = admin
admin_password = GucluBirSifre456!
secret_key = rastgele_uzun_bir_string_yazin_buraya
disable_gravatar = true
[users]
allow_sign_up = false
allow_org_create = false
[auth.anonymous]
enabled = false
sudo systemctl restart grafana-server
InfluxDB Data Source Ekleme
Grafana web arayüzüne giriş yapın ve sol menüden Connections > Data sources yolunu izleyin. Add data source butonuna tıklayıp InfluxDB seçin.
Burada dikkat etmeniz gereken bir nokta var: InfluxDB 2.x için Flux sorgu dilini seçmeniz gerekiyor. Formda şu değerleri girin:
- Query Language: Flux
- URL: http://localhost:8086
- Organization: production-org
- Token: Grafana için oluşturduğunuz read token
- Default Bucket: system-metrics
Save & Test butonuna tıkladığınızda yeşil bir başarı mesajı görmelisiniz. Eğer hata alırsanız token’ı ve organization adını kontrol edin.
İlk Dashboard Oluşturma
Şimdi gerçek bir senaryo üzerinden gidelim. Bir e-ticaret şirketinde çalıştığınızı ve web sunucularınızı izlemeniz gerektiğini varsayalım. CPU, bellek, disk ve network metriklerini içeren bir dashboard oluşturacağız.
Grafana’da Dashboards > New > New Dashboard yolunu izleyin ve Add visualization butonuna tıklayın. Data source olarak az önce eklediğimiz InfluxDB’yi seçin.
Panel editöründe Code moduna geçerek Flux sorguları yazacağız. İşte CPU kullanımı için örnek sorgu:
from(bucket: "system-metrics")
|> range(start: v.timeRangeStart, stop: v.timeRangeStop)
|> filter(fn: (r) => r._measurement == "cpu")
|> filter(fn: (r) => r._field == "usage_active")
|> filter(fn: (r) => r.cpu == "cpu-total")
|> filter(fn: (r) => r.host == "web-server-01")
|> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)
|> yield(name: "mean")
Bellek kullanımı için:
from(bucket: "system-metrics")
|> range(start: v.timeRangeStart, stop: v.timeRangeStop)
|> filter(fn: (r) => r._measurement == "mem")
|> filter(fn: (r) => r._field == "used_percent")
|> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)
|> yield(name: "mean")
Disk kullanımı için:
from(bucket: "system-metrics")
|> range(start: v.timeRangeStart, stop: v.timeRangeStop)
|> filter(fn: (r) => r._measurement == "disk")
|> filter(fn: (r) => r._field == "used_percent")
|> filter(fn: (r) => r.path == "/")
|> aggregateWindow(every: v.windowPeriod, fn: last, createEmpty: false)
|> yield(name: "last")
Alert Kuralları Tanımlama
Dashboard görsel olarak güzel durdu, ama izlemenin asıl amacı sorunları erkenden fark etmek. Grafana 10.x ile alert sistemi çok daha güçlü hale geldi. Alerting > Alert rules > New alert rule yolunu izleyin.
Örnek olarak CPU %80’i geçtiğinde uyarı verecek bir kural oluşturalım. Alert rule editöründe şu Flux sorgusunu kullanalım:
from(bucket: "system-metrics")
|> range(start: -5m)
|> filter(fn: (r) => r._measurement == "cpu")
|> filter(fn: (r) => r._field == "usage_active")
|> filter(fn: (r) => r.cpu == "cpu-total")
|> mean()
- Condition: IS ABOVE 80
- Evaluate every: 1m
- For: 5m (5 dakika boyunca bu şart sağlanırsa alert üret)
Alert notification için Alerting > Contact points bölümünden Slack, email veya PagerDuty gibi kanalları ekleyebilirsiniz. Slack webhook entegrasyonu için:
- Name: ops-team-slack
- Integration: Slack
- Webhook URL: Slack’ten aldığınız webhook URL’si
- Channel: #alerts
Dashboard Şablonları ve Değişkenler
Tek sunucu için dashboard oluşturduk, ama ortamda 20 sunucu varsa ne yapacaksınız? Dashboard variables kullanarak tek bir dashboard ile tüm sunucuları izleyebilirsiniz.
Dashboard settings > Variables > Add variable yolunu izleyin:
- Name: host
- Type: Query
- Data source: InfluxDB
- Query:
import "influxdata/influxdb/schema"
schema.tagValues(
bucket: "system-metrics",
tag: "host"
)
Bu variable’ı oluşturduktan sonra panellerinizdeki sorgularda r.host == "web-server-01" yerine r.host == "${host}" yazarsınız. Artık dashboard’un üstünde bir dropdown menü belirecek ve buradan hangi sunucuyu izlemek istediğinizi seçebileceksiniz.
Veri Saklama Politikası ve Performans
InfluxDB’de veri saklama süresi bucket bazında ayarlanır. Büyüyen veri boyutu hem disk kullanımını hem de sorgu performansını etkiler. Pratikte şöyle bir strateji işe yarıyor:
# Raw data için 7 günlük retention
influx bucket update
--name system-metrics
--retention 7d
# Uzun vadeli aggregated data için ayrı bucket
influx bucket create
--name system-metrics-monthly
--org production-org
--retention 365d
InfluxDB 2.x ile gelen Tasks özelliği, belirli aralıklarla Flux sorguları çalıştırıp sonuçları farklı bir bucket’a yazmak için kullanılır. Bu sayede ham veriyi 7 gün saklarken 1 saatlik ortalamalar alınmış veriyi 1 yıl saklayabilirsiniz.
# Downsampling task oluşturma
influx task create --name "Downsample CPU Hourly" --org production-org --file - << 'EOF'
option task = {name: "Downsample CPU Hourly", every: 1h}
from(bucket: "system-metrics")
|> range(start: -task.every)
|> filter(fn: (r) => r._measurement == "cpu")
|> filter(fn: (r) => r._field == "usage_active")
|> aggregateWindow(every: 1h, fn: mean)
|> to(bucket: "system-metrics-monthly", org: "production-org")
EOF
Yaygın Sorunlar ve Çözümleri
Kurulum ve konfigürasyon sırasında karşılaşabileceğiniz sorunları paylaşayım.
Telegraf veri gönderemiyor:
# Telegraf loglarını kontrol et
sudo journalctl -u telegraf -n 50 --no-pager
# Token geçerliliğini test et
curl -X GET "http://localhost:8086/api/v2/me"
-H "Authorization: Token TOKENINIZ"
Grafana InfluxDB’ye bağlanamıyor:
Eğer Grafana ve InfluxDB ayrı sunuculardaysa localhost yerine gerçek IP adresini kullanın. Ayrıca InfluxDB’nin 8086 portunu sadece gerekli IP’lere açtığınızdan emin olun.
# InfluxDB bağlantı testi
curl -I http://localhost:8086/health
# Firewall kontrolü
sudo ufw status
sudo ufw allow from GRAFANA_IP to any port 8086
Panel’de “No data” görünüyor:
Flux sorgusundaki range, filter ve field isimlerini kontrol edin. InfluxDB Data Explorer üzerinden önce sorguyu test etmek çok zaman kazandırır.
Disk doldu InfluxDB yavaşladı:
# InfluxDB disk kullanımı
du -sh /var/lib/influxdb/
# Manuel compaction başlatmak için servisi restart et
sudo systemctl restart influxdb
# Eski bucket verilerini temizle
influx delete
--bucket system-metrics
--start '1970-01-01T00:00:00Z'
--stop $(date -u -d '30 days ago' +%Y-%m-%dT%H:%M:%SZ)
--org production-org
Yedekleme Stratejisi
Monitoring sisteminizin kendisini de yedeklemeniz şart. InfluxDB 2.x’te yedekleme oldukça basit.
# Tüm InfluxDB verilerini yedekle
influx backup /opt/influxdb-backups/$(date +%Y%m%d)
--org production-org
# Sadece belirli bucket'ı yedekle
influx backup /opt/influxdb-backups/$(date +%Y%m%d)
--bucket system-metrics
--org production-org
# Yedekten geri yükleme
influx restore /opt/influxdb-backups/20240115
--org production-org
Grafana için ise /var/lib/grafana/grafana.db SQLite dosyasını yedeklemek yeterli. Dashboardları JSON olarak export etmek de iyi bir pratik.
# Grafana database yedekleme
sudo cp /var/lib/grafana/grafana.db /opt/grafana-backups/grafana-$(date +%Y%m%d).db
# Cron ile otomatik yedekleme
sudo crontab -e
# Şunu ekle:
# 0 2 * * * influx backup /opt/influxdb-backups/$(date +%Y%m%d) --org production-org && find /opt/influxdb-backups -mtime +7 -exec rm -rf {} ;
Sonuç
InfluxDB ve Grafana ikilisi, ciddi bir öğrenme eğrisi olmadan production kalitesinde monitoring altyapısı kurmanızı sağlar. Bu yazıda sıfırdan başlayıp çalışan bir TIG Stack kurduk, güvenlik ayarlarını yaptık, alerting mekanizmasını konfigüre ettik ve veri saklama politikasını belirledik.
Buradan sonra yapabilecekleriniz oldukça fazla. MySQL, PostgreSQL veya Redis gibi servislerin metriklerini toplamak için ilgili Telegraf input plugin’lerini ekleyebilirsiniz. Kubernetes cluster’larınızı izlemek için Prometheus ile birlikte Grafana kullanabilirsiniz, çünkü Grafana birden fazla data source destekliyor. Ayrıca Grafana’nın alerting sistemi üzerine daha derin inebilir, PagerDuty veya OpsGenie entegrasyonlarıyla on-call süreçlerinizi otomatize edebilirsiniz.
Production’da bir kaç ay bu sistemi kullandıktan sonra hangi metriklerin gerçekten işe yaradığını anlayacaksınız. Başlangıçta her şeyi izlemek cazip geliyor ama sonunda birkaç kritik metriğe odaklanan temiz bir dashboard çok daha değerli oluyor. Basit tut, anlamlı alert eşikleri koy ve gerçekten kimsenin bakmadığı panelleri kaldırmaktan çekinme.
