Oyun Kitabı
Ödeme Gözlemlenebilirlik ve Korelasyon (Odeme Gozlemlenebilirlik Ve Korelasyon)
Her log, metrik ve trace payment id ile nasıl korele edilir? Adım adım event log ve deferred finalize metrikleri operasyonu nasıl kurtarır?
Dağıtık Ödeme Motoru (Distributed Payment Engine)
Bolum 18 / 22
Capture ile complete arasındaki boşluğu kapatan dağıtık ödeme mimarisi serisi.
Önceki bölümde webhook ile senkron yolun aynı kayda yarıştığını ve version token ile lease'in bunu nasıl çözdüğünü gördük. Peki yarış gerçekleştiğinde veya bir ödeme saatlerce FinalizePending'de kaldığında bunu nasıl görürsünüz?
Dağıtık bir ödeme sisteminde 'bir şeyler ters gitti' demek yetmez; hangi payment id, hangi adımda, hangi kanıtla takıldı sorusunun saniyeler içinde cevaplanması gerekir. Observability burada lüks değil — reconciliation worker'ın neyi tarayacağını, on-call mühendisinin hangi runbook'u açacağını belirleyen altyapıdır.
Payment #8812
├─ trace: checkout-orchestrator
├─ step log: ChargeSent → WebhookReceived → FinalizeAttempted
└─ metric: deferred_finalize_age_seconds = 847
Bu bölüm, payment id'yi omurga yaparak log, trace ve metrikleri nasıl bir araya getireceğinizi ele alıyor.
Kavramlar ilk geçtiği yerde
📦 Payment ID (Correlation Spine)
Tüm servisler, loglar ve metriklerde tekrarlanan, ödeme yaşam döngüsünün birincil anahtarı.
📦 Step Event Log
Bir ödemenin her anlamlı adımını kaydeden, append-only olay dizisi.
📦 Deferred Finalize
Ödeme PSP tarafında sonuçlanmış olabilir ama local sistem henüz terminal statüye geçmemiştir.
📦 Structured Log
Serbest metin yerine alan tabanlı, sorgulanabilir log kaydı.
Request id veya trace id geçicidir; payment id kalıcıdır. Bir müşteri şikayeti geldiğinde aradığınız şey request id değil, payment id'dir.
Payment id: korelasyonun omurgası
Checkout orchestrator bir ödeme başlattığında payment id üretilir ve o andan itibaren her servise taşınır: provider gateway'e giden charge isteğinde, webhook metadata'sında, step event log'unda, metrik etiketlerinde. Bu id, dağınık izleri tek bir hikâyeye bağlar.
❌ Korelasyonsuz
[ERROR] webhook processing failed
[ERROR] charge timeout in gateway
→ hangi ödeme?
✓ Payment id ile
paymentId=8812 step=WebhookReceived error=version_conflict
paymentId=8812 step=ChargeSent latency_ms=4200
→ aynı ödeme, farklı adımlar, anında görünür
Trace span'leri de payment id taşımalıdır. Bir trace'e girdiğinizde checkout'tan webhook finalize'a kadar tüm adımları görmelisiniz — farklı servisler arasında request id değişse bile payment id sabit kalır.
Step event log: ödemenin zaman çizelgesi
Metrikler 'kaç tane' sorusuna cevap verir; step event log 'ne oldu, sırayla' sorusuna. Her anlamlı adım bir kayıt üretir:
8812 ChargeRequested orchestrator amount=249.00
8812 ChargeSent gateway providerRef=ch_abc
8812 SyncResponsePending orchestrator redirectUrl=issued
8812 WebhookReceived gateway event=PaymentCaptured
8812 FinalizeAttempted orchestrator version=3→4
8812 FinalizeSucceeded orchestrator status=Captured
Bu log append-only'dir; bir adım geri alınmaz, yeni bir adım eklenir. Telafi (compensation) veya reconciliation müdahalesi de kendi adımını yazar — böylece 'bu ödeme neden iki kez finalize edildi' sorusunun cevabı kaybolmaz.
Step event log, audit trail ile karıştırılmamalıdır: audit 'kim ne yaptı' sorusuna cevap verir; step log 'sistem ne yaptı, hangi sırada' sorusuna. İkisi birbirini tamamlar.
Deferred finalize metrikleri: sessiz takılmayı görünür kılmak
FinalizePending statüsünde kalan bir ödeme, müşteriye henüz sonuç gösterilmemiş ama PSP tarafında çoktan sonuçlanmış olabilir. Bu pencere normaldir — ama ne kadar sürdüğü ölçülmelidir.
Metrik: deferred_finalize_count
→ şu an FinalizePending'de olan ödeme sayısı
Metrik: deferred_finalize_age_seconds (histogram)
→ her ödemenin bu statüde ne kadar kaldığı
Alert: deferred_finalize_age_p99 > 600s
→ finalize pipeline'ında sistemik sorun
Bu metrikler reconciliation worker'ın 'ne kadar acil' taraması gerektiğini de belirler. deferred_finalize_age_seconds yükseliyorsa sorun tek bir ödemede değil, finalize pipeline'ında veya webhook işlemede olabilir.
Dashboard düzeni: operasyonel görünürlük
| Panel | Gösterdiği | Aksiyon tetikleyicisi |
|---|---|---|
| Deferred finalize count | Takılı ödeme hacmi | Sürekli yükseliş → pipeline incelemesi |
| Finalize age P99 | En kötü gecikme | SLA aşımı → on-call |
| Step log gap | Eksik adım (WebhookReceived yok) | Webhook delivery sorunu |
| Version conflict rate | Yarış yoğunluğu | Concurrency tuning |
Sık karıştırılan ayrımlar
❌ Request id yeterli korelasyon sağlar
✓ Request id geçicidir; payment id ödeme boyunca kalıcıdır
❌ Log volume = observability
✓ Sorgulanabilir, payment id'li structured log = observability
❌ Metrikler geliştirme için yeterli
✓ Step event log, metriklerin gösteremediği sıra ve bağlamı taşır
Log vs step event log vs audit
| Tür | Soru | Örnek |
|---|---|---|
| Structured log | Anlık olay detayı | WebhookReceived, latency=120ms |
| Step event log | Yaşam döngüsü sırası | ChargeSent → WebhookReceived → Finalize |
| Audit log | İnsan/süreç müdahalesi | Operator X triggered manual heal |
Observability kontrol listesi
- Her log satırı, trace span'i ve metrik etiketi payment id taşıyor mu?
- Step event log append-only mi ve her anlamlı adımı kapsıyor mu?
deferred_finalize_countvedeferred_finalize_age_secondsmetrikleri tanımlı mı?- Finalize age P99 için SLA tabanlı alert var mı?
- Bir payment id ile step log'dan checkout'tan terminal statüye kadar tam yol izlenebiliyor mu?
- Reconciliation worker'ın düzelttiği kayıtlar step log'a yazılıyor mu?
Bu yazıdan aklında ne kalmalı
- Payment id, tüm observability'nin omurgasıdır; request id tek başına yetmez.
- Step event log, ödemenin zaman çizelgesidir; metriklerin gösteremediği sırayı taşır.
- Deferred finalize metrikleri, sessiz takılmayı ölçülü ve uyarılabilir kılar.
- Observability lüks değil; reconciliation ve on-call'in neye bakacağını belirler.
Bir ödeme takıldığında 'loglara bakalım' yetmez; payment id ile saniyeler içinde hangi adımda kaldığını gösterecek bir step event log ve deferred finalize metriği gerekir.
Bir sonraki bölümde bu görünürlüğün üzerine recovery pipeline ve runbook'ları inşa ediyoruz: otomasyon önce, insan müdahalesi uniqueness duvarlarında.
SSS
Sık sorulan sorular
Payment ID (Correlation Spine) nedir?
Tüm servisler, loglar ve metriklerde tekrarlanan, ödeme yaşam döngüsünün birincil anahtarı.
Step Event Log nedir?
Bir ödemenin her anlamlı adımını kaydeden, append-only olay dizisi.
"Request id yeterli korelasyon sağlar" doğru mu?
Request id geçicidir; payment id ödeme boyunca kalıcıdır
Bu bölüm neyi sabitler?
Bu bölüm, payment id'yi omurga yaparak log, trace ve metrikleri nasıl bir araya getireceğinizi ele alıyor. Payment id, tüm observability'nin omurgasıdır; request id tek başına yetmez. Önceki bölümde webhook ile senkron yolun aynı kayda yarıştığını ve version token ile lease'in bunu nasıl çözdüğünü gördük. Peki yarış gerçekleştiğinde veya bir ödeme saatlerce `FinalizePending`'de kaldığında bunu nasıl görürsünüz?
Ogrenilen Muhendislik Prensipleri
- Payment id tüm log, trace ve metriklerin omurgasıdır.
- Step event log sırayı taşır; metrikler hacmi taşır — ikisi birbirini tamamlar.
- Deferred finalize metrikleri sessiz takılmayı ölçülü ve uyarılabilir kılar.
Okumaya devam et
Okumaya devam et
Seride sonraki yazi
Ödeme Kurtarma Pipeline ve Runbook
Otomasyon önce: reconciliation worker ve recovery pipeline. Uniqueness duvarları replay'i engellediğinde kanıta dayalı insan runbook'ları devreye girer.
Seride sonraki yazi
Webhook Altında Optimistic Concurrency
Webhook ile senkron yanıt aynı ödemeye aynı anda dokunduğunda version token ve lease nasıl yarışı çözer? Bayat okumanın terminal ödemede client secret…
Ayni seriden
Ödemelerde Effectively-Once İşleme
Exactly-once messaging bir yalandır. Defense in depth ile idempotency, dedup, outbox ve reconciliation birleşince effectively-once iş sonucu nasıl elde…