Membedah hierarki SLI, SLO, dan SLA: cara mendefinisikan indikator availability, latency, dan error rate, menentukan target SLO yang rasional dan terukur, memahami perbedaan SLO vs SLA, lalu mempraktikkan SLO untuk satu service dengan Prometheus

Setelah di episode 2 kita memahami bahwa SLI/SLO/error budget adalah satu hierarki, kini saatnya turun ke detail: bagaimana mendefinisikannya dengan benar. Inilah keterampilan paling fundamental seorang SRE — dan sekaligus paling sering salah dilakukan. Banyak tim menulis "SLO 99.9%" tanpa tahu SLI apa yang diukur, sehingga target itu hanyalah angka di atas kertas.
Kabar baiknya, definisi SLO yang baik mengikuti pola yang bisa dipelajari: pilih perspektif pengguna, pilih metrik yang mewakili pengalaman itu, hitung agregasinya, lalu pilih target yang bermakna. Episode ini membekali kalian pola tersebut, dan mengakhirinya dengan SLO nyata untuk satu service.
SLI (Service Level Indicator) adalah ukuran kuantitatif dari aspek layanan yang dirasakan pengguna. Aturan utamanya satu kalimat: ukurlah dari sudut pandang pengguna, bukan dari sudut pandang server.
Rasio request yang berhasil terhadap total request:
sum(rate(http_requests_total{code=~"2..|3.."}[5m]))
/ sum(rate(http_requests_total[5m]))Perhatikan detail kritis: kita menghitung request berhasil dari sisi client (status code), bukan uptime mesin. Sebuah server yang "hidup" tapi membalas 500 pun dihitung tidak available — karena dari mata pengguna, layanan memang gagal.
Distribusi waktu respons. Ukuran yang dipakai bukan rata-rata, melainkan percentile — karena rata-rata menyembunyikan pengguna yang menderita:
histogram_quantile(0.95,
sum(rate(http_request_duration_seconds_bucket[5m])) by (le))Rasio error terhadap total — sudah tercakup dalam availability, tetapi sering dilaporkan terpisah karena lebih ekspresif untuk debugging. Error di sini juga harus didefinisikan dari perspektif pengguna: timeout dari sisi client adalah error meskipun server "berhasil" membalas.
Important
Pilih 3-4 SLI maksimal per service. Jika kalian mendefinisikan sepuluh SLI, tidak ada yang benar-benar dijaga — alert makin bising, prioritas makin kabur. Tim SRE yang baik justru bisa berdebat lama soal satu SLI yang benar-benar mewakili pengalaman pengguna.
SLO (Service Level Objective) adalah target pada SLI. Pola penulisannya selalu sama:
Contoh SLO yang baik:
| Service | SLO |
|---|---|
| Payment API | Availability 99,9% per 30 hari, latency p95 ≤ 250 ms |
| Frontend | Availability 99,5% per 30 hari, error rate ≤ 0,5% |
| Batch job | Completion 99% dalam 4 jam per hari |
Target bukan sekadar angka teknik: menentukan biaya. Setiap tambahan 9 di belakang koma berarti eksponensial biaya operasional dan batasan rilis. Latihan berpikir yang baik:
SLO 99,9% artinya toleransi downtime ~43 menit per bulan — dan itu boleh dipakai. SLO bukan sasaran moral, melainkan kontrak dengan bisnis.
Ketiganya sering tertukar. Perbedaan praktisnya:
| Istilah | Sifat | Pemilik |
|---|---|---|
| SLI | Metrik mentah yang diukur | Tim teknis |
| SLO | Target internal yang disepakati | Tim teknis + bisnis |
| SLA | Janji kontrak eksternal (punya konsekuensi hukum/finansial) | Legal + bisnis |
Aturan praktis yang dipakai Google: jangan pernah membuat SLA yang lebih ketat dari SLO. SLA punya konsekuensi eksternal (denda, kompensasi), sedangkan SLO adalah target internal. Jika SLA Anda 99,9% tetapi SLO internal 99,95%, Anda punya buffer kecil; jika dibalik, Anda menjanjikan ke pelanggan sesuatu yang tidak dijaga di dalam — resep kegagalan.
Warning
Kesalahan paling umum: membuat SLA "99,99%" untuk menenangkan penjualan, sementara SLO internal hanya 99,9%. Akibatnya setiap bulan tim teknik berdebat dengan pelanggan, dan error budget habis bahkan untuk perbaikan internal. Mulailah dari SLO, lalu turunkan SLA dari sana — bukan sebaliknya.
Kita praktikkan pada stack episode 0. Tambahkan job contoh ke prometheus.yml:
scrape_configs:
- job_name: demo
static_configs:
- targets: ["demo.local:8080"]Jalankan ulang Prometheus, lalu buka query berikut untuk menghitung error budget bulanan yang sudah terpakai:
(1 - sum(rate(http_requests_total{job="demo",code=~"5.."}[30d]))
/ sum(rate(http_requests_total{job="demo"}[30d])))
/ 0.999 * 100Angka yang keluar: persentase error budget yang tersisa. Jika di atas 100%, SLO sudah terlanggar. Untuk mengetahuinya tanpa menghitung manual setiap hari, SLO Reporter sederhana bisa dibuat dengan PromQL record:
groups:
- name: slo
rules:
- record: sli:availability:ratio_rate30d
expr: |
sum(rate(http_requests_total{code=~"2..|3.."}[30d]))
/ sum(rate(http_requests_total[30d]))Tip
Mulailah dari satu SLO sederhana (availability 99,9% pada satu service) dan ukur selama 2-3 minggu sebelum menambah SLO lain. Prosesnya lebih penting dari angkanya: kalian sedang membangun kebiasaan review SLO bulanan, bukan sekadar membuat dashboard yang tidak pernah dibuka.
SLI harus terlihat terus-menerus, bukan dihitung saat krisis. Praktik minimum yang sehat:
Pada episode 3 ini, kalian telah menguasai fondasi pengukuran reliability.
Inti yang harus dibawa pulang:
Di episode 4 selanjutnya, kita akan membahas error budget dan trade-offs — cara menghitung error budget, menggunakannya sebagai alat keputusan rilis, dan menjaga keseimbangan velocity vs reliability di dunia nyata. Sampai jumpa di episode 4!