Heartbeat ile Uptime İzleme ve Alarm Kurulumu

Prod ortamda bir servis sessiz sedasız çöküp saatlerce kimsenin haberi olmadan çalışmadan durmuşsa, o acıyı bilirsiniz. Monitoring stack’in güzel dashboardları var, metrikler akıyor, loglar geliyor; ama o kritik endpoint bir türlü kontrol edilmiyor. İşte Elastic Stack’in Heartbeat bileşeni tam da bu boşluğu dolduruyor. Pasif log analizinin ötesine geçip aktif olarak “bu servis ayakta mı, cevap veriyor mu?” sorusunu sormak için tasarlanmış bir araç.

Bu yazıda Heartbeat’i sıfırdan kurup yapılandıracağız, gerçek dünya senaryolarında nasıl kullanıldığını göreceğiz ve Kibana üzerinde anlamlı alarmlar nasıl kurulur onu konuşacağız.

Heartbeat Nedir, Neden Kullanmalısınız?

Metricbeat sunucunuzun CPU ve RAM’ini izler. Filebeat loglarınızı toplar. Heartbeat ise dışarıdan bir göz gibi davranır: belirli aralıklarla hedef servislere istek atar ve cevap alıp almadığını, ne kadar sürede cevap geldiğini, SSL sertifikasının geçerli olup olmadığını kayıt altına alır.

Bunu neden önemsiyoruz? Çünkü bir servis “çalışıyor” görünebilir ama gerçekte cevap vermiyor olabilir. Nginx process’i ayaktadır, container running durumundadır, ama uygulama içindeki bir deadlock yüzünden hiçbir isteğe yanıt gelmemektedir. Heartbeat bu farkı yakalar.

Desteklediği protokoller:

  • ICMP: Basit ping kontrolü, host erişilebilirliği
  • TCP: Port bazlı kontrol, veritabanı portları, özel protokoller
  • HTTP/HTTPS: Web servisleri, REST API’ler, health endpoint’leri

Kurulum

Ubuntu/Debian üzerinde kurulum yapalım önce:

# Elastic GPG key ekle
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

# Repository ekle
echo "deb https://artifacts.elastic.co/packages/8.x/apt stable main" | 
  sudo tee /etc/apt/sources.list.d/elastic-8.x.list

# Kur
sudo apt-get update && sudo apt-get install heartbeat-elastic

# Servis olarak etkinleştir
sudo systemctl enable heartbeat-elastic

RPM tabanlı sistemler 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

# Kur
sudo yum install heartbeat-elastic -y
sudo systemctl enable heartbeat-elastic

Ana Konfigürasyon Dosyası

/etc/heartbeat/heartbeat.yml dosyası her şeyin başladığı yer. Temel yapıya bakalım:

# heartbeat.yml

heartbeat.config.monitors:
  path: ${path.config}/monitors.d/*.yml
  reload.enabled: true
  reload.period: 5s

# Elasticsearch bağlantısı
output.elasticsearch:
  hosts: ["https://elasticsearch:9200"]
  username: "heartbeat_writer"
  password: "${HEARTBEAT_ES_PASS}"
  ssl.certificate_authorities: ["/etc/heartbeat/certs/ca.crt"]

# Kibana için setup
setup.kibana:
  host: "https://kibana:5601"
  username: "elastic"
  password: "${KIBANA_PASS}"

# İndeks adlandırması
setup.template.name: "heartbeat"
setup.template.pattern: "heartbeat-*"
setup.ilm.rollover_alias: "heartbeat"

Burada dikkat etmeniz gereken nokta: Heartbeat’i Elasticsearch’e doğrudan yazmak yerine Logstash üzerinden geçirmek de mümkün. Büyük ortamlarda bu yaklaşım daha mantıklı çünkü merkezi bir pipeline yönetimi sağlıyor.

Monitor Tanımları

Gerçek iş burada başlıyor. /etc/heartbeat/monitors.d/ altında YAML dosyaları oluşturarak farklı servis tiplerini izleyebilirsiniz.

HTTP Monitor

# /etc/heartbeat/monitors.d/web-services.yml

- type: http
  id: ecommerce-api
  name: "E-ticaret API"
  schedule: "@every 30s"
  hosts:
    - "https://api.sirket.com.tr/health"
    - "https://api-dr.sirket.com.tr/health"
  check.response:
    status: [200]
    body:
      - '"status":"healthy"'
  timeout: 10s
  ssl.verification_mode: full

- type: http
  id: payment-gateway
  name: "Ödeme Sistemi"
  schedule: "@every 10s"
  hosts: ["https://odeme.sirket.com.tr/ping"]
  check.response:
    status: [200, 204]
  timeout: 5s
  tags: ["critical", "payment"]

- type: http
  id: internal-dashboard
  name: "İç Dashboard"
  schedule: "@every 60s"
  hosts: ["http://192.168.10.50:3000/api/health"]
  username: "monitor_user"
  password: "${DASHBOARD_MONITOR_PASS}"
  check.response:
    status: [200]

check.response.body alanı çok değerli: sadece 200 dönüyor mu diye değil, dönen içerikte beklediğiniz bir string var mı diye de kontrol edebilirsiniz. Uygulamanız 200 döndürüp içinde "status":"degraded" yazıyor olabilir, bu farkı da yakalamak isteyebilirsiniz.

TCP Monitor

Veritabanı portları ve diğer TCP servisleri için:

# /etc/heartbeat/monitors.d/infrastructure.yml

- type: tcp
  id: postgresql-primary
  name: "PostgreSQL Primary"
  schedule: "@every 15s"
  hosts:
    - "db-primary.internal:5432"
  timeout: 3s
  tags: ["database", "postgresql"]

- type: tcp
  id: redis-cluster
  name: "Redis Cluster"
  schedule: "@every 15s"
  hosts:
    - "redis-01.internal:6379"
    - "redis-02.internal:6379"
    - "redis-03.internal:6379"
  timeout: 2s
  tags: ["cache", "redis"]

- type: tcp
  id: rabbitmq-amqp
  name: "RabbitMQ AMQP Port"
  schedule: "@every 30s"
  hosts: ["rabbitmq.internal:5672"]
  timeout: 5s

ICMP Monitor

Network segmentleri arası erişilebilirliği test etmek için:

# /etc/heartbeat/monitors.d/network.yml

- type: icmp
  id: core-network-devices
  name: "Ağ Cihazları Ping"
  schedule: "@every 30s"
  hosts:
    - "192.168.1.1"
    - "192.168.1.2"
    - "10.0.0.1"
  timeout: 5s
  wait: 1s
  tags: ["network", "infrastructure"]

ICMP monitörler için Heartbeat’in root ya da özel capability ile çalışması gerekebilir. Linux’ta şunu kontrol edin:

# Heartbeat process'ine ICMP için gerekli capability ver
sudo setcap cap_net_raw+eip /usr/share/heartbeat/heartbeat

# Ya da systemd override ile
sudo systemctl edit heartbeat-elastic
# [Service]
# AmbientCapabilities=CAP_NET_RAW

SSL Sertifika İzleme

Heartbeat’in en sevdiğim özelliklerinden biri SSL sertifika takibi. Sertifika süresi dolmadan uyarı almak için ekstra bir araç gerekmez:

- type: http
  id: ssl-certificate-monitor
  name: "SSL Sertifika Kontrolü"
  schedule: "@every 12h"
  hosts:
    - "https://www.sirket.com.tr"
    - "https://api.sirket.com.tr"
    - "https://panel.sirket.com.tr"
  check.response:
    status: [200, 301, 302]
  ssl.verification_mode: full
  timeout: 10s
  tags: ["ssl", "certificate"]

Kibana’da tls.certificate_not_valid_after alanını kullanarak sertifika bitiş tarihine göre alarm oluşturabilirsiniz. 30 gün, 14 gün ve 7 gün öncesinde farklı severity seviyelerinde uyarı almak iyi bir pratik.

Kibana’da Uptime Uygulaması

Heartbeat verilerini görselleştirmek için Kibana’nın yerleşik Uptime uygulaması var. Önce index pattern’ı oluşturmanız gerekiyor:

# Heartbeat index template'ini Elasticsearch'e yükle
heartbeat setup --index-management -E output.logstash.enabled=false 
  -E 'output.elasticsearch.hosts=["https://elasticsearch:9200"]' 
  -E 'output.elasticsearch.username=elastic' 
  -E "output.elasticsearch.password=${ELASTIC_PASS}" 
  -E 'output.elasticsearch.ssl.certificate_authorities=["/etc/heartbeat/certs/ca.crt"]'

Kibana Uptime bölümünde (/app/uptime) monitor’larınızı göreceksiniz. Buradan her monitor için:

  • Availability: Son 24 saat, 7 gün, 30 günlük uptime yüzdesi
  • Duration trends: Cevap süresi trendi
  • Status history: Geçmişteki down/up olayları
  • TLS bilgisi: Sertifika detayları ve kalan süre

Elasticsearch’te Veri Analizi

Ham veriye Elasticsearch üzerinden de bakabilirsiniz. Bazı faydalı sorgular:

# Son 1 saatte down olan monitörler
curl -X GET "https://elasticsearch:9200/heartbeat-*/_search" 
  -H 'Content-Type: application/json' 
  -u elastic:$ELASTIC_PASS 
  -d '{
    "query": {
      "bool": {
        "must": [
          {"term": {"monitor.status": "down"}},
          {"range": {"@timestamp": {"gte": "now-1h"}}}
        ]
      }
    },
    "aggs": {
      "down_monitors": {
        "terms": {
          "field": "monitor.name",
          "size": 20
        }
      }
    }
  }'
# Yavaş cevap veren servisler (500ms üzeri)
curl -X GET "https://elasticsearch:9200/heartbeat-*/_search" 
  -H 'Content-Type: application/json' 
  -u elastic:$ELASTIC_PASS 
  -d '{
    "query": {
      "bool": {
        "must": [
          {"term": {"monitor.status": "up"}},
          {"range": {
            "monitor.duration.us": {"gte": 500000}
          }},
          {"range": {"@timestamp": {"gte": "now-15m"}}}
        ]
      }
    },
    "_source": ["monitor.name", "monitor.duration.us", "url.full", "@timestamp"],
    "sort": [{"monitor.duration.us": {"order": "desc"}}],
    "size": 10
  }'

Kibana Alerting ile Alarm Kurulumu

Burada işler ilginçleşiyor. Kibana’nın Alerting (Stack Rules) özelliği ile Heartbeat verilerine dayalı otomatik bildirimler kurabilirsiniz.

Kibana Arayüzü: Management > Stack Management > Rules and Connectors

Önce bir connector oluşturun. Örneğin Slack için:

{
  "connector_type_id": ".slack",
  "name": "Slack Ops Channel",
  "config": {
    "webhookUrl": "https://hooks.slack.com/services/xxx/yyy/zzz"
  }
}

Sonra bir Uptime rule ekleyin:

  • Rule type: Uptime TLS veya Uptime monitor status
  • Monitor status rule için: belirli monitörler down duruma geçtiğinde tetiklensin
  • Check every: 1 dakika
  • Notify when: Monitor down olduğunda, durumu değiştiğinde veya hala down olduğunda ayrı ayrı ayarlanabilir

Kibana UI yerine API üzerinden rule oluşturmak için:

curl -X POST "https://kibana:5601/api/alerting/rule" 
  -H 'Content-Type: application/json' 
  -H 'kbn-xsrf: true' 
  -u elastic:$ELASTIC_PASS 
  -d '{
    "name": "Kritik Servisler Down Alarm",
    "rule_type_id": "xpack.uptime.alerts.monitorStatus",
    "consumer": "uptime",
    "schedule": {"interval": "1m"},
    "params": {
      "numTimes": 3,
      "timerangeCount": 15,
      "timerangeUnit": "m",
      "filters": {
        "tags": [["critical"]]
      },
      "shouldCheckStatus": true,
      "shouldCheckAvailability": true,
      "availability": {
        "range": 30,
        "rangeUnit": "d",
        "threshold": "99.9"
      }
    },
    "actions": [{
      "id": "slack-connector-id",
      "group": "xpack.uptime.alerts.actionGroups.monitorStatus",
      "params": {
        "message": "ALARM: {{context.monitorName}} servisi DOWN durumunda! URL: {{context.monitorUrl}}"
      }
    }]
  }'

Watchers ile Gelişmiş Alarm Senaryoları

Kibana Alerting yetmediği durumlarda Elasticsearch Watcher’ı devreye sokabilirsiniz. Örneğin “son 5 dakikada 3’ten fazla farklı servis down olduysa kritik alarm gönder” gibi karmaşık senaryolar için:

curl -X PUT "https://elasticsearch:9200/_watcher/watch/multi-service-down" 
  -H 'Content-Type: application/json' 
  -u elastic:$ELASTIC_PASS 
  -d '{
    "trigger": {
      "schedule": {"interval": "2m"}
    },
    "input": {
      "search": {
        "request": {
          "indices": ["heartbeat-*"],
          "body": {
            "query": {
              "bool": {
                "must": [
                  {"term": {"monitor.status": "down"}},
                  {"range": {"@timestamp": {"gte": "now-5m"}}}
                ]
              }
            },
            "aggs": {
              "unique_down": {
                "cardinality": {"field": "monitor.id"}
              }
            },
            "size": 0
          }
        }
      }
    },
    "condition": {
      "compare": {
        "ctx.payload.aggregations.unique_down.value": {
          "gte": 3
        }
      }
    },
    "actions": {
      "send_email": {
        "email": {
          "to": ["[email protected]"],
          "subject": "KRİTİK: Çoklu servis kesintisi tespit edildi",
          "body": {
            "text": "Son 5 dakikada {{ctx.payload.aggregations.unique_down.value}} farklı servis down durumunda. Lütfen acilen kontrol edin."
          }
        }
      }
    }
  }'

Gerçek Dünya: Deployment Sürecinde Heartbeat Kullanımı

Pratik bir senaryo paylaşayım. Deployment sonrası servislerin tam olarak ayağa kalktığından emin olmak için CI/CD pipeline’ınıza Heartbeat kontrolü ekleyebilirsiniz:

#!/bin/bash
# post-deploy-check.sh

ELASTICSEARCH_URL="https://elasticsearch:9200"
MONITOR_ID="ecommerce-api"
MAX_WAIT=120
INTERVAL=10
ELAPSED=0

echo "Deployment sonrası servis kontrolü başlıyor..."

while [ $ELAPSED -lt $MAX_WAIT ]; do
  STATUS=$(curl -s -u "elastic:${ELASTIC_PASS}" 
    "${ELASTICSEARCH_URL}/heartbeat-*/_search" 
    -H 'Content-Type: application/json' 
    -d "{
      "query": {
        "bool": {
          "must": [
            {"term": {"monitor.id": "${MONITOR_ID}"}},
            {"range": {"@timestamp": {"gte": "now-30s"}}}
          ]
        }
      },
      "sort": [{"@timestamp": {"order": "desc"}}],
      "size": 1
    }" | jq -r '.hits.hits[0]._source.monitor.status' 2>/dev/null)

  if [ "$STATUS" = "up" ]; then
    echo "Servis UP durumunda. Deployment başarılı."
    exit 0
  fi

  echo "Servis henüz hazır değil (durum: ${STATUS}). ${INTERVAL}s bekleniyor..."
  sleep $INTERVAL
  ELAPSED=$((ELAPSED + INTERVAL))
done

echo "HATA: Servis ${MAX_WAIT} saniye içinde UP durumuna geçmedi!"
exit 1

Heartbeat’i Kubernetes’te Çalıştırma

Kubernetes ortamında Heartbeat’i DaemonSet yerine Deployment olarak çalıştırmak genellikle daha mantıklı:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: heartbeat
  namespace: monitoring
spec:
  replicas: 2
  selector:
    matchLabels:
      app: heartbeat
  template:
    metadata:
      labels:
        app: heartbeat
    spec:
      containers:
      - name: heartbeat
        image: docker.elastic.co/beats/heartbeat:8.11.0
        args: ["-c", "/etc/heartbeat/heartbeat.yml", "-e"]
        env:
        - name: ELASTICSEARCH_HOST
          value: "https://elasticsearch:9200"
        - name: HEARTBEAT_ES_PASS
          valueFrom:
            secretKeyRef:
              name: heartbeat-secrets
              key: elasticsearch-password
        volumeMounts:
        - name: config
          mountPath: /etc/heartbeat
          readOnly: true
        securityContext:
          capabilities:
            add:
            - NET_RAW
      volumes:
      - name: config
        configMap:
          name: heartbeat-config

Performans ve Ölçeklendirme Notları

Çok sayıda monitor tanımladığınızda dikkat etmeniz gereken birkaç şey var:

  • scheduler.limit: Eş zamanlı çalışabilecek maksimum monitor sayısını kontrol eder. Varsayılan 0 yani sınırsız, ama büyük ortamlarda bunu sınırlamak iyi olabilir.
  • HTTP timeout değerleri: Çok düşük timeout koyarsanız yanlış alarm üretirsiniz. Ağ gecikmesini hesaba katın.
  • Schedule sıklığı: Her şeyi 10 saniyede bir kontrol etmek gerekmez. Kritiklik seviyesine göre farklılaştırın.
  • Index rollover: Heartbeat yoğun veri üretir. ILM policy ile eski verileri hot-warm-cold mimarisine göre yönetin.
# Heartbeat'in kaç monitor çalıştırdığını kontrol et
curl -s "https://elasticsearch:9200/heartbeat-*/_search" 
  -H 'Content-Type: application/json' 
  -u elastic:$ELASTIC_PASS 
  -d '{
    "aggs": {
      "monitor_count": {
        "cardinality": {"field": "monitor.id"}
      }
    },
    "size": 0
  }' | jq '.aggregations.monitor_count.value'

Sonuç

Heartbeat, ELK Stack içinde en az konuşulan ama pratik değeri açısından en yüksek bileşenlerden biri. Metrik ve log tabanlı izlemenin tamamlayıcısı olarak, dışarıdan aktif kontrol yaparak “servis gerçekten cevap veriyor mu?” sorusunu yanıtlıyor.

Kurulum basit, konfigürasyon YAML tabanlı ve okunabilir. Monitor tanımlarını monitors.d altında modüler tutarsanız yönetimi kolaylaşıyor. Kibana Uptime ile görselleştirme, Alerting ile bildirim ve Watcher ile karmaşık alarm mantıkları bir arada iyi çalışıyor.

Başlangıç için kritik HTTP endpoint’lerinizi, veritabanı portlarınızı ve SSL sertifikalarınızı izlemeye alın. Bunu oturtunca deployment sonrası kontroller, SLA raporlaması ve anomali tespiti gibi ileri senaryolara geçebilirsiniz. Ekibiniz “sistemi biz çökmeden önce müşteri mi bildiriyor?” sorusunu artık sormuyorsa, doğru yoldasınız demektir.

Bir yanıt yazın

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