Blackbox Exporter ile Dış Servis İzleme
Prometheus ekosisteminde çalışırken bir süre sonra kaçınılmaz olarak şu soruyla yüzleşiyorsunuz: “Sunucularımın içini izliyorum güzel de, dışarıdan nasıl görünüyorlar?” İşte tam bu noktada Blackbox Exporter devreye giriyor. Node Exporter gibi hedef sistemin üzerine kurulmak zorunda değil, tamamen dışarıdan HTTP, HTTPS, DNS, TCP ve ICMP protokolleriyle servislerinizi yoklayan bir araç. Gerçek bir kullanıcının deneyimini simüle etmek istiyorsanız, Blackbox Exporter sizin için biçilmiş kaftan.
Blackbox Exporter Nedir ve Neden Kullanmalısınız
Blackbox Exporter, Prometheus’un resmi exporter ailesi içinde yer alır ve “probe” (yoklama) tabanlı çalışır. Yani bir URL’ye GET isteği atar, cevabın kaç milisaniyede geldiğine bakar, HTTP durum kodunu kontrol eder, SSL sertifikasının ne zaman biteceğini hesaplar. Tüm bunları Prometheus’un anlayacağı metrik formatına çevirir.
Bu araç olmadan şunları fark edemezsiniz:
- Uygulamanızın Docker container’ı ayakta ama HTTP 502 dönüyor
- SSL sertifikanız 3 gün sonra bitiyor
- DNS çözümlemesi normalden 800ms daha uzun sürüyor
- Belirli bir endpoint’iniz zaman zaman timeout veriyor ama server log’larında iz bırakmıyor
Bunların hepsi “dışarıdan bakış” sorunlarıdır. Node Exporter CPU ve RAM’i izler, Blackbox Exporter ise gerçek dünyadan kullanıcıların yaşadığı deneyimi izler.
Kurulum
Binary ile Kurulum
# Son sürümü indirin
wget https://github.com/prometheus/blackbox_exporter/releases/download/v0.25.0/blackbox_exporter-0.25.0.linux-amd64.tar.gz
# Arşivi açın
tar xvf blackbox_exporter-0.25.0.linux-amd64.tar.gz
# Binary'yi taşıyın
sudo mv blackbox_exporter-0.25.0.linux-amd64/blackbox_exporter /usr/local/bin/
# Konfigurasyon dizini oluşturun
sudo mkdir -p /etc/blackbox_exporter
# Örnek config'i kopyalayın
sudo mv blackbox_exporter-0.25.0.linux-amd64/blackbox.yml /etc/blackbox_exporter/
Servis kullanıcısı oluşturun. Root olarak çalıştırmak istemezsiniz:
sudo useradd --no-create-home --shell /bin/false blackbox_exporter
sudo chown blackbox_exporter:blackbox_exporter /usr/local/bin/blackbox_exporter
sudo chown -R blackbox_exporter:blackbox_exporter /etc/blackbox_exporter
Systemd servis dosyasını oluşturun:
sudo nano /etc/systemd/system/blackbox_exporter.service
[Unit]
Description=Blackbox Exporter
Wants=network-online.target
After=network-online.target
[Service]
User=blackbox_exporter
Group=blackbox_exporter
Type=simple
ExecStart=/usr/local/bin/blackbox_exporter
--config.file=/etc/blackbox_exporter/blackbox.yml
--web.listen-address=":9115"
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable blackbox_exporter
sudo systemctl start blackbox_exporter
sudo systemctl status blackbox_exporter
Port 9115 üzerinden çalışıyor olmalı. Tarayıcınızdan http://sunucu-ip:9115 adresine gittiğinizde basit bir web arayüzü göreceksiniz.
Docker ile Kurulum
Eğer zaten Docker tabanlı bir Prometheus stack’iniz varsa:
version: '3.8'
services:
blackbox-exporter:
image: prom/blackbox-exporter:v0.25.0
container_name: blackbox_exporter
ports:
- "9115:9115"
volumes:
- ./blackbox.yml:/etc/blackbox_exporter/config.yml
command:
- '--config.file=/etc/blackbox_exporter/config.yml'
restart: unless-stopped
networks:
- monitoring
networks:
monitoring:
external: true
Blackbox Konfigürasyonu
Blackbox Exporter’ın güzel yanı, “modül” tabanlı yapısıdır. Her modül, nasıl bir yoklama yapılacağını tanımlar. Aynı exporter ile HTTP kontrolü de yaparsınız, ICMP ping de atarsınız.
Temel blackbox.yml
modules:
# Standart HTTP kontrolü
http_2xx:
prober: http
timeout: 10s
http:
valid_http_versions: ["HTTP/1.1", "HTTP/2.0"]
valid_status_codes: [200, 201, 204]
method: GET
follow_redirects: true
preferred_ip_protocol: "ip4"
# HTTPS + SSL sertifika kontrolü
http_2xx_tls:
prober: http
timeout: 15s
http:
valid_http_versions: ["HTTP/1.1", "HTTP/2.0"]
valid_status_codes: [200]
method: GET
follow_redirects: true
tls_config:
insecure_skip_verify: false
preferred_ip_protocol: "ip4"
# TCP port kontrolü (database, custom servisler için)
tcp_connect:
prober: tcp
timeout: 5s
# ICMP ping
icmp_ping:
prober: icmp
timeout: 5s
icmp:
preferred_ip_protocol: "ip4"
# DNS çözümleme kontrolü
dns_check:
prober: dns
timeout: 5s
dns:
query_name: "google.com"
query_type: "A"
valid_rcodes:
- NOERROR
# POST endpoint kontrolü (API health check için)
http_post_2xx:
prober: http
timeout: 10s
http:
method: POST
headers:
Content-Type: application/json
Authorization: "Bearer your-token-here"
body: '{"ping": "pong"}'
valid_status_codes: [200, 201]
insecure_skip_verify: false ayarını production’da asla true yapmayın. SSL doğrulama hatası alıyorsanız sertifika zincirini düzeltmeniz gerekiyor, bu ayarı değiştirmeniz değil.
Prometheus Konfigürasyonu
Blackbox Exporter’ı kurdunuz, şimdi Prometheus’a hangi hedefleri nasıl yoklayacağını söylememiz lazım. Bu kısım biraz farklı çünkü normal exporter’lardan ayrışıyor.
scrape_configs:
# HTTP/HTTPS izleme
- job_name: 'blackbox_http'
metrics_path: /probe
params:
module: [http_2xx_tls]
static_configs:
- targets:
- https://yourdomain.com
- https://api.yourdomain.com/health
- https://app.yourdomain.com/status
- https://example-partner-api.com/ping
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: localhost:9115
# TCP port izleme
- job_name: 'blackbox_tcp'
metrics_path: /probe
params:
module: [tcp_connect]
static_configs:
- targets:
- db-server-01:5432
- redis-server:6379
- mail-server:25
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: localhost:9115
# ICMP ping izleme
- job_name: 'blackbox_icmp'
metrics_path: /probe
params:
module: [icmp_ping]
static_configs:
- targets:
- 192.168.1.1
- gateway.yourdomain.com
- 8.8.8.8
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: localhost:9115
Relabel bloğuna dikkat edin. Bu kısım kafa karıştırıcı görünse de mantığı şu: Prometheus normalde hedefi doğrudan scrape eder. Ama burada Blackbox Exporter’a “şu hedefi yokla” diyoruz. __address__ yeniden yönlendirilerek Blackbox Exporter adresine çevriliyor, asıl hedef ise __param_target olarak geçiyor.
Kritik Metrikler
Blackbox Exporter çok sayıda metrik üretir ama günlük işinize yarayacak olanlar bunlar:
probe_success: 1 ise yoklama başarılı, 0 ise başarısız. En temel alarm metriği.
probe_duration_seconds: Yoklamanın toplam süresi. Yavaşlama tespiti için kullanılır.
probe_http_status_code: Dönen HTTP durum kodu. 200 beklerken 503 görüyorsanız sorun var demektir.
probe_ssl_earliest_cert_expiry: SSL sertifikasının Unix timestamp olarak bitiş tarihi. Şu anki zaman ile farkı alırsanız kaç saniye kaldığını bulursunuz.
probe_http_duration_seconds: HTTP yoklamasının her fazının süresi. DNS çözümleme, TCP bağlantısı, TLS el sıkışması, ilk byte süresi gibi detayları verir.
probe_dns_lookup_time_seconds: DNS çözümlemesinin ne kadar sürdüğü.
Grafana Dashboard
Prometheus’tan verileri çektiniz, şimdi görselleştirme zamanı. Grafana’da yeni bir dashboard oluşturun ve şu sorguları kullanın.
Servis Uptime Durumu (Stat Panel)
probe_success{job="blackbox_http"}
Her servis için 1 veya 0 değeri döner. Kırmızı/yeşil renklendirme ile anlık durumu gösterir.
Yanıt Süresi Trendi (Time Series)
probe_duration_seconds{job="blackbox_http"}
Zaman içinde yanıt sürelerinin nasıl değiştiğini görmek için mükemmel.
SSL Sertifika Son Kullanma (Stat Panel)
(probe_ssl_earliest_cert_expiry{job="blackbox_http"} - time()) / 86400
Bu sorgu kaç gün kaldığını döndürür. 30 günün altında sarı, 7 günün altında kırmızı yaparsanız güzel bir uyarı paneli olur.
HTTP Fazlarına Göre Süre Breakdown (Bar Chart)
probe_http_duration_seconds{job="blackbox_http", phase="connect"}
probe_http_duration_seconds{job="blackbox_http", phase="tls"}
probe_http_duration_seconds{job="blackbox_http", phase="processing"}
probe_http_duration_seconds{job="blackbox_http", phase="transfer"}
Bu dört sorguyu aynı panel üzerinde göstermek, “nerede yavaş?” sorusunu anında cevaplamanızı sağlar.
Hazır dashboard kullanmak isterseniz Grafana’nın resmi sitesinden Dashboard ID 7587 numaralı “Prometheus Blackbox Exporter” dashboard’unu import edebilirsiniz.
Alertmanager ile Alarm Kurulumu
İzlemek güzel ama uyarı almadan izlemenin pek bir anlamı yok. Prometheus alert rule’larını şöyle tanımlayabilirsiniz:
groups:
- name: blackbox_alerts
interval: 30s
rules:
# Servis erişilemez
- alert: ServiceDown
expr: probe_success == 0
for: 2m
labels:
severity: critical
annotations:
summary: "Servis erişilemez: {{ $labels.instance }}"
description: "{{ $labels.instance }} adresine 2 dakikadır ulaşılamıyor. Job: {{ $labels.job }}"
# Yavaş yanıt süresi
- alert: SlowResponseTime
expr: probe_duration_seconds > 3
for: 5m
labels:
severity: warning
annotations:
summary: "Yavaş yanıt: {{ $labels.instance }}"
description: "{{ $labels.instance }} son 5 dakikadır 3 saniyenin üzerinde yanıt veriyor. Mevcut: {{ $value }}s"
# SSL sertifika kritik
- alert: SSLCertExpiringCritical
expr: (probe_ssl_earliest_cert_expiry - time()) / 86400 < 7
for: 1h
labels:
severity: critical
annotations:
summary: "SSL sertifikası 7 günden az: {{ $labels.instance }}"
description: "{{ $labels.instance }} sertifikası {{ $value | printf "%.0f" }} gün sonra bitiyor!"
# SSL sertifika uyarı
- alert: SSLCertExpiringWarning
expr: (probe_ssl_earliest_cert_expiry - time()) / 86400 < 30
for: 1h
labels:
severity: warning
annotations:
summary: "SSL sertifikası 30 günden az: {{ $labels.instance }}"
description: "{{ $labels.instance }} sertifikası {{ $value | printf "%.0f" }} gün sonra bitiyor."
# HTTP durum kodu anormalliği
- alert: HTTPStatusCodeAnomaly
expr: probe_http_status_code != 200 and probe_http_status_code != 0
for: 3m
labels:
severity: warning
annotations:
summary: "Beklenmeyen HTTP kodu: {{ $labels.instance }}"
description: "{{ $labels.instance }} {{ $value }} kodu dönüyor."
Gerçek Dünya Senaryoları
Senaryo 1: E-Ticaret Sitesi İzleme
Bir e-ticaret platformunda şu endpointleri izlediğinizi düşünün:
- Ana sayfa
- Ürün listeleme API’si
- Ödeme gateway entegrasyon endpoint’i
- Admin paneli
Ödeme gateway’i için özel bir modül oluşturabilirsiniz:
modules:
payment_gateway_check:
prober: http
timeout: 8s
http:
valid_status_codes: [200]
method: POST
headers:
Content-Type: application/json
X-API-Key: "monitoring-readonly-key"
body: '{"action": "health_check"}'
fail_if_body_not_matches_regexp:
- ""status":"ok""
tls_config:
insecure_skip_verify: false
fail_if_body_not_matches_regexp özelliği muhteşem. HTTP 200 dönse bile response body’sinde “status”:”ok” görmezseniz yoklama başarısız sayılır. Ödeme sistemleri bazen 200 dönüp hata mesajı içinde başarısız olur, bu özellik tam onu yakalar.
Senaryo 2: Çoklu Datacenter SSL Takibi
Onlarca domain yönetiyorsanız sertifika takibi kabus olabilir. Blackbox ile hepsini tek yerden izleyebilirsiniz:
- job_name: 'ssl_monitoring'
metrics_path: /probe
params:
module: [http_2xx_tls]
static_configs:
- targets:
- https://domain1.com
- https://domain2.com
- https://api.domain3.com
- https://mail.domain4.com
labels:
environment: production
- targets:
- https://staging.domain1.com
- https://dev.domain2.com
labels:
environment: staging
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: blackbox-exporter:9115
Environment label’ı eklemek harika bir pratik. Grafana’da sadece production’ı izleyebilir, staging’i ayrı tutabilirsiniz.
Senaryo 3: Database ve Cache Bağlantı Kontrolü
PostgreSQL, Redis, MongoDB’nin TCP portları açık mı diye kontrol etmek, uygulama katmanına yük bindirmeden temel sağlık kontrolü yapmanızı sağlar:
- job_name: 'database_tcp_check'
metrics_path: /probe
params:
module: [tcp_connect]
static_configs:
- targets:
- postgres-primary:5432
- postgres-replica:5432
- redis-master:6379
- redis-sentinel:26379
- mongodb-01:27017
labels:
tier: database
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: localhost:9115
Güvenlik Dikkat Noktaları
Blackbox Exporter’ı internete açık bırakmayın. Port 9115’e sadece Prometheus sunucunuzun erişmesi gerekiyor. Firewall kuralınızı buna göre ayarlayın:
# Sadece Prometheus sunucusundan erişime izin ver
sudo ufw allow from 10.0.1.50 to any port 9115 comment "Prometheus scrape"
# Diğer erişimleri engelle
sudo ufw deny 9115
ICMP probe’ları için Blackbox Exporter’ın özel izinlere ihtiyacı var. Binary’ye cap_net_raw yetkisi vermek root olarak çalıştırmaktan çok daha güvenli:
sudo setcap cap_net_raw+ep /usr/local/bin/blackbox_exporter
Bu komut sayesinde servis kullanıcısı root olmadan ICMP paketleri gönderebilir.
Performans Optimizasyonu
Çok fazla hedef izliyorsanız scrape interval’larını dikkatli ayarlayın. Her 15 saniyede bir 200 URL’yi yoklamak hem Blackbox Exporter’ı hem de hedef servisleri yorabilir.
Kritiklik seviyesine göre ayrıştırın:
- Production endpoint’leri: 30 saniye
- Staging endpoint’leri: 2 dakika
- SSL sertifika kontrolü: 5 dakika (sertifika 30 saniyede değişmez)
- job_name: 'blackbox_production'
scrape_interval: 30s
metrics_path: /probe
params:
module: [http_2xx_tls]
static_configs:
- targets:
- https://critical-api.yourdomain.com/health
- job_name: 'blackbox_ssl_certs'
scrape_interval: 5m
metrics_path: /probe
params:
module: [http_2xx_tls]
static_configs:
- targets:
- https://domain1.com
- https://domain2.com
- https://domain3.com
Sonuç
Blackbox Exporter, Prometheus ekosisteminin en değer verilen araçlarından biri. Kurulumu basit, konfigürasyonu esnek, çıktısı son derece pratik. Bir servis izleme altyapısını tam olarak tamamlamak için node exporter ile birlikte düşünmek gerekiyor: biri içeriden, diğeri dışarıdan bakıyor.
Özellikle SSL sertifika takibi meselesi tek başına bu aracı kullanmayı haklı kılar. Kaç kez “yok bir sertifika var, büyük firma bakıyor olmalı” diyerek gözden kaçan sertifika bitmesine tanık olundu. Artık Grafana dashboard’unuzda kalan gün sayısı kırmızıya döndüğünde Alertmanager sizi uyarıyor, siz de tatildeyken bile o sahneyle karşılaşmıyorsunuz.
Prod ortamınıza geçmeden önce birkaç test hedefi ile başlayın, modülleri kendi ihtiyaçlarınıza göre şekillendirin ve fail_if_body_not_matches_regexp gibi gelişmiş özellikleri keşfetmek için zaman ayırın. Dışarıdan izleme, sadece “site açık mı kapalı mı” sorusunun çok ötesinde bir görünürlük katmanı ekliyor altyapınıza.
