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 telegrafile bakın. - Permission denied: Disk veya Docker socket’e erişim sorunu. Kullanıcı gruplarını kontrol edin.
- Metrik buffer dolu:
metric_buffer_limitdeğ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.
