Zabbix ile Prometheus Karşılaştırması: Hangisi Seçilmeli?

Monitoring dünyasında iki büyük isim var: Zabbix ve Prometheus. Her ikisini de production ortamlarında yıllarca kullandım, birinden diğerine geçişleri yönettim, ikisini aynı anda çalıştırdım. Bu yazıda size “hangisi daha iyi?” sorusunun cevabını değil, “hangi durumda hangisini seçmelisiniz?” sorusunun cevabını vereceğim. Çünkü doğru soru bu.

Mimari Farklar: Neden Önemli?

Zabbix ve Prometheus’un temel farkı, veri toplama mimarisinde yatıyor. Bu fark, her şeyi etkiliyor: kurulum, ölçekleme, bakım, ekip adaptasyonu.

Zabbix push/pull hibrit model kullanıyor. Agent kurulmuş sunucular veri gönderebilir (active), Zabbix server da çekebilir (passive). Veritabanı merkezli bir yapı: tüm metrikler, konfigürasyonlar, kullanıcılar bir veritabanında (MySQL, PostgreSQL, Oracle) yaşıyor.

Prometheus ise saf pull model. Hedef endpointleri scrape ediyor, verileri kendi time-series veritabanında (TSDB) saklıyor. Konfigürasyon dosya tabanlı, veritabanı bağımlılığı yok.

Bu mimari fark pratikte şu anlama geliyor: Zabbix’te bir şeyi değiştirdiğinizde UI’dan yapıyorsunuz ve veritabanına yazılıyor. Prometheus’ta config dosyasını düzenliyorsunuz, reload atıyorsunuz. İkinci yaklaşım GitOps ve Infrastructure as Code ile çok daha iyi uyuşuyor.

Kurulum Karşılaştırması

Zabbix kurulumu biraz daha karmaşık. Veritabanı, server, frontend, agent bileşenlerini ayrı ayrı yönetiyorsunuz. Ama bu karmaşıklık beraberinde daha fazla kontrol getiriyor.

# Zabbix 6.4 kurulumu - Ubuntu 22.04
wget https://repo.zabbix.com/zabbix/6.4/ubuntu/pool/main/z/zabbix-release/zabbix-release_6.4-1+ubuntu22.04_all.deb
dpkg -i zabbix-release_6.4-1+ubuntu22.04_all.deb
apt update

apt install -y zabbix-server-mysql zabbix-frontend-php 
    zabbix-apache-conf zabbix-sql-scripts zabbix-agent2

# Veritabanı oluşturma
mysql -u root -p -e "CREATE DATABASE zabbix CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;"
mysql -u root -p -e "CREATE USER 'zabbix'@'localhost' IDENTIFIED BY 'StrongPass123!';"
mysql -u root -p -e "GRANT ALL PRIVILEGES ON zabbix.* TO 'zabbix'@'localhost';"

# Schema yükleme
zcat /usr/share/zabbix-sql-scripts/mysql/server.sql.gz | 
    mysql --default-character-set=utf8mb4 -uzabbix -p zabbix

systemctl enable --now zabbix-server zabbix-agent2 apache2

Prometheus tarafında işler çok daha basit:

# Prometheus kurulumu
PROM_VERSION="2.48.0"
wget https://github.com/prometheus/prometheus/releases/download/v${PROM_VERSION}/prometheus-${PROM_VERSION}.linux-amd64.tar.gz
tar xvf prometheus-${PROM_VERSION}.linux-amd64.tar.gz
mv prometheus-${PROM_VERSION}.linux-amd64 /opt/prometheus

# Servis kullanıcısı
useradd --no-create-home --shell /bin/false prometheus
chown -R prometheus:prometheus /opt/prometheus

# Temel config
cat > /opt/prometheus/prometheus.yml << 'EOF'
global:
  scrape_interval: 15s
  evaluation_interval: 15s

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']

  - job_name: 'node'
    static_configs:
      - targets: ['web01:9100', 'web02:9100', 'db01:9100']
EOF

# Systemd unit
cat > /etc/systemd/system/prometheus.service << 'EOF'
[Unit]
Description=Prometheus
After=network.target

[Service]
User=prometheus
ExecStart=/opt/prometheus/prometheus 
    --config.file=/opt/prometheus/prometheus.yml 
    --storage.tsdb.path=/opt/prometheus/data 
    --storage.tsdb.retention.time=30d
Restart=always

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable --now prometheus

Gördüğünüz gibi Prometheus kurulumu gerçekten 10 dakika meselesi. Zabbix’te veritabanını ayarlamak, schema’yı yüklemek, frontend konfigürasyonu derken minimum 30-45 dakika harcıyorsunuz.

Metrik Toplama: Exporter vs Agent

Prometheus dünyasında exporter kavramı var. Her servis için ayrı bir exporter binary’si çalışıyor. node_exporter sistem metriklerini, mysqld_exporter MySQL metriklerini, nginx-exporter Nginx metriklerini topluyor.

# Node Exporter kurulumu
NODE_EXP_VERSION="1.7.0"
wget https://github.com/prometheus/node_exporter/releases/download/v${NODE_EXP_VERSION}/node_exporter-${NODE_EXP_VERSION}.linux-amd64.tar.gz
tar xvf node_exporter-${NODE_EXP_VERSION}.linux-amd64.tar.gz
mv node_exporter-${NODE_EXP_VERSION}.linux-amd64/node_exporter /usr/local/bin/

cat > /etc/systemd/system/node_exporter.service << 'EOF'
[Unit]
Description=Node Exporter
After=network.target

[Service]
User=prometheus
ExecStart=/usr/local/bin/node_exporter 
    --collector.systemd 
    --collector.processes 
    --web.listen-address=":9100"
Restart=always

[Install]
WantedBy=multi-user.target
EOF

systemctl enable --now node_exporter

Bu yaklaşımın güzel yanı: her exporter bağımsız, küçük, tek bir iş yapıyor. Zabbix’te ise her şey agent içinde halloluyor, ama bu bazen şişkin bir agent anlamına geliyor.

Zabbix Agent2 ile özel metrik toplama şöyle yapılıyor:

# Zabbix UserParameter ile özel metrik
# /etc/zabbix/zabbix_agent2.d/custom.conf

# Disk I/O bekleyen process sayısı
UserParameter=custom.disk.wait,ps aux | awk '{print $8}' | grep -c "D"

# Belirli bir servisin memory kullanımı (örnek: nginx)
UserParameter=custom.nginx.memory,ps aux | grep nginx | grep -v grep | awk '{sum += $6} END {print sum}'

# Java heap kullanımı (JMX olmadan)
UserParameter=custom.java.heap[*],java -cp /opt/scripts/HeapCheck.jar HeapCheck $1

Zabbix’te UserParameter ile istediğiniz her şeyi script’e döküp metrik haline getirebilirsiniz. Bu esneklik gerçekten güçlü. Prometheus exporter yazmak da zor değil ama ek geliştirme gerektiriyor.

Alerting Mekanizmaları

Zabbix’te alerting trigger tabanlı. Bir eşik aşıldığında trigger aktifleşiyor, action çalışıyor. Konfigürasyon UI üzerinden yapılıyor ve oldukça görsel.

Prometheus’ta ise Alertmanager ayrı bir bileşen. Alert kuralları YAML formatında, PromQL ile yazılıyor. Bu başlangıçta karmaşık gelebilir ama çok güçlü.

# Prometheus alert kuralı örneği
# /opt/prometheus/rules/system_alerts.yml
groups:
  - name: system
    interval: 30s
    rules:
      - alert: YuksekCPUKullanimi
        expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 85
        for: 5m
        labels:
          severity: warning
          team: infra
        annotations:
          summary: "{{ $labels.instance }} CPU kullanimi yuksek"
          description: "Son 5 dakikada CPU kullanimi %{{ $value | printf "%.1f" }} seviyesinde"

      - alert: DiskDolmakUzere
        expr: (node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"}) * 100 < 15
        for: 10m
        labels:
          severity: critical
        annotations:
          summary: "{{ $labels.instance }} disk dolmak uzere"
          description: "Kalan alan: %{{ $value | printf "%.1f" }}"

Bu alert tanımı git reponuzda yaşıyor, review süreçlerinden geçiyor, versiyonlanıyor. Zabbix’te bir trigger oluştururken UI’da tıklıyorsunuz ve bu değişiklik audit log’da kalıyor ama git history’nizde değil.

Alertmanager konfigürasyonu da dosya tabanlı:

# /opt/alertmanager/alertmanager.yml
global:
  resolve_timeout: 5m
  smtp_smarthost: 'smtp.sirket.com:587'
  smtp_from: '[email protected]'

route:
  group_by: ['alertname', 'instance']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 4h
  receiver: 'default'
  routes:
    - match:
        severity: critical
      receiver: 'pagerduty-critical'
      continue: true
    - match:
        team: infra
      receiver: 'infra-team-slack'

receivers:
  - name: 'default'
    email_configs:
      - to: '[email protected]'

  - name: 'infra-team-slack'
    slack_configs:
      - api_url: 'https://hooks.slack.com/services/XXX/YYY/ZZZ'
        channel: '#infra-alerts'
        text: '{{ range .Alerts }}{{ .Annotations.description }}{{ end }}'

Zabbix’te media type konfigürasyonu UI’dan yapılıyor ve Slack, PagerDuty gibi entegrasyonlar için webhook desteği mevcut. Ancak karmaşık routing kuralları yazmak Zabbix’te biraz daha zahmetli. Zabbix 6.0 ile gelen problem suppression ve maintenance window özellikleri oldukça olgunlaşmış durumda.

Sorgu Dili: SQL vs PromQL

Bu noktada deneyimlerimden konuşacağım. Zabbix’te geçmişe yönelik veri sorgulamak için UI’dan gidiyorsunuz, grafikler çiziyorsunuz. API üzerinden data çekmek mümkün ama PromQL kadar esnek değil.

PromQL öğrenme eğrisi var, inkâr etmeyeyim. Ama öğrendikten sonra çok güçlü:

# Son 1 saatte en fazla CPU kullanan 5 instance
topk(5, 
  100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[1h])) * 100)
)

# Disk yazma hızı MB/s cinsinden
rate(node_disk_written_bytes_total{device="sda"}[5m]) / 1024 / 1024

# Network interface başına RX/TX oranı
irate(node_network_receive_bytes_total{device!="lo"}[5m]) * 8 / 1024 / 1024

# Bellek kullanım yüzdesi (buffer/cache hariç)
(1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100

# HTTP istek başarı oranı (örnek: blackbox_exporter ile)
rate(probe_success{job="http_check"}[5m]) * 100

Bu sorgular Grafana dashboard’larınızda, alert kurallarınızda, recording rule’larınızda kullanılıyor. Bir kez PromQL’i kavradıktan sonra Zabbix’in query arayüzü kısıtlayıcı gelmeye başlıyor.

Ölçekleme: Küçük Ortam vs Büyük Ortam

Burada işler ilginçleşiyor ve genellikle karar noktası burası oluyor.

50’den az sunucu: Her iki araç da rahatlıkla çalışır. Zabbix burada avantajlı çünkü kurulumu tamamlandıktan sonra ekibin öğrenmesi daha kolay, UI intuitive.

50-500 sunucu arası: Her iki araç da yönetilebilir. Zabbix Proxy kullanmaya başlamanız gerekebilir. Prometheus burada gayet iyi çalışıyor.

500+ sunucu: Prometheus ve Thanos veya Cortex kombinasyonu çok daha mantıklı. Zabbix’i bu ölçekte çalıştırabilirsiniz ama veritabanı yönetimi, partitioning, history housekeeping gibi konularla ciddi zaman harcarsınız.

# Zabbix Proxy kurulumu (dağıtık deployment için)
apt install -y zabbix-proxy-mysql

# /etc/zabbix/zabbix_proxy.conf
Server=192.168.1.10          # Ana Zabbix Server IP
Hostname=proxy-dc2           # Proxy adı
DBHost=localhost
DBName=zabbix_proxy
DBUser=zabbix
DBPassword=ProxyPass456!

# Proxy SQLite ile (hafif seçenek, küçük lokasyonlar için)
apt install -y zabbix-proxy-sqlite3
# /etc/zabbix/zabbix_proxy.conf
ProxyMode=0                  # Active proxy
DBName=/var/lib/zabbix/zabbix_proxy.db

Prometheus federation ile büyük ortamlarda ölçekleme:

# Global Prometheus (merkez) - diğer Prometheus'lardan veri toplama
scrape_configs:
  - job_name: 'federate'
    scrape_interval: 15s
    honor_labels: true
    metrics_path: '/federate'
    params:
      'match[]':
        - '{job="node"}'
        - '{__name__=~"job:.*"}'
    static_configs:
      - targets:
          - 'prometheus-dc1:9090'
          - 'prometheus-dc2:9090'
          - 'prometheus-dc3:9090'

Gerçek Dünya Senaryoları

Senaryo 1: Geleneksel altyapı, karma OS ortamı

Bir müşterimizde 200’ü aşkın Windows ve Linux sunucu, 15 farklı uygulama tipi, merkezi bir NOC ekibi vardı. NOC ekibi teknik ama komut satırından çok UI seven insanlar. Burada tereddütsüz Zabbix seçtik. Windows agent kurulumu kolay, SNMP ile network cihazları dahil edildi, IPMI ile fiziksel sunucu sağlığı izlendi. NOC ekibi adaptasyonu 1 haftada tamamlandı.

Senaryo 2: Kubernetes üzerinde mikroservis

30 microservice, Kubernetes cluster, CI/CD pipeline’ı olan bir startup. Burada Prometheus + Grafana + Alertmanager stack’i. Her service kendi /metrics endpoint’ini expose ediyor. ServiceMonitor kaynakları ile yeni servisler otomatik discover ediliyor. Zabbix bu ortamda epey zorlanırdı çünkü dynamic service discovery Prometheus’un doğasında var.

# Kubernetes ServiceMonitor örneği (Prometheus Operator)
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: uygulama-api
  namespace: monitoring
spec:
  selector:
    matchLabels:
      app: uygulama-api
  endpoints:
    - port: metrics
      interval: 15s
      path: /metrics
  namespaceSelector:
    matchNames:
      - production
      - staging

Senaryo 3: Hibrit yaklaşım

Bazı ortamlarda ikisini birden kullandım. Zabbix legacy sistemler ve network ekipmanları için, Prometheus ise Kubernetes workload’ları için. İkisinin verilerini Grafana’da birleştirip unified dashboard oluşturduk. Bu düşündüğünüzden daha iyi çalışıyor.

Öğrenme Eğrisi ve Ekip Faktörü

Dürüst olmak gerekirse, ekibinizin mevcut becerileri seçimi büyük ölçüde belirler.

Ekibinizde YAML yazabilen, git kullanan, terminal’den korkmayan insanlar varsa Prometheus stack’i benimsemek kolay. DevOps kültürü oturmuş bir ekip için Prometheus daha doğal hissettiriyor.

Ama NOC odaklı, vardiyalı çalışan, UI’dan operasyon yapan bir ekip için Zabbix çok daha kullanılabilir. Zabbix’in problem management, acknowledgment, escalation özellikleri gerçekten olgunlaşmış.

Maliyet ve Lisans

Her ikisi de open source ve ücretsiz. Ancak enterprise özellikler için:

  • Zabbix: Tamamen açık kaynak, ticari destek için Zabbix LLC’ye ödeme yapıyorsunuz. Kod her zaman bedava.
  • Prometheus: Apache 2.0 lisanslı. Grafana Cloud, Grafana Enterprise gibi ticari ürünler üzerine kurulu.

Büyük ölçekte Zabbix’in veritabanı maliyetleri gözden kaçırılmamalı. Yüksek write throughput için güçlü bir veritabanı sunucusu gerekiyor. Prometheus’un local TSDB’si bu açıdan çok daha verimli.

Monitoring as Code

Bu başlık altında Prometheus’un ciddi avantajı var. Tüm konfigürasyon dosya tabanlı olduğu için:

# Prometheus konfigürasyonunu test etme
/opt/prometheus/promtool check config /opt/prometheus/prometheus.yml

# Alert kurallarını test etme
/opt/prometheus/promtool check rules /opt/prometheus/rules/*.yml

# Unit test yazabilirsiniz alert kuralları için!
cat > /opt/prometheus/rules/tests/cpu_alert_test.yml << 'EOF'
rule_files:
  - ../system_alerts.yml

tests:
  - interval: 1m
    input_series:
      - series: 'node_cpu_seconds_total{mode="idle", instance="web01"}'
        values: '0+0.1x10 0+0.05x20'
    alert_rule_test:
      - eval_time: 10m
        alertname: YuksekCPUKullanimi
        exp_alerts:
          - exp_labels:
              instance: web01
              severity: warning
EOF

/opt/prometheus/promtool test rules /opt/prometheus/rules/tests/cpu_alert_test.yml

Zabbix bu konuda yakın zamana kadar oldukça geride kalıyordu. Zabbix 6.x ile configuration export/import API’si gelişti ama hâlâ Prometheus’un dosya tabanlı yaklaşımının yakalayabildiği IaC olgunluğunda değil. Terraform Zabbix provider mevcut ama deneyimlerim karışık.

Karar Kriterleri Özeti

Aşağıdaki sorulara verdiğiniz cevaplara göre karar verin:

  • Kubernetes veya container tabanlı ortam mı? Prometheus seçin.
  • Dynamic service discovery ihtiyacınız var mı? Prometheus üstün.
  • Windows ağırlıklı ortam mı? Zabbix daha kolay yönetilir.
  • NOC ekibi UI’dan çalışıyor mu? Zabbix kazanır.
  • GitOps ve IaC kültürü oturduysa? Prometheus daha uygun.
  • SNMP ile network cihazı izlemek istiyor musunuz? Zabbix çok daha hazır.
  • 500+ node, uzun vadeli metric saklama? Prometheus + Thanos kombinasyonu.
  • Hızlı kurulum, minimum öğrenme eğrisi? Zabbix (altyapı tarafı), Prometheus (uygulama tarafı karmaşıklaşabilir).

Sonuç

Yıllarca “Zabbix mi Prometheus mu?” tartışmasının içinde bulundum. Sonunda şunu fark ettim: bu sorunun tek bir doğru cevabı yok ve bu cevabı arayanlar genellikle yanlış soruyu soruyorlar.

Zabbix, altyapı izlemenin proven bir aracı. Olgun, kararlı, UI’sı güçlü, SNMP ve IPMI desteği mükemmel. Özellikle geleneksel datacenter ortamlarında, karma işletim sistemi ekosistemlerinde ve NOC ekipleriyle çalışırken rakipsiz.

Prometheus ise modern cloud-native dünyasının izleme standardı haline geldi. Kubernetes ekosistemiyle entegrasyonu, dosya tabanlı konfigürasyonu, güçlü sorgu dili ve aktif topluluğuyla yeni nesil altyapılarda tercih edilen araç.

Bugün yeni bir monitoring altyapısı kuruyorsanız ve ortamınız container/Kubernetes ağırlıklıysa Prometheus stack’i ile başlayın. Geleneksel sunucu parkı yönetiyorsanız ve ekibiniz UI odaklıysa Zabbix ile gidin. Büyük ve karma ortamlarda ikisini birden kullanmaktan çekinmeyin, Grafana her ikisini de datasource olarak destekliyor ve unified dashboarding yapabilirsiniz.

En kötü karar, ikisinden birini körü körüne seçip ortamınıza uydurmaya çalışmaktır. Araç ortama hizmet eder, ortam araca değil.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir