Tự dựng Grafana OnCall (Self-hosted): Quản lý lịch trực và Escalation chuyên nghiệp cho Team DevOps

Monitoring tutorial - IT technology blog
Monitoring tutorial - IT technology blog

Nỗi ám ảnh mang tên “Alert Fatigue” và sự ra đời của Grafana OnCall

Nếu bạn từng làm Ops, chắc hẳn đã trải qua cảm giác 2 giờ sáng điện thoại rung bần bật vì hơn 50 alert từ Alertmanager đổ về Telegram. Lúc đó, câu hỏi đầu tiên không phải là lỗi gì, mà là: “Ai đang trực? Ai sẽ xử lý ca này?”. Nếu không có quy trình phân công rõ ràng, kết quả thường là cả team cùng thức, hoặc tệ hơn là chẳng ai làm gì vì tưởng người khác đã xử lý.

Hệ thống monitoring của mình theo dõi 15 server và 40 microservices. Setup này giúp phát hiện sự cố nhanh, nhưng khi quy mô tăng lên, mình nhận ra chỉ nhận alert thôi là chưa đủ. Mình cần một công cụ quản lý lịch trực (On-call schedules) và tự động “leo thang” (Escalation) nếu người trực chính không phản hồi. Giải pháp mình chọn là Grafana OnCall.

Trước đây, OnCall chỉ có trên bản Cloud trả phí. Hiện tại, Grafana đã mở mã nguồn cho bản Self-hosted (Open Source). Đây là lựa chọn tuyệt vời để thay thế PagerDuty hay Opsgenie, giúp bạn tiết kiệm ít nhất $20/user/tháng mà vẫn giữ trọn vẹn dữ liệu tại chỗ.

Yêu cầu hệ thống và chuẩn bị

Để OnCall chạy mượt, không bị lag khi xử lý hàng nghìn event, bạn cần chuẩn bị:

  • Server Linux (Ubuntu 22.04 là ổn định nhất).
  • Docker và Docker Compose bản mới nhất.
  • Grafana (phiên bản 9.0 trở lên).
  • Domain và chứng chỉ SSL (bắt buộc nếu bạn muốn nhận Webhook từ bên ngoài).

Về phần cứng, hãy ưu tiên 2 vCPU, 4GB RAM và 20GB SSD. OnCall không chạy đơn lẻ mà kéo theo một “binh đoàn” microservices gồm Redis, PostgreSQL, Celery và RabbitMQ.

Các bước cài đặt Grafana OnCall bằng Docker Compose

Cách nhanh nhất là dùng repo chính thức từ Grafana. Bạn chỉ cần clone về và điều chỉnh vài thông số môi trường.

# Clone repo chính thức
git clone https://github.com/grafana/oncall.git
cd oncall

# Tạo file môi trường từ mẫu
cp .env.example .env

Tiếp theo, hãy mở file .env. Đây là bước quan trọng nhất để hệ thống có thể liên lạc với thế giới bên ngoài:

# Domain truy cập OnCall
EXTERNAL_URL=https://oncall.company.com

# Key bảo mật (nên generate chuỗi dài trên 32 ký tự)
SECRET_KEY=dung-dung-key-mac-dinh-nhe-anh-em

# Kết nối với Grafana hiện có
GRAFANA_API_URL=http://grafana-internal:3000

Sau khi lưu cấu hình, bạn chỉ cần gõ lệnh này là xong:

docker-compose up -d

Hãy đợi khoảng 2 phút để database khởi tạo xong. Bạn có thể kiểm tra trạng thái bằng lệnh docker-compose ps. Nếu tất cả container đều báo Up (healthy), bạn đã thành công một nửa.

Cấu hình OnCall: Từ lịch trực đến quy trình leo thang

Khi truy cập vào giao diện OnCall tích hợp trong Grafana, việc đầu tiên bạn cần làm là thiết lập UsersTeams.

1. Thiết lập Lịch trực (Schedules)

OnCall cho phép tạo lịch trực xoay vòng linh hoạt. Mình thường chia team thành 2 nhóm: trực chính (Primary) và dự phòng (Shadow). Giao diện kéo thả rất trực quan. Một điểm cộng lớn là OnCall hỗ trợ xuất lịch ra iCal. Anh em có thể đồng bộ thẳng vào Google Calendar trên điện thoại để biết chính xác khi nào mình “lên thớt”.

2. Quy trình leo thang (Escalation Chains)

Đây là trái tim của hệ thống. Một quy trình thực tế mình đang áp dụng cho hệ thống production:

  • Phút 0: Gửi thông báo Telegram cho người trực chính.
  • Phút 5: Nếu chưa bấm “Acknowledge”, hệ thống tự động gọi điện qua Twilio.
  • Phút 15: Vẫn không có phản hồi? Tự động ping toàn bộ team và Leader trên Slack/Telegram.

Cơ chế này giúp loại bỏ hoàn toàn tình trạng sót alert do ngủ quên hoặc mất mạng.

Kết nối Telegram để nhận alert 24/7

Tại Việt Nam, Telegram là kênh nhận tin tốt nhất vì tốc độ nhanh và API miễn phí. Bạn cần tạo một Bot qua @BotFather để lấy Token.

Trong menu Chat Ops của OnCall, hãy điền Token vào mục Telegram. Mỗi thành viên cần chat /start với Bot để liên kết tài khoản. Sau đó, Bot sẽ gửi tin nhắn kèm các nút bấm Ack (Xác nhận) hoặc Resolve (Đã xử lý) ngay dưới nội dung alert. Rất tiện lợi.

# Ví dụ cấu hình Webhook
Telegram Bot Token: 7123456789:AAH_... 
Telegram Webhook URL: https://oncall.yourdomain.com/telegram/webhook

Kinh nghiệm vận hành thực tế

Đừng vội tin hệ thống ngay sau khi cài. Mình luôn thực hiện bài test “giả lập sự cố” bằng cách hạ ngưỡng cảnh báo CPU xuống 5%. Nếu tin nhắn đến đúng người, đúng thời điểm và nhảy đúng bước leo thang, lúc đó mới yên tâm được.

Vài lưu ý xương máu cho anh em:

  • Đồng bộ Timezone: Hãy đảm bảo server, Grafana và OnCall cùng múi giờ (thường là Asia/Ho_Chi_Minh). Lệch múi giờ sẽ khiến lịch trực bị nhảy lung tung.
  • Giám sát chính OnCall: Vì đây là lớp bảo vệ cuối cùng, bản thân nó cũng cần được monitor. Mình thường dùng một script đơn giản bên ngoài để check health-check URL của OnCall mỗi phút.
  • Dọn dẹp Database: OnCall lưu trữ rất nhiều event log. Hãy thiết lập policy tự động xóa dữ liệu cũ sau 30 ngày để tránh làm đầy ổ cứng server.

Triển khai Grafana OnCall giúp team mình giải tỏa áp lực tâm lý cực lớn. Ai trực thì người đó lo, những người còn lại có thể yên tâm ngủ ngon mà không sợ bị réo tên vô cớ giữa đêm.

Share: