Metricbeat ile Sistem Metriklerini Toplama ve ELK Stack’e Gönderme

Prod ortamda bir servis yavaşladığında, ilk refleks genellikle log’lara bakmak olur. Ama çoğu zaman sorun log’larda değil, metrik’lerde gizlidir. CPU spike’ı mı var? Memory leak mi? Disk I/O mu doldu? Bu soruların cevabını ancak düzgün bir metrik toplama altyapısıyla verebilirsiniz. Metricbeat tam da bu iş için tasarlanmış, Elastic Stack’in hafif ama güçlü veri toplayıcısı.

Bu yazıda Metricbeat’i sıfırdan kurarak gerçek bir izleme altyapısı oluşturacağız. Sadece “nasıl kurulur” değil, “neden böyle yapılandırılır” sorusunu da cevaplayacağız.

Metricbeat Nedir ve Neden Tercih Edilir?

Metricbeat, sistem ve servis metriklerini toplayıp Elasticsearch veya Logstash’e gönderen bir Elastic Beat’tir. Go ile yazıldığı için kaynak tüketimi son derece düşüktür. Bir zamanlar Nagios ve Zabbix ile uğraşmış biri olarak söyleyebilirim ki, agent kurulumu, konfigürasyon karmaşası ve ekran başında geçirilen saatler açısından Metricbeat çok daha temiz bir deneyim sunuyor.

Temel avantajları şu şekilde sıralayabiliriz:

  • Düşük kaynak tüketimi: Tipik bir kurulumda 50-100 MB RAM kullanır
  • Modüler yapı: Sadece ihtiyacınız olan modülleri aktifleştirebilirsiniz
  • Out-of-the-box dashboard’lar: Kibana için hazır görselleştirmeler gelir
  • Geniş servis desteği: MySQL, Nginx, Redis, Kafka, Kubernetes ve daha fazlası

Kurulum ve Temel Yapılandırma

Debian/Ubuntu tabanlı sistemlerde kurulum:

# Elastic GPG anahtarını ekle
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elastic-keyring.gpg

# Repository ekle
echo "deb [signed-by=/usr/share/keyrings/elastic-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-8.x.list

# Kur
sudo apt update && sudo apt install metricbeat -y

RHEL/CentOS için:

# Repo dosyasını oluştur
cat > /etc/yum.repos.d/elastic.repo << EOF
[elasticsearch]
name=Elasticsearch repository for 8.x packages
baseurl=https://artifacts.elastic.co/packages/8.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
EOF

sudo yum install metricbeat -y

Kurulum tamamlandıktan sonra ana konfigürasyon dosyası /etc/metricbeat/metricbeat.yml altında bulunur. Bu dosya üç ana bölümden oluşur: modül konfigürasyonu, output ayarları ve genel Metricbeat ayarları.

Temel bir konfigürasyon örneği:

# /etc/metricbeat/metricbeat.yml

metricbeat.config.modules:
  path: ${path.config}/modules.d/*.yml
  reload.enabled: true
  reload.period: 10s

# Elasticsearch output
output.elasticsearch:
  hosts: ["https://elasticsearch:9200"]
  username: "metricbeat_user"
  password: "${METRICBEAT_PASSWORD}"
  ssl.certificate_authorities: ["/etc/metricbeat/certs/ca.crt"]

# Kibana ayarları (dashboard kurulumu için)
setup.kibana:
  host: "https://kibana:5601"
  username: "kibana_system"
  password: "${KIBANA_PASSWORD}"

# Genel ayarlar
setup.dashboards.enabled: true
setup.template.settings:
  index.number_of_shards: 1
  index.codec: best_compression

logging.level: info
logging.to_files: true
logging.files:
  path: /var/log/metricbeat
  name: metricbeat
  keepfiles: 7

Burada dikkat edilmesi gereken birkaç nokta var. Password’leri direkt YAML’a yazmak yerine environment variable kullanmak, özellikle GitOps yaklaşımında konfigürasyon dosyalarını repo’ya atarken şifre sızıntısı riskini ortadan kaldırır.

Sistem Modüllerini Yapılandırma

Metricbeat’in kalbi modüllerdir. En temel ve en çok kullanılan sistem modülünü aktifleştirelim:

# System modülünü aktifleştir
sudo metricbeat modules enable system

# Mevcut modüllerin durumunu kontrol et
sudo metricbeat modules list

System modülü konfigürasyonu:

# /etc/metricbeat/modules.d/system.yml

- module: system
  period: 10s
  metricsets:
    - cpu
    - load
    - memory
    - network
    - process
    - process_summary
    - socket_summary
    - diskio
    - filesystem
    - fsstat

  process.include_top_n:
    by_cpu: 10      # CPU'ya göre top 10 process
    by_memory: 10   # Memory'ye göre top 10 process

  cpu.metrics: ["percentages", "normalized_percentages"]

  core.metrics: ["percentages"]

  # Belirli filesystem'leri hariç tut
  filesystem.ignore_types:
    - nfs
    - sysfs
    - devtmpfs
    - tmpfs
    - proc

period: 10s değeri üretim ortamı için makul bir başlangıç noktasıdır. Çok sık veri toplarsanız hem Elasticsearch’e yük bindirirsiniz hem de storage tüketiminiz artar. Kritik sistemler için 5 saniye, genel monitoring için 30 saniye bile yeterlidir.

Uygulama Servis Modülleri

Sadece sistem metriklerini toplamak çoğu zaman yeterli olmaz. Web sunucunuzun gerçekte kaç istek işlediğini, veritabanı bağlantı havuzunun ne kadar dolu olduğunu da görmek istersiniz.

Nginx Modülü

sudo metricbeat modules enable nginx
# /etc/metricbeat/modules.d/nginx.yml

- module: nginx
  metricsets: ["stubstatus"]
  period: 10s
  hosts: ["http://127.0.0.1"]
  server_status_path: "/nginx_status"

Bu modülün çalışması için Nginx’te stub_status aktif olmalı:

# /etc/nginx/conf.d/status.conf
server {
    listen 127.0.0.1:80;
    location /nginx_status {
        stub_status;
        allow 127.0.0.1;
        deny all;
    }
}

MySQL Modülü

# /etc/metricbeat/modules.d/mysql.yml

- module: mysql
  metricsets:
    - status
    - galera_status
    - performance
    - query
  period: 10s
  hosts: ["root:${MYSQL_PASSWORD}@tcp(127.0.0.1:3306)/"]

MySQL için monitoring kullanıcısı oluşturmak daha güvenli bir yaklaşım:

# MySQL'de monitoring kullanıcısı oluştur
mysql -u root -p -e "
CREATE USER 'metricbeat'@'localhost' IDENTIFIED BY 'guclu_sifre_buraya';
GRANT REPLICATION CLIENT, PROCESS ON *.* TO 'metricbeat'@'localhost';
GRANT SELECT ON performance_schema.* TO 'metricbeat'@'localhost';
FLUSH PRIVILEGES;
"

Redis Modülü

# /etc/metricbeat/modules.d/redis.yml

- module: redis
  metricsets:
    - info
    - keyspace
  period: 10s
  hosts: ["127.0.0.1:6379"]
  password: "${REDIS_PASSWORD}"

Kubernetes Ortamında Metricbeat

Modern altyapılarda Kubernetes’te çalışan servisler için Metricbeat’i DaemonSet olarak deploy etmek standart yaklaşımdır. Bu sayede her node üzerinde otomatik olarak çalışır.

# metricbeat-daemonset.yaml

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: metricbeat
  namespace: kube-system
spec:
  selector:
    matchLabels:
      app: metricbeat
  template:
    metadata:
      labels:
        app: metricbeat
    spec:
      serviceAccountName: metricbeat
      hostNetwork: true
      dnsPolicy: ClusterFirstWithHostNet
      containers:
      - name: metricbeat
        image: docker.elastic.co/beats/metricbeat:8.12.0
        args: ["-c", "/etc/metricbeat.yml", "-e"]
        env:
        - name: ELASTICSEARCH_HOST
          value: "https://elasticsearch:9200"
        - name: ELASTICSEARCH_USERNAME
          valueFrom:
            secretKeyRef:
              name: elastic-credentials
              key: username
        - name: ELASTICSEARCH_PASSWORD
          valueFrom:
            secretKeyRef:
              name: elastic-credentials
              key: password
        - name: NODE_NAME
          valueFrom:
            fieldRef:
              fieldPath: spec.nodeName
        securityContext:
          runAsUser: 0
        resources:
          limits:
            memory: 200Mi
            cpu: 200m
          requests:
            memory: 100Mi
            cpu: 100m
        volumeMounts:
        - name: config
          mountPath: /etc/metricbeat.yml
          readOnly: true
          subPath: metricbeat.yml
        - name: proc
          mountPath: /hostfs/proc
          readOnly: true
        - name: cgroup
          mountPath: /hostfs/sys/fs/cgroup
          readOnly: true
      volumes:
      - name: config
        configMap:
          name: metricbeat-config
      - name: proc
        hostPath:
          path: /proc
      - name: cgroup
        hostPath:
          path: /sys/fs/cgroup

Kubernetes ortamında hostNetwork: true ve hostPID: true ayarları önemli. Bunlar olmadan node seviyesindeki metrikleri doğru toplayamazsınız.

Performans Tuning ve Üretim Ortamı Optimizasyonu

Tek bir sunucuyu izlemek ile 200 sunuculuk bir fleet’i izlemek çok farklı şeyler. Büyük ortamlarda dikkat etmeniz gereken bazı kritik ayarlar var.

# Büyük ortamlar için output optimizasyonu
output.elasticsearch:
  hosts: ["https://es-node1:9200", "https://es-node2:9200", "https://es-node3:9200"]
  loadbalance: true
  bulk_max_size: 1600
  worker: 4
  compression_level: 3

# Queue ayarları - bellek içi tampon
queue.mem:
  events: 4096
  flush.min_events: 512
  flush.timeout: 5s

# Circuit breaker - Elasticsearch dolduğunda Metricbeat'in event'leri tutması için
output.elasticsearch:
  backoff.init: 1s
  backoff.max: 60s

compression_level: 3 ayarı network trafiğini yaklaşık %70-80 azaltır. Bu özellikle datacenter dışı Elasticsearch cluster’larına veri gönderirken network maliyetini ciddi ölçüde düşürür.

Processors ile Veriyi Zenginleştirme

Ham metrikler tek başına yeterli değildir. Hangi ortam, hangi servis, hangi takım gibi meta bilgileri eklemek, ileride Kibana’da filtreleme yaparken hayat kurtarır.

# metricbeat.yml içinde processors bölümü

processors:
  # Gereksiz alanları sil (storage tasarrufu)
  - drop_fields:
      fields:
        - agent.ephemeral_id
        - ecs.version

  # Ortam bilgisi ekle
  - add_fields:
      target: ''
      fields:
        environment: "production"
        datacenter: "ist-dc1"
        team: "platform"

  # Cloud metadata ekle (AWS/GCP/Azure üzerindeyseniz)
  - add_cloud_metadata:
      timeout: 3s

  # Host metadata ekle
  - add_host_metadata:
      when.not.contains.tags: forwarded

  # Yüksek CPU durumunda event'e özel tag ekle
  - add_tags:
      tags: ["high-cpu"]
      when:
        range:
          system.cpu.total.pct:
            gte: 0.9

  # Belirli process'leri filtrele
  - drop_event:
      when:
        equals:
          system.process.name: "metricbeat"

Güvenlik Yapılandırması

Elastic Stack 8.x ile güvenlik varsayılan olarak açık gelir. TLS olmadan Elasticsearch’e bağlanmak artık mümkün değil. Doğru bir güvenlik yapılandırması:

# Metricbeat için özel kullanıcı ve rol oluştur
# Elasticsearch'te çalıştır

# Rol oluştur
curl -X POST "https://elasticsearch:9200/_security/role/metricbeat_writer" 
  -H 'Content-Type: application/json' 
  -u elastic:şifre 
  -d '{
    "cluster": ["monitor", "read_ilm", "read_pipeline"],
    "indices": [
      {
        "names": ["metricbeat-*", ".monitoring-*"],
        "privileges": ["index", "create_index", "create", "write"]
      }
    ]
  }'

# Kullanıcı oluştur
curl -X POST "https://elasticsearch:9200/_security/user/metricbeat_user" 
  -H 'Content-Type: application/json' 
  -u elastic:şifre 
  -d '{
    "password": "güvenli_şifre",
    "roles": ["metricbeat_writer"],
    "full_name": "Metricbeat Service User"
  }'

Sisteme başladıktan sonra çalışıp çalışmadığını test etmek için:

# Konfigürasyonu test et
sudo metricbeat test config -e

# Elasticsearch bağlantısını test et
sudo metricbeat test output

# Dashboard'ları yükle
sudo metricbeat setup --dashboards

# Servisi başlat
sudo systemctl enable metricbeat
sudo systemctl start metricbeat

# Log'ları takip et
sudo journalctl -u metricbeat -f

ILM Policy ile Veri Yaşam Döngüsü Yönetimi

Metrikler birikmek üzere vardır. Aylarca metrik topladıktan sonra disk dolmaya başlar. Index Lifecycle Management (ILM) bu sorunu çözer:

# Metricbeat için ILM policy oluştur
curl -X PUT "https://elasticsearch:9200/_ilm/policy/metricbeat-policy" 
  -H 'Content-Type: application/json' 
  -u elastic:şifre 
  -d '{
    "policy": {
      "phases": {
        "hot": {
          "min_age": "0ms",
          "actions": {
            "rollover": {
              "max_primary_shard_size": "20gb",
              "max_age": "1d"
            }
          }
        },
        "warm": {
          "min_age": "7d",
          "actions": {
            "shrink": {
              "number_of_shards": 1
            },
            "forcemerge": {
              "max_num_segments": 1
            }
          }
        },
        "cold": {
          "min_age": "30d",
          "actions": {
            "freeze": {}
          }
        },
        "delete": {
          "min_age": "90d",
          "actions": {
            "delete": {}
          }
        }
      }
    }
  }'

Bu policy ile hot phase’de günlük rollover yapılır, 7 gün sonra warm’a geçerek shard sayısı azaltılır, 30 gün sonra cold’a alınır ve 90 gün sonra silinir. Metrikler için 90 günlük saklama süresi çoğu kullanım senaryosu için yeterlidir.

Kibana’da Dashboard Oluşturma ve Anomali Tespiti

Metricbeat’in otomatik yüklediği dashboard’lar iyi bir başlangıç noktasıdır ama zaman içinde kendi özel görünümlerinizi oluşturmak istersiniz. Kibana Lens ile birkaç dakikada etkili görseller yapabilirsiniz.

Gerçek hayat örneği: Bir e-ticaret platformunda her hafta Cuma öğleden sonra başlayan yavaşlamayı metriklerle analiz ettik. CPU normale yakın görünüyordu ama disk I/O wait time anormalce yüksekti. system.diskio.io.ops metriği bunu açıkça gösteriyordu. Sorun, cron job’un tam bu saatte çalışan büyük bir veritabanı yedeği olduğunu ortaya koydu. Yedek saatini gece 02:00’ye taşıdık, sorun çözüldü.

Bu tür analizleri yapabilmek için şu metriklere mutlaka dashboard’da yer verin:

  • system.cpu.total.pct: Toplam CPU kullanımı
  • system.memory.actual.used.pct: Gerçek memory kullanımı (cache dahil değil)
  • system.diskio.io.time: Disk I/O wait süresi
  • system.network.in.bytes ve out.bytes: Network trafiği
  • system.load.norm.1: Normalized load average

Yaygın Sorunlar ve Çözümleri

Gerçek ortamlarda en sık karşılaşılan sorunların başında izin problemleri gelir. Özellikle /proc ve /sys altındaki dosyalara erişim için Metricbeat’in yeterli yetkisi olması gerekir:

# Metricbeat kullanıcısına gerekli yetkiyi ver
sudo setcap cap_net_raw=eip /usr/share/metricbeat/bin/metricbeat

# systemd servis dosyasını kontrol et
sudo systemctl cat metricbeat

# Eğer sorun devam ederse root olarak çalıştır (tercih edilmez ama acil durum için)
sudo sed -i 's/User=metricbeat/User=root/' /lib/systemd/system/metricbeat.service
sudo systemctl daemon-reload

Elasticsearch’e bağlantı sorunlarında debug modu:

# Verbose modda çalıştır
sudo metricbeat -e -d "*" 2>&1 | grep -E "error|ERR|connection"

# Belirli bir modülü test et
sudo metricbeat test modules system

Sonuç

Metricbeat, doğru yapılandırıldığında görünmez bir izleme katmanı oluşturur. Sunucularınızda neler döndüğünü anlayabilmek, sorunları önceden fark edebilmek ve kapasite planlaması yapabilmek için sağlam bir metrik altyapısı şart. Anlattığım kurulum yaklaşımı tek bir sunucudan yüzlerce node’a kadar ölçeklenir.

Önemli olan sadece kurmak değil, topladığınız metrikler üzerinde alert’ler tanımlamak ve anomali tespiti yapmaktır. Elasticsearch Watcher veya Kibana Alerting ile kritik eşiklerde bildirim alacak şekilde sistemi tamamladığınızda, gece telefonunuzu açmak yerine sabah işe geldiğinizde olayın kaydını görebilirsiniz. Bu fark, iyi bir izleme altyapısının size kazandırdığı en değerli şeydir: uyku.

Bir yanıt yazın

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