Netdata ile Anomali Tespiti ve Makine Öğrenmesi
Sunucularınız gece 3’te anormal davranmaya başlıyor, siz uyuyorsunuz ve sabah işe geldiğinizde bir felaket sizi bekliyor. Bu senaryo, klasik eşik tabanlı izleme sistemlerinin en büyük açmazını özetliyor: bir metrik belirlediğiniz eşiği geçmeden alarm çalmıyor, ama o eşiği geçtiğinde iş işten geçmiş olabiliyor. Netdata’nın makine öğrenmesi tabanlı anomali tespit motoru tam da bu boşluğu kapatmak için tasarlandı.
Netdata Anomali Tespiti Nedir?
Netdata 1.32 sürümüyle birlikte gelen ML tabanlı anomali skoru özelliği, her metrik için geçmiş verileri kullanarak “normal” davranış modelini öğreniyor. Sistem daha sonra gerçek zamanlı olarak gelen yeni verileri bu modelle karşılaştırıyor ve sapmaları puanlıyor.
Teknik olarak Netdata, her metrik için k-means kümeleme algoritması kullanıyor. Varsayılan ayarlarda son 4 saat ile 24 saat arasındaki veriyi eğitim verisi olarak kullanıyor ve her dakika modeli güncelliyor. Bu yaklaşım, hem ani spike’ları hem de yavaş yavaş kötüleşen durumları yakalamayı mümkün kılıyor.
Anomali skoru 0 ile 1 arasında bir değer alıyor:
- 0: Tamamen normal, beklenen davranış
- 1: Kesinlikle anomali, modelin hiç görmediği bir durum
- 0.5 üzeri: Dikkat edilmesi gereken bölge
Kurulum ve Ön Gereksinimler
Anomali tespiti için Netdata’nın en az 1.32 veya üzeri sürümünü kullanmanız gerekiyor. Güncel kurulum için:
# Mevcut Netdata sürümünü kontrol et
netdata --version
# Otomatik kurulum scripti ile güncel sürümü yükle
wget -O /tmp/netdata-kickstart.sh https://my-netdata.io/kickstart.sh
sudo sh /tmp/netdata-kickstart.sh --stable-channel
# Servis durumunu kontrol et
sudo systemctl status netdata
ML motorunun aktif olduğunu doğrulamak için:
# Netdata config dosyasını bul
sudo netdata -W dump-config | grep -A 20 "ml"
# Alternatif olarak config dosyasını doğrudan kontrol et
sudo cat /etc/netdata/netdata.conf | grep -A 10 "[ml]"
Eğer ML bölümü görünmüyorsa netdata.conf dosyasına manuel olarak eklemeniz gerekiyor:
sudo nano /etc/netdata/netdata.conf
Dosyaya şu bölümü ekleyin:
[ml]
# ML motorunu aktif et
enabled = yes
# Eğitim için minimum veri noktası sayısı (varsayılan: 900)
minimum num samples to train = 900
# Maksimum eğitim verisi sayısı
maximum num samples to train = 14400
# Eğitim aralığı (saniye cinsinden, varsayılan: 3600 = 1 saat)
train every = 3600
# Anomali skoru eşiği (bu değerin üzerindekiler anomali sayılır)
# 0.99 demek %99 güven aralığı dışında kalan
maximum num k-means iterations = 1000
Değişiklikleri uygulamak için:
sudo systemctl restart netdata
# veya daha nazik bir yöntem:
sudo kill -HUP $(pidof netdata)
Anomali Skorlarını İzleme
Netdata, her metrik için anomali skorunu anomaly_detection namespace’i altında saklıyor. Bu skorları Netdata’nın kendi arayüzünden veya API üzerinden sorgulayabilirsiniz.
Web Arayüzü Üzerinden
Netdata’nın web arayüzüne bağlandığınızda (varsayılan port 19999), her grafiğin sağ üst köşesinde küçük bir beyin ikonu görürsünüz. Bu ikona tıkladığınızda ilgili metriğin anomali skorunu normal metrikle üst üste görebilirsiniz.
Ayrıca sol menüden Anomaly Advisor bölümüne giderek sistemdeki tüm anomalileri tek bir yerden görebilirsiniz. Bu bölüm özellikle bir sorun yaşandığında “neyin anormal olduğunu” hızlıca tespit etmek için son derece kullanışlı.
API Üzerinden Anomali Skorlarını Çekme
# Bir sunucunun anomali skorlarını API ile sorgula
curl -s "http://localhost:19999/api/v1/data?chart=anomaly_detection.anomaly_rates&after=-300&format=json" | python3 -m json.tool
# Belirli bir zaman aralığı için anomali verisi
# after ve before parametreleri Unix timestamp veya negatif saniye kabul eder
curl -s "http://localhost:19999/api/v1/data?chart=system.cpu&after=-3600&options=anomaly-bit" | python3 -m json.tool
Anomali bitmap verisi çekmek için daha detaylı bir sorgu:
# Son 1 saatin anomali verilerini JSON formatında çek ve kaydet
curl -s "http://localhost:19999/api/v1/data?
chart=system.cpu&
after=-3600&
before=0&
points=60&
group=average&
options=anomaly-bit%7Cjson2"
-o /tmp/cpu_anomaly_last_hour.json
# Sonucu görüntüle
cat /tmp/cpu_anomaly_last_hour.json | python3 -c "
import json, sys
data = json.load(sys.stdin)
print('Toplam veri noktasi:', len(data.get('data', [])))
anomalies = [d for d in data.get('data', []) if d[1] > 0]
print('Anomali sayisi:', len(anomalies))
"
Özel Anomali Bildirimleri Kurma
Varsayılan anomali bildirimleri genellikle çok gürültülü veya çok sessiz oluyor. Kendi ihtiyaçlarınıza göre özelleştirmek için Netdata’nın alarm sistemiyle ML skorlarını birleştirmeniz gerekiyor.
health.d Altında Özel Anomali Alarmı
sudo nano /etc/netdata/health.d/ml-anomaly.conf
# CPU anomali alarmı - yüksek anomali skoru için uyar
alarm: cpu_anomaly_high
on: anomaly_detection.anomaly_rates
os: linux
hosts: *
lookup: average -5m unaligned of system.cpu
every: 1m
warn: $this > 0.5
crit: $this > 0.8
delay: up 2m down 5m multiplier 1.5 max 1h
info: CPU metrikleri son 5 dakikada anormal davranış gösteriyor
to: sysadmin
# Bellek anomali alarmı
alarm: memory_anomaly
on: anomaly_detection.anomaly_rates
os: linux
hosts: *
lookup: average -10m unaligned of system.ram
every: 2m
warn: $this > 0.6
crit: $this > 0.85
delay: up 5m down 10m multiplier 1.2 max 2h
info: Bellek kullanımı beklenmedik bir anomali gösteriyor
to: sysadmin
Alarmı test etmek için:
# Alarm konfigürasyonunu doğrula
sudo netdatacli reload-health
# Mevcut alarm durumlarını kontrol et
sudo netdatacli alarms-values
# Belirli bir alarm için detay
sudo netdatacli get-raw-stream 2>/dev/null | grep "ml-anomaly"
Gerçek Dünya Senaryosu: Yavaş Bir Memory Leak’i Yakalamak
Klasik bir senaryo: production sunucunuzda çalışan bir Java uygulaması günde birkaç MB bellek sızdırıyor. Eşik tabanlı alarmınız ancak bellek %90’a geldiğinde çalıyor, ama o noktada JVM zaten yaşlı nesil GC baskısı altında ve servis kalitesi ciddi şekilde düşmüş oluyor.
ML tabanlı yaklaşımda sistem şunu fark ediyor: her gün sabah bellek şu kadar, akşam şu kadar. Ama bu hafta sabah başlangıç değerleri her gün biraz daha yüksek. Bu monoton artış paterni, normal kullanım paterninden sapıyor ve anomali skoru yavaş yavaş yükseliyor.
Bu tür bir durumu tespit etmek için özel bir izleme scripti yazabilirsiniz:
#!/bin/bash
# /usr/local/bin/netdata-ml-monitor.sh
# Anomali skorlarını izle ve trend analizi yap
NETDATA_URL="http://localhost:19999"
THRESHOLD=0.4
LOG_FILE="/var/log/netdata-ml-monitor.log"
ALERT_EMAIL="[email protected]"
check_anomaly_trend() {
local chart=$1
local dimension=$2
# Son 2 saatin verilerini çek
local data=$(curl -s "${NETDATA_URL}/api/v1/data?
chart=${chart}&
after=-7200&
points=120&
group=average&
options=anomaly-bit" 2>/dev/null)
if [ -z "$data" ]; then
echo "$(date): HATA - $chart için veri alınamadı" >> "$LOG_FILE"
return
fi
# Python ile trend analizi
local trend=$(echo "$data" | python3 -c "
import json, sys
try:
data = json.load(sys.stdin)
points = [d[1] for d in data.get('data', []) if d[1] is not None]
if len(points) < 10:
print('insufficient_data')
sys.exit(0)
# Son 30 vs ilk 30 karşılaştır
first_half = sum(points[:30]) / 30
second_half = sum(points[-30:]) / 30
if second_half > first_half * 1.5 and second_half > 0.3:
print(f'INCREASING_TREND:{first_half:.3f}:{second_half:.3f}')
elif second_half > 0.6:
print(f'HIGH_ANOMALY:{second_half:.3f}')
else:
print(f'NORMAL:{second_half:.3f}')
except Exception as e:
print(f'ERROR:{e}')
" 2>/dev/null)
echo "$(date): $chart -> $trend" >> "$LOG_FILE"
# Artan trend varsa uyar
if echo "$trend" | grep -q "INCREASING_TREND|HIGH_ANOMALY"; then
echo "UYARI: $chart anomali trendi tespit edildi: $trend" |
mail -s "[Netdata ML] Anomali Trendi: $chart" "$ALERT_EMAIL"
fi
}
# İzlenecek metrikleri kontrol et
check_anomaly_trend "system.ram" "used"
check_anomaly_trend "system.cpu" "user"
check_anomaly_trend "system.io" "in"
check_anomaly_trend "system.net" "received"
echo "$(date): ML anomali kontrolü tamamlandı" >> "$LOG_FILE"
Script’i cron’a ekleyin:
chmod +x /usr/local/bin/netdata-ml-monitor.sh
# Her 15 dakikada bir çalıştır
echo "*/15 * * * * root /usr/local/bin/netdata-ml-monitor.sh" |
sudo tee /etc/cron.d/netdata-ml-monitor
# Log rotasyonu ekle
sudo tee /etc/logrotate.d/netdata-ml-monitor << 'EOF'
/var/log/netdata-ml-monitor.log {
daily
rotate 7
compress
missingok
notifempty
}
EOF
Çoklu Sunucu Ortamında Anomali Korelasyonu
Tek bir sunucudaki anomali bazen önemsiz olabilir, ama aynı anda birden fazla sunucuda anomali görülmesi ciddi bir sorunun işareti. Özellikle mikroservis mimarilerinde bu durum çok daha kritik.
Netdata Parent-Child mimarisini kullanarak tüm sunucuların anomali verilerini merkezi bir noktada toplayabilirsiniz:
# Parent sunucu konfigürasyonu (stream.conf)
sudo nano /etc/netdata/stream.conf
# Parent sunucuda - gelen bağlantıları kabul et
[stream]
enabled = yes
# Her child için bir API key tanımla
[API_KEY_BURAYA]
enabled = yes
default history = 86400
default memory mode = dbengine
health enabled by default = auto
allow from = *
Child sunucularda (izlenen sunucular):
# Child sunucu stream.conf
[stream]
enabled = yes
destination = parent-sunucu-ip:19999
api key = API_KEY_BURAYA
timeout seconds = 60
buffer size bytes = 1048576
reconnect delay seconds = 5
initial clock resync iterations = 60
Bu yapıyı kurduktan sonra parent sunucuda tüm child’ların anomali skorlarını tek bir sorguyla çekebilirsiniz:
# Parent üzerinden tüm node'ların anomali özetini al
curl -s "http://parent-sunucu:19999/api/v1/info" |
python3 -c "
import json, sys
data = json.load(sys.stdin)
nodes = data.get('mirrored_hosts', [])
print(f'Toplam izlenen sunucu: {len(nodes)}')
for node in nodes:
print(f' - {node}')
"
ML Modelinin Kalibrasyonu ve İyileştirme
Makine öğrenmesi modelleri kutudan çıktığı gibi mükemmel çalışmaz. Özellikle ilk birkaç günde çok fazla false positive alabilirsiniz. Bunu minimize etmek için bazı pratik adımlar:
Planlı Bakım Dönemlerinde ML’yi Uyarma
Sunucunuza yüksek yük bindireceğiniz bir batch iş çalıştıracaksanız, ML motoruna bu durumu bildirmeniz gerekiyor. Aksi takdirde model bu yükü de “normal” olarak öğrenebilir ya da gereksiz alarmlar üretir:
# Bakım modu başlat - ML eğitimini geçici durdur
sudo netdatacli ml-training-start
# veya API üzerinden
curl -s -X POST "http://localhost:19999/api/v1/manage/health?cmd=SILENCE&context=anomaly_detection"
Belirli Metrikleri ML’den Hariç Tutma
Bazı metrikler doğası gereği çok değişken olabilir ve sürekli false positive üretir. Bu metrikleri ML’den hariç tutmak için:
sudo nano /etc/netdata/netdata.conf
[ml]
enabled = yes
# Bu pattern'lere uyan metrikleri ML'den hariç tut
# Virgülle ayrılmış glob pattern'ler
charts to skip from training = system.interrupts
system.softirqs
apps.cpu_*_percentage
# Minimum veri kalitesi - bu değerin altında eğitim yapma
# Çok değişken metriklere eğitim yapmamak için kullanılır
minimum std dev = 0.01
Grafana ile Anomali Görselleştirmesi
Netdata’nın kendi arayüzü güzel ama ekibiniz Grafana kullanıyorsa anomali skorlarını oraya taşımak isteyebilirsiniz. Netdata’nın Prometheus exporter özelliğini kullanarak bunu yapabilirsiniz:
# Netdata'nın Prometheus endpoint'ini test et
curl -s "http://localhost:19999/api/v1/allmetrics?format=prometheus&help=yes" |
grep "anomaly" | head -20
Prometheus scrape konfigürasyonu:
# /etc/prometheus/prometheus.yml içine ekle
scrape_configs:
- job_name: 'netdata-ml'
metrics_path: '/api/v1/allmetrics'
params:
format: ['prometheus']
# Sadece anomali metriklerini çek, bandwith tasarrufu için
filter: ['anomaly_detection*']
static_configs:
- targets:
- 'sunucu1:19999'
- 'sunucu2:19999'
- 'sunucu3:19999'
scrape_interval: 60s
Grafana’da anomali skorlarını göstermek için kullanabileceğiniz PromQL sorgusu:
# Tüm sunuculardaki yüksek anomali skorlarını göster
# Panel tipini "Heatmap" olarak ayarlayın
netdata_anomaly_detection_anomaly_rates_percentage{dimension=~"system.cpu|system.ram"} > 0.4
# Son 1 saatin maksimum anomali skorunu al
max_over_time(netdata_anomaly_detection_anomaly_rates_percentage[1h])
Anomali Tespitinin Sınırları ve Dikkat Edilmesi Gerekenler
ML tabanlı anomali tespiti güçlü bir araç ama sihirli bir değnek değil. Bazı önemli noktalar:
- Yeni kurulan sistemlerde dikkatli olun: Model en az 24-48 saatlik veriye ihtiyaç duyuyor. Bu süreçte çok fazla false positive göreceksiniz, buna hazırlıklı olun.
- Mevsimsel paternleri öğrenmesi zaman alır: Eğer sisteminizde haftalık döngüler varsa (hafta sonu düşük trafik gibi), modelin bunları öğrenmesi 1-2 hafta sürebilir.
- Anomali, sorun değildir: Yüksek anomali skoru bir şeylerin farklı gittiğini söyler, bunun iyi mi kötü mü olduğunu söylemez. Büyük bir kampanya sonucu artan trafik de anomali olarak görünebilir.
- Eşik değerlerini durumunuza göre ayarlayın: 0.5 eşiği bazı ortamlar için çok hassas, bazıları için çok toleranslı olabilir. İlk 2 haftayı gözlem yaparak geçirmenizi öneririm.
- Disk I/O ve network metrikleri genellikle gürültülü: Bu metriklerde anomali skorunun daha yüksek eşikte alarm üretmesi tercih edilebilir.
Sonuç
Netdata’nın ML tabanlı anomali tespiti, klasik eşik tabanlı izlemenin yerine geçmiyor, onun yanına ekleniyor. Eşik alarmlarınız “bir şey patlak” dediğinde çalıştırılıyor, ML alarmları ise “bir şeyler ters gitmeye başladı” dediğinde devreye giriyor. Bu iki katmanın birlikte çalışması, hem anlık krizleri hem de yavaş yavaş kötüleşen durumları yakalayabilen sağlam bir izleme altyapısı oluşturuyor.
Pratikte önerim şu: Önce 1-2 hafta boyunca sadece gözlem yapın, alarm üretmeyin. Bu sürede hangi metriklerin ne kadar değişken olduğunu, hangi pattern’lerin “normal” olduğunu anlayın. Sonra önce uyarı seviyesinde alarmları devreye alın, gerçek yangın alarmlarını ancak yeterli veri biriktikten sonra etkinleştirin. Bu yaklaşımla hem alarm yorgunluğunun önüne geçersiniz hem de gerçekten kritik durumlar için güvenilir bir erken uyarı sisteminiz olur.
Netdata bu özelliği açık kaynak ve ücretsiz sunuyor. 2500 euroya ticari anomali tespit araçları varken, iyi konfigüre edilmiş bir Netdata kurulumu production ortamlarında gayet tatmin edici sonuçlar veriyor. Denemek için hiçbir bahaneniz yok.
