Node Exporter Kurulumu: Sistem Metriklerini Prometheus ile Toplama
Prometheus kurulumunu tamamladınız, Grafana’yı ayarladınız ama dashboardlarınız hala boş görünüyor. İşte tam bu noktada Node Exporter devreye giriyor. Prometheus’un kendi başına sistem metriklerini toplayamadığını, bunun için ayrı bir “exporter” bileşenine ihtiyaç duyduğunu anlamak, izleme altyapısının en kritik adımını kavramak demektir. Bu yazıda Node Exporter’ı sıfırdan kuracak, yapılandıracak ve gerçek dünya senaryolarında nasıl kullanacağınızı öğreneceksiniz.
Node Exporter Nedir ve Neden Gereklidir?
Node Exporter, Linux sistemlerinde CPU kullanımı, bellek durumu, disk I/O, ağ trafiği ve çok daha fazlasını Prometheus’un anlayabileceği formatta sunan bir araçtır. Prometheus mimarisinde “pull” modeli kullanılır; yani Prometheus, metrikleri kendisi çekmeye gelir. Node Exporter ise bu metrikleri hazırlayıp /metrics endpoint’inde bekletir.
Bir sunucuda neler olduğunu anlamak için top, htop veya vmstat gibi araçları kullanabilirsiniz. Ancak bunlar anlık görüntü sunar ve tarihsel analiz yapmanıza olanak tanımaz. Node Exporter ile birlikte Prometheus ve Grafana üçlüsünü kurduğunuzda, geçen hafta Salı gecesi saat 03:00’te neden CPU spike yaşandığını, hangi diskin dolmak üzere olduğunu ve ağ trafiğinin hangi saatlerde pik yaptığını görebilirsiniz.
Ön Gereksinimler
Bu rehber Ubuntu 22.04 ve CentOS/RHEL 8+ üzerinde test edilmiştir. Aynı adımlar Debian tabanlı ve RPM tabanlı diğer dağıtımlarda da büyük ölçüde geçerlidir.
Başlamadan önce şunların hazır olduğundan emin olun:
- Prometheus kurulu ve çalışıyor olmalı (önceki yazıya bakın)
- Sudo yetkisine sahip bir kullanıcı
- İzlemek istediğiniz her sunucuda Node Exporter kurulacak
- 9100 portuna erişim (Node Exporter varsayılan portu)
Node Exporter İndirme ve Kurulum
Sistem Kullanıcısı Oluşturma
Güvenlik açısından Node Exporter’ı ayrı bir sistem kullanıcısıyla çalıştırmak en iyi pratiktir. Bu kullanıcının login shell’e ihtiyacı yok.
sudo useradd --no-create-home --shell /bin/false node_exporter
Binary İndirme
Prometheus’un GitHub releases sayfasından en güncel versiyonu indirin. Bu yazıyı yazdığım sırada 1.7.0 güncel sürümdü.
cd /tmp
wget https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz
# İndirilen dosyanın bütünlüğünü kontrol edin
sha256sum node_exporter-1.7.0.linux-amd64.tar.gz
SHA256 checksum değerini GitHub releases sayfasındaki sha256sums dosyasıyla karşılaştırın. Production ortamında bu adımı asla atlamayın.
tar xvf node_exporter-1.7.0.linux-amd64.tar.gz
sudo cp node_exporter-1.7.0.linux-amd64/node_exporter /usr/local/bin/
sudo chown node_exporter:node_exporter /usr/local/bin/node_exporter
# Temizlik
rm -rf /tmp/node_exporter-1.7.0.linux-amd64*
Systemd Servis Dosyası Oluşturma
Node Exporter’ı sistem servisi olarak tanımlamak, sunucu yeniden başladığında otomatik olarak ayağa kalkmasını sağlar.
sudo nano /etc/systemd/system/node_exporter.service
Aşağıdaki içeriği dosyaya yapıştırın:
[Unit]
Description=Node Exporter
Wants=network-online.target
After=network-online.target
[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter
--collector.systemd
--collector.processes
--web.listen-address=0.0.0.0:9100
--web.telemetry-path=/metrics
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target
Servisi etkinleştirip başlatın:
sudo systemctl daemon-reload
sudo systemctl enable node_exporter
sudo systemctl start node_exporter
sudo systemctl status node_exporter
Çıktıda Active: active (running) görüyorsanız kurulum başarılı demektir.
Metriklerin Doğrulanması
Node Exporter’ın çalıştığını ve metrikleri sunduğunu doğrulayalım:
curl http://localhost:9100/metrics | head -50
Bu komut yüzlerce metrik satırı döndürecektir. Birkaç örnek:
# HELP node_cpu_seconds_total Seconds the CPUs spent in each mode.
# TYPE node_cpu_seconds_total counter
node_cpu_seconds_total{cpu="0",mode="idle"} 12345.67
node_cpu_seconds_total{cpu="0",mode="system"} 234.56
node_memory_MemAvailable_bytes 4294967296
node_filesystem_avail_bytes{...} 107374182400
Belirli bir metriği filtrelemek için grep kullanabilirsiniz:
# Sadece bellek metriklerini görüntüle
curl -s http://localhost:9100/metrics | grep "^node_memory"
# Disk metriklerini görüntüle
curl -s http://localhost:9100/metrics | grep "^node_filesystem"
Güvenlik Duvarı Yapılandırması
Node Exporter, Prometheus sunucusundan erişilebilir olmalı ama internete açık olmamalıdır. Sadece Prometheus sunucusunun IP adresinden 9100 portuna erişime izin verin.
Ubuntu/Debian (UFW) için:
# Sadece Prometheus sunucusunun erişimine izin ver
sudo ufw allow from 192.168.1.100 to any port 9100
# Durumu kontrol et
sudo ufw status
CentOS/RHEL (firewalld) için:
sudo firewall-cmd --permanent --new-zone=prometheus
sudo firewall-cmd --permanent --zone=prometheus --add-source=192.168.1.100
sudo firewall-cmd --permanent --zone=prometheus --add-port=9100/tcp
sudo firewall-cmd --reload
192.168.1.100 yerine kendi Prometheus sunucunuzun IP adresini yazın. Birden fazla Prometheus sunucunuz varsa her biri için ayrı rule ekleyin.
Prometheus’a Node Exporter Hedefi Ekleme
Prometheus, Node Exporter’ı hedef olarak tanımalı ki metrikleri çekebilsin. Prometheus sunucusundaki yapılandırma dosyasını düzenleyin:
sudo nano /etc/prometheus/prometheus.yml
scrape_configs bölümüne yeni bir job ekleyin:
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'node_exporter'
static_configs:
- targets:
- '192.168.1.101:9100' # web sunucusu
- '192.168.1.102:9100' # veritabanı sunucusu
- '192.168.1.103:9100' # uygulama sunucusu
labels:
environment: 'production'
Prometheus yapılandırmasını yeniden yükleyin:
sudo systemctl reload prometheus
# Ya da SIGHUP gönderin
sudo kill -HUP $(pidof prometheus)
Prometheus web arayüzünde Status > Targets menüsünden tüm hedeflerin UP durumunda olduğunu doğrulayın.
Önemli Collector’lar ve Yapılandırması
Node Exporter, varsayılan olarak etkin olan ve isteğe bağlı olarak açılabilen çok sayıda collector içerir.
Varsayılan Olarak Etkin Collector’lar
En sık kullandığınız metrik grupları şunlardır:
- cpu: CPU kullanım modları (user, system, idle, iowait, nice, irq, softirq)
- meminfo: Bellek kullanımı, swap durumu, buffer/cache bilgileri
- filesystem: Disk kullanımı, inode sayıları, mount noktaları
- diskstats: Disk okuma/yazma hızları, I/O latency
- netdev: Ağ arayüzü istatistikleri, paket sayıları, hata oranları
- loadavg: 1, 5 ve 15 dakikalık load average değerleri
- stat: Sistem geneli istatistikler, boot zamanı, context switch sayısı
- time: Sistem saati ve NTP senkronizasyon durumu
- uname: Kernel versiyonu ve sistem bilgileri
İsteğe Bağlı Collector’lar
Bazı collector’lar performans etkisi nedeniyle varsayılan olarak kapalıdır:
- –collector.systemd: Systemd servislerinin durumunu izler
- –collector.processes: Çalışan process sayısı ve durumları
- –collector.tcpstat: TCP bağlantı durumları (TIME_WAIT, ESTABLISHED vb.)
- –collector.interrupts: CPU interrupt istatistikleri
Systemd collector ile servislerinizin çöküp çökmediğini otomatik olarak izleyebilirsiniz. Bu özellikle kritik servislerin uptime’ını takip etmek için çok kullanışlıdır.
Belirli Collector’ları Devre Dışı Bırakma
Kullanmadığınız collector’ları kapatmak hem performans kazandırır hem de gereksiz veri toplanmasını önler:
/usr/local/bin/node_exporter
--no-collector.arp
--no-collector.bcache
--no-collector.buddyinfo
--collector.systemd
--collector.processes
Gerçek Dünya Senaryosu: Çoklu Sunucu Ortamı
Diyelim ki 10 sunuculu bir altyapınız var. Her sunucuya tek tek gidip Node Exporter kurmak yerine Ansible ile bunu otomatize edebilirsiniz.
# ansible/roles/node_exporter/tasks/main.yml içeriğini elle uygulamak için
# Bu script ile tüm sunuculara kurulum yapabilirsiniz
#!/bin/bash
SERVERS="web01 web02 db01 db02 app01 app02"
NODE_EXPORTER_VERSION="1.7.0"
for SERVER in $SERVERS; do
echo "Installing Node Exporter on $SERVER..."
ssh -o StrictHostKeyChecking=no deploy@$SERVER << EOF
# Kullanıcı oluştur
sudo useradd --no-create-home --shell /bin/false node_exporter 2>/dev/null || true
# Binary indir ve kur
cd /tmp
wget -q https://github.com/prometheus/node_exporter/releases/download/v${NODE_EXPORTER_VERSION}/node_exporter-${NODE_EXPORTER_VERSION}.linux-amd64.tar.gz
tar xf node_exporter-${NODE_EXPORTER_VERSION}.linux-amd64.tar.gz
sudo cp node_exporter-${NODE_EXPORTER_VERSION}.linux-amd64/node_exporter /usr/local/bin/
sudo chown node_exporter:node_exporter /usr/local/bin/node_exporter
rm -rf /tmp/node_exporter*
echo "Node Exporter installed on $SERVER"
EOF
echo "Done: $SERVER"
done
Textfile Collector ile Özel Metrik Ekleme
Node Exporter’ın en güçlü özelliklerinden biri textfile collector‘dır. Kendi script’lerinizin ürettiği metrikleri Node Exporter aracılığıyla Prometheus’a besleyebilirsiniz.
Önce textfile dizini oluşturun:
sudo mkdir -p /var/lib/node_exporter/textfile_collector
sudo chown node_exporter:node_exporter /var/lib/node_exporter/textfile_collector
Servis dosyasına textfile collector parametresini ekleyin:
ExecStart=/usr/local/bin/node_exporter
--collector.textfile.directory=/var/lib/node_exporter/textfile_collector
--collector.systemd
--collector.processes
Şimdi örnek bir custom metrik script’i yazalım. Bu script son backup zamanını ve backup dosya boyutunu raporlasın:
#!/bin/bash
# /usr/local/bin/backup_metrics.sh
BACKUP_DIR="/backup"
OUTPUT_FILE="/var/lib/node_exporter/textfile_collector/backup.prom"
# Son backup dosyasını bul
LAST_BACKUP=$(ls -t $BACKUP_DIR/*.tar.gz 2>/dev/null | head -1)
if [ -n "$LAST_BACKUP" ]; then
BACKUP_TIME=$(stat -c %Y "$LAST_BACKUP")
BACKUP_SIZE=$(stat -c %s "$LAST_BACKUP")
BACKUP_AGE=$(($(date +%s) - BACKUP_TIME))
cat > $OUTPUT_FILE << METRICS
# HELP backup_last_timestamp Unix timestamp of the last backup
# TYPE backup_last_timestamp gauge
backup_last_timestamp $BACKUP_TIME
# HELP backup_last_size_bytes Size of the last backup in bytes
# TYPE backup_last_size_bytes gauge
backup_last_size_bytes $BACKUP_SIZE
# HELP backup_age_seconds Age of the last backup in seconds
# TYPE backup_age_seconds gauge
backup_age_seconds $BACKUP_AGE
METRICS
else
echo "backup_last_timestamp 0" > $OUTPUT_FILE
fi
Bu script’i cron ile her saat çalıştırın:
chmod +x /usr/local/bin/backup_metrics.sh
# Crontab'a ekle
echo "0 * * * * root /usr/local/bin/backup_metrics.sh" | sudo tee /etc/cron.d/backup_metrics
Yararlı PromQL Sorguları
Node Exporter kurulumunu tamamladıktan sonra Prometheus’ta şu sorguları kullanabilirsiniz:
CPU kullanım yüzdesi:
100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
Kullanılabilir bellek yüzdesi:
(node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100
Disk kullanım yüzdesi:
100 - ((node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"}) * 100)
Ağ trafiği (bytes/saniye):
rate(node_network_receive_bytes_total{device!="lo"}[5m])
Disk I/O latency:
rate(node_disk_io_time_seconds_total[5m])
Bu sorguları Grafana’da paneller oluşturmak için kullanabilirsiniz.
Sorun Giderme
Node Exporter başlamıyor
# Detaylı log çıktısı için
sudo journalctl -u node_exporter -f
# Port çakışması kontrolü
sudo ss -tlnp | grep 9100
# Binary çalıştırma yetkisi
ls -la /usr/local/bin/node_exporter
Prometheus hedeflere ulaşamıyor
# Node Exporter'ın doğru IP'de dinlediğini kontrol et
sudo ss -tlnp | grep 9100
# Prometheus sunucusundan bağlantı testi
curl -v http://HEDEF_IP:9100/metrics
# Güvenlik duvarı kurallarını kontrol et
sudo iptables -L INPUT -n -v | grep 9100
Bazı metrikler görünmüyor
# Etkin collector listesini görüntüle
curl -s http://localhost:9100/metrics | grep "^# HELP" | cut -d' ' -f3 | sort
# systemd collector için gerekli izinler
sudo usermod -aG systemd-journal node_exporter
sudo systemctl restart node_exporter
Güvenliği Artırma: TLS ve Basic Auth
Production ortamında Node Exporter’a TLS ve kimlik doğrulama eklemek iyi bir pratiktir. Node Exporter 1.5.0’dan itibaren bu özellik built-in olarak gelir.
Konfigürasyon dosyası oluşturun:
sudo nano /etc/node_exporter/config.yml
tls_server_config:
cert_file: /etc/node_exporter/tls.crt
key_file: /etc/node_exporter/tls.key
basic_auth_users:
prometheus: $2y$10$hashedpasswordhere
Şifreyi hash’lemek için:
# htpasswd aracı ile (apache2-utils paketi gerekli)
htpasswd -nBC 10 "" | tr -d ':n'
Servis dosyasını güncelleyin:
ExecStart=/usr/local/bin/node_exporter
--web.config.file=/etc/node_exporter/config.yml
--collector.systemd
--collector.processes
Prometheus tarafında da kimlik bilgilerini tanımlamanız gerekir:
scrape_configs:
- job_name: 'node_exporter'
scheme: https
tls_config:
ca_file: /etc/prometheus/ca.crt
basic_auth:
username: prometheus
password: yourpassword
static_configs:
- targets: ['192.168.1.101:9100']
Sonuç
Node Exporter, Prometheus tabanlı izleme altyapısının temel taşlarından biridir. Kurulumu görece basit olsa da doğru yapılandırılması, güvenliğinin sağlanması ve textfile collector ile genişletilmesi, izleme sisteminizi gerçekten kullanışlı hale getirir.
Önemli noktalara toplu bakalım:
- Node Exporter’ı her zaman ayrı bir sistem kullanıcısıyla çalıştırın
- 9100 portunu sadece Prometheus sunucunuza açın, internete asla
- Textfile collector ile özel metriklerinizi sisteme entegre edin
- Production ortamında TLS ve basic auth kullanmayı ihmal etmeyin
--collector.systemdve--collector.processescollector’larını etkinleştirin, çok değerli veriler sağlarlar- Çok sayıda sunucunuz varsa kurulumu Ansible veya benzeri bir araçla otomatize edin
Bir sonraki yazıda Grafana’da Node Exporter metriklerini kullanarak dashboard oluşturacak, CPU, bellek ve disk için alert kuralları yazacak ve bu bildirimler ile PagerDuty veya Slack entegrasyonu yapacağız. Node Exporter’ı kurduktan sonra veri akmaya başlayacak ve asıl eğlence grafiklerin şekillendiği o an başlayacak.
