Drift Tespiti (Sapma Algılama)
Drift (sapma), Git repo'sundaki "olması gereken" durum ile Consul'daki "gerçek" durum arasındaki farktır. Consul Guardian, bu farkları otomatik olarak tespit eder ve raporlar.
Drift Nedir?
İdeal durumda Git repo'sun Consul'un birebir yansıması olmalıdır. Ama pratikte sapma oluşabilir:
- Birisi Consul UI'dan doğrudan bir key değiştirmiş olabilir (Guardian'ı bypass ederek)
- Bir otomasyon scripti Consul'a yazma yapmış olabilir
- Consul restart sonrası bazı key'ler kaybolmuş olabilir
- Yeni bir key eklenip Git'e hiç commit edilmemiş olabilir
Bu durumlarda "kaynak" (Git) ile "gerçek" (Consul) arasında fark oluşur. Buna drift diyoruz.
CLI ile Drift Tespiti
# Temel drift kontrolü
consul-guardian drift
# Belirli prefix için
consul-guardian drift --prefix "config/production/"
# JSON çıktısı (CI/CD için)
consul-guardian drift --format json
# Drift varsa çıkış kodu 1 döndürür (CI pipeline'da kullanışlı)
consul-guardian drift --exit-code
Örnek çıktı:
Drift Report (2026-04-04T14:30:00Z)
====================================
MISSING (Git'te var, Consul'da yok): 2
- config/production/cache-ttl
- config/production/old-service
EXTRA (Consul'da var, Git'te yok): 1
+ env/production/TEMP_DEBUG_FLAG
DRIFTED (Değerleri farklı): 1
~ config/production/database
Git: {"host":"db.prod.internal","port":5432,"pool_size":20}
Consul: {"host":"db.prod.internal","port":5432,"pool_size":50}
Summary: 4 drifted, 47 in sync
Dashboard ile Drift Tespiti
Dashboard'un Drift Detection sayfasından tek tıkla tarama başlatabilirsin. Sonuçlar tablo halinde gösterilir:
- Her drift kategorisi renk kodlu
- Farklı değerleri yan yana görebilirsin
- Doğrudan restore aksiyonu alabilirsin
Drift Kategorileri
MISSING (Eksik)
Git'te var ama Consul'da yok. Muhtemel sebepler:
- Key Consul'dan silinmiş
- Consul restart sonrası veri kaybedilmiş
- Key henüz Consul'a yazılmamış
EXTRA (Fazla)
Consul'da var ama Git'te yok. Muhtemel sebepler:
- Key doğrudan Consul UI/API üzerinden eklenmiş
- Bir otomasyon scripti Guardian'ı bypass ederek yazmış
- Geçici test key'i bırakılmış
DRIFTED (Sapmış)
Key her iki tarafta da var ama değerleri farklı. Muhtemel sebepler:
- Consul'daki değer doğrudan değiştirilmiş
- Git'teki değer güncellenmiş ama Consul'a yansıtılmamış
- Yarışma durumu (race condition) oluşmuş
CI/CD Pipeline'larında Kullanım
Drift tespiti CI/CD pipeline'ına entegre etmek, production'a deploy öncesi konfigürasyon tutarlılığını garanti eder.
GitHub Actions Örneği
name: Config Drift Check
on:
schedule:
- cron: '*/15 * * * *' # Her 15 dakikada
workflow_dispatch:
jobs:
drift-check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Drift kontrolü
run: |
consul-guardian drift \
--consul-addr ${{ secrets.CONSUL_ADDR }} \
--consul-token ${{ secrets.CONSUL_TOKEN }} \
--prefix "config/production/" \
--format json \
--exit-code
continue-on-error: true
- name: Drift varsa Slack bildir
if: failure()
uses: slackapi/slack-github-action@v1
with:
payload: |
{"text": "Consul KV drift tespit edildi! Kontrol edin."}
GitLab CI Örneği
drift-check:
stage: validate
script:
- consul-guardian drift --exit-code --format json > drift-report.json
artifacts:
paths:
- drift-report.json
when: on_failure
rules:
- if: $CI_PIPELINE_SOURCE == "schedule"
Zamanlanmış Drift Kontrolü
Yapılandırma dosyasında otomatik drift kontrolü ayarlayabilirsin:
drift:
enabled: true
schedule: "*/15 * * * *" # Her 15 dakikada bir
auto_reconcile: false # Otomatik düzeltme yapma, sadece uyar
source: "git" # Kaynak: Git repo (source of truth)
auto_reconcile: true yapılırsa, Guardian drift tespit ettiğinde otomatik olarak Git'teki değeri Consul'a yazar. Bu tehlikeli olabilir -- önce test ortamında dene. Production'da false tutmanı ve manuel karar vermeni öneririm.
Gerçek Senaryo: Gece Vardiyasındaki Değişiklik
Cuma gece 23:00'te on-call mühendis bir incident sırasında config/production/rate-limit key'ini Consul UI'dan değiştiriyor. Guardian watch çalışıyor ve değişikliği Git'e commit ediyor.
Pazartesi sabah drift kontrolü çalıştırıyorsun:
consul-guardian drift --prefix "config/production/"
Herşey senkronize görünüyor çünkü Guardian değişikliği zaten Git'e yansıtmış. Ama eğer Guardian o sırada çalışmıyorduysa, drift raporu farklı görünür:
DRIFTED: config/production/rate-limit
Git: {"max_rps": 1000}
Consul: {"max_rps": 100}
Bu durumda ya Git'i güncellersin (Consul'daki değer doğru) ya da Consul'u restore edersin (Git'teki değer doğru).