Ketika Data yang Memutuskan: Menggunakan Observability untuk Mendorong Progressive Delivery
Kamu baru saja mendorong versi baru aplikasi. Deployment canary mulai merutekan 10 persen traffic ke instance baru. Seluruh tim menatap dashboard. Apakah ini berfungsi? Apakah ini gagal? Haruskah kamu lanjutkan atau hentikan?
Tanpa data nyata, kamu hanya menebak. Dan menebak saat rilis adalah cara masalah kecil berubah menjadi insiden produksi.
Progressive delivery — baik kamu menyebutnya canary, blue-green, atau phased rollout — hanya berfungsi jika kamu memiliki cara yang andal untuk mengukur apakah versi baru benar-benar sehat. Keputusan untuk melanjutkan, menahan, atau melakukan rollback harus didasarkan pada sesuatu yang lebih solid daripada perasaan atau sekilas melihat satu grafik.
Empat Sinyal yang Penting Selama Rilis
Ketika versi baru mulai menerima traffic, empat metrik memberikan gambaran lengkap tentang apa yang terjadi. Ini bukan pengukuran yang eksotis. Ini adalah sinyal yang sama yang seharusnya sudah kamu pantau di produksi, tetapi selama rilis progresif, kamu perlu membandingkannya antara versi lama dan baru secara real-time.
Error Rate
Ini adalah persentase request yang gagal dari semua request yang mengenai versi baru. Jika aplikasi kamu biasanya berjalan dengan error rate di bawah 0,1 persen, dan tiba-tiba melonjak ke 5 persen setelah versi baru live, ada yang salah.
Lonjakan error rate bisa berasal dari banyak tempat: bug di kode baru, dependensi yang berubah perilaku, atau ketidakcocokan konfigurasi antar lingkungan. Kuncinya adalah bisa melihat perbedaan antara error rate versi lama dan error rate versi baru secara berdampingan. Error rate 0,5 persen pada versi baru mungkin terlihat baik jika dilihat sendiri, tetapi jika versi lama berjalan di 0,05 persen, itu peningkatan sepuluh kali lipat yang layak diselidiki.
Latency
Perubahan waktu respons sering kali menjadi tanda pertama bahwa ada yang tidak beres, bahkan sebelum error muncul. Versi baru mungkin memperkenalkan query database yang lebih lambat, menambahkan langkah pemrosesan yang tidak perlu, atau mengubah cara kerja caching. Pengguna mungkin tidak menyadari beberapa milidetik tambahan, tetapi ketika latency melonjak dari 200 milidetik menjadi 2 detik, pengalaman pengguna menurun secara signifikan.
Pantau latency dari sisi server, tetapi juga dari sisi pengguna jika memungkinkan. Metrik sisi server memberi tahu seberapa cepat aplikasi kamu merespons, tetapi metrik sisi klien memberi tahu apa yang sebenarnya dialami pengguna, termasuk penundaan jaringan dan waktu rendering browser.
Traffic
Metrik ini mengonfirmasi bahwa konfigurasi routing kamu benar-benar berfungsi seperti yang diharapkan. Jika kamu mengatur canary untuk menerima 10 persen traffic, kamu perlu memverifikasi bahwa 10 persen request memang mengenai versi baru. Load balancer yang salah konfigurasi, sticky sessions, atau caching layer dapat menyebabkan traffic terbagi tidak merata.
Volume traffic juga memberi tahu apakah versi baru dapat menangani beban yang sama dengan versi lama. Jika versi baru mulai menjatuhkan koneksi atau menolak request pada tingkat traffic yang sama, itu adalah tanda jelas adanya masalah kapasitas.
Saturation
Saturation mengukur seberapa penuh sumber daya server kamu. CPU, memori, disk I/O, dan koneksi database semuanya perlu dipantau. Jika versi baru tiba-tiba menggunakan memori dua kali lipat dari versi lama, server kamu bisa kehabisan sumber daya dan crash.
Saturation sering kali menjadi indikator awal. Ini muncul sebelum error rate melonjak atau latency meningkat. Jika kamu menangkap saturation lebih awal, kamu bisa menjeda rilis dan menyelidiki sebelum pengguna terpengaruh.
Menetapkan Threshold Sebelum Rilis
Keempat metrik ini tidak berarti banyak tanpa threshold untuk dibandingkan. Kamu perlu mendefinisikan seperti apa "sehat" itu sebelum rilis dimulai, bukan di tengah-tengah ketika semua orang stres dan opini mulai bermunculan.
Tetapkan angka spesifik untuk setiap metrik. Contohnya:
- Error rate harus tetap di bawah 0,5 persen
- Rata-rata latency tidak boleh meningkat lebih dari 20 persen dibandingkan versi lama
- Utilisasi CPU harus tetap di bawah 80 persen
- Penggunaan memori tidak boleh melebihi 90 persen dari kapasitas yang tersedia
Threshold ini harus berasal dari service level objectives (SLO) yang sudah ada atau dari data historis tentang bagaimana aplikasi biasanya berperilaku. Jika kamu tidak memiliki data historis, mulailah dengan angka konservatif dan sesuaikan seiring pembelajaran.
Threshold juga perlu memperhitungkan persentase traffic. Canary yang berjalan pada 5 persen traffic mungkin tidak menunjukkan masalah yang hanya muncul di bawah beban penuh. Pertimbangkan untuk menetapkan threshold berbeda untuk tahap rollout yang berbeda, atau gunakan metode statistik yang mendeteksi anomali bahkan dengan ukuran sampel kecil.
Membuat Keputusan Berdasarkan Data
Setelah metrik mengalir dan threshold ditetapkan, proses keputusan menjadi langsung. Kamu tidak perlu berdebat tentang apakah rilis terlihat baik. Data yang memberi tahu.
Jika semua metrik tetap dalam batas aman untuk periode observasi yang ditentukan — misalnya lima menit data stabil — kamu lanjutkan ke tahap berikutnya. Tingkatkan persentase traffic dari 10 persen menjadi 25 persen, atau pindahkan lebih banyak pengguna ke versi baru. Kemudian amati lagi.
Proses keputusan mengikuti alur yang jelas berdasarkan empat sinyal dan threshold-nya:
Jika ada metrik yang melintasi threshold peringatan tetapi tetap di bawah threshold kritis, tahan rilis. Jangan tingkatkan traffic. Jangan lakukan rollback dulu. Beri tim waktu untuk menyelidiki apakah ini masalah nyata atau lonjakan sementara.
Jika metrik melintasi threshold kritis — error rate melonjak drastis, latency tiga kali lipat, atau server mulai kehabisan memori — lakukan rollback segera. Jangan menunggu rapat. Jangan minta persetujuan. Data sudah memutuskan.
Mengotomatiskan Loop Keputusan
Pengambilan keputusan manual berfungsi untuk tim kecil dan rilis berisiko rendah, tetapi tidak bisa diskalakan. Manusia lambat, tidak konsisten, dan rentan terhadap bias. Orang yang sama yang langsung rollback pada hari Senin mungkin ragu-ragu pada hari Jumat karena rilisnya mendesak.
Pendekatan yang lebih baik adalah mengotomatiskan seluruh loop keputusan. Pipeline deployment kamu harus membaca data observability, membandingkannya dengan threshold, dan memutuskan apakah akan melanjutkan, menahan, atau melakukan rollback tanpa intervensi manusia.
Ini tidak berarti menghilangkan manusia dari proses sepenuhnya. Ini berarti memindahkan keterlibatan manusia ke tempat yang paling bernilai: mendefinisikan threshold, meninjau pola dari waktu ke waktu, dan menangani kasus tepi yang tidak bisa diantisipasi oleh otomatisasi. Keputusan rutin — "apakah canary ini cukup sehat untuk meningkatkan traffic?" — adalah jenis keputusan yang komputer tangani lebih baik daripada manusia.
Checklist Praktis untuk Rilis Berikutnya
Sebelum kamu menjalankan progressive delivery berikutnya, pastikan hal-hal ini sudah siap:
- Error rate, latency, traffic, dan saturation semuanya dikumpulkan untuk versi lama dan baru
- Threshold ditetapkan dan didokumentasikan sebelum rilis dimulai
- Jendela observasi ditentukan (berapa lama menunggu sebelum membuat keputusan)
- Rollback otomatis dikonfigurasi dan diuji, bukan hanya direncanakan
- Seseorang di tim tahu apa yang harus dilakukan jika otomatisasi gagal atau menghasilkan false positive
Kesimpulan
Observability mengubah progressive delivery dari permainan tebak-tebakan menjadi proses berbasis data. Ketika kamu memiliki metrik real-time, threshold yang jelas, dan pengambilan keputusan otomatis, kamu berhenti bertanya "apakah rilis ini aman?" dan mulai bertanya "apa kata data?" Jawabannya selalu menunggu di dashboard dan log kamu. Bagian tersulitnya adalah menyiapkan sistem untuk mendengarkan.