Định nghĩa SLI/SLO và tính Error Budget
🎯 Mục tiêu: Viết SLO document chuẩn cho một web API, tính error budget theo phút và quyết định policy deploy dựa trên budget còn lại.
🧰 Công cụ / nền tảng: WSL2/Ubuntu hoặc Git Bash, VS Code, bc (basic calculator), curl.
📦 Chuẩn bị: Cài WSL2 + Ubuntu. Kiểm tra: bc --version (có sẵn trên Ubuntu). Tạo thư mục làm việc.
mkdir -p ~/sre-lab && cd ~/sre-lab
▶️ Các bước:
Bước 1 — Viết SLO Document
cat > slo-payment-api.md << 'EOF'
# SLO Document — Payment API v1
## Service Overview
- **Service:** payment-api (checkout endpoint)
- **Owner:** [email protected]
- **Review cadence:** Monthly
## SLIs (Service Level Indicators)
| SLI Name | Query / Metric | Good event definition |
|-----------------|-------------------------------------------------------|-------------------------------|
| Availability | HTTP 2xx responses / total responses | status_code < 500 |
| Latency p99 | 99th percentile response time | latency_ms < 500 |
| Error Rate | HTTP 5xx responses / total responses | error_rate < 0.1% |
## SLOs (Service Level Objectives)
| SLO | Target | Window |
|----------------------|-----------|--------------|
| Availability | >= 99.9% | 30-day rolling|
| Latency p99 | <= 500ms | 7-day rolling |
| Error Rate | < 0.1% | 24h rolling |
## SLA (external commitment)
- Availability >= 99.5% per month (buffer: 0.4%)
- Violation → 10% service credit
## Error Budget Policy
- Budget > 50% remaining: normal deploy cadence
- Budget 10–50% remaining: require extra review + canary
- Budget < 10% remaining: freeze feature deployments
- Budget = 0: full freeze, SRE focuses on reliability only
EOF
echo "SLO document created."
Bước 2 — Tính Error Budget
# Các biến cơ bản
SLO=99.9 # percent
WINDOW_DAYS=30
# Tổng số phút trong window
TOTAL_MINUTES=$(echo "$WINDOW_DAYS * 24 * 60" | bc)
echo "Total minutes in window: $TOTAL_MINUTES"
# Output: Total minutes in window: 43200
# Error budget (phút được phép downtime)
ERROR_BUDGET=$(echo "scale=2; $TOTAL_MINUTES * (100 - $SLO) / 100" | bc)
echo "Error budget (minutes): $ERROR_BUDGET"
# Output: Error budget (minutes): 43.20
# Giả sử tháng này đã có 2 incidents: 15 phút + 10 phút
CONSUMED=25
REMAINING=$(echo "scale=2; $ERROR_BUDGET - $CONSUMED" | bc)
PCT_REMAINING=$(echo "scale=1; $REMAINING * 100 / $ERROR_BUDGET" | bc)
echo "Budget consumed: ${CONSUMED} min"
echo "Budget remaining: ${REMAINING} min (${PCT_REMAINING}%)"
# Policy decision
if (( $(echo "$PCT_REMAINING > 50" | bc -l) )); then
echo "DECISION: Green - Normal deploy cadence OK"
elif (( $(echo "$PCT_REMAINING > 10" | bc -l) )); then
echo "DECISION: Yellow - Extra review required before deploy"
else
echo "DECISION: RED - Feature deploys FROZEN"
fi
Bước 3 — Simulate SLI từ log
# Tạo access log giả
cat > access.log << 'EOF'
200 45ms /api/pay
200 120ms /api/pay
500 2ms /api/pay
200 89ms /api/pay
503 1ms /api/pay
200 340ms /api/pay
200 67ms /api/pay
200 510ms /api/pay
200 78ms /api/pay
200 200ms /api/pay
EOF
TOTAL=$(wc -l < access.log)
SUCCESS=$(grep -c "^2" access.log)
ERRORS=$(grep -cE "^5" access.log)
AVAILABILITY=$(echo "scale=4; $SUCCESS * 100 / $TOTAL" | bc)
ERROR_RATE=$(echo "scale=4; $ERRORS * 100 / $TOTAL" | bc)
echo "Total requests: $TOTAL"
echo "Successful (2xx): $SUCCESS"
echo "Errors (5xx): $ERRORS"
echo "Availability: ${AVAILABILITY}%"
echo "Error rate: ${ERROR_RATE}%"
# SLO check
if (( $(echo "$AVAILABILITY >= 99.9" | bc -l) )); then
echo "SLO STATUS: PASSING"
else
echo "SLO STATUS: BREACHED - Burning error budget!"
fi
✅ Kết quả mong đợi: File slo-payment-api.md có đủ 5 mục. Script tính đúng error budget = 43.20 phút. SLO check output rõ PASSING/BREACHED. Policy decision hiển thị Green/Yellow/Red dựa trên budget còn lại.
🧹 Cleanup: cd ~ && rm -rf ~/sre-lab (hoặc giữ lại cho LAB-112).