Minimale observability-opzet voor CRUD-backends en API's
Minimale observability-opzet voor CRUD-zware backends: gestructureerde logs, kernmetrics en praktische alerts om trage queries, fouten en uitval vroeg te detecteren.

Welk probleem lost observability op in CRUD-zware apps
CRUD-zware zakelijke apps falen meestal op saaie, dure manieren. Een lijstpagina wordt elke week trager, een opslaan-knop time-out soms, en support hoort over “random 500s” die je niet kunt reproduceren. Niets lijkt kapot in development, maar productie voelt onbetrouwbaar.
De echte kosten zijn niet alleen het incident. Het is de tijd die je kwijt bent met gissen. Zonder duidelijke signalen stuiteren teams tussen “het zal de database zijn”, “het zal het netwerk zijn” en “het zal dat ene endpoint zijn”, terwijl gebruikers wachten en vertrouwen daalt.
Observability verandert die gissingen in antwoorden. Kort gezegd: je kunt zien wat er gebeurde en begrijpen waarom. Je komt er met drie signaaltypen:
- Logs: wat de app besloot te doen (met nuttige context)
- Metrics: hoe het systeem zich over tijd gedraagt (latency, foutpercentages, saturatie)
- Traces (optioneel): waar tijd is doorgebracht over services en de database
Voor CRUD-apps en API-services draait het minder om fancy dashboards en meer om snelle diagnose. Als een “Create invoice”-aanroep vertraagt, moet je binnen minuten kunnen zeggen of de vertraging uit een database-query kwam, een downstream-API of een overbelaste worker — niet pas na uren.
Een minimale setup begint bij de vragen die je echt moet kunnen beantwoorden op een slechte dag:
- Welk endpoint faalt of is traag, en voor wie?
- Is het een piek (traffic) of een regressie (een nieuwe release)?
- Is de database de bottleneck, of de app?
- Treft dit gebruikers nu echt, of vult het alleen logs?
Als je backends bouwt met een gegenereerde stack (bijvoorbeeld AppMaster dat Go-services genereert), geldt dezelfde regel: begin klein, houd signalen consistent en voeg alleen nieuwe metrics of alerts toe nadat een echt incident heeft aangetoond dat ze tijd hadden bespaard.
De minimale setup: wat je nodig hebt en wat je kunt overslaan
Een minimale observability-opzet heeft drie pijlers: logs, metrics en alerts. Traces zijn nuttig, maar voor de meeste CRUD-zware business-apps een bonus.
Het doel is helder. Je moet weten (1) wanneer gebruikers falen, (2) waarom ze falen en (3) waar in het systeem het gebeurt. Als je die vragen niet snel kunt beantwoorden, verspil je tijd met gissen en discussiëren over wat veranderde.
De kleinste set signalen die je daar meestal brengt ziet er zo uit:
- Gestructureerde logs voor elk request en background job zodat je kunt zoeken op request ID, gebruiker, endpoint en fout.
- Een paar kernmetrics: request rate, foutpercentage, latency en database-tijd.
- Alerts gekoppeld aan gebruikersimpact (pieken in fouten of aanhoudend trage responses), niet aan elke interne waarschuwing.
Het helpt ook om symptomen van oorzaken te scheiden. Een symptoom is wat gebruikers voelen: 500s, timeouts, trage pagina's. Een oorzaak is wat het creëert: lock contention, een verzadigde connection pool of een trage query na het toevoegen van een nieuwe filter. Alert op symptomen en gebruik “oorzaak”-signalen om te onderzoeken.
Een praktische regel: kies één plek om de belangrijke signalen te bekijken. Context-switchen tussen een log-tool, een metrics-tool en een aparte alert-inbox vertraagt je wanneer het echt telt.
Gestructureerde logs die leesbaar blijven onder druk
Wanneer iets kapot gaat, is het snelste pad naar een antwoord meestal: “Welk exact request raakte deze gebruiker?” Daarom is een stabiele correlatie-ID belangrijker dan bijna elke andere log-aanpassing.
Kies één veldnaam (gebruikelijk request_id) en behandel het als verplicht. Genereer het aan de rand (API-gateway of eerste handler), draag het mee door interne calls en neem het op in elke logregel. Voor achtergrondjobs maak je per run een nieuwe request_id en sla je een parent_request_id op wanneer een job door een API-call werd gestart.
Log in JSON, niet vrij tekst. Dat houdt logs doorzoekbaar en consistent wanneer je moe bent, gestrest en snel aan het skimmen.
Een eenvoudige set velden is genoeg voor de meeste CRUD-zware API-services:
timestamp,level,service,envrequest_id,route,method,statusduration_ms,db_query_counttenant_idofaccount_id(veilige identifiers, geen persoonlijke data)
Logs moeten je helpen beperken tot “welke klant en welk scherm”, zonder een data-lek te veroorzaken. Vermijd standaard namen, e-mails, telefoonnummers, adressen, tokens of volledige request-bodies. Als je dieper detail nodig hebt, log het dan alleen op aanvraag en met redactie.
Twee velden renderen snel waarde in CRUD-systemen: duration_ms en db_query_count. Ze vangen trage handlers en onbedoelde N+1-patronen voordat je tracing toevoegt.
Definieer loglevels zodat iedereen ze hetzelfde gebruikt:
info: verwachte gebeurtenissen (request voltooid, job gestart)warn: ongewoon maar herstelbaar (traag request, retry geslaagd)error: gefaald request of job (exception, timeout, slechte dependency)
Als je backends bouwt met een platform zoals AppMaster, houd dan dezelfde veldnamen aan voor gegenereerde services zodat “zoeken op request_id” overal werkt.
Kernmetrics die het meest tellen voor CRUD-backends en API's
De meeste incidenten in CRUD-zware apps hebben een herkenbare vorm: één of twee endpoints worden traag, de database raakt belast en gebruikers zien spinners of timeouts. Je metrics moeten dat verhaal binnen enkele minuten duidelijk maken.
Een minimale set dekt meestal vijf gebieden:
- Traffic: requests per seconde (per route of tenminste per service) en request-rate per statusklasse (2xx, 4xx, 5xx)
- Fouten: 5xx-rate, timeouttellingen en een apart metric voor “business errors” teruggegeven als 4xx (zodat je mensen niet paget voor gebruikersfouten)
- Latency (percentielen): p50 voor de typische ervaring en p95 (soms p99) om “er is iets mis” te detecteren
- Saturatie: CPU en geheugen, plus app-specifieke saturatie (worker-utilisatie, thread/goroutine-druk als je dat blootlegt)
- Database-druk: query-duration p95, verbindingen in gebruik versus max, en lock wait-time (of tellingen van queries die wachten op locks)
Twee details maken metrics veel actiegerichter.
Ten eerste: scheid interactieve API-requests van achtergrondwerk. Een trage email-sender of webhook-retry-loop kan CPU, DB-verbindingen of uitgaand netwerk opslokken en de API “random traag” laten lijken. Track queues, retries en jobduur als eigen tijdreeksen, ook als ze op dezelfde backend draaien.
Ten tweede: voeg altijd versie/build-metadata toe aan dashboards en alerts. Wanneer je een nieuw gegenereerd backend uitrolt (bijvoorbeeld na het regenereren van code vanuit een no-code tool zoals AppMaster), wil je snel kunnen beantwoorden: steeg de fout- of p95-latency direct na deze release?
Een simpele regel: als een metric je niet kan vertellen wat te doen (rollback, schalen, query fixen of een job pauzeren), hoort het niet in je minimale set.
Databasesignalen: de gebruikelijke wortel van CRUD-pijn
In CRUD-zware apps is de database vaak waar “het traag aanvoelt” echte gebruikerspijn wordt. Een minimale setup moet duidelijk maken wanneer de bottleneck PostgreSQL is (niet de API-code), en welk type DB-probleem het is.
Wat je als eerste in PostgreSQL moet meten
Je hebt geen tientallen dashboards nodig. Begin met signalen die de meeste incidenten verklaren:
- Langzame query-rate en p95/p99 querytijden (plus de top langzame queries)
- Lock waits en deadlocks (wie blokkeert wie)
- Connection usage (actieve verbindingen versus pool-limiet, gefaalde connecties)
- Schijf- en I/O-druk (latency, saturatie, vrije ruimte)
- Replication lag (als je read-replicas draait)
Scheid app-tijd van DB-tijd
Voeg een query-timing histogram toe in de API-laag en tag het met het endpoint of use case (bijvoorbeeld: GET /customers, “search orders”, “update ticket status”). Dit laat zien of een endpoint traag is omdat het veel kleine queries uitvoert of één grote.
Spot N+1-patronen vroeg
CRUD-schermen triggeren vaak N+1-queries: één lijstquery, daarna één query per rij om gerelateerde data te halen. Let op endpoints waar het request-aantal stabiel blijft maar het aantal DB-queries per request stijgt. Als je gegenereerde backends gebruikt vanuit modellen en businesslogica, is dit vaak waar je het fetch-patroon bijstelt.
Als je al een cache hebt, meet de hit rate. Voeg geen cache toe alleen om betere grafieken te krijgen.
Behandel schema-wijzigingen en migraties als een risicoventster. Noteer wanneer ze beginnen en eindigen en let op pieken in locks, querytijd en connection-fouten tijdens dat venster.
Alerts die de juiste persoon wakker maken om de juiste reden
Alerts moeten wijzen op een echt gebruikersprobleem, niet op een drukke grafiek. Voor CRUD-zware apps begin je met wat gebruikers voelen: fouten en traagheid.
Als je alleen drie alerts toevoegt in het begin, maak ze dan:
- stijgende 5xx-rate
- aanhoudende p95-latency
- een plotselinge daling in succesvolle requests
Daarna voeg je een paar “waarschijnlijke oorzaak”-alerts toe. CRUD-backends falen vaak op voorspelbare manieren: de database raakt zonder verbindingen, een achtergrondqueue hoopt op, of een enkel endpoint begint te time-outen en sleept de hele API mee.
Drempels: basislinie + marge, geen giswerk
Hardcoded getallen zoals “p95 > 200ms” werken zelden in alle omgevingen. Meet een normale week en zet de alert net boven normaal met een veiligheidsmarge. Bijvoorbeeld, als p95 meestal 350–450 ms is tijdens kantooruren, alert dan op 700 ms gedurende 10 minuten. Als 5xx typisch 0.1–0.3% is, page bij 2% gedurende 5 minuten.
Houd drempels stabiel. Pas ze niet elke dag aan. Pas ze aan na een incident, wanneer je veranderingen aan echte uitkomsten kunt koppelen.
Pageren vs ticket: beslis voordat je het nodig hebt
Gebruik twee severiteiten zodat mensen het signaal vertrouwen:
- Page wanneer gebruikers geblokkeerd zijn of data in gevaar is (hoge 5xx, API-timeouts, DB connection pool bijna uitgeput).
- Maak een ticket wanneer het degradeert maar niet urgent is (langzame toename in p95, backlog in queue, schijfgebruik dat omhoog trend).
Zet alerts uit tijdens verwachte veranderingen zoals deploy-vensters en gepland onderhoud.
Maak alerts actiegericht. Voeg “wat je eerst moet checken” toe (top endpoint, DB-verbindingen, recente deploy) en “wat veranderde” (nieuwe release, schema-update). Als je in AppMaster bouwt, noteer welk backend- of moduleonderdeel het laatst is gegenereerd en gedeployed, want dat is vaak de snelste lead.
Simpele SLO's voor zakelijke apps (en hoe ze alerts vormen)
Een minimale setup wordt gemakkelijker als je bepaalt wat “goed genoeg” betekent. Dat is waar SLO's voor zijn: heldere doelen die vage monitoring omzetten in concrete alerts.
Begin met SLIs die mappen naar wat gebruikers voelen: beschikbaarheid (kunnen gebruikers requests voltooien), latency (hoe snel acties afronden) en foutpercentage (hoe vaak requests falen).
Stel SLO's per groep endpoints in, niet per route. Voor CRUD-zware apps houdt groepering het overzichtelijk: reads (GET/list/search), writes (create/update/delete) en auth (login/token refresh). Dat voorkomt honderden kleine SLO's die niemand onderhoudt.
Voorbeelden van SLO's die bij typische verwachtingen passen:
- Interne CRUD-app (admin-portal): 99.5% beschikbaarheid per maand, 95% van read-requests onder 800 ms, 95% van write-requests onder 1.5 s, foutpercentage onder 0.5%.
- Publieke API: 99.9% beschikbaarheid per maand, 99% van read-requests onder 400 ms, 99% van write-requests onder 800 ms, foutpercentage onder 0.1%.
Errorbudgets zijn de toegestane “slechte tijd” binnen de SLO. Een 99.9% maandelijkse beschikbaarheids-SLO betekent dat je ongeveer 43 minuten downtime per maand kunt hebben. Als je dat vroeg in de maand verbruikt, pauzeer risicovolle veranderingen totdat stabiliteit terug is.
Gebruik SLO's om te beslissen wat een alert waard is versus een dashboardtrend. Alert wanneer je het errorbudget snel verbrandt (gebruikers falen actief), niet wanneer een metric iets slechter is dan gisteren.
Als je snel backends bouwt (bijvoorbeeld met AppMaster die een Go-service genereert), houden SLO's de focus op gebruikersimpact zelfs als de implementatie eronder verandert.
Stap voor stap: bouw een minimale observability-setup in een dag
Begin met het gedeelte van het systeem dat gebruikers het meest raken. Kies de API-calls en jobs die, als ze traag of kapot zijn, de hele app laten voelen alsof hij down is.
Schrijf je top endpoints en achtergrondwerk op. Voor een CRUD-business-app zijn dat meestal login, list/search, create/update en één export- of importjob. Als je de backend met AppMaster bouwde, neem dan je gegenereerde endpoints en eventuele Business Process-flows mee die op schema of via webhooks draaien.
Een één-dagsplan
- Uur 1: Kies je top 5 endpoints en 1–2 background jobs. Noteer wat “goed” is: typische latency, verwacht foutpercentage, normale DB-tijd.
- Uren 2–3: Voeg gestructureerde logs toe met consistente velden:
request_id,user_id(als beschikbaar),endpoint,status_code,latency_ms,db_time_msen een korteerror_codevoor bekende fouten. - Uren 3–4: Voeg kernmetrics toe: requests per seconde, p95-latency, 4xx-rate, 5xx-rate en DB-timings (query-duur en connection-pool-saturatie als je die hebt).
- Uren 4–6: Bouw drie dashboards: een overzicht (gezondheid in één oogopslag), een API-detailview (endpoint-breakdown) en een databaseview (langzame queries, locks, connection-gebruik).
- Uren 6–8: Voeg alerts toe, veroorzaak een gecontroleerde fout en bevestig dat de alert actiegericht is.
Houd alerts weinig en gefocust. Je wilt alerts die naar gebruikersimpact wijzen, niet naar “er is iets veranderd”.
Alerts om mee te beginnen (5–8 totaal)
Een goede starterset is: te hoge API p95-latency, aanhoudende 5xx-rate, plotselinge piek in 4xx (vaak auth of validatiewijzigingen), achtergrondjob-fouten, langzame DB-queries, DB-verbindingen bijna op limiet en weinig schijfruimte (als je self-hosted bent).
Schrijf daarna een klein runbook per alert. Eén pagina is genoeg: wat eerst te controleren (dashboardpanelen en sleutel-logvelden), waarschijnlijke oorzaken (DB locks, ontbrekende index, downstream outage) en de eerste veilige actie (herstart een vastgelopen worker, rollback van een wijziging, pauzeer een zware job).
Veelgemaakte fouten die monitoring lawaaierig of nutteloos maken
De snelste manier om een minimale observability-setup te verkwisten is monitoring als een vinkje behandelen. CRUD-zware apps falen meestal op een paar voorspelbare manieren (trage DB-calls, timeouts, slechte releases), dus je signalen moeten daarop gefocust blijven.
De meest voorkomende fout is alert fatigue: te veel alerts, te weinig actie. Als je op elke piek een page stuurt, houden mensen na twee weken geen rekening meer met alerts. Een goede regel is simpel: een alert moet wijzen op een waarschijnlijke fix, niet alleen op “er is iets veranderd.”
Een andere klassieke fout is het ontbreken van correlatie-IDs. Als je een foutlog, een traag request en een DB-query niet aan één request kunt koppelen, verlies je uren. Zorg dat elke request een request_id krijgt (en neem die op in logs, traces als je die hebt, en responses wanneer veilig).
Wat meestal lawaai maakt
Lawaaiige systemen delen vaak dezelfde problemen:
- Eén alert mixte 4xx en 5xx, waardoor clientfouten en serverfouten identiek lijken.
- Metrics meten alleen gemiddelden en verbergen tail-latency (p95 of p99) waar gebruikers pijn voelen.
- Logs bevatten per ongeluk gevoelige data (wachtwoorden, tokens, volledige request-bodies).
- Alerts triggeren op symptomen zonder context (hoge CPU) in plaats van gebruikersimpact (foutpercentage, latency).
- Deploys zijn onzichtbaar, dus regressies lijken op willekeurige fouten.
CRUD-apps zijn vooral vatbaar voor de “gemiddelde-val”: één langzame query kan 5% van requests pijnlijk maken terwijl het gemiddelde er prima uitziet. Tail-latency plus foutpercentage geeft een helderder beeld.
Voeg deploy-markers toe. Of je nu shipt vanuit CI of code exporteert, registreer de versie en deployment-tijd als event en in je logs.
Snelle checks: een minimale observability-checklist
Je setup werkt wanneer je een paar vragen snel kunt beantwoorden, zonder 20 minuten door dashboards te graven. Als je niet snel “ja/nee” kunt krijgen, mis je een sleutel signaal of zijn je views te versnipperd.
Snelle checks tijdens een incident
Je zou het meeste in minder dan een minuut moeten kunnen doen:
- Kun je vanuit één foutview zien of gebruikers nu falen (ja/nee) (5xx, timeouts, mislukte jobs)?
- Kun je het traagste endpoint-groep en diens p95-latency vinden en zien of het erger wordt?
- Kun je app-tijd scheiden van DB-tijd voor een request (handler-tijd, DB-query-tijd, externe calls)?
- Zie je of de database bijna aan connection-limieten of CPU-limieten zit en of queries queuen?
- Als een alert afging, suggereert die een volgende actie (rollback, schaal, check DB-verbindingen, inspecteer één endpoint) en niet alleen “latency hoog”?
Logs moeten zowel veilig als bruikbaar zijn. Ze moeten genoeg context bieden om één falend request door services heen te volgen, maar mogen geen persoonlijke data lekken.
Log sanity check
Kies één recent falen en open de logs. Bevestig dat je request_id, endpoint, status code, duration en een duidelijke foutmelding hebt. Controleer ook dat je geen raw tokens, wachtwoorden, volledige betaalgegevens of persoonlijke velden logt.
Als je CRUD-zware backends met AppMaster bouwt, mik dan op één “incident view” die deze checks combineert: fouten, p95-latency per endpoint en DB-gezondheid. Dat dekt de meeste echte outages in zakelijke apps.
Voorbeeld: een traag CRUD-scherm diagnosticeren met de juiste signalen
Een interne admin-portal is de hele ochtend goed, en wordt dan merkbaar traag tijdens een druk uur. Gebruikers klagen dat het openen van de “Orders”-lijst en het opslaan van bewerkingen 10–20 seconden duurt.
Je begint met top-level signalen. Het API-dashboard toont dat p95-latency voor read-endpoints steeg van ongeveer 300 ms naar 4–6 s, terwijl het foutpercentage laag bleef. Tegelijkertijd toont het database-paneel actieve verbindingen dicht bij de pool-limiet en een toename in lock waits. CPU op de backend-nodes is normaal, dus het lijkt geen compute-probleem.
Vervolgens pak je één traag request en volg je het door de logs. Filter op het endpoint (bijvoorbeeld GET /orders) en sorteer op duur. Pak een request_id van een 6-seconden-request en zoek die door services heen. Je ziet dat de handler snel klaar was, maar de DB-query-logregel binnen diezelfde request_id een query van 5.4 seconden toont met rows=50 en een grote lock_wait_ms.
Nu kun je de oorzaak met vertrouwen stellen: de vertraging zit in het databasepad (een trage query of lock-contentie), niet in het netwerk of backend-CPU. Dat is wat een minimale setup je oplevert: sneller tot de kern komen.
Typische fixes, in volgorde van veiligheid:
- Voeg of pas een index aan voor de gebruikte filter/sort op het lijstscherm.
- Verwijder N+1-queries door gerelateerde data in één query of één join op te halen.
- Stel de connection pool af zodat je de DB niet uithongert onder load.
- Voeg caching alleen toe voor stabiele, read-heavy data (en documenteer invalidatieregels).
Sluit de lus met een gerichte alert. Page alleen wanneer p95-latency voor de endpointgroep boven je drempel blijft gedurende 10 minuten en DB-connectiongebruik boven (bijvoorbeeld) 80% is. Die combinatie voorkomt lawaai en vangt dit probleem eerder de volgende keer.
Volgende stappen: houd het minimaal en verbeter op basis van echte incidenten
Een minimale observability-setup moet op dag één saai aanvoelen. Als je begint met te veel dashboards en alerts, stel je ze eeuwig bij en mis je toch de echte issues.
Behandel elk incident als feedback. Vraag na de fix: wat had het sneller gemaakt om te zien en makkelijker te diagnosticeren? Voeg alleen dát toe.
Standaardiseer vroeg, ook al heb je maar één service vandaag. Gebruik dezelfde veldnamen in logs en dezelfde metric-namen overal zodat nieuwe services het patroon automatisch volgen. Dat maakt dashboards ook herbruikbaar.
Een kleine releasdiscipline betaalt zich snel terug:
- Voeg een deploy-marker toe (versie, omgeving, commit/build ID) zodat je kunt zien of problemen na een release begonnen.
- Schrijf een klein runbook voor de top 3 alerts: wat het betekent, eerste checks en wie het bezit.
- Houd één “gouden” dashboard met de essentie voor elke service.
Als je backends met AppMaster bouwt, helpt het om je observability-velden en kernmetrics te plannen vóór het genereren van services, zodat elke nieuwe API met consistente gestructureerde logs en health-signalen uitgeleverd wordt. Als je één plek zoekt om te beginnen met het bouwen van die backends, is AppMaster (appmaster.io) ontworpen om productieklare backend-, web- en mobiele apps te genereren terwijl de implementatie consistent blijft als requirements veranderen.
Kies per keer één verbetering gebaseerd op wat echt pijn deed:
- Voeg database-query-timing toe (en log de traagste queries met context).
- Verscherp alerts zodat ze wijzen op gebruikersimpact, niet alleen resourcepieken.
- Maak één dashboard duidelijker (hernoem grafieken, voeg drempels toe, verwijder ongebruikte panels).
Herhaal die cyclus na elk echt incident. Binnen een paar weken heb je monitoring die bij je CRUD-app en API-verkeer past in plaats van een generieke template.
FAQ
Begin met observability zodra productieproblemen langer duren om uit te zoeken dan om op te lossen. Als je “random 500s”, trage lijsten of timeouts ziet die je niet kunt reproduceren, besparen een klein setje consistente logs, metrics en alerts uren gokwerk.
Monitoring vertelt je dat er iets mis is; observability helpt je begrijpen waarom het gebeurde door contextrijke signalen die je kunt correleren. Voor CRUD-API's is het praktische doel een snelle diagnose: welk endpoint, welke gebruiker/tenant en of de tijd in de app of de database werd besteed.
Begin met gestructureerde request-logs, een handvol kernmetrics en een paar alerts gericht op gebruikersimpact. Tracing kan voor veel CRUD-apps wachten als je al duration_ms, db_time_ms (of iets vergelijkbaars) en een stabiele request_id logt die je overal kunt doorzoeken.
Gebruik één correlatieveld zoals request_id en voeg het toe aan iedere request-logregel en iedere achtergrondjob-run. Genereer het aan de rand (edge), draag het mee door interne calls en zorg dat je logs kunt doorzoeken op die ID om snel één falende of trage request te reconstrueren.
Log timestamp, level, service, env, route, method, status, duration_ms en veilige identifiers zoals tenant_id of account_id. Vermijd standaard persoonlijke data, tokens en volledige request-bodies; voeg die details alleen op aanvraag en met redactie toe.
Houd request-rate, 5xx-rate, latency-percentielen (minimaal p50 en p95) en basis-saturatie (CPU/memory plus eventuele worker- of queue-druk) bij. Voeg vroeg database-tijd en connection-poolgebruik toe, want veel CRUD-uitval komt door database-contentie of pool-uitputting.
Omdat ze de trage 'tail' verbergen die gebruikers daadwerkelijk ervaren. Gemiddelden kunnen er prima uitzien terwijl p95 erg slecht is voor een relevante groep requests — precies waarom CRUD-schermen ‘random traag’ aanvoelen zonder duidelijke fouten.
Monitor langzame query-rate en query-time-percentielen, lock waits/deadlocks en connection usage versus pool-limieten. Die signalen vertellen of de database de bottleneck is en of het probleem query-prestatie, contentie of simpelweg te weinig verbindingen onder load is.
Begin met alerts op gebruikerssymptomen: aanhoudende 5xx-rate, aanhoudende p95-latency en een plotselinge daling in succesvolle requests. Voeg oorzaak-gerichte alerts alleen daarna toe (zoals DB-verbindingen bijna op limiet of job-backlog) zodat het on-call signaal betrouwbaar en bruikbaar blijft.
Voeg versie/build-metadata toe aan logs, dashboards en alerts en registreer deploy-markers zodat je kunt zien wanneer wijzigingen zijn uitgegaan. Bij gegenereerde backends (zoals AppMaster-generated Go services) is dit vooral belangrijk omdat regeneratie en redeploys vaak voorkomen en je snel wilt bevestigen of een regressie direct na een release begon.
Houd request_id, endpoint, status code, duration en een duidelijke foutmelding in de logs voor een recent falen. Controleer ook dat je geen tokens, wachtwoorden, volledige betaalgegevens of persoonlijke velden in raw vorm logt. Die combinatie maakt reconstructie en veilig onderzoek mogelijk.


