Telegraf ile Sistem Metriklerini Toplama

Sistem yönetiminin en can sıkıcı kısımlarından biri, “acaba sunucuda ne oluyor?” sorusuna cevap ararken terminalde boğulmak. CPU yüksek mi, disk doluyor mu, network tıkalı mı? Bunları anlık görmek yetmez, zamanla nasıl değiştiğini de izlemek gerekir. İşte tam bu noktada Telegraf devreye giriyor.

Telegraf, InfluxData tarafından geliştirilen, Go ile yazılmış açık kaynaklı bir metrik toplama ajanıdır. Tek başına pek bir anlam ifade etmez ama InfluxDB ile birleştiğinde güçlü bir izleme altyapısının temelini oluşturur. Bu yazıda Telegraf’ı sıfırdan kurarak gerçek dünya senaryolarında nasıl kullandığımı anlatacağım.

Telegraf Nedir ve Neden Kullanılır?

Telegraf’ın en güzel yanı plugin tabanlı mimarisidir. 200’den fazla input plugin’i, onlarca output plugin’i var. Sistem metriklerini toplamak istiyorsun, plugin var. MySQL sorgularını izlemek istiyorsun, plugin var. Docker container’larını takip etmek istiyorsun, yine plugin var.

Benim tercih etme sebeplerim şunlar:

  • Düşük kaynak tüketimi: Go ile yazıldığı için bellek ayak izi minimal, genellikle 50-100 MB arasında kalıyor
  • Tek binary: Bağımlılık derdi yok, indir, çalıştır, bitti
  • Zengin plugin ekosistemi: Neredeyse her şey için hazır plugin mevcut
  • InfluxDB ile mükemmel entegrasyon: Aynı ekip tarafından geliştirildiği için line protocol desteği nativ olarak geliyor

Kurulum

Ubuntu/Debian Sistemlerde Kurulum

# InfluxData GPG anahtarını ekle
curl -s https://repos.influxdata.com/influxdata-archive_compat.key | 
  gpg --dearmor | 
  sudo tee /etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg > /dev/null

# Repository ekle
echo 'deb [signed-by=/etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg] 
  https://repos.influxdata.com/debian stable main' | 
  sudo tee /etc/apt/sources.list.d/influxdata.list

# Güncelle ve kur
sudo apt-get update
sudo apt-get install telegraf -y

RHEL/CentOS/Rocky Linux’ta Kurulum

# Repository dosyasını oluştur
cat <<EOF | sudo tee /etc/yum.repos.d/influxdata.repo
[influxdata]
name = InfluxData Repository - Stable
baseurl = https://repos.influxdata.com/rhel/$releasever/$basearch/stable
enabled = 1
gpgcheck = 1
gpgkey = https://repos.influxdata.com/influxdata-archive_compat.key
EOF

sudo yum install telegraf -y

Kurulum bittikten sonra servisi başlatmadan önce konfigurasyon dosyasına bir göz atmak gerekiyor.

Temel Konfigurasyon

Telegraf’ın ana konfigurasyon dosyası /etc/telegraf/telegraf.conf altında bulunur. Bu dosya oldukça kalabalık, yüzlerce satır comment içeriyor. Yeni başlayanlar için bu biraz bunaltıcı olabiliyor.

Benim yaklaşımım şu: ana konfigurasyon dosyasını minimal tutuyorum, her servis için ayrı conf dosyaları oluşturuyorum. Telegraf /etc/telegraf/telegraf.d/ dizinindeki tüm .conf dosyalarını otomatik olarak okuyor.

Önce sıfırdan minimal bir konfigurasyon oluşturalım:

# Mevcut conf dosyasını yedekle
sudo cp /etc/telegraf/telegraf.conf /etc/telegraf/telegraf.conf.bak

# Yeni minimal konfigurasyon oluştur
sudo tee /etc/telegraf/telegraf.conf > /dev/null <<'EOF'
[global_tags]
  datacenter = "istanbul-dc1"
  environment = "production"

[agent]
  interval = "10s"
  round_interval = true
  metric_batch_size = 1000
  metric_buffer_limit = 10000
  collection_jitter = "2s"
  flush_interval = "10s"
  flush_jitter = "5s"
  precision = ""
  hostname = ""
  omit_hostname = false

[[outputs.influxdb_v2]]
  urls = ["http://localhost:8086"]
  token = "INFLUXDB_TOKEN_BURAYA"
  organization = "myorg"
  bucket = "system_metrics"

[[inputs.cpu]]
  percpu = true
  totalcpu = true
  collect_cpu_time = false
  report_active = false

[[inputs.disk]]
  ignore_fs = ["tmpfs", "devtmpfs", "devfs", "iso9660", "overlay", "aufs", "squashfs"]

[[inputs.mem]]

[[inputs.system]]
EOF

Bu minimal konfigurasyon ile CPU, disk, bellek ve sistem bilgilerini toplamaya başlayabilirsiniz.

Global Tags Kullanımı

Global tags, tüm metriklerinize otomatik olarak eklenen etiketlerdir. Birden fazla sunucu yönetiyorsanız bu çok kritik. InfluxDB’de sorgularken hangi sunucudan geldiğini, hangi ortamda çalıştığını bu etiketlerle ayırt ediyorsunuz.

Tipik bir production ortamında kullandığım global tags yapısı:

[global_tags]
  datacenter = "istanbul-dc1"
  environment = "production"
  team = "backend"
  service_tier = "critical"

Eğer bu değerleri dinamik olarak almak istiyorsanız, ortam değişkenlerini kullanabilirsiniz:

[global_tags]
  datacenter = "$DATACENTER"
  environment = "$APP_ENV"

Sonra /etc/default/telegraf dosyasına:

DATACENTER=istanbul-dc1
APP_ENV=production

Sistem Metrikleri: Detaylı Konfigurasyonlar

CPU Metrikleri

[[inputs.cpu]]
  # Her core için ayrı metrik topla
  percpu = true
  # Toplam CPU kullanımını da topla
  totalcpu = true
  # CPU zamanlarını topla (user, system, idle vb.)
  collect_cpu_time = false
  # Aktif CPU yüzdesini raporla
  report_active = true
  # Bu tagları metriğe ekle
  [inputs.cpu.tags]
    cpu_type = "physical"

Disk ve Disk I/O Metrikleri

Disk metriklerinde iki ayrı plugin kullanıyorum: disk (kullanım istatistikleri) ve diskio (okuma/yazma istatistikleri).

[[inputs.disk]]
  # Bu filesystem türlerini izleme
  ignore_fs = ["tmpfs", "devtmpfs", "devfs", "iso9660", "overlay", "aufs", "squashfs"]
  # Mount point'leri filtrele
  mount_points = ["/", "/data", "/var/log"]

[[inputs.diskio]]
  # Belirli diskleri izle (boş bırakırsan tümünü izler)
  devices = ["sda", "sdb", "nvme0n1"]
  # Device etiketlerini ekle
  device_tags = ["ID_FS_TYPE", "ID_FS_USAGE"]
  # iostat tarzı istatistikler için
  skip_serial_number = false

Network Metrikleri

[[inputs.net]]
  # Belirli interface'leri izle
  interfaces = ["eth0", "ens3", "bond0"]
  # DNS lookup'ları takip et
  ignore_protocol_stats = false

[[inputs.netstat]]
  # Aktif bağlantı sayılarını takip eder

Process ve Sistem Yükü

[[inputs.system]]
  # uptime, load1, load5, load15 gibi metrikleri toplar

[[inputs.processes]]
  # process durumlarını sayar (running, sleeping, zombie vs.)

[[inputs.kernel]]
  # kernel istatistikleri: context switch, interrupts vb.

Gerçek Dünya Senaryosu: MySQL Sunucusu İzleme

Diyelim ki bir MySQL sunucusu yönetiyorsunuz ve sadece sistem metriklerini değil, veritabanı metriklerini de toplamak istiyorsunuz. Bunun için /etc/telegraf/telegraf.d/mysql.conf dosyası oluşturuyorum:

[[inputs.mysql]]
  servers = ["telegraf_user:guclu_sifre@tcp(127.0.0.1:3306)/"]
  
  # Temel istatistikler
  metric_version = 2
  
  # Hangi metrikleri topla
  gather_global_status = true
  gather_global_variables = true
  gather_slave_status = true
  gather_binary_logs = false
  gather_table_io_waits = false
  gather_table_lock_waits = true
  gather_index_io_waits = false
  gather_event_waits = false
  gather_file_events_stats = false
  gather_perf_events_statements = false
  
  # Interval'ı özelleştir
  interval = "30s"
  
  [inputs.mysql.tags]
    db_role = "master"
    db_cluster = "web-cluster-01"

MySQL tarafında Telegraf için minimal yetkili bir kullanıcı oluşturmanız gerekiyor:

CREATE USER 'telegraf_user'@'localhost' IDENTIFIED BY 'guclu_sifre';
GRANT REPLICATION CLIENT ON *.* TO 'telegraf_user'@'localhost';
GRANT PROCESS ON *.* TO 'telegraf_user'@'localhost';
GRANT SELECT ON performance_schema.* TO 'telegraf_user'@'localhost';
FLUSH PRIVILEGES;

Docker Container Metrikleri Toplama

Modern altyapılarda Docker container izleme kaçınılmaz. Telegraf’ın Docker plugin’i bu işi güzel yapıyor:

[[inputs.docker]]
  # Docker socket'i
  endpoint = "unix:///var/run/docker.sock"
  
  # Container başına metrik topla
  gather_services = false
  
  # Sadece çalışan container'ları izle
  container_state_include = ["running"]
  
  # Label'lardan tag oluştur
  docker_label_include = ["com.docker.compose.service", "com.docker.compose.project"]
  
  # Timeout
  timeout = "5s"
  
  # Toplam ve per-container metrikler
  total = true
  total_include = ["cpu", "blkio", "net"]

Telegraf’ın Docker socket’ine erişebilmesi için kullanıcısını docker grubuna eklemek gerekiyor:

sudo usermod -aG docker telegraf
sudo systemctl restart telegraf

Log Tabanlı Metrik Toplama

Bu senaryo çok işe yarıyor: Nginx access log’larından istek sayısı, response time gibi metrikleri çekme. /etc/telegraf/telegraf.d/nginx_logs.conf:

[[inputs.logparser]]
  files = ["/var/log/nginx/access.log"]
  from_beginning = false
  
  [inputs.logparser.grok]
    patterns = ['%{COMBINED_LOG_FORMAT}']
    measurement = "nginx_access_log"
    timezone = "Europe/Istanbul"
    
[[inputs.nginx]]
  # Nginx stub status modülü gerektirir
  urls = ["http://localhost/nginx_status"]
  response_timeout = "5s"

Nginx tarafında stub_status modülünü aktif etmek için:

server {
    listen 127.0.0.1:80;
    location /nginx_status {
        stub_status on;
        allow 127.0.0.1;
        deny all;
    }
}

Telegraf’ı Test Etme ve Debug

Konfigurasyon değişikliklerinden sonra Telegraf’ı test etmek çok önemli. Servisi yeniden başlatmadan önce şu komutla syntax kontrolü yapıyorum:

# Konfigurasyon syntax kontrolü
telegraf --config /etc/telegraf/telegraf.conf --test

# Belirli bir plugin'i test et
telegraf --config /etc/telegraf/telegraf.conf 
  --input-filter cpu 
  --test

# Debug modunda çalıştır
telegraf --config /etc/telegraf/telegraf.conf 
  --debug 
  --test 2>&1 | head -100

--test flag’i metriklerini stdout’a yazıyor, InfluxDB’ye göndermiyor. Bu sayede neyin toplandığını görebilirsiniz.

Üretilen metriklerin formatını görmek için:

# Belirli bir measurement'ı filtrele
telegraf --config /etc/telegraf/telegraf.conf 
  --input-filter disk 
  --test | grep -v "^#"

Servis Yönetimi ve Log Takibi

# Servisi başlat
sudo systemctl start telegraf

# Sistem başlangıcında otomatik başlaması için
sudo systemctl enable telegraf

# Servis durumunu kontrol et
sudo systemctl status telegraf

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

# Son 100 satır log
sudo journalctl -u telegraf -n 100 --no-pager

Telegraf’ta en sık karşılaştığım sorunlar:

  • InfluxDB bağlantı hatası: Token veya URL yanlış. journalctl -u telegraf ile bakın.
  • Permission denied: Disk veya Docker socket’e erişim sorunu. Kullanıcı gruplarını kontrol edin.
  • Metrik buffer dolu: metric_buffer_limit değerini artırın veya flush interval’ı düşürün.

Çoklu Output Konfigurasyonu

Bazı durumlarda aynı metriklerini hem InfluxDB’ye hem de başka bir sisteme göndermek isteyebilirsiniz. Telegraf bunu destekliyor:

# InfluxDB 2.x'e gönder
[[outputs.influxdb_v2]]
  urls = ["http://influxdb-primary:8086"]
  token = "PRIMARY_TOKEN"
  organization = "myorg"
  bucket = "system_metrics"

# Yedek InfluxDB'ye de gönder
[[outputs.influxdb_v2]]
  urls = ["http://influxdb-backup:8086"]
  token = "BACKUP_TOKEN"
  organization = "myorg"
  bucket = "system_metrics_backup"
  # Sadece kritik metrikleri gönder
  [outputs.influxdb_v2.tagpass]
    service_tier = ["critical"]

tagpass ve tagdrop direktifleri ile hangi metriklerın hangi output’a gideceğini kontrol edebilirsiniz. Bu özellik özellikle maliyeti kontrol altında tutmak için çok işe yarıyor.

Processor Plugin’leri ile Metrik Dönüştürme

Bazen toplanan ham metriği olduğu gibi göndermek istemezsiniz. Processor plugin’leri bu iş için var:

# Metrik adını değiştir
[[processors.rename]]
  [[processors.rename.replace]]
    measurement = "cpu"
    dest = "cpu_metrics"

# Gereksiz field'ları sil
[[processors.fieldpass]]
  fields = ["usage_user", "usage_system", "usage_idle"]
  namepass = ["cpu"]

# Tag ekle veya değiştir
[[processors.strings]]
  [[processors.strings.uppercase]]
    field = "datacenter"

Aggregator Plugin’leri

Her 10 saniyede bir veri göndermek yerine, 1 dakikalık ortalama almak istiyorsanız aggregator plugin’leri kullanın. Bu hem storage’ı hem de network bandwıdth’ını düşürür:

[[aggregators.basicstats]]
  period = "60s"
  drop_original = true
  stats = ["mean", "min", "max", "stdev"]
  namepass = ["cpu", "mem"]

[[aggregators.minmax]]
  period = "60s"
  drop_original = false
  namepass = ["disk"]

drop_original = true yaparsanız, ham metrikler InfluxDB’ye gitmez, sadece aggregate edilmiş değerler gider.

Performans Tuning

Yoğun bir sunucuda Telegraf’ın kendisi kaynak tüketmeye başlayabilir. Birkaç ipucu:

Interval’ı artırın: Her şeyi 10 saniyede toplamak zorunda değilsiniz. Disk kullanımı için 60 saniye yeterli.

[[inputs.disk]]
  interval = "60s"

[[inputs.cpu]]
  interval = "10s"

Batch size’ı optimize edin: Ağ gecikmesi yüksekse, batch size’ı artırmak toplam HTTP isteği sayısını düşürür.

[agent]
  metric_batch_size = 5000
  metric_buffer_limit = 50000

Gereksiz field’ları filtrele: Topladığınız her field storage ve query maliyeti demek.

[[inputs.cpu]]
  fieldpass = ["usage_user", "usage_system", "usage_idle", "usage_iowait"]

Telegraf ile Özel Script Çalıştırma

Bazen mevcut plugin’ler yeterli olmuyor. Kendi script’inizi çalıştırıp çıktısını Telegraf’a besleyebilirsiniz:

[[inputs.exec]]
  commands = ["/usr/local/bin/custom_metric_collector.sh"]
  timeout = "10s"
  data_format = "influx"
  interval = "30s"

Script’in çıktısı InfluxDB line protocol formatında olmalı:

#!/bin/bash
# /usr/local/bin/custom_metric_collector.sh

# Aktif kullanıcı sayısını say
USER_COUNT=$(who | wc -l)

# Açık dosya sayısını al
OPEN_FILES=$(lsof | wc -l)

# Line protocol formatında çıktı
echo "custom_system_metrics active_users=${USER_COUNT}i,open_files=${OPEN_FILES}i"

Sonuç

Telegraf, sistem izleme altyapısının sessiz kahramanıdır. Doğru konfigüre edildiğinde aylarca sorunsuz çalışır, güncellenmesi kolaydır ve yeni servisler eklendikçe hızla adapte edilebilir.

Benim production ortamlarımda standart haline gelen yaklaşım şu: global_tags ile sunucu kimliğini sabitle, sistem metriklerini ana conf’ta tut, her uygulama için telegraf.d/ altında ayrı dosya oluştur. Bu şekilde konfigurasyon yönetimi Ansible veya Chef ile kolayca otomatize edilebiliyor.

Başlamak için en iyi yol basit bir kurulum yapıp --test flag’i ile ne toplandığını görmek. Sonra Grafana’ya bağlayıp ilk dashboard’ı oluşturduğunuzda, saatler önceki “acaba ne oluyor?” sorusuna artık cevabınız olduğunu göreceksiniz.

Bir sonraki yazıda InfluxDB’de bu verileri sorgulayıp Grafana ile görselleştirmeyi ele alacağım.

Bir yanıt yazın

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