Ana içeriğe geç
Kategoriye Dön

Sunucu İzleme Araçları: Grafana, Prometheus ve Netdata

Prometheus + Grafana stack kurulumu, Netdata, node_exporter, alert kuralları, dashboard oluşturma ve sunucu metrik izleme.

Okuma süresi: 18 dk Monitoring
monitoringgrafanaprometheusnetdatasunucu izlemealertdashboard

İç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

hljs bash
# 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

hljs yaml
# 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:

hljs bash
curl http://localhost:9100/metrics | head -50

Prometheus Kurulumu

Docker Compose ile Prometheus Stack

hljs yaml
# 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ı

hljs yaml
# 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:

hljs yaml
# 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

hljs yaml
# 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

hljs yaml
# 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

hljs yaml
# grafana/provisioning/datasources/prometheus.yml
apiVersion: 1
datasources:
  - name: Prometheus
    type: prometheus
    access: proxy
    url: http://prometheus:9090
    isDefault: true
    editable: true

Dashboard Provisioning

hljs yaml
# 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ı

hljs promql
# 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

hljs bash
# 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

hljs yaml
# 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ı

hljs bash
# Ana yapılandırma dosyasını düzenle
sudo /etc/netdata/edit-config netdata.conf
hljs ini
# /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ı

hljs bash
sudo /etc/netdata/edit-config health.d/cpu.conf
hljs yaml
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

hljs bash
# 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:

hljs yaml
# 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:
hljs bash
docker compose -f docker-compose.monitoring.yml up -d

Nginx Reverse Proxy ile Güvenli Erişim

hljs nginx
# /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.