Tập này giúp bạn biết hệ thống còn sống hay đã chết trước khi người dùng kịp báo lỗi: dựng endpoint /health, thu thập metrics bằng django-prometheus và đặt cảnh báo uptime. Kết quả là giám sát tối thiểu nhưng đủ dùng: trạng thái sống/chết, số request và lỗi 5xx. Nối tiếp tập 7 về logging tập trung và bắt lỗi với Sentry, tập này chuyển từ “ghi lại sự cố” sang “phát hiện sự cố ngay khi nó xảy ra”.

1. Endpoint /health: load balancer cần gì?

Load balancer không đọc log, nó chỉ gọi một URL và xem mã trạng thái. Endpoint /health tốt phải rẻ, nhanh và kiểm tra đúng thứ quyết định khả năng phục vụ: kết nối database. Đừng kiểm tra thứ nặng như gửi email thử hay gọi API bên ngoài, vì chúng làm health check chậm và báo sai. Trả 200 khi database trả lời được, 503 khi không.

# monitoring/views.py
from django.db import connection
from django.http import JsonResponse
def liveness(request):
return JsonResponse({"status": "ok"})
def readiness(request):
try:
with connection.cursor() as cursor:
cursor.execute("SELECT 1")
except Exception:
return JsonResponse({"status": "not_ready"}, status=503)
return JsonResponse({"status": "ready"})
# monitoring/urls.py
from django.urls import path
from . import views
urlpatterns = [
path("health/live/", views.liveness, name="liveness"),
path("health/ready/", views.readiness, name="readiness"),
]

2. Phân biệt liveness và readiness

Gộp hai khái niệm này thành một endpoint sẽ gây rắc rối khi deploy. Liveness trả lời “tiến trình còn sống không”, readiness trả lời “đã sẵn sàng nhận traffic chưa”. Khi ứng dụng đang chạy migrations, readiness nên trả 503 để load balancer tạm ngưng gửi request, còn liveness vẫn 200 để orchestrator không giết tiến trình vô ích. Với ứng dụng quản lý chi tiêu, readiness kiểm tra database và Redis.

3. Metrics với django-prometheus

Log cho biết chuyện gì xảy ra với một request cụ thể, metrics cho biết xu hướng của cả hệ thống. Cài django-prometheus, thêm middleware và mở /metrics cho Prometheus scrape. Bạn sẽ có số request theo view, thời gian xử lý và số lỗi. Chuẩn Prometheus dùng được ngay với Grafana và Alertmanager. Bảo vệ /metrics bằng IP nội bộ hoặc basic auth.

# settings.py (production)
INSTALLED_APPS = [
"django_prometheus",
# ...
]
MIDDLEWARE = [
"django_prometheus.middleware.PrometheusBeforeMiddleware",
# ... các middleware khác ...
"django_prometheus.middleware.PrometheusAfterMiddleware",
]
# urls.py (project)
from django.urls import include, path
urlpatterns = [
path("", include("django_prometheus.urls")),
path("", include("monitoring.urls")),
# ...
]

4. Đặt cảnh báo uptime từ metrics

Metrics không có cảnh báo chỉ là biểu đồ đẹp. Bắt đầu với ba cảnh báo: health check thất bại hai lần liên tiếp, lỗi 5xx vượt 1% trong 5 phút, và p95 vượt 2 giây trong 10 phút. Mỗi cảnh báo phải gắn với một hành động cụ thể: xem log theo tập 7, kiểm tra deploy gần nhất, hay mở runbook. Nếu cảnh báo kêu mà không ai biết phải làm gì, hãy sửa runbook trước.

5. Kiểm tra sau khi cấu hình

Chạy server, gọi /health và /metrics bằng curl, tắt thử database để xem /health chuyển sang 503, rồi bật lại và xác nhận readiness hồi phục. Monitoring tốt là phát hiện nhanh và hành động rõ ràng.

curl -i http://localhost:8000/health/live/
curl -i http://localhost:8000/health/ready/
curl http://localhost:8000/metrics | head -20

Áp dụng vào dự án của bạn

Với ứng dụng quản lý chi tiêu, hãy bắt đầu ngay: thêm /health và /health/ready, gắn django-prometheus vào staging trước, và đặt một cảnh báo uptime duy nhất gửi về kênh chat của nhóm. Khi cảnh báo đầu tiên kêu đúng lúc, bạn sẽ mở rộng sang metrics nghiệp vụ như số giao dịch mới mỗi giờ.

Bài viết liên quan

Câu hỏi thường gặp

/health nên kiểm tra những gì?

Chỉ kiểm tra thứ quyết định khả năng phục vụ request, thường là database và cache. Tránh dịch vụ bên ngoài không thiết yếu vì chúng gây báo động giả.

Có nên để /metrics công khai không?

Không. Endpoint metrics lộ số liệu nội bộ và có thể bị lạm dụng để thăm dò hệ thống. Giới hạn bằng IP nội bộ hoặc basic auth.

django-prometheus khác gì với việc tự ghi log thời gian xử lý?

Log ghi từng request rời rạc, khó tổng hợp xu hướng. Metrics tổng hợp sẵn theo thời gian, giúp vẽ biểu đồ và đặt cảnh báo dễ dàng.

Nguồn tham khảo