Prometheus Kurulumu ve Temel Yapılandırma
Sunucu izleme konusunda bir noktaya gelirsiniz: logları tek tek incelemek, top komutu açık tutmak ve “bir şeyler ters gidiyor” hissini yaşamak artık yetmez hale gelir. İşte tam o noktada Prometheus devreye giriyor. Açık kaynaklı bu monitoring sistemi, özellikle mikroservis mimarileri ve containerized ortamlar için neredeyse endüstri standardı haline geldi. Bu yazıda Prometheus’u sıfırdan kurarak gerçek dünya senaryolarına göre yapılandıracağız.
Prometheus Nedir ve Neden Kullanmalısınız
Prometheus, SoundCloud tarafından 2012’de geliştirilen ve 2016’da CNCF (Cloud Native Computing Foundation) bünyesine giren bir monitoring ve alerting sistemidir. Temel felsefesi şu: metrikler sisteminizden çekilir (pull model), zaman serisi olarak depolanır ve PromQL adı verilen güçlü bir sorgu diliyle analiz edilir.
Pull model yaklaşımı sayesinde hangi sistemin izleneceği merkezi olarak yönetilir. Push modeline göre daha güvenli ve kontrol edilebilir bir mimari sunar. Bir servis çöktüğünde “metrik gelmiyor” durumu bile bir uyarı tetikleyebilir.
Prometheus’un öne çıkan özellikleri:
- Çok boyutlu veri modeli: Her metrik, key-value çiftleri şeklinde etiketlerle zenginleştirilir
- PromQL: Güçlü ve esnek bir sorgu dili
- Servis keşfi: Kubernetes, Consul, DNS gibi sistemlerle entegrasyon
- Alertmanager: Gelişmiş uyarı yönetimi ve yönlendirme
- Uzun vadeli depolama: Thanos veya Cortex gibi çözümlerle ölçeklendirilebilir
Kurulum Öncesi Hazırlık
Kuruluma geçmeden önce ortamımızı hazırlayalım. Bu yazıda Ubuntu 22.04 LTS üzerinde çalışacağız ama adımların büyük çoğunluğu diğer dağıtımlarda da aynı.
Öncelikle sistemi güncelleyelim ve gerekli bağımlılıkları yükleyelim:
sudo apt update && sudo apt upgrade -y
sudo apt install -y wget curl tar htop
Prometheus’u sistem kullanıcısı olarak çalıştırmak güvenlik açısından kritik. prometheus adında bir kullanıcı ve grup oluşturuyoruz:
sudo groupadd --system prometheus
sudo useradd --system --no-create-home --shell /bin/false
--gid prometheus prometheus
--no-create-home ve --shell /bin/false parametrelerine dikkat edin. Bu kullanıcının sisteme login yapamamasını garantiliyoruz. Üretim ortamında minimum yetki prensibi (principle of least privilege) ihmal edilmemeli.
Prometheus’un ihtiyaç duyacağı dizinleri oluşturalım:
sudo mkdir -p /etc/prometheus
sudo mkdir -p /var/lib/prometheus
sudo chown prometheus:prometheus /etc/prometheus
sudo chown prometheus:prometheus /var/lib/prometheus
Prometheus Binary Kurulumu
Prometheus’u paket yöneticisi yerine doğrudan binary olarak kurmayı tercih ediyorum. Böylece versiyon kontrolü tamamen bizde olur. Güncel versiyonu Prometheus GitHub sayfasından kontrol edin; bu yazı yazılırken 2.48.x stabil sürümdü.
cd /tmp
PROMETHEUS_VERSION="2.48.1"
wget https://github.com/prometheus/prometheus/releases/download/v${PROMETHEUS_VERSION}/prometheus-${PROMETHEUS_VERSION}.linux-amd64.tar.gz
tar -xzf prometheus-${PROMETHEUS_VERSION}.linux-amd64.tar.gz
cd prometheus-${PROMETHEUS_VERSION}.linux-amd64
İndirdiğimiz paketin içeriğini yerleştiriyoruz:
sudo cp prometheus promtool /usr/local/bin/
sudo cp -r consoles/ console_libraries/ /etc/prometheus/
sudo cp prometheus.yml /etc/prometheus/prometheus.yml
sudo chown prometheus:prometheus /usr/local/bin/prometheus
sudo chown prometheus:prometheus /usr/local/bin/promtool
sudo chown -R prometheus:prometheus /etc/prometheus/consoles
sudo chown -R prometheus:prometheus /etc/prometheus/console_libraries
Kurulumu doğrulayalım:
prometheus --version
promtool --version
promtool özellikle değerli bir araç. Yapılandırma dosyalarını ve alerting kurallarını production’a almadan önce doğrulamak için kullanacağız.
Temel Yapılandırma Dosyası
Prometheus’un kalbi olan prometheus.yml dosyasını düzenleyelim. Varsayılan dosya iyi bir başlangıç noktası ama gerçek dünya için biraz daha detaylı bir yapılandırma gerekiyor:
sudo nano /etc/prometheus/prometheus.yml
Aşağıdaki yapılandırmayı kullanabilirsiniz:
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_timeout: 10s
external_labels:
monitor: 'production-cluster'
environment: 'prod'
alerting:
alertmanagers:
- static_configs:
- targets:
# Alertmanager kurulduğunda buraya eklenecek
# - alertmanager:9093
rule_files:
- "/etc/prometheus/rules/*.yml"
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
metrics_path: '/metrics'
scheme: 'http'
- job_name: 'node-exporter'
static_configs:
- targets:
- 'localhost:9100'
- '192.168.1.10:9100'
- '192.168.1.11:9100'
relabel_configs:
- source_labels: [__address__]
regex: '([^:]+):.*'
target_label: instance
replacement: '${1}'
Bu yapılandırmadaki önemli parametreler:
- scrape_interval: Her hedeften kaç saniyede bir metrik çekileceği. 15 saniye çoğu senaryo için idealdir. Çok düşük değer hem Prometheus’u hem hedef sistemi yorar.
- evaluation_interval: Alerting kurallarının kaç saniyede bir değerlendirileceği.
- scrape_timeout: Bir hedeften metrik çekilirken ne kadar bekleneceği. Bu değer scrape_interval’dan küçük olmalı.
- external_labels: Tüm metriklere otomatik eklenen etiketler. Birden fazla Prometheus instance’ı varsa kritik önem taşır.
Yapılandırmayı doğrulayalım:
promtool check config /etc/prometheus/prometheus.yml
Hatasız çıktı şöyle görünmeli: SUCCESS: /etc/prometheus/prometheus.yml is valid prometheus config file syntax
Systemd Servis Dosyası Oluşturma
Prometheus’u sistem servisi olarak çalıştırmak için bir systemd unit file oluşturuyoruz:
sudo nano /etc/systemd/system/prometheus.service
[Unit]
Description=Prometheus Monitoring System
Documentation=https://prometheus.io/docs/introduction/overview/
Wants=network-online.target
After=network-online.target
[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart=/usr/local/bin/prometheus
--config.file=/etc/prometheus/prometheus.yml
--storage.tsdb.path=/var/lib/prometheus/
--storage.tsdb.retention.time=30d
--storage.tsdb.retention.size=10GB
--web.console.libraries=/etc/prometheus/console_libraries
--web.console.templates=/etc/prometheus/consoles
--web.listen-address=0.0.0.0:9090
--web.enable-lifecycle
--log.level=info
Restart=on-failure
RestartSec=5s
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
Servis parametrelerinin açıklamaları:
- –storage.tsdb.retention.time=30d: Verileri 30 gün sakla. Disk durumunuza göre ayarlayın.
- –storage.tsdb.retention.size=10GB: Maksimum 10GB disk kullan. İki kural birlikte çalışır, hangisi önce tetiklenirse eskiler silinir.
- –web.enable-lifecycle: HTTP üzerinden reload ve shutdown imkanı sağlar.
curl -X POST http://localhost:9090/-/reloadile yapılandırmayı servis yeniden başlatmadan yükleyebilirsiniz. - LimitNOFILE=65536: Açık dosya limiti. Yoğun ortamlarda önemli.
Servisi aktif edelim:
sudo systemctl daemon-reload
sudo systemctl start prometheus
sudo systemctl enable prometheus
sudo systemctl status prometheus
Tarayıcınızdan http://sunucu-ip:9090 adresine gidin. Prometheus web arayüzünü görmelisiniz. Expression browser’da up yazarak aktif hedefleri kontrol edebilirsiniz.
Node Exporter Kurulumu
Prometheus tek başına sadece kendi metriklerini toplar. Sunucu kaynaklarını (CPU, RAM, disk, network) izlemek için Node Exporter şart. Üretim ortamında izlemek istediğiniz her sunucuya Node Exporter kurmalısınız.
cd /tmp
NODE_EXPORTER_VERSION="1.7.0"
wget https://github.com/prometheus/node_exporter/releases/download/v${NODE_EXPORTER_VERSION}/node_exporter-${NODE_EXPORTER_VERSION}.linux-amd64.tar.gz
tar -xzf node_exporter-${NODE_EXPORTER_VERSION}.linux-amd64.tar.gz
sudo cp node_exporter-${NODE_EXPORTER_VERSION}.linux-amd64/node_exporter /usr/local/bin/
sudo useradd --system --no-create-home --shell /bin/false node_exporter
Node Exporter için systemd servisi:
sudo nano /etc/systemd/system/node_exporter.service
[Unit]
Description=Node Exporter
Documentation=https://prometheus.io/docs/guides/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.filesystem.mount-points-exclude='^/(sys|proc|dev|host|etc)($$|/)'
--collector.systemd
--web.listen-address=:9100
Restart=on-failure
RestartSec=5s
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl start node_exporter
sudo systemctl enable node_exporter
Node Exporter çalıştıktan sonra http://sunucu-ip:9100/metrics adresine gidin. Yüzlerce metrik göreceksiniz. Bu sayfalarda gezinmek başlangıçta ezici gelebilir ama zamanla hangi metriklerin ne anlama geldiğini öğreniyorsunuz.
Güvenlik Yapılandırması
Prometheus ve Node Exporter varsayılan olarak herhangi bir kimlik doğrulaması yapmaz. Üretim ortamında bu kabul edilemez. En azından şu önlemleri alın.
Güvenlik duvarı yapılandırması. Prometheus portunuzu (9090) ve Node Exporter portunuzu (9100) sadece yetkili IP adreslerine açın:
sudo ufw allow from 192.168.1.0/24 to any port 9090
sudo ufw allow from 192.168.1.0/24 to any port 9100
sudo ufw deny 9090
sudo ufw deny 9100
Nginx reverse proxy ile TLS. Prometheus arayüzüne HTTPS üzerinden erişmek için Nginx kullanabilirsiniz:
sudo apt install -y nginx apache2-utils
sudo htpasswd -c /etc/nginx/.htpasswd prometheus_admin
server {
listen 443 ssl;
server_name prometheus.sirketiniz.com;
ssl_certificate /etc/letsencrypt/live/prometheus.sirketiniz.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/prometheus.sirketiniz.com/privkey.pem;
location / {
auth_basic "Prometheus";
auth_basic_user_file /etc/nginx/.htpasswd;
proxy_pass http://localhost:9090;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
Alerting Kuralları Oluşturma
Metrik toplamak güzel ama asıl değer, sorunları erkenden fark etmektir. Temel alerting kuralları için bir dosya oluşturalım:
sudo mkdir -p /etc/prometheus/rules
sudo nano /etc/prometheus/rules/node_alerts.yml
groups:
- name: node_alerts
interval: 30s
rules:
- alert: HighCPUUsage
expr: 100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
for: 5m
labels:
severity: warning
annotations:
summary: "Yüksek CPU kullanımı: {{ $labels.instance }}"
description: "{{ $labels.instance }} üzerinde CPU kullanımı son 5 dakikadır %{{ $value | humanize }} seviyesinde."
- alert: CriticalCPUUsage
expr: 100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 95
for: 2m
labels:
severity: critical
annotations:
summary: "Kritik CPU kullanımı: {{ $labels.instance }}"
description: "ACIL: {{ $labels.instance }} üzerinde CPU kullanımı %{{ $value | humanize }}."
- alert: LowDiskSpace
expr: (node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"}) * 100 < 15
for: 5m
labels:
severity: warning
annotations:
summary: "Düşük disk alanı: {{ $labels.instance }}"
description: "{{ $labels.instance }} kök dosya sisteminde sadece %{{ $value | humanize }} boş alan kaldı."
- alert: HighMemoryUsage
expr: (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100 > 85
for: 10m
labels:
severity: warning
annotations:
summary: "Yüksek bellek kullanımı: {{ $labels.instance }}"
description: "{{ $labels.instance }} üzerinde bellek kullanımı %{{ $value | humanize }}."
- alert: NodeDown
expr: up{job="node-exporter"} == 0
for: 1m
labels:
severity: critical
annotations:
summary: "Sunucu erişilemiyor: {{ $labels.instance }}"
description: "{{ $labels.instance }} 1 dakikadır erişilemiyor. Acil müdahale gerekebilir."
Kuralları doğrulayın ve Prometheus’u yeniden yükleyin:
promtool check rules /etc/prometheus/rules/node_alerts.yml
curl -X POST http://localhost:9090/-/reload
PromQL ile Temel Sorgular
Prometheus web arayüzünde Expression browser üzerinden bazı temel sorgular çalıştıralım. Bu sorgular Grafana dashboard’ları oluştururken de kullanacaksınız.
# CPU kullanım yüzdesi (tüm instance'lar)
100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
# Kullanılabilir bellek GB cinsinden
node_memory_MemAvailable_bytes / 1024 / 1024 / 1024
# Disk kullanım yüzdesi
100 - ((node_filesystem_avail_bytes{mountpoint="/"} * 100) / node_filesystem_size_bytes{mountpoint="/"})
# Network trafiği (bytes/saniye, son 5 dakika ortalaması)
irate(node_network_receive_bytes_total{device!="lo"}[5m])
# 1 dakikadaki load average
node_load1
# Uptime
(node_boot_time_seconds - time()) * -1
Bu sorgular gerçek dünyada ne işe yarar? Bir müşteri “site yavaşladı” dediğinde ilk 30 saniye içinde CPU, bellek, disk ve network metriklerini yan yana görüp bottleneck’i tespit edebilirsiniz. Bunu loglarla yapmaya kalkarsanız saatler geçer.
Çoklu Sunucu Ortamı için Yapılandırma
Gerçek dünyada tek sunucu izlemiyorsunuz. 20-30 sunucudan oluşan bir ortamda static config yerine file-based service discovery kullanmak daha yönetilebilir:
sudo nano /etc/prometheus/targets/nodes.json
[
{
"targets": ["web01.sirket.local:9100", "web02.sirket.local:9100"],
"labels": {
"group": "web",
"environment": "production"
}
},
{
"targets": ["db01.sirket.local:9100", "db02.sirket.local:9100"],
"labels": {
"group": "database",
"environment": "production"
}
},
{
"targets": ["staging01.sirket.local:9100"],
"labels": {
"group": "web",
"environment": "staging"
}
}
]
prometheus.yml içinde bu dosyayı kullanalım:
scrape_configs:
- job_name: 'node-exporter'
file_sd_configs:
- files:
- '/etc/prometheus/targets/*.json'
refresh_interval: 30s
Bu yaklaşımın güzelliği şu: yeni sunucu eklediğinizde sadece JSON dosyasını güncelliyorsunuz. Prometheus servisini yeniden başlatmaya gerek yok, 30 saniye içinde yeni hedefi otomatik keşfediyor.
Performans ve Depolama Optimizasyonu
Yoğun ortamlarda Prometheus’un kaynak tüketimi ciddi boyutlara ulaşabilir. Birkaç pratik öneri:
Bellek kullanımı. Prometheus varsayılan olarak mevcut RAM’in yaklaşık %25’ini kullanır. Bunu kontrol etmek için:
# Mevcut chunk'ları ve bellek kullanımını izleyin
curl -s http://localhost:9090/api/v1/query?query=process_resident_memory_bytes | python3 -m json.tool
TSDB (Time Series Database) optimizasyonu. Çok fazla unique label kombinasyonu “high cardinality” sorununa yol açar. Örneğin her HTTP isteği için benzersiz user_id etiketi eklemek, Prometheus’u öldürür. Etiket tasarımına dikkat edin.
WAL (Write-Ahead Log) boyutunu izleyin:
du -sh /var/lib/prometheus/wal/
du -sh /var/lib/prometheus/
Disk kullanımı beklenenden hızlı büyüyorsa scrape_interval’ı artırmayı veya gereksiz metrikleri filtrelemeyi düşünün.
Sorun Giderme
Kurulum sonrasında sık karşılaşılan sorunlar ve çözümleri:
Hedef “DOWN” görünüyor. İlk kontrol noktanız Prometheus web arayüzündeki Status > Targets sayfası. Hata mesajını okuyun. Genellikle:
- Bağlantı reddedildi: Node Exporter çalışmıyor veya firewall bloklıyor
- Bağlantı zaman aşımı: Ağ sorunu veya scrape_timeout çok düşük
- Kimlik doğrulama hatası: TLS veya basic auth yapılandırma yanlışlığı
Prometheus çok fazla bellek tüketiyor. Aktif zaman serisi sayısını kontrol edin:
curl -s 'http://localhost:9090/api/v1/query?query=prometheus_tsdb_head_series' | grep -o '"value":[.*]'
1 milyonun üzerinde aktif seri varsa cardinality sorununu araştırın.
Yapılandırma reload çalışmıyor. --web.enable-lifecycle flag’inin eklendiğinden emin olun:
curl -v -X POST http://localhost:9090/-/reload
Sonuç
Prometheus kurulumu ilk bakışta karmaşık görünse de aslında oldukça sistematik bir süreç. Binary kurulum, sistem kullanıcısı, systemd servisi ve temel yapılandırma adımlarını tamamladıktan sonra ortamınızı izlemeye hazır bir sisteme sahipsiniz.
Bu yazıda ele aldığımız konular, Prometheus’un %80’lik kullanım senaryosunu kapsıyor. Node Exporter metrikleri, temel alerting kuralları ve file-based service discovery ile küçük-orta ölçekli ortamları rahatça yönetebilirsiniz.
Sonraki adım olarak Alertmanager kurarak uyarıları e-posta, Slack veya PagerDuty’ye yönlendirmeyi ve Grafana ile görsel dashboard’lar oluşturmayı inceleyeceğiz. Prometheus’u Grafana ile birleştirdiğinizde, o “bir şeyler ters gidiyor” hissi yerini “tam olarak ne olduğunu biliyorum” güvenine bırakıyor.
Sorularınızı ve karşılaştığınız sorunları yorumlarda paylaşabilirsiniz. Özellikle yüksek cardinality sorunları ve Kubernetes entegrasyonu konularında okuyucu talepleri olursa ayrı yazılar hazırlayabiliriz.
