Penyiapan observabilitas minimal untuk backend dan API CRUD
Penyiapan observabilitas minimal untuk backend yang banyak melakukan CRUD: log terstruktur, metrik inti, dan alert praktis untuk mendeteksi kueri lambat, error, dan gangguan lebih awal.

Masalah yang diselesaikan observabilitas di aplikasi berat CRUD
Aplikasi bisnis yang banyak melakukan CRUD biasanya gagal dalam cara yang membosankan dan mahal. Halaman daftar semakin lambat setiap minggu, tombol simpan kadang-kadang timeout, dan tim support melaporkan “500 acak” yang tidak bisa Anda reproduksi. Tidak ada yang terlihat rusak di pengembangan, tetapi produksi terasa tidak dapat diandalkan.
Biaya sebenarnya bukan hanya insiden. Itu adalah waktu yang dihabiskan untuk menebak. Tanpa sinyal yang jelas, tim lompat-lompat antara “pasti database,” “pasti jaringan,” dan “pasti endpoint itu,” sementara pengguna menunggu dan kepercayaan turun.
Observabilitas mengubah tebakan itu menjadi jawaban. Singkatnya: Anda bisa melihat apa yang terjadi dan memahami kenapa. Anda sampai di sana dengan tiga tipe sinyal:
- Log: apa yang aplikasi putuskan untuk dilakukan (dengan konteks yang berguna)
- Metrik: bagaimana sistem berperilaku sepanjang waktu (latensi, tingkat error, saturasi)
- Trace (opsional): di mana waktu dihabiskan di antara layanan dan database
Untuk aplikasi CRUD dan layanan API, ini lebih tentang diagnosis cepat daripada dashboard mewah. Ketika panggilan “Create invoice” melambat, Anda harus bisa menentukan apakah keterlambatan berasal dari kueri database, API downstream, atau worker yang kelebihan beban dalam hitungan menit, bukan jam.
Setup minimal dimulai dari pertanyaan yang benar-benar perlu Anda jawab di hari buruk:
- Endpoint mana yang gagal atau lambat, dan untuk siapa?
- Apakah ini lonjakan (traffic) atau regresi (rilis baru)?
- Apakah database bottleneck, atau aplikasinya?
- Apakah ini memengaruhi pengguna sekarang, atau hanya memenuhi log?
Jika Anda membangun backend dengan stack yang digenerasi (misalnya, AppMaster menghasilkan layanan Go), aturan yang sama berlaku: mulai kecil, jaga konsistensi sinyal, dan tambahkan metrik atau alert baru hanya setelah insiden nyata membuktikan mereka akan menghemat waktu.
Setup minimal: apa yang Anda butuhkan dan apa yang bisa dilewatkan
Setup observabilitas minimal mempunyai tiga pilar: log, metrik, dan alert. Trace berguna, tetapi untuk kebanyakan aplikasi bisnis CRUD mereka adalah bonus.
Tujuannya jelas. Anda harus tahu (1) kapan pengguna gagal, (2) mengapa mereka gagal, dan (3) di mana di sistem itu terjadi. Jika Anda tidak bisa menjawab itu dengan cepat, Anda akan membuang waktu menebak dan berdebat tentang apa yang berubah.
Set sinyal terkecil yang biasanya membawa Anda ke sana terlihat seperti ini:
- Log terstruktur untuk setiap permintaan dan job latar agar Anda bisa mencari berdasarkan request ID, user, endpoint, dan error.
- Beberapa metrik inti: laju permintaan, laju error, latensi, dan waktu database.
- Alert yang terkait dampak pengguna (lonjakan error atau respons lambat yang berkepanjangan), bukan setiap peringatan internal.
Juga membantu memisahkan gejala dari penyebab. Gejala adalah apa yang dirasakan pengguna: 500, timeout, halaman lambat. Penyebab adalah apa yang membuatnya: kontensi lock, pool koneksi yang jenuh, atau kueri lambat setelah filter baru ditambahkan. Alert pada gejala dan gunakan sinyal “penyebab” untuk investigasi.
Aturan praktis: pilih satu tempat untuk melihat sinyal penting. Berpindah-pindah antara tool log, tool metrik, dan kotak masuk alert terpisah memperlambat Anda ketika itu paling penting.
Log terstruktur yang tetap terbaca saat tekanan
Saat sesuatu rusak, jalur tercepat ke jawaban biasanya: “Permintaan mana tepatnya yang kena ini?” Itulah mengapa ID korelasi yang stabil lebih penting daripada hampir semua tweak log lain.
Pilih satu nama field (umumnya request_id) dan anggap itu wajib. Hasilkan di edge (API gateway atau handler pertama), teruskan melalui panggilan internal, dan sertakan di setiap baris log. Untuk job latar, buat request_id baru per eksekusi job dan simpan parent_request_id ketika job dipicu oleh panggilan API.
Catat dalam format JSON, bukan teks bebas. Itu menjaga log mudah dicari dan konsisten saat Anda lelah, stres, dan membaca cepat.
Set field sederhana sudah cukup untuk kebanyakan layanan API CRUD:
timestamp,level,service,envrequest_id,route,method,statusduration_ms,db_query_counttenant_idatauaccount_id(identifier aman, bukan data pribadi)
Log harus membantu Anda mempersempit “pelanggan mana dan layar mana,” tanpa menjadi kebocoran data. Hindari nama, email, nomor telepon, alamat, token, atau body permintaan penuh secara default. Jika Anda membutuhkan detail lebih dalam, catat hanya atas permintaan dan dengan redaksi.
Dua field memberi manfaat cepat di sistem CRUD: duration_ms dan db_query_count. Mereka menangkap handler lambat dan pola N+1 yang tidak disengaja bahkan sebelum Anda menambahkan tracing.
Definisikan level log supaya semua orang menggunakannya dengan cara yang sama:
info: kejadian yang diharapkan (permintaan selesai, job dimulai)warn: tidak biasa tapi dapat dipulihkan (permintaan lambat, retry berhasil)error: permintaan atau job gagal (exception, timeout, dependency buruk)
Jika Anda membangun backend dengan platform seperti AppMaster, jaga nama field yang sama di seluruh layanan yang digenerasi sehingga “cari berdasarkan request_id” bekerja di mana-mana.
Metrik kunci yang paling penting untuk backend CRUD dan API
Sebagian besar insiden di aplikasi berat CRUD memiliki pola yang familier: satu atau dua endpoint melambat, database tertekan, dan pengguna melihat spinner atau timeout. Metrik Anda harus membuat cerita itu jelas dalam beberapa menit.
Set minimal biasanya mencakup lima area:
- Traffic: request per detik (per route atau setidaknya per service) dan laju permintaan menurut kelas status (2xx, 4xx, 5xx)
- Error: laju 5xx, jumlah timeout, dan metrik terpisah untuk “error bisnis” yang dikembalikan sebagai 4xx (agar Anda tidak memanggil orang untuk kesalahan pengguna)
- Latensi (persentil): p50 untuk pengalaman tipikal dan p95 (kadang p99) untuk deteksi “ada yang salah”
- Saturasi: CPU dan memori, plus saturasi spesifik aplikasi (pemanfaatan worker, tekanan thread/goroutine jika Anda mengeksposenya)
- Tekanan database: p95 durasi kueri, koneksi pool yang sedang digunakan vs maksimum, dan waktu tunggu lock (atau jumlah kueri yang menunggu lock)
Dua detail membuat metrik jauh lebih dapat ditindaklanjuti.
Pertama, pisahkan permintaan API interaktif dari pekerjaan latar. Pengirim email lambat atau loop retry webhook bisa menghabiskan CPU, koneksi DB, atau network keluar dan membuat API terlihat “acak lambat.” Lacak antrean, retry, dan durasi job sebagai deret waktu sendiri, bahkan jika mereka berjalan di backend yang sama.
Kedua, selalu lampirkan metadata versi/build ke dashboard dan alert. Ketika Anda menerapkan backend yang digenerasi (misalnya, setelah meregenerasi kode dari tool no-code seperti AppMaster), Anda ingin menjawab satu pertanyaan dengan cepat: apakah laju error atau p95 latency melonjak tepat setelah rilis ini?
Aturan sederhana: jika sebuah metrik tidak memberi tahu Anda apa yang harus dilakukan selanjutnya (rollback, scale, perbaiki kueri, atau hentikan job), metrik itu tidak termasuk dalam set minimal Anda.
Sinyal database: akar masalah umum pada CRUD
Di aplikasi berat CRUD, database seringkali tempat di mana “terasa lambat” menjadi sakit pengguna yang nyata. Setup minimal harus membuat jelas ketika bottleneck ada di PostgreSQL (bukan kode API), dan jenis masalah DB apa itu.
Yang diukur pertama di PostgreSQL
Anda tidak perlu puluhan dashboard. Mulai dengan sinyal yang menjelaskan sebagian besar insiden:
- Laju kueri lambat dan waktu kueri p95/p99 (plus kueri lambat teratas)
- Lock waits dan deadlock (siapa yang memblokir siapa)
- Penggunaan koneksi (koneksi aktif vs batas pool, koneksi gagal)
- Tekanan disk dan I/O (latensi, saturasi, ruang kosong)
- Lag replikasi (jika Anda menjalankan read replica)
Pisahkan waktu aplikasi vs waktu DB
Tambahkan histogram timing kueri di lapisan API dan tandai dengan endpoint atau kasus penggunaan (misalnya: GET /customers, “search orders”, “update ticket status”). Ini menunjukkan apakah sebuah endpoint lambat karena menjalankan banyak kueri kecil atau satu kueri besar.
Deteksi pola N+1 lebih awal
Layar CRUD sering memicu N+1: satu kueri daftar, lalu satu kueri per baris untuk mengambil data terkait. Perhatikan endpoint di mana jumlah permintaan tetap datar tetapi jumlah kueri DB per permintaan meningkat. Jika Anda menghasilkan backend dari model dan logika bisnis, sering di situlah Anda menyetel pola pengambilan data.
Jika Anda sudah punya cache, lacak hit rate. Jangan tambahkan cache hanya untuk memperbaiki grafik.
Anggap perubahan skema dan migrasi sebagai window risiko. Catat kapan mereka mulai dan selesai, lalu awasi lonjakan lock, waktu kueri, dan error koneksi selama jendela itu.
Alert yang membangunkan orang yang tepat untuk alasan yang tepat
Alert harus menunjuk ke masalah pengguna nyata, bukan grafik sibuk. Untuk aplikasi CRUD, mulailah dengan memantau apa yang dirasakan pengguna: error dan lambat.
Jika Anda hanya menambahkan tiga alert di awal, buatlah:
- kenaikan laju 5xx
- p95 latency yang berkepanjangan
- penurunan mendadak pada permintaan sukses
Setelah itu, tambahkan beberapa alert “penyebab kemungkinan”. Backend CRUD sering gagal dengan cara yang dapat diprediksi: database kehabisan koneksi, antrean latar menumpuk, atau satu endpoint mulai timeout dan menyeret seluruh API turun.
Ambang: baseline + margin, bukan tebakan
Mengunci angka seperti “p95 > 200ms” jarang berhasil di semua lingkungan. Ukurlah minggu normal, lalu set alert sedikit di atas normal dengan margin aman. Misalnya, jika p95 biasanya 350–450ms selama jam kerja, alert pada 700ms selama 10 menit. Jika 5xx biasanya 0.1–0.3%, paging pada 2% selama 5 menit.
Jaga ambang agar stabil. Jangan setel setiap hari. Setel ulang setelah insiden, ketika Anda bisa mengaitkan perubahan ke hasil nyata.
Paging vs tiket: putuskan sebelum Anda membutuhkannya
Gunakan dua tingkat keparahan agar orang mempercayai sinyal:
- Page ketika pengguna terblokir atau data berisiko (5xx tinggi, timeout API, pool koneksi DB hampir habis).
- Buat tiket ketika menurun tapi tidak mendesak (peningkatan lambat p95, backlog antrean, penggunaan disk yang meningkat).
Bungkam alert selama perubahan yang diharapkan seperti window deploy dan maintenance terencana.
Buat alert yang dapat ditindaklanjuti. Sertakan “apa yang diperiksa pertama” (endpoint teratas, koneksi DB, rilis terbaru) dan “apa yang berubah” (rilis baru, update skema). Jika Anda membangun di AppMaster, catat backend atau modul mana yang paling baru diregenerasi dan dideploy, karena itu sering kali petunjuk tercepat.
SLO sederhana untuk aplikasi bisnis (dan bagaimana mereka membentuk alert)
Setup minimal menjadi lebih mudah ketika Anda memutuskan apa arti “cukup baik”. Itulah fungsi SLO: target yang jelas yang mengubah monitoring kabur menjadi alert spesifik.
Mulai dengan SLI yang memetakan apa yang dirasakan pengguna: availability (apakah pengguna dapat menyelesaikan permintaan), latensi (seberapa cepat aksi selesai), dan tingkat error (seberapa sering permintaan gagal).
Set SLO per grup endpoint, bukan per route. Untuk aplikasi CRUD ini menjaga keterbacaan: read (GET/list/search), write (create/update/delete), dan auth (login/refresh token). Ini menghindari ratusan SLO kecil yang tidak dipelihara.
Contoh SLO yang sesuai ekspektasi tipikal:
- Aplikasi CRUD internal (portal admin): 99.5% availability per bulan, 95% read di bawah 800 ms, 95% write di bawah 1.5 s, error rate di bawah 0.5%.
- API publik: 99.9% availability per bulan, 99% read di bawah 400 ms, 99% write di bawah 800 ms, error rate di bawah 0.1%.
Error budget adalah waktu “buruk” yang diizinkan dalam SLO. SLO availability 99.9% per bulan berarti Anda bisa menghabiskan sekitar 43 menit downtime per bulan. Jika Anda menghabiskannya lebih awal, hentikan perubahan berisiko sampai stabil kembali.
Gunakan SLO untuk memutuskan apa yang pantas menjadi alert versus tren dashboard. Alert saat Anda membakar error budget dengan cepat (pengguna benar-benar gagal), bukan saat metrik sedikit lebih buruk dari kemarin.
Jika Anda membangun backend dengan cepat (misalnya, AppMaster menghasilkan layanan Go), SLO menjaga fokus pada dampak pengguna meski implementasi berubah di bawahnya.
Langkah demi langkah: bangun setup observabilitas minimal dalam sehari
Mulailah dengan bagian sistem yang paling disentuh pengguna. Pilih panggilan API dan job yang, jika lambat atau rusak, membuat seluruh aplikasi terasa down.
Tuliskan endpoint teratas dan pekerjaan latar Anda. Untuk aplikasi bisnis CRUD, biasanya itu login, list/search, create/update, dan satu job ekspor atau impor. Jika Anda membangun backend dengan AppMaster, sertakan endpoint yang digenerasi dan Business Process yang berjalan terjadwal atau via webhook.
Rencana satu hari
- Jam 1: Pilih 5 endpoint teratas dan 1–2 job latar. Catat seperti apa “baik”: latensi tipikal, tingkat error yang diharapkan, waktu DB normal.
- Jam 2–3: Tambahkan log terstruktur dengan field konsisten:
request_id,user_id(jika ada),endpoint,status_code,latency_ms,db_time_ms, danerror_codesingkat untuk kegagalan yang diketahui. - Jam 3–4: Tambahkan metrik inti: request per detik, p95 latency, laju 4xx, laju 5xx, dan timing DB (durasi kueri dan saturasi pool koneksi jika tersedia).
- Jam 4–6: Bangun tiga dashboard: overview (kesehatan sekilas), detail API (pemisahan per endpoint), dan view database (kueri lambat, lock, penggunaan koneksi).
- Jam 6–8: Tambahkan alert, jalankan kegagalan terkontrol, dan konfirmasi alert dapat ditindaklanjuti.
Jaga alert sedikit dan fokus. Anda ingin alert yang menunjuk ke dampak pengguna, bukan “ada yang berubah”.
Alert awal yang direkomendasikan (5–8 total)
Set starter yang solid: p95 latency API terlalu tinggi, laju 5xx berkepanjangan, lonjakan 4xx mendadak (sering masalah auth atau validasi), kegagalan job latar, kueri DB lambat, koneksi DB mendekati limit, dan ruang disk rendah (jika self-hosted).
Lalu tulis runbook kecil per alert. Satu halaman cukup: apa yang diperiksa pertama (panel dashboard dan field log kunci), penyebab kemungkinan (lock DB, index hilang, query lambat), dan tindakan aman pertama (restart worker macet, rollback perubahan, hentikan job berat).
Kesalahan umum yang membuat monitoring berisik atau tak berguna
Cara tercepat menyia-nyiakan setup observabilitas minimal adalah memperlakukan monitoring sebagai checklist. Aplikasi CRUD biasanya gagal dengan beberapa cara yang dapat diprediksi (panggilan DB lambat, timeout, rilis buruk), jadi sinyal Anda harus tetap fokus pada itu.
Kegagalan yang paling umum adalah kelelahan alert: terlalu banyak alert, terlalu sedikit tindakan. Jika Anda membangunkan orang untuk setiap lonjakan, mereka berhenti mempercayai alert dalam dua minggu. Aturan bagus: sebuah alert harus menunjuk ke perbaikan yang mungkin, bukan hanya “ada yang berubah”.
Kesalahan klasik lain adalah tidak ada correlation ID. Jika Anda tidak bisa mengaitkan log error, permintaan lambat, dan kueri DB ke satu permintaan, Anda kehilangan jam. Pastikan setiap permintaan mendapat request_id (dan sertakan di log, trace jika ada, dan respons jika aman).
Apa yang biasanya menciptakan noise
Sistem berisik cenderung berbagi masalah yang sama:
- Satu alert mencampur 4xx dan 5xx, sehingga kesalahan klien dan server tampak identik.
- Metrik hanya melacak rata-rata, menyembunyikan tail latency (p95 atau p99) di mana pengguna merasa sakit.
- Log memasukkan data sensitif secara tidak sengaja (password, token, body permintaan penuh).
- Alert memicu pada gejala tanpa konteks (CPU tinggi) bukan dampak pengguna (laju error, latensi).
- Deploy tidak terlihat, sehingga regresi terlihat seperti kegagalan acak.
Aplikasi CRUD sangat rentan pada “perangkap rata-rata.” Satu kueri lambat bisa membuat 5% permintaan terasa menyakitkan sementara rata-rata terlihat baik. Tail latency ditambah laju error memberi gambaran yang lebih jelas.
Tambahkan marker deploy. Baik Anda mengirim dari CI atau meregenerasi kode di platform seperti AppMaster, catat versi dan waktu deployment sebagai event dan di log Anda.
Pemeriksaan cepat: checklist observabilitas minimal
Setup Anda bekerja ketika Anda bisa menjawab beberapa pertanyaan dengan cepat, tanpa menggali dashboard selama 20 menit. Jika Anda tidak bisa mendapat “ya/tidak” dengan cepat, Anda kehilangan sinyal kunci atau view Anda terlalu tersebar.
Pemeriksaan cepat saat insiden
Anda harus bisa melakukan sebagian besar ini dalam kurang dari satu menit:
- Bisakah Anda mengatakan apakah pengguna gagal sekarang (ya/tidak) dari satu tampilan error (5xx, timeout, job gagal)?
- Bisakah Anda melihat grup endpoint paling lambat dan p95-nya, dan apakah itu menjadi lebih buruk?
- Bisakah Anda memisahkan waktu aplikasi vs waktu DB untuk sebuah permintaan (waktu handler, waktu kueri DB, panggilan eksternal)?
- Bisakah Anda melihat apakah database mendekati batas koneksi atau batas CPU, dan apakah kueri sedang mengantri?
- Jika alert menyala, apakah itu menyarankan aksi berikutnya (rollback, scale, cek koneksi DB, inspeksi satu endpoint), bukan hanya “latensi tinggi"?
Log harus aman dan berguna sekaligus. Mereka butuh cukup konteks untuk mengikuti satu permintaan yang gagal antar layanan, tapi tidak boleh membocorkan data pribadi.
Pemeriksaan kewajaran log
Pilih satu kegagalan baru-baru ini dan buka lognya. Konfirmasi Anda memiliki request_id, endpoint, status code, durasi, dan pesan error yang jelas. Juga konfirmasi Anda tidak mencatat token mentah, password, detail pembayaran penuh, atau field pribadi.
Jika Anda membangun backend CRUD dengan AppMaster, targetkan satu “incident view” yang menggabungkan pemeriksaan ini: error, p95 latency per endpoint, dan kesehatan DB. Itu saja menutup sebagian besar outage nyata di aplikasi bisnis.
Contoh: mendiagnosis layar CRUD yang lambat dengan sinyal yang tepat
Portal admin internal baik-baik saja sepanjang pagi, lalu terasa lambat selama jam sibuk. Pengguna mengeluh membuka daftar “Orders” dan menyimpan perubahan memakan 10–20 detik.
Mulai dari sinyal tingkat atas. Dashboard API menunjukkan p95 latency untuk endpoint baca melonjak dari ~300 ms menjadi 4–6 s, sementara laju error tetap rendah. Pada saat yang sama, panel database menunjukkan koneksi aktif mendekati limit pool dan peningkatan lock waits. CPU node backend normal, jadi ini tidak terlihat seperti masalah compute.
Selanjutnya, pilih satu permintaan lambat dan ikuti lewat log. Filter berdasarkan endpoint (misalnya, GET /orders) dan urutkan berdasarkan durasi. Ambil request_id dari permintaan 6 detik dan cari di seluruh layanan. Anda melihat handler selesai cepat, tetapi baris log kueri DB dalam request_id yang sama menunjukkan kueri 5.4 detik dengan rows=50 dan lock_wait_ms besar.
Sekarang Anda bisa menyatakan penyebab dengan yakin: perlambatan ada di jalur database (kueri lambat atau kontensi lock), bukan jaringan atau CPU backend. Itulah keuntungan setup minimal: mempersempit pencarian lebih cepat.
Perbaikan tipikal, berdasarkan urutan keamanan:
- Tambah atau sesuaikan index untuk filter/sort yang digunakan pada layar daftar.
- Hilangkan N+1 dengan mengambil data terkait dalam satu kueri atau join tunggal.
- Atur pool koneksi supaya tidak membuat DB kelaparan di bawah beban.
- Tambahkan caching hanya untuk data baca-stabil dan dokumentasikan aturan invalidasinya.
Tutup loop dengan alert yang terarah. Page hanya ketika p95 latency grup endpoint tetap di atas ambang Anda selama 10 menit dan penggunaan koneksi DB di atas (misalnya) 80%. Kombinasi itu menghindari noise dan menangkap masalah ini lebih awal berikutnya.
Langkah berikutnya: jaga tetap minimal, lalu tingkatkan berdasarkan insiden nyata
Setup observabilitas minimal harus terasa membosankan di hari pertama. Jika Anda mulai dengan terlalu banyak dashboard dan alert, Anda akan terus menyetel mereka dan tetap melewatkan masalah nyata.
Anggap setiap insiden sebagai umpan balik. Setelah perbaikan dikirim, tanyakan: apa yang seharusnya membuat ini lebih cepat terlihat dan lebih mudah didiagnosis? Tambahkan hanya itu.
Standarisasi sejak awal, bahkan jika Anda hanya punya satu layanan hari ini. Gunakan nama field yang sama di log dan nama metrik yang sama di mana-mana agar layanan baru cocok pola tanpa debat. Itu juga membuat dashboard dapat dipakai ulang.
Disiplin rilis kecil memberi manfaat cepat:
- Tambahkan marker deploy (versi, environment, commit/build ID) sehingga Anda bisa melihat apakah masalah dimulai setelah rilis.
- Tulis runbook kecil untuk 3 alert teratas: apa artinya, pemeriksaan pertama, dan siapa pemiliknya.
- Simpan satu dashboard “emas” dengan esensial untuk setiap layanan.
Jika Anda membangun backend dengan AppMaster, membantu untuk merencanakan field observabilitas dan metrik kunci sebelum menghasilkan layanan, sehingga setiap API baru dikirim dengan log terstruktur dan sinyal kesehatan yang konsisten secara default. Jika Anda ingin satu tempat untuk mulai membangun backend itu, AppMaster (appmaster.io) dirancang untuk menghasilkan backend, web, dan aplikasi mobile siap produksi sambil menjaga implementasi konsisten seiring perubahan kebutuhan.
Pilih satu perbaikan berikutnya berdasarkan apa yang benar-benar menyakitkan:
- Tambah timing kueri database (dan catat kueri terlambat teratas dengan konteks).
- Perketat alert supaya menunjuk ke dampak pengguna, bukan hanya lonjakan resource.
- Buat satu dashboard lebih jelas (ganti nama chart, tambahkan ambang, hapus panel yang tidak terpakai).
Ulangi siklus itu setelah setiap insiden nyata. Dalam beberapa minggu, Anda akan memiliki monitoring yang cocok untuk aplikasi CRUD dan trafik API Anda daripada template generik.
FAQ
Mulailah dengan observabilitas ketika masalah produksi membutuhkan waktu lebih lama untuk dijelaskan daripada untuk diperbaiki. Jika Anda melihat “500 acak”, halaman daftar yang lambat, atau timeout yang tidak bisa direproduksi, seperangkat log, metrik, dan alert konsisten yang kecil akan menghemat jam menebak-nebak.
Monitoring memberi tahu Anda bahwa sesuatu salah, sementara observabilitas membantu Anda memahami mengapa itu terjadi dengan sinyal kaya-konteks yang bisa Anda korelasikan. Untuk API CRUD, tujuan praktisnya adalah diagnosis cepat: endpoint mana, user/tenant mana, dan apakah waktu dihabiskan di aplikasi atau di database.
Mulai dengan log permintaan terstruktur, beberapa metrik inti, dan beberapa alert berdampak-pengguna. Tracing bisa menunggu untuk banyak aplikasi CRUD jika Anda sudah mencatat duration_ms, db_time_ms (atau serupa), dan request_id yang stabil yang bisa dicari di mana-mana.
Gunakan satu field korelasi seperti request_id dan sertakan di setiap baris log permintaan dan setiap eksekusi job latar. Hasilkan ID ini di edge, teruskan melalui panggilan internal, dan pastikan Anda bisa mencari log berdasarkan ID itu untuk merekonstruksi satu permintaan yang gagal atau lambat dengan cepat.
Catat timestamp, level, service, env, route, method, status, duration_ms, dan identifier aman seperti tenant_id atau account_id. Hindari mencatat data pribadi, token, dan body permintaan penuh secara default; jika perlu detail, tambahkan hanya untuk error tertentu dengan redaksi.
Lacak laju permintaan, laju 5xx, persentil latensi (setidaknya p50 dan p95), dan saturasi dasar (CPU/memory plus tekanan worker atau antrean yang Anda miliki). Tambahkan waktu database dan penggunaan pool koneksi sejak dini, karena banyak outage CRUD sebenarnya adalah kontensi database atau kehabisan pool.
Karena mereka menyembunyikan ekor lambat yang sebenarnya dirasakan pengguna. Rata-rata bisa terlihat baik sementara p95 buruk untuk sebagian permintaan yang signifikan — itulah yang membuat layar CRUD terasa “acak lambat” tanpa kesalahan yang jelas.
Pantau laju kueri lambat dan persentil waktu kueri, lock waits/deadlock, dan penggunaan koneksi versus batas pool. Sinyal-sinyal ini memberi tahu apakah database menjadi bottleneck dan apakah masalahnya performa kueri, kontensi, atau sekadar kehabisan koneksi saat beban tinggi.
Mulailah dengan alert pada gejala yang dirasakan pengguna: laju 5xx yang berkepanjangan, p95 latency yang berkepanjangan, dan penurunan mendadak pada permintaan sukses. Tambahkan alert yang mengarah ke penyebab hanya setelah itu (seperti koneksi DB mendekati limit atau backlog job) agar sinyal on-call tetap dapat dipercaya dan dapat ditindaklanjuti.
Lampirkan metadata versi/build ke log, dashboard, dan alert, dan catat marker deploy sehingga Anda bisa melihat kapan perubahan dikirim. Dengan backend yang digenerasi (seperti layanan Go yang dihasilkan AppMaster), ini sangat penting karena regenerasi dan redeploy bisa sering terjadi, dan Anda ingin cepat memastikan apakah regresi dimulai tepat setelah rilis.


