Uptime Monitoring - Alertmanager ile Kesinti Bildirimi Otomasyonu

Uptime Monitoring - Alertmanager ile Kesinti Bildirimi Otomasyonu

Bir web sitesinin veya API'nin çöktüğünü müşterilerinizden önce fark etmek, operasyonel güvenilirliğin temel taşıdır. Manuel kontrol yerine otomatik uptime monitoring kurarak HTTP, TCP ve DNS sağlık kontrollerini sürekli çalıştırabilir, Alertmanager ile kesinti anında Slack, PagerDuty veya e-posta b

Bir web sitesinin veya API'nin çöktüğünü müşterilerinizden önce fark etmek, operasyonel güvenilirliğin temel taşıdır. Manuel kontrol yerine otomatik uptime monitoring kurarak HTTP, TCP ve DNS sağlık kontrollerini sürekli çalıştırabilir, Alertmanager ile kesinti anında Slack, PagerDuty veya e-posta bildirimi gönderebilirsiniz. Bu rehberde Prometheus Blackbox Exporter ile uptime izleme kurulumundan Alertmanager yapılandırmasına, alert kurallarından on-call yönetimine kadar tüm süreci ele alıyoruz.

Uptime Monitoring Neden Kritiktir?

Downtime doğrudan gelir kaybı demektir. Bir e-ticaret sitesi için dakikada binlerce liralık satış kaybı, bir SaaS uygulaması için SLA ihlali ve cezai yaptırım anlamına gelebilir. Proaktif izleme ile sorunları kullanıcılar fark etmeden tespit edip müdahale edebilirsiniz.

Uptime Hedefi Yıllık İzin Verilen Downtime Aylık İzin Verilen Downtime
99% (iki dokuz) 3 gün 15 saat 7 saat 18 dakika
99.9% (üç dokuz) 8 saat 46 dakika 43 dakika 50 saniye
99.99% (dört dokuz) 52 dakika 36 saniye 4 dakika 23 saniye
99.999% (beş dokuz) 5 dakika 16 saniye 26 saniye

💡 Gerçekçi Hedef: Çoğu web uygulaması için %99.9 (üç dokuz) makul bir hedeftir. Bu aylık yaklaşık 43 dakika downtime'a izin verir. %99.99 ve üzeri hedefler yedekli altyapı, otomatik failover ve 7/24 on-call ekip gerektirir.

Blackbox Exporter ile Endpoint İzleme

Prometheus Blackbox Exporter, HTTP, HTTPS, TCP, ICMP ve DNS protokolleri üzerinden endpoint'lerin erişilebilirliğini kontrol eder. Uygulamanızın dışından (black-box) bakarak gerçek kullanıcı deneyimini simüle eder.

docker-compose.yml
version: "3.8"
services:
  prometheus:
    image: prom/prometheus:v2.50.0
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
      - ./alert-rules.yml:/etc/prometheus/alert-rules.yml
    ports:
      - "9090:9090"
    networks:
      - monitoring

  blackbox-exporter:
    image: prom/blackbox-exporter:v0.25.0
    volumes:
      - ./blackbox.yml:/etc/blackbox_exporter/config.yml
    ports:
      - "9115:9115"
    networks:
      - monitoring

  alertmanager:
    image: prom/alertmanager:v0.27.0
    volumes:
      - ./alertmanager.yml:/etc/alertmanager/alertmanager.yml
    ports:
      - "9093:9093"
    networks:
      - monitoring

networks:
  monitoring:
    driver: bridge

Blackbox Exporter Yapılandırması

Blackbox Exporter'ın hangi kontrolleri yapacağını modüller ile tanımlarsınız:

blackbox.yml
modules:
  http_2xx:
    prober: http
    timeout: 10s
    http:
      valid_http_versions: ["HTTP/1.1", "HTTP/2.0"]
      valid_status_codes: [200, 201, 301, 302]
      follow_redirects: true
      preferred_ip_protocol: ip4
      tls_config:
        insecure_skip_verify: false

  http_post_api:
    prober: http
    timeout: 10s
    http:
      method: POST
      headers:
        Content-Type: application/json
      body: '{"health": "check"}'
      valid_status_codes: [200]

  tcp_connect:
    prober: tcp
    timeout: 5s

  dns_check:
    prober: dns
    timeout: 5s
    dns:
      query_name: hosted.cloud
      query_type: A
      transport_protocol: udp

  ssl_expiry:
    prober: http
    timeout: 10s
    http:
      valid_status_codes: [200, 301, 302]
      tls_config:
        insecure_skip_verify: false

Prometheus Scrape Yapılandırması

Prometheus'un Blackbox Exporter üzerinden hedef endpoint'leri kontrol etmesi için scrape config tanımlayın:

prometheus.yml
global:
  scrape_interval: 15s
  evaluation_interval: 15s

rule_files:
  - alert-rules.yml

alerting:
  alertmanagers:
    - static_configs:
        - targets: ["alertmanager:9093"]

scrape_configs:
  - job_name: "blackbox-http"
    metrics_path: /probe
    params:
      module: [http_2xx]
    static_configs:
      - targets:
          - https://hosted.cloud
          - https://api.hosted.cloud/health
          - https://admin.hosted.cloud
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: blackbox-exporter:9115

  - job_name: "blackbox-tcp"
    metrics_path: /probe
    params:
      module: [tcp_connect]
    static_configs:
      - targets:
          - db-server:5432
          - redis-server:6379
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: blackbox-exporter:9115

Prometheus Alert Kuralları

Alert kuralları, belirli koşullar sağlandığında Alertmanager'a bildirim göndermesini tetikler. Uptime monitoring için temel kurallar:

alert-rules.yml
groups:
  - name: uptime-alerts
    rules:
      # Endpoint tamamen erisilemez
      - alert: EndpointDown
        expr: probe_success == 0
        for: 2m
        labels:
          severity: critical
        annotations:
          summary: "Endpoint {{ $labels.instance }} down"
          description: "{{ $labels.instance }} 2 dakikadir erisilemez."

      # Yavas yanit suresi (2 saniyeden fazla)
      - alert: HighResponseTime
        expr: probe_http_duration_seconds{phase="transfer"} > 2
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "Slow response: {{ $labels.instance }}"
          description: "{{ $labels.instance }} yanit suresi 5 dakikadir 2 saniyenin uzerinde."

      # SSL sertifikasi 14 gun icinde sona erecek
      - alert: SSLCertExpiringSoon
        expr: (probe_ssl_earliest_cert_expiry - time()) / 86400 < 14
        for: 1h
        labels:
          severity: warning
        annotations:
          summary: "SSL cert expiring: {{ $labels.instance }}"
          description: "{{ $labels.instance }} SSL sertifikasi {{ $value | humanize }} gun icinde sona erecek."

      # HTTP durum kodu 5xx
      - alert: HTTPStatusError
        expr: probe_http_status_code >= 500
        for: 1m
        labels:
          severity: critical
        annotations:
          summary: "HTTP 5xx: {{ $labels.instance }}"
          description: "{{ $labels.instance }} HTTP {{ $value }} durum kodu donuyor."

⚠️ Dikkat: for süresini çok kısa tutmayın. Geçici ağ dalgalanmaları yanlış alarm (false positive) üretir. Critical alert'ler için en az 2 dakika, warning alert'ler için 5 dakika bekleyin. Ancak gerçek kesintilerde hızlı bildirim için bu süreleri iş gereksinimlerinize göre ayarlayın.

Alertmanager Yapılandırması

Alertmanager, Prometheus'tan gelen alert'leri alır, gruplar, tekrar eden bildirimleri bastırır ve doğru kanala yönlendirir. Routing, grouping ve inhibition mekanizmaları ile alert yorgunluğunu önler.

alertmanager.yml
global:
  resolve_timeout: 5m
  slack_api_url: 'https://hooks.slack.com/services/T.../B.../xxx'

route:
  receiver: slack-default
  group_by: [alertname, instance]
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 4h
  routes:
    # Critical alert'ler PagerDuty'ye
    - match:
        severity: critical
      receiver: pagerduty-critical
      repeat_interval: 1h
      continue: true

    # Tum alert'ler Slack'e de gitsin
    - match_re:
        severity: critical|warning
      receiver: slack-alerts

receivers:
  - name: slack-default
    slack_configs:
      - channel: '#monitoring'
        title: '{{ .GroupLabels.alertname }}'
        text: '{{ range .Alerts }}{{ .Annotations.description }}{{ end }}'

  - name: slack-alerts
    slack_configs:
      - channel: '#alerts-critical'
        color: '{{ if eq .Status "firing" }}danger{{ else }}good{{ end }}'
        title: '[{{ .Status | toUpper }}] {{ .GroupLabels.alertname }}'
        text: '{{ range .Alerts }}{{ .Annotations.description }}\n{{ end }}'

  - name: pagerduty-critical
    pagerduty_configs:
      - service_key: 'your-pagerduty-integration-key'
        severity: critical

inhibit_rules:
  # EndpointDown varsa HighResponseTime'i bastir
  - source_match:
      alertname: EndpointDown
    target_match:
      alertname: HighResponseTime
    equal: [instance]

Grafana ile Uptime Dashboard

Blackbox Exporter metriklerini Grafana'da görselleştirerek tüm endpoint'lerinizin durumunu tek bir panelden izleyebilirsiniz. Temel metrikler:

  • probe_success Endpoint erişilebilir mi? 1 = başarılı, 0 = başarısız. Stat panel ile yeşil/kırmızı durum göstergesi oluşturun.
  • probe_http_duration_seconds HTTP yanıt süresi (DNS, connect, TLS, transfer aşamaları ayrı ayrı). Time series panel ile trend analizi yapın.
  • probe_ssl_earliest_cert_expiry SSL sertifika bitiş tarihi (Unix timestamp). Kalan gün sayısını hesaplayarak sertifika yenileme takibi yapın.
  • Uptime Yüzdesi (PromQL) avg_over_time(probe_success[30d]) * 100 ile son 30 günlük uptime yüzdesini hesaplayın.

On-Call Yönetimi ve Alert Yorgunluğunu Önleme

Etkili bir alerting sistemi yalnızca doğru zamanda, doğru kişiye, doğru bilgiyi iletmelidir. Aşırı alert gönderimi "alert fatigue" (alarm yorgunluğu) yaratır ve ekibin gerçek sorunları gözden kaçırmasına neden olur.

Severity Ayrımı

Critical: anında PagerDuty/telefon. Warning: Slack bildirimi. Info: yalnızca dashboard'da görünsün.

Inhibition Kuralları

Sunucu tamamen çöktüyse, o sunucudaki tüm servis alert'lerini bastırın. Tek bir kök neden bildirimi yeterlidir.

Silence ve Maintenance

Planlı bakım sırasında Alertmanager silence oluşturun. Bakım bitince otomatik kaldırılır.

Sunucu metrikleri için Prometheus + Grafana rehberimizi, merkezi log yönetimi için ELK Stack rehberimizi, SSL sertifika yönetimi için Let's Encrypt Otomatik Yenileme rehberimizi inceleyin. Alertmanager Resmi Dokümantasyonu ve Blackbox Exporter GitHub ek kaynak olarak faydalıdır.

Sıkça Sorulan Sorular

Blackbox Exporter ile internal servisleri de izleyebilir miyim?

Evet, Blackbox Exporter yalnızca public endpoint'lerle sınırlı değildir. Internal API'ler, veritabanı portları ve mesaj kuyruğu bağlantılarını TCP probe ile izleyebilirsiniz. Kubernetes'te ClusterIP servisleri de kontrol edilebilir.

Uptime monitoring için ne sıklıkta kontrol yapmalıyım?

Kritik servisler için 15-30 saniye aralıkla kontrol önerilir. Daha az kritik servisler için 1-5 dakika yeterlidir. Çok sık kontrol (5 saniyeden az) hedef servise gereksiz yük bindirebilir ve yanlış alarm üretebilir.

Alertmanager'da alert tekrarını nasıl kontrol ederim?

repeat_interval parametresi ile aynı alert'in ne sıklıkta tekrar gönderileceğini belirleyin. Critical alert'ler için 1 saat, warning alert'ler için 4 saat makul değerlerdir. Çözülmemiş alert'ler bu aralıkla tekrar bildirilir.

Birden fazla lokasyondan uptime kontrolü yapabilir miyim?

Evet, farklı coğrafi lokasyonlara Blackbox Exporter kurarak multi-location monitoring yapabilirsiniz. Bu sayede bölgesel ağ sorunlarını tespit edebilir ve yanlış alarm oranını düşürebilirsiniz. En az 2-3 farklı lokasyondan kontrol önerilir.

Sonuç

Prometheus Blackbox Exporter ile HTTP, TCP ve DNS endpoint'lerinizi sürekli izleyin. Alertmanager ile kesinti anında doğru ekibe doğru kanaldan bildirim gönderin. Inhibition kuralları ve severity ayrımı ile alert yorgunluğunu önleyin ve Grafana dashboard'ları ile uptime metriklerinizi görselleştirin.

Kesintisiz Çalışan Altyapı mı Arıyorsunuz?

Hosted Cloud'un %99.9 uptime garantili sunucuları ile hizmetlerinizi güvenle çalıştırın.

Bulut Sunucu Planlarını İncele →
A

Ahmet Yılmaz

Kıdemli Altyapı Mühendisi

10 yılı aşkın bulut altyapısı ve DevOps deneyimiyle Hosted Cloud'un teknik ekibinde yer almaktadır. Kubernetes, Terraform ve yüksek erişilebilirlik mimarileri üzerine uzmanlaşmıştır.

Yorumlar yakında