CRUD ağırlıklı backend'ler ve API'ler için minimal gözlemlenebilirlik kurulumu
CRUD ağırlıklı backend'ler için minimal gözlemlenebilirlik: yapılandırılmış loglar, temel metrikler ve yavaş sorguları, hataları ve kesintileri erken yakalayacak pratik alarmlar.

CRUD ağırlıklı uygulamalarda gözlemlenebilirliğin çözdüğü sorun
CRUD ağırlıklı iş uygulamaları genellikle sıkıcı ve pahalı şekillerde başarısız olur. Bir liste sayfası her hafta yavaşlar, kaydetme düğmesi bazen zaman aşımına uğrar ve destek “rastgele 500'ler” rapor eder ama siz yeniden üretemezsiniz. Geliştirmede hiçbir şey kırık görünmez, ama üretim güvenilmez hissedilir.
Gerçek maliyet sadece olaya bağlı değildir. Tahmin harcayan ekiplerin zamanı da maliyettir. Net sinyaller yoksa ekipler “kesin veritabanıdır”, “ağdır” ve “o endpoint'tir” arasında gidip gelirken kullanıcılar bekler ve güven azalır.
Gözlemlenebilirlik bu tahminleri cevaplara çevirir. Basitçe: ne olduğunu görüp nedenini anlayabilirsiniz. Bunu üç sinyal türüyle sağlarsınız:
- Loglar: uygulamanın ne yapmaya karar verdiği (kullanışlı bağlamla)
- Metrikler: sistemin zaman içindeki davranışı (gecikme, hata oranı, doygunluk)
- Trace'ler (opsiyonel): zamanın servisler ve veritabanı arasında nerede geçtiği
CRUD uygulamaları ve API servisleri için bu, gösterişli panolardan çok hızlı teşhisle ilgilidir. “Fatura oluştur” çağrısı yavaşladığında gecikmenin veritabanı sorgusundan mı, downstream API'den mi yoksa aşırı yüklenmiş bir işçiden mi olduğunu dakikalar içinde söyleyebilmelisiniz, saatler içinde değil.
Minimal bir kurulum, kötü bir günde gerçekten yanıtlamanız gereken sorulardan başlar:
- Hangi endpoint başarısız oluyor veya yavaş, ve kimin için?
- Bu bir trafik zirvesi mi yoksa bir regresyon mu (yeni bir sürüm)?
- Darboğaz veritabanı mı yoksa uygulama mı?
- Bu şu anda kullanıcıları etkiliyor mu yoksa sadece logları mı dolduruyor?
Eğer üretilmiş bir yığınla backend'ler inşa ediyorsanız (örneğin, AppMaster'ın Go servisleri üretmesi gibi), aynı kural geçerlidir: küçük başlayın, sinyalleri tutarlı tutun ve gerçekten bir olay göstermedikçe yeni metrik veya alarm eklemeyin.
Minimal kurulum: neye ihtiyacınız var, neyi atlayabilirsiniz
Minimal gözlemlenebilirlik üç direğe dayanır: loglar, metrikler ve alarmlar. Trace'ler faydalıdır ama çoğu CRUD ağırlıklı iş uygulaması için ekstra sayılır.
Hedef nettir. (1) Kullanıcıların ne zaman başarısız olduğunu, (2) neden başarısız olduklarını ve (3) sistemin hangi kısmında olduğunu hızlıca bilmelisiniz. Bunları cevaplayamıyorsanız zaman tahmine ve tartışmaya harcanır.
Sizi genelde oraya götüren en küçük sinyal seti şöyle görünür:
- Her istek ve arka plan işi için yapılandırılmış loglar, böylece
request_id, kullanıcı, endpoint ve hata ile arama yapabilirsiniz. - Birkaç temel metrik: istek hızı, hata oranı, gecikme ve veritabanı zamanı.
- Kullanıcı etkisine bağlı alarmlar (hata zirveleri veya kalıcı yavaş tepki), her dahili uyarıya değil.
Ayrıca semptomları sebeplerden ayırmak yardımcı olur. Semptom, kullanıcının hissettikleridir: 500'ler, zaman aşımı, yavaş sayfalar. Sebep ise bunu yaratan şeydir: kilit rekabeti, doymuş bağlantı havuzu veya yeni eklenen filtre sonrası yavaş sorgu. Semptomlara alarm kurun ve soruşturma için “sebep” sinyallerini kullanın.
Pratik bir kural: önemli sinyalleri görmek için tek bir yer seçin. Log aracı, metrik aracı ve ayrı bir alarm gelen kutusu arasında bağlam değiştirmek, işin en önemli anında sizi yavaşlatır.
Baskı altındayken okunabilir kalan yapılandırılmış loglar
Bir şey bozulduğunda en hızlı cevap yolu genellikle: “Bu kullanıcının hangi kesin isteğini tetikledi?” eder. Bu yüzden stabil bir korelasyon ID'si neredeyse her başka log iyileştirmesinden daha önemlidir.
Bir alan adı seçin (genelde request_id) ve bunu zorunlu kabul edin. Kenarda (API gateway veya ilk handler) oluşturun, iç çağrılarda taşıyın ve her log satırına ekleyin. Arka plan işler için her çalıştırma başına yeni bir request_id oluşturun ve bir iş bir API çağrısı tarafından tetiklendiyse parent_request_id saklayın.
Logları JSON formatında tutun, serbest metin yerine. Bu, yorgun ve stresliyken arama yapmayı ve tutarlılığı korumayı kolaylaştırır.
CRUD ağırlıklı API servisleri için basit bir alan seti çoğu durumda yeterlidir:
timestamp,level,service,envrequest_id,route,method,statusduration_ms,db_query_counttenant_idveyaaccount_id(kişisel veri olmayan güvenli tanımlayıcılar)
Loglar hangi müşteri ve hangi ekrana ait olduğunu daraltmanıza yardımcı olmalı, veri sızıntısına dönüşmemeli. Varsayılan olarak isim, e-posta, telefon, adres, token veya tam istek gövdeleri loglamaktan kaçının. Daha derin detaya ihtiyaç varsa yalnızca talep üzerine ve redaksiyonla ekleyin.
CRUD sistemlerinde iki alan hızlı geri dönüş sağlar: duration_ms ve db_query_count. Bunlar tracing eklemeden önce bile yavaş handler'ları ve kazara oluşan N+1 desenlerini yakalar.
Herkesin aynı şekilde kullanması için log seviyelerini tanımlayın:
info: beklenen olaylar (istek tamamlandı, iş başladı)warn: sıra dışı ama kurtarılabilir (yavaş istek, retry başarılı)error: başarısız istek veya iş (istisna, zaman aşımı, kötü bağımlılık)
AppMaster gibi bir platformla backend'ler üretiyorsanız, üretilen servislerde aynı alan adlarını tutun ki her yerde request_id ile arama çalışsın.
CRUD backend'leri ve API'ler için en önemli metrikler
CRUD ağırlıklı uygulamalardaki çoğu olay benzer bir şekle sahiptir: bir veya iki endpoint yavaşlar, veritabanı zorlanır ve kullanıcılar yükleniyor göstergesi veya zaman aşımı görür. Metrikleriniz bu hikayeyi birkaç dakika içinde açık hale getirmeli.
Minimal set genelde beş alanı kapsar:
- Trafik: saniyedeki istek sayısı (route bazında veya en azından servis bazında) ve durum sınıfına göre istek hızı (2xx, 4xx, 5xx)
- Hatalar: 5xx oranı, zaman aşımı sayısı ve 4xx olarak dönen “iş hataları” için ayrı bir metrik (kullanıcı hataları için insanları çağırmamak için)
- Gecikme (yüzdelikler): p50 tipik deneyim için ve p95 (bazen p99) “bir şeyler yanlış” tespit için
- Doygunluk: CPU ve bellek, artı uygulamaya özgü doygunluk (işçi kullanımı, thread/goroutine baskısı)
- Veritabanı baskısı: sorgu süresi p95, bağlantı havuzu kullanım oranı ve kilit bekleme süresi (veya kilit bekleyen sorgu sayıları)
İki detay metrikleri çok daha eyleme dönüştürülebilir kılar.
İlk olarak, etkileşimli API isteklerini arka plan işlerinden ayırın. Yavaş bir e-posta gönderici veya webhook retry döngüsü CPU, DB bağlantıları veya giden ağı tüketip API'yi “rastgele yavaş” gösterebilir. Kuyrukları, retry'leri ve iş sürelerini ayrı zaman serileri olarak takip edin, aynı backend içinde çalışsalar bile.
İkinci olarak, panolara ve alarmlara sürüm/build meta verisi ekleyin. Yeni bir üretilmiş backend dağıttığınızda (örneğin AppMaster ile kodu yeniden üretip dağıttıktan sonra), hızlıca şu soruyu cevaplayabilmelisiniz: hata oranı veya p95 gecikme bu sürümden sonra arttı mı?
Bir kural: bir metrik size sonraki adımı söylemiyorsa (geri al, ölçeklendir, bir sorguyu düzelt, bir işi durdur), minimal setinize ait değildir.
Veritabanı sinyalleri: CRUD acılarının yaygın kök nedeni
CRUD ağırlıklı uygulamalarda veritabanı genellikle “yavaş hissetme”nin gerçek kullanıcı acısına dönüştüğü yerdir. Minimal kurulum PostgreSQL'in darboğaz olup olmadığını ve hangi tür DB sorunu olduğunu açıkça göstermelidir.
PostgreSQL'de önce neyi ölçmelisiniz
Düzine panoya ihtiyacınız yok. Çoğu olayı açıklayan sinyallerle başlayın:
- Yavaş sorgu oranı ve p95/p99 sorgu süresi (ve en yavaş sorguların listesi)
- Kilit beklemeleri ve deadlock'lar (kim kim tarafından bloke ediliyor)
- Bağlantı kullanımı (aktif bağlantılar vs havuz limiti, başarısız bağlantılar)
- Disk ve I/O baskısı (gecikme, doygunluk, boş alan)
- Replikasyon gecikmesi (okuma replika çalıştırıyorsanız)
Uygulama zamanı ile DB zamanını ayırın
API katmanında bir sorgu zamanlama histogramı ekleyin ve bunu endpoint veya kullanım durumu ile etiketleyin (örneğin: GET /customers, “sipariş ara”, “bilet durumunu güncelle”). Bu, bir endpoint'in çok sayıda küçük sorgu çalıştırdığı için mi yoksa tek büyük bir sorgu nedeniyle mi yavaşladığını gösterir.
N+1 desenlerini erken yakalayın
CRUD ekranları genellikle N+1 sorgular tetikler: bir liste sorgusu, sonra her satır için ilişkili veriyi almak üzere ayrı sorgular. İstek sayısı sabit kalırken isteğe düşen DB sorgu sayısının arttığı endpoint'leri izleyin. Model ve iş mantığı üzerinden üretilen backend'ler bu noktada genelde optimizasyon gerektirir.
Zaten bir cache'iniz varsa hit rate'ini izleyin. Daha iyi grafikler için cache eklemeyin; performans ihtiyacı varsa doğru yere cache koyun.
Şema değişiklikleri ve migration'ları riskli pencere olarak değerlendirin. Başlangıç ve bitiş zamanlarını kaydedin, sonra o pencere sırasında kilit, sorgu süresi ve bağlantı hatalarında zirve olup olmadığını izleyin.
Doğru kişiyi doğru nedenle uyandıran alarmlar
Alarmlar gerçek bir kullanıcı problemini işaret etmeli, yoğun bir grafik değil. CRUD ağırlıklı uygulamalar için önce kullanıcıların hissettiklerini izlemeye başlayın: hatalar ve yavaşlama.
İlk başta yalnızca üç alarm eklerseniz, bunlar olsun:
- artan 5xx oranı
- kalıcı p95 gecikme
- başarılı isteklerde ani düşüş
Bundan sonra birkaç “muhtemel sebep” alarmı ekleyin. CRUD backend'ler sık öngörülebilir şekilde başarısız olur: veritabanı bağlantıları dolar, arka plan kuyruğu birikir veya tek bir endpoint zaman aşımına girip tüm API'yi yavaşlatır.
Eşikler: tahmin değil, temel + marj
“p95 > 200ms” gibi sabit sayıların doğrudan her ortamda işe yaraması nadirdir. Normal bir haftayı ölçün, sonra alarmı normalin biraz üzerine güvenlik marjıyla koyun. Örneğin, p95 gecikme iş saatlerinde genelde 350–450ms ise, 10 dakika boyunca 700ms'de alarm verin. 5xx genelde %0.1–0.3 ise, 5 dakika boyunca %2'de page atın.
Eşikleri sık değiştirmeyin. Olay sonrası gerçek sonuçlara bağlanabildiğinizde ayarlayın.
Page vs ticket: ihtiyaç doğmadan karar verin
İki şiddet düzeyi kullanın ki insanlar sinyale güvensin:
- Page: kullanıcılar bloke olduğunda veya veri riske girdiğinde (yüksek 5xx, API zaman aşımı, DB bağlantı havuzu neredeyse tükenmiş)
- Ticket oluştur: bozulma var ama acil değilse (p95'in yavaşça artması, kuyruk birikimi, disk kullanımı trendi)
Dağıtım pencereleri ve planlı bakım sırasında alarmları susturun.
Alarmları eyleme geçirilebilir yapın. “İlk bakılacaklar” (en önemli endpoint, DB bağlantıları, son deploy) ve “ne değişti” (yeni sürüm, şema güncellemesi) bilgilerini ekleyin. AppMaster ile geliştiriyorsanız, en son hangi backend veya modülün yeniden üretildiğini ve deploy edildiğini not edin; bu genelde en hızlı ipucudur.
İş uygulamaları için basit SLO'lar (ve alarmları nasıl şekillendirirler)
Ne kadar “yeterince iyi” olduğunu kararlaştırmak işleri kolaylaştırır. SLO'lar belirsiz izlemeyi belirli alarm kurallarına dönüştürür.
Kullanıcıların hissettiği şeye doğrudan bağlı SLIs ile başlayın: kullanılabilirlik (kullanıcılar isteği tamamlayabiliyor mu), gecikme (işlemler ne kadar çabuk bitiyor) ve hata oranı (istekler ne sıklıkla başarısız oluyor).
SLO'ları route bazında değil endpoint grubu bazında belirleyin. CRUD ağırlıklı uygulamalar için gruplama okunabilirliği korur: okuma (GET/list/search), yazma (create/update/delete) ve auth (login/token refresh). Bu, sürdürülmesi zor yüzlerce küçük SLO'dan kaçınır.
Tipik beklentilere uyan örnek SLO'lar:
- İç CRUD uygulaması (admin portal): aylık %99.5 kullanılabilirlik, okuma isteklerinin %95'i 800 ms altında, yazma isteklerinin %95'i 1.5 s altında, hata oranı %0.5'in altında.
- Public API: aylık %99.9 kullanılabilirlik, okuma isteklerinin %99'u 400 ms altında, yazma isteklerinin %99'u 800 ms altında, hata oranı %0.1'in altında.
Hata bütçeleri SLO içindeki izin verilen “kötü zaman”dır. %99.9 aylık kullanılabilirlik demek ayda yaklaşık 43 dakika çalışma dışıdır. Bütçeyi erken harcarsanız, stabilite geri gelene kadar riskli değişiklikleri durdurun.
SLO'ları alarmlar için karar verirken kullanın: hata bütçesini hızlı yakıyorsanız alarm verin (kullanıcılar aktif olarak başarısız oluyor), küçük bir metrik bozulması için değil.
Eğer backend'leri hızlıca üretiyorsanız (ör. AppMaster ile Go servisleri üretmek), SLO'lar uygulamanın altında değişse bile odak noktasını kullanıcı etkisinde tutar.
Adım adım: bir günde minimal gözlemlenebilirlik kurun
Kullanıcıların en çok dokunduğu sistem dilimini seçin. En önemli API çağrılarını ve işleri seçin; bunlar yavaş veya bozulduğunda uygulamanın tümü kötü hissedilir.
En önemli endpoint'lerinizi ve arka plan işleri not edin. CRUD iş uygulaması için genelde login, list/search, create/update ve bir export/import işi olur. AppMaster ile inşa ettiyseniz, üretilen endpoint'leri ve zamanlanmış veya webhook ile çalışan Business Process akışlarını da dahil edin.
Bir günlük plan
- 1. Saat: En önemli 5 endpoint ve 1–2 arka plan işini seçin. “İyi” görünümünü yazın: tipik gecikme, beklenen hata oranı, normal DB zamanı.
- 2–3. Saatler: Tutarlı alanlarla yapılandırılmış logları ekleyin:
request_id,user_id(varsa),endpoint,status_code,latency_ms,db_time_msve bilinen hatalar için kısa birerror_code. - 3–4. Saatler: Temel metrikleri ekleyin: saniyede istek, p95 gecikme, 4xx oranı, 5xx oranı ve DB zamanlamaları (sorgu süresi ve bağlantı havuzu doygunluğu if available).
- 4–6. Saatler: Üç pano oluşturun: genel görünüm (sağlık bir bakışta), API detay görünümü (endpoint kırılımı) ve veritabanı görünümü (yavaş sorgular, kilitler, bağlantı kullanımı).
- 6–8. Saatler: Alarmlar ekleyin, kontrollü bir hata tetikleyin ve alarmın eyleme geçirilebilir olduğunu doğrulayın.
Alarmları az ve odaklı tutun. Amacınız kullanıcı etkisine işaret eden alarmlar, “bir şey değişti” diyenler değil.
Başlangıç için alarmlar (5–8 adet)
İyi bir başlangıç seti: API p95 gecikmesi çok yüksek, kalıcı 5xx oranı, 4xx'de ani artış (genelde auth veya doğrulama değişiklikleri), arka plan iş başarısızlıkları, DB yavaş sorgular, DB bağlantılarının limite yakın olması ve düşük disk alanı (self-hosted ise).
Sonra her alarm için küçük bir runbook yazın. Bir sayfa yeterlidir: önce neye bakılacak (pano panelleri ve ana log alanları), olası nedenler (DB kilidi, eksik indeks, downstream kesinti) ve ilk güvenli eylem (takılmış işçiyi yeniden başlat, değişikliği geri al, ağır işi duraklat).
İzlemeyi gürültülü veya işe yaramaz yapan yaygın hatalar
Minimal gözlemlenebilirlik kurulumu boşa harcamanın en hızlı yolu izlemeyi bir onay kutusu gibi görmektir. CRUD uygulamaları genelde birkaç öngörülebilir şekilde bozulur (yavaş DB çağrıları, zaman aşımı, hatalı sürümler), bu yüzden sinyaller o noktalara odaklanmalı.
En yaygın hata alarm yorgunluğudur: çok fazla alarm, çok az eylem. Her zirvede page atarsanız insanlar ikinci haftada alarmlara güvenmeyi bırakır. Basit bir kural: bir alarm muhtemel bir düzeltiye işaret etmeli, sadece “bir şey değişti” dememeli.
Bir diğer klasik hata korelasyon ID'lerinin eksik olmasıdır. Bir hata logunu, yavaş isteği ve DB sorgusunu tek bir isteğe bağlayamıyorsanız saatler kaybedersiniz. Her isteğe bir request_id verin ve bunu loglarda, trace'lerde (varsa) ve yanıtlar güvenliyse yanıt gövdelerinde bulundurun.
Gürültü oluşturan yaygın sebepler
Gürültülü sistemler genelde şu sorunları paylaşır:
- Bir alarm 4xx ve 5xx'i karıştırır, böylece istemci hataları ve sunucu hataları aynı görünür.
- Metrikler sadece ortalamaları takip eder, kuyruk gecikmesini (p95/p99) gizler.
- Loglar kazara hassas veri içerir (parolalar, token'lar, tam istek gövdeleri).
- Alarmlar bağlamdan yoksun semptomlarda tetiklenir (CPU yüksek) yerine kullanıcı etkisini (hata oranı, gecikme) hedeflemelidir.
- Deploy'lar görünür değil, bu yüzden regresyonlar rastgele hatalar gibi görünür.
CRUD uygulamaları özellikle “ortalama tuzağına” açıktır. Tek bir yavaş sorgu isteklerin %5'ini acı verici hale getirirken ortalama iyi görünebilir. Kuyruk gecikmesi artı hata oranı daha net bir tablo verir.
Deploy işaretçileri ekleyin. CI'den gönderiyor olun veya AppMaster gibi bir platformda kodu yeniden üretiyor olun, sürüm ve dağıtım zamanını bir olay olarak ve loglarda kaydedin.
Hızlı kontroller: minimal gözlemlenebilirlik kontrol listesi
Kurulumunuz şu soruları hızlıca yanıtlayabildiğinde işe yarıyor demektir. Bu sorulara 20 dakika panolar arasında gezinmeden hızlıca “evet/hayır” cevapları alamıyorsanız önemli bir sinyal eksiktir veya görünümleriniz çok dağınıktır.
Olay sırasında hızlı kontroller
Bunun çoğunu bir dakikadan kısa sürede yapabilmelisiniz:
- Tek bir hata görünümünden (5xx, zaman aşımı, başarısız işler) kullanıcıların şu anda başarısız olup olmadığını söyleyebiliyor musunuz (evet/hayır)?
- En yavaş endpoint grubunu ve onun p95 gecikmesini görebiliyor ve kötüleşip kötüleşmediğini tespit edebiliyor musunuz?
- Bir isteğin uygulama zamanı ile DB zamanını ayırabiliyor musunuz (handler zamanı, DB sorgu zamanı, dış çağrılar)?
- Veritabanının bağlantı limitine veya CPU limitine yakın olup olmadığını ve sorguların kuyruğa girip girmediğini görebiliyor musunuz?
- Bir alarm tetiklendiyse, bir sonraki eylemi (geri al, ölçekle, DB bağlantılarını kontrol et, bir endpoint'i incele) öneriyor mu?
Loglar aynı anda güvenli ve kullanışlı olmalı. Bir başarısız isteği servisler arasında takip etmek için yeterli bağlam sağlamalı, ama kişisel verileri sızdırmamalıdır.
Log sağduyu kontrolü
Son başarısızlıklardan birini seçin ve loglarını açın. request_id, endpoint, durum kodu, süre ve net bir hata mesajı olduğundan emin olun. Ayrıca ham token'ları, parolaları, tam ödeme detaylarını veya kişisel alanları loglamadığınızdan emin olun.
Eğer CRUD ağırlıklı backend'leri AppMaster ile inşa ediyorsanız, bu kontrolleri birleştiren tek bir “olay görünümü” hedefleyin: hatalar, endpoint'e göre p95 gecikme ve DB sağlığı. Bu, iş uygulamalarındaki çoğu kesintiyi kapsar.
Örnek: doğru sinyallerle yavaş bir CRUD ekranını teşhis etmek
Bir iç yönetici portalı sabah iyi çalışırken yoğun saatte belirgin şekilde yavaşlıyor. Kullanıcılar “Siparişler” listesini açmanın ve düzenlemeleri kaydetmenin 10–20 saniye sürdüğünü bildiriyor.
İlk olarak üst seviye sinyallere bakıyorsunuz. API panosu, okuma endpointlerinin p95 gecikmesinin sabah ~300 ms'den 4–6 s'e çıktığını gösteriyor, hata oranı düşük kaldı. Aynı zamanda veritabanı paneli aktif bağlantıların havuz limitine yakın olduğunu ve kilit beklemelerinde artış olduğunu gösteriyor. Backend düğümlerinin CPU'su normal, bu yüzden problem CPU değil.
Sonra bir yavaş isteği alıp loglarda takip ediyorsunuz. GET /orders endpoint'ine göre filtreleyin ve süreye göre sıralayın. 6 saniyelik bir isteğin request_idsini alın ve servisler arasında arayın. Handler hızlı bitmiş ama aynı request_id içindeki DB sorgu log satırı 5.4 saniyelik bir sorgu ve rows=50 ile büyük bir lock_wait_ms gösteriyor.
Artık nedeni net şekilde söyleyebilirsiniz: yavaşlama veritabanı yolunda (yavaş sorgu veya kilit rekabeti), ağ veya backend CPU değil. Minimal bir kurulum size aramayı çok daha hızlı daraltma kazandırır.
Tipik ve güvenli düzeltme sırayla:
- Liste ekranında kullanılan filtre/sıralama için indeks ekleyin veya ayarlayın.
- İlişkili verileri bir sorguda veya join ile fetch ederek N+1 sorgularını kaldırın.
- DB altındaki yük altında havuzu açacak şekilde bağlantı havuzunu ayarlayın.
- Sadece stabil, okuma-ağır veriler için cache ekleyin (ve invalidasyon kurallarını belgeleyin).
Son olarak hedeflenen bir alarm kurun. Sadece endpoint grubu için p95 gecikme 10 dakika boyunca eşik üzerinde kalır ve DB bağlantı kullanımı (örneğin) %80'in üzerindeyse page atın. Bu kombinasyon gürültüyü azaltır ve bir dahaki sefere sorunu daha erken yakalar.
Sonraki adımlar: minimal tutun, sonra gerçek olaylarla geliştirin
Minimal gözlemlenebilirlik kurulumunun ilk gününde sıkıcı hissettirmesi gerekir. Çok fazla pano ve alarmla başlarsanız sonsuza dek onları ayarlamak zorunda kalırsınız ve yine de gerçek sorunları kaçırırsınız.
Her olayı geri bildirim olarak değerlendirin. Düzeltme gönderildikten sonra sorun: neyi daha hızlı fark etmeyi ve teşhis etmeyi sağlardı? Sadece onu ekleyin.
Erken dönemde standartlaştırın, bugün yalnızca bir servise sahip olsanız bile. Loglarda aynı alan adlarını ve metrik isimlerini kullanın ki yeni servisler tartışmaya gerek kalmadan aynı paterni uygulasın. Bu panoların tekrar kullanılmasını sağlar.
Küçük bir sürüm disiplini hızlı geri dönüş sağlar:
- Deploy işaretçisi (sürüm, environment, commit/build ID) ekleyin ki bir problemin bir sürümle başlayıp başlamadığını görün.
- İlk 3 alarm için küçük bir runbook yazın: ne anlama gelir, ilk kontroller, ve kimin sorumlu olduğu.
- Her servis için temel olan tek bir “altın” pano tutun.
AppMaster ile backend'ler üretiyorsanız, gözlemlenebilirlik alanlarınızı ve temel metrikleri servisleri üretmeden önce planlamak yardımcı olur; böylece her yeni API varsayılan olarak tutarlı yapılandırılmış loglar ve sağlık sinyalleri ile gelir. Eğer bu backendlere başlamanız için tek bir yer arıyorsanız, AppMaster (appmaster.io) üretime hazır backend, web ve mobil uygulamalar oluşturacak şekilde tasarlanmıştır ve gereksinimler değiştikçe uygulamanın tutarlı kalmasına yardımcı olur.
Bir seferde yalnızca bir sonraki geliştirmeyi seçin, gerçek acının nereden geldiğine göre:
- Veritabanı sorgu zamanlaması ekleyin (ve en yavaş sorguları bağlamla loglayın).
- Alarmları kullanıcı etkisine işaret edecek şekilde sıkılaştırın, sadece kaynak zirvelerine değil.
- Bir panoyu daha net yapın (grafikleri yeniden adlandırın, eşikleri ekleyin, kullanılmayan panelleri kaldırın).
Her gerçek olaydan sonra bu döngüyü tekrarlayın. Birkaç hafta içinde CRUD uygulamanıza ve API trafiğinize uyacak, genel şablona göre değil gerçek ihtiyaçlara göre şekillenmiş bir izleme setine sahip olursunuz.
SSS
Üretimdeki sorunları açıklamak, çözmekten daha uzun sürmeye başladığında gözlemlenebilirlikle uğraşmaya başlayın. “Rastgele 500'ler”, yavaş liste sayfaları veya tekrarlanamayan zaman aşımı sorunları görüyorsanız, tutarlı bir küçük log, metrik ve alarm seti saatlerce süren tahminleri önler.
Monitoring size bir şeyin yanlış olduğunu söyler; gözlemlenebilirlik neden olduğunu anlamanıza yardımcı olur. Context zengini sinyallerle hangi endpoint, hangi kullanıcı/tenant ve zamanın uygulamada mı yoksa veritabanında mı geçtiğini hızla tespit edebilirsiniz. CRUD API'lerde pratik hedef hızlı tanı koymaktır.
İşlem günlüklerini yapılandırılmış olarak kaydetmek, birkaç temel metrik ve kullanıcı-etkili birkaç alarm ile başlayın. İzleme (tracing) birçok CRUD uygulaması için bekleyebilir; eğer duration_ms, db_time_ms gibi alanlar ve aranabilir bir request_id varsa çoğu sorunu çözebilirsiniz.
Tek bir korelasyon alanı kullanın, örneğin request_id, ve bunu her istek log satırına ve her arka plan işi çalışmasına ekleyin. Kenarda (API gateway veya ilk handler) oluşturun, iç çağrılar boyunca taşıyın ve loglarda bu ID ile arama yaparak tek bir başarısız veya yavaş isteği hızlıca yeniden inşa edin.
Yapılandırılmış loglarda en azından timestamp, level, service, env, route, method, status, duration_ms ve tenant/account için güvenli bir tanımlayıcı (tenant_id veya account_id) bulundurun. Varsayılan olarak kişisel verileri, token'ları ve tam istek gövdelerini loglamaktan kaçının; gerekirse yalnızca sorunlu durumlarda ve redaksiyonla ekleyin.
İstek hızı, 5xx oranı, gecikme yüzdelikleri (en az p50 ve p95) ve temel doygunluk ölçümleri (CPU/bellek ve varsa işçi/kuyruk basıncı). Erken aşamada veritabanı zamanı ve bağlantı havuzu kullanımı özellikle önemlidir; çünkü birçok CRUD kesintisi veritabanı tıkanıklığı veya havuz tükenmesinden kaynaklanır.
Çünkü kullanıcıların hissettiği zayıf kuyrukları gösterirler. Ortalama değerler her şeyi gizleyebilir: ortalama iyi görünürken p95/p99 çok kötü olabilir ve bu da kullanıcıların “rastgele yavaş” hissetmesine yol açar.
Yavaş sorgu oranı ve sorgu zamanının yüzdelikleri, kilit beklemeleri/ölüm kilitleri ve bağlantı kullanımı vs. havuz limitleri. Bunlar veritabanının darboğaz olup olmadığını ve problemin sorgu performansı, içerme (contention) veya bağlantı tükenmesi olup olmadığını gösterir.
Önce kullanıcı semptomlarına alarm kurun: kalıcı 5xx oranı, kalıcı p95 gecikme ve başarılı istekte ani düşüş. Sonrasında neden-odaklı alarmlar ekleyin (DB bağlantıları sınırda, iş kuyruğu birikti gibi) ki on-call sinyali güvenilir ve eyleme dönüştürülebilir kalsın.
Loglara, panolara ve alarmlara versiyon/build meta verisi ekleyin ve deploy işaretçileri kaydedin ki değişiklik gönderildiğinde regresyonun hemen ilişkilendirilebilsin. AppMaster gibi üretilmiş backend'lerde (ör. AppMaster tarafından üretilen Go servisleri) yeniden oluşturma ve yeniden dağıtım sık olabileceğinden bu özellikle önemlidir.


