Sunucu İzleme Araçları: Grafana, Prometheus ve Netdata
Prometheus + Grafana stack kurulumu, Netdata, node_exporter, alert kuralları, dashboard oluşturma ve sunucu metrik izleme.
İçindekiler
Sunucu İzleme Araçları: Grafana, Prometheus ve Netdata
Sunucu altyapınızı etkin bir şekilde izlemek, performans sorunlarını erken tespit etmek ve kesintileri önlemek için güçlü monitoring araçlarına ihtiyacınız vardır. Bu rehberde Prometheus, Grafana ve Netdata üçlüsünü kurarak kapsamlı bir sunucu izleme sistemi oluşturacağız.
Prometheus Nedir?
Prometheus, Cloud Native Computing Foundation (CNCF) tarafından desteklenen açık kaynaklı bir metrik toplama ve izleme sistemidir. Pull-based mimarisi sayesinde hedef sistemlerden metrikleri düzenli aralıklarla çeker ve zaman serisi veritabanında saklar.
Prometheus'un temel özellikleri:
- PromQL: Güçlü sorgulama dili ile metrikleri analiz etme
- Pull-Based Model: Hedeflerden metrikleri HTTP üzerinden çekme
- Service Discovery: Otomatik hedef keşfi (Kubernetes, Consul, DNS)
- Alert Manager: Koşul bazlı alarm yönetimi
- Multi-dimensional Data: Label bazlı esnek veri modeli
- Federation: Birden fazla Prometheus sunucusunu hiyerarşik bağlama
Node Exporter Kurulumu
Node Exporter, Linux sunuculardan donanım ve işletim sistemi metriklerini toplayan Prometheus exporter'ıdır.
Systemd ile Kurulum
# Node Exporter indir
cd /tmp
curl -LO https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz
tar xzf node_exporter-1.7.0.linux-amd64.tar.gz
# Binary'yi taşı
sudo mv node_exporter-1.7.0.linux-amd64/node_exporter /usr/local/bin/
# Kullanıcı oluştur
sudo useradd --no-create-home --shell /bin/false node_exporter
# Systemd servis dosyası
sudo tee /etc/systemd/system/node_exporter.service > /dev/null <<EOF
[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=:9100
[Install]
WantedBy=multi-user.target
EOF
# Servisi başlat
sudo systemctl daemon-reload
sudo systemctl enable --now node_exporter
sudo systemctl status node_exporter
Docker ile Node Exporter
# docker-compose.yml
version: '3.8'
services:
node-exporter:
image: prom/node-exporter:latest
container_name: node-exporter
restart: unless-stopped
ports:
- "9100:9100"
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
command:
- '--path.procfs=/host/proc'
- '--path.sysfs=/host/sys'
- '--path.rootfs=/rootfs'
- '--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/)'
Metrikleri kontrol edin:
curl http://localhost:9100/metrics | head -50
Prometheus Kurulumu
Docker Compose ile Prometheus Stack
# docker-compose.yml
version: '3.8'
services:
prometheus:
image: prom/prometheus:latest
container_name: prometheus
restart: unless-stopped
ports:
- "9090:9090"
volumes:
- ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
- ./prometheus/alert_rules.yml:/etc/prometheus/alert_rules.yml
- prometheus_data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--storage.tsdb.retention.time=30d'
- '--web.enable-lifecycle'
volumes:
prometheus_data:
Prometheus Yapılandırması
# prometheus/prometheus.yml
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_timeout: 10s
alerting:
alertmanagers:
- static_configs:
- targets:
- alertmanager:9093
rule_files:
- "alert_rules.yml"
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'node-exporter'
static_configs:
- targets:
- 'node-exporter:9100'
- '192.168.1.10:9100'
- '192.168.1.11:9100'
labels:
env: 'production'
- job_name: 'docker'
static_configs:
- targets: ['cadvisor:8080']
Alert Kuralları
Prometheus alert kuralları ile kritik durumları tespit edin:
# prometheus/alert_rules.yml
groups:
- name: sunucu_alerts
rules:
- alert: YuksekCPUKullanimi
expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 85
for: 5m
labels:
severity: warning
annotations:
summary: "Yüksek CPU kullanımı ({{ $labels.instance }})"
description: "CPU kullanımı %{{ $value | printf \"%.1f\" }} - 5 dakikadır %85 üzerinde."
- alert: YuksekRAMKullanimi
expr: (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100 > 90
for: 5m
labels:
severity: critical
annotations:
summary: "Yüksek RAM kullanımı ({{ $labels.instance }})"
description: "RAM kullanımı %{{ $value | printf \"%.1f\" }} - %90 üzerinde."
- alert: DiskDolmakUzere
expr: (1 - (node_filesystem_avail_bytes{fstype!~"tmpfs|overlay"} / node_filesystem_size_bytes{fstype!~"tmpfs|overlay"})) * 100 > 85
for: 10m
labels:
severity: warning
annotations:
summary: "Disk dolmak üzere ({{ $labels.instance }})"
description: "{{ $labels.mountpoint }} disk kullanımı %{{ $value | printf \"%.1f\" }}"
- alert: SunucuErisilemez
expr: up == 0
for: 2m
labels:
severity: critical
annotations:
summary: "Sunucu erişilemez ({{ $labels.instance }})"
description: "{{ $labels.job }} hedefi 2 dakikadır erişilemez durumda."
- alert: YuksekDiskIO
expr: rate(node_disk_io_time_seconds_total[5m]) > 0.9
for: 10m
labels:
severity: warning
annotations:
summary: "Yüksek Disk I/O ({{ $labels.instance }})"
description: "Disk I/O kullanımı %{{ $value | printf \"%.1f\" }} - 10 dakikadır yüksek."
Alertmanager Kurulumu
# alertmanager/alertmanager.yml
global:
resolve_timeout: 5m
route:
group_by: ['alertname', 'severity']
group_wait: 30s
group_interval: 5m
repeat_interval: 4h
receiver: 'telegram'
routes:
- match:
severity: critical
receiver: 'telegram'
repeat_interval: 1h
receivers:
- name: 'telegram'
telegram_configs:
- bot_token: 'BOT_TOKEN_BURAYA'
chat_id: CHAT_ID_BURAYA
parse_mode: 'HTML'
message: |
<b>{{ .Status | toUpper }}</b>
<b>Alert:</b> {{ .CommonLabels.alertname }}
<b>Severity:</b> {{ .CommonLabels.severity }}
<b>Instance:</b> {{ .CommonLabels.instance }}
<b>Description:</b> {{ .CommonAnnotations.description }}
Grafana Kurulumu
Docker Compose ile Grafana
# docker-compose.yml (prometheus stack'e ekleyin)
services:
grafana:
image: grafana/grafana:latest
container_name: grafana
restart: unless-stopped
ports:
- "3000:3000"
volumes:
- grafana_data:/var/lib/grafana
- ./grafana/provisioning:/etc/grafana/provisioning
environment:
- GF_SECURITY_ADMIN_USER=admin
- GF_SECURITY_ADMIN_PASSWORD=GucluSifre123!
- GF_USERS_ALLOW_SIGN_UP=false
- GF_SERVER_ROOT_URL=https://grafana.example.com
- GF_INSTALL_PLUGINS=grafana-clock-panel,grafana-piechart-panel
volumes:
grafana_data:
Grafana Data Source Provisioning
# grafana/provisioning/datasources/prometheus.yml
apiVersion: 1
datasources:
- name: Prometheus
type: prometheus
access: proxy
url: http://prometheus:9090
isDefault: true
editable: true
Dashboard Provisioning
# grafana/provisioning/dashboards/dashboard.yml
apiVersion: 1
providers:
- name: 'default'
orgId: 1
folder: 'Server Monitoring'
type: file
disableDeletion: false
editable: true
options:
path: /etc/grafana/provisioning/dashboards/json
Popüler Grafana Dashboard'ları
Grafana.com'dan hazır dashboard'ları import edebilirsiniz:
# Node Exporter Full Dashboard
Dashboard ID: 1860
Data Source: Prometheus
# Docker Container Monitoring
Dashboard ID: 893
# Prometheus Stats
Dashboard ID: 2
# Alertmanager Dashboard
Dashboard ID: 9578
Import etmek için: Grafana → Dashboards → Import → Dashboard ID girin → Load → Prometheus data source seçin → Import.
Özel PromQL Sorguları
# CPU kullanım yüzdesi
100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
# RAM kullanım yüzdesi
(1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100
# Disk kullanım yüzdesi
(1 - (node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"})) * 100
# Network trafiği (bytes/saniye)
rate(node_network_receive_bytes_total{device="eth0"}[5m])
rate(node_network_transmit_bytes_total{device="eth0"}[5m])
# Disk I/O (read/write bytes/saniye)
rate(node_disk_read_bytes_total[5m])
rate(node_disk_written_bytes_total[5m])
# Sistem uptime
node_time_seconds - node_boot_time_seconds
# Açık dosya tanımlayıcı sayısı
node_filefd_allocated
Netdata Kurulumu
Netdata, gerçek zamanlı sunucu izleme aracıdır. Kurulumu son derece kolaydır ve anında detaylı metrikler sunar.
Tek Komutla Kurulum
# Otomatik kurulum scripti
bash <(curl -Ss https://my-netdata.io/kickstart.sh)
# Kurulum sonrası
sudo systemctl status netdata
Web arayüzü: http://SUNUCU_IP:19999
Docker ile Netdata
# docker-compose.yml
version: '3.8'
services:
netdata:
image: netdata/netdata:latest
container_name: netdata
restart: unless-stopped
ports:
- "19999:19999"
cap_add:
- SYS_PTRACE
- SYS_ADMIN
security_opt:
- apparmor:unconfined
volumes:
- netdataconfig:/etc/netdata
- netdatalib:/var/lib/netdata
- netdatacache:/var/cache/netdata
- /etc/passwd:/host/etc/passwd:ro
- /etc/group:/host/etc/group:ro
- /etc/localtime:/etc/localtime:ro
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /etc/os-release:/host/etc/os-release:ro
- /var/log:/host/var/log:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
volumes:
netdataconfig:
netdatalib:
netdatacache:
Netdata Yapılandırması
# Ana yapılandırma dosyasını düzenle
sudo /etc/netdata/edit-config netdata.conf
# /etc/netdata/netdata.conf
[global]
hostname = sunucu-01
history = 3996
update every = 1
memory mode = dbengine
page cache size = 64
dbengine multihost disk space = 2048
[web]
bind to = 0.0.0.0
default port = 19999
allow connections from = localhost 192.168.1.*
Netdata Alarm Yapılandırması
sudo /etc/netdata/edit-config health.d/cpu.conf
alarm: cpu_usage_high
on: system.cpu
lookup: average -5m percentage foreach user,system
units: %
every: 1m
warn: $this > 80
crit: $this > 95
info: CPU kullanımı son 5 dakikada ortalama $this%
to: sysadmin
Netdata Cloud Entegrasyonu
# Netdata Cloud'a bağlan (ücretsiz)
sudo netdata-claim.sh -token=TOKEN -rooms=ROOM_ID -url=https://app.netdata.cloud
Tam Monitoring Stack (Docker Compose)
Tüm bileşenleri tek bir compose dosyasında birleştirin:
# docker-compose.monitoring.yml
version: '3.8'
services:
prometheus:
image: prom/prometheus:latest
container_name: prometheus
restart: unless-stopped
ports:
- "9090:9090"
volumes:
- ./prometheus:/etc/prometheus
- prometheus_data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.retention.time=30d'
networks:
- monitoring
grafana:
image: grafana/grafana:latest
container_name: grafana
restart: unless-stopped
ports:
- "3000:3000"
volumes:
- grafana_data:/var/lib/grafana
environment:
- GF_SECURITY_ADMIN_PASSWORD=GucluSifre123!
depends_on:
- prometheus
networks:
- monitoring
node-exporter:
image: prom/node-exporter:latest
container_name: node-exporter
restart: unless-stopped
ports:
- "9100:9100"
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
command:
- '--path.procfs=/host/proc'
- '--path.sysfs=/host/sys'
- '--path.rootfs=/rootfs'
networks:
- monitoring
alertmanager:
image: prom/alertmanager:latest
container_name: alertmanager
restart: unless-stopped
ports:
- "9093:9093"
volumes:
- ./alertmanager:/etc/alertmanager
networks:
- monitoring
cadvisor:
image: gcr.io/cadvisor/cadvisor:latest
container_name: cadvisor
restart: unless-stopped
ports:
- "8080:8080"
volumes:
- /:/rootfs:ro
- /var/run:/var/run:ro
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
networks:
- monitoring
networks:
monitoring:
driver: bridge
volumes:
prometheus_data:
grafana_data:
docker compose -f docker-compose.monitoring.yml up -d
Nginx Reverse Proxy ile Güvenli Erişim
# /etc/nginx/sites-available/grafana.example.com
server {
listen 443 ssl http2;
server_name grafana.example.com;
ssl_certificate /etc/letsencrypt/live/grafana.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/grafana.example.com/privkey.pem;
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;
}
location /api/live/ {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}
}
REXE sunucularınızda Prometheus + Grafana + Netdata stack'ini kurarak tüm altyapınızı tek bir dashboard'dan izleyebilirsiniz. Alert kuralları sayesinde sorunları proaktif olarak tespit edebilirsiniz.
İlgili Makaleler
Proxy Sunucu Kurulumu: Squid ve HAProxy Rehberi
Squid forward proxy, HAProxy load balancer, SSL termination, ACL kuralları, caching, health check ve yüksek erişilebilirlik.
Nginx Proxy Manager Kurulumu: Web Arayüzlü Reverse Proxy
Nginx Proxy Manager Docker kurulumu, SSL sertifikası otomatik yenileme, proxy host ekleme, access list, redirect, stream ve custom location.
CrowdSec Kurulumu: Topluluk Destekli Güvenlik Motoru
CrowdSec kurulumu, bouncer yapılandırması, saldırı algılama, IP engelleme, dashboard, koleksiyon ve senaryo yönetimi.