Ana içeriğe geç

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 hakkında

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).