Cơn ác mộng 2 giờ sáng và bài toán quản lý cảnh báo phân tán
Đồng hồ điểm 2 giờ sáng, chuông PagerDuty réo liên hồi. Mình bật dậy, mắt nhắm mắt mở mở laptop. Hệ thống đang gặp sự cố lớn trên quy mô multi-cluster. Công ty mình chạy Kubernetes trên cả AWS, Google Cloud và một cụm On-premise. Mỗi nơi lại có một bộ Prometheus và Alertmanager riêng biệt.
Lúc đó, mình phải cuống cuồng mở 7 tab trình duyệt để check từng cụm. Cái báo lỗi database, cái báo latency tăng vọt. Giao diện mặc định của Alertmanager quá nghèo nàn, khiến việc định vị lỗi thực sự cực kỳ chậm chạp. Mình nhận ra: Alert fatigue không chỉ do số lượng cảnh báo, mà còn do công cụ quản lý quá phân mảnh.
Sau đêm “đáng nhớ” đó, mình quyết định tìm cách gom tất cả đống lộn xộn này về một màn hình duy nhất. Và Karma chính là cứu cánh.
Nên chọn công cụ nào để quản lý Alertmanager?
Trước khi chốt Karma, mình đã thử qua vài phương án quen thuộc. Dưới đây là góc nhìn thực tế của mình:
1. UI mặc định của Alertmanager
- Điểm cộng: Có sẵn, không tốn tài nguyên cài đặt.
- Điểm trừ: Giao diện lỗi thời từ thập kỷ trước. Nó không có tính năng gom nhóm (grouping) thông minh và không thể xem cảnh báo từ nhiều nguồn cùng lúc.
2. Tích hợp vào Grafana
- Điểm cộng: Tận dụng dashboard đẹp, quen thuộc.
- Điểm trừ: Grafana mạnh về biểu đồ (visualization) hơn là quản lý vòng đời alert. Khi hệ thống có hơn 100 alert cùng lúc, giao diện Grafana bắt đầu trở nên nặng nề và khó thao tác silence nhanh.
3. Karma Dashboard (Lựa chọn tối ưu)
- Điểm cộng: Cực nhẹ, chuyên biệt cho Alertmanager. Nó hỗ trợ filter bằng regex siêu mạnh, gom nhóm alert theo label linh hoạt và kết nối không giới hạn số lượng backend.
- Điểm trừ: Bạn phải tốn thêm một chút công sức để duy trì service này.
Tại sao Karma là “chân ái” của SRE?
Khả năng Filtering là thứ khiến mình ấn tượng nhất. Khi hệ thống scale lớn, bạn sẽ bị ngập trong hàng ngàn alert “rác”. Với Karma, mình chỉ cần gõ một câu query ngắn gọn: @state=active severity=critical cluster=prod. Ngay lập tức, những thứ quan trọng nhất hiện ra, không sót một lỗi nào.
Bên cạnh đó, tính năng Silence management giúp mình tiết kiệm cực nhiều thời gian. Thay vì đăng nhập vào từng cluster để tắt tạm cảnh báo (silence), mình có thể xử lý tập trung ngay trên Karma. Trong đợt bảo trì hệ thống tháng trước, mình đã giảm được 80% số lần click chuột nhờ cách quản lý tập trung này.
Triển khai Karma Dashboard bằng Docker Compose
Cách nhanh nhất để lên đồ là dùng Docker. Dưới đây là cấu hình mình dùng để quản lý 2 cụm Alertmanager (Production và Staging).
Bước 1: Soạn file cấu hình karma.yaml
File này dùng để khai báo các đầu mối Alertmanager mà Karma cần kéo dữ liệu.
# karma.yaml
alertmanager:
interval: 30s
servers:
- name: "Prod-Cluster"
uri: "http://alertmanager-prod:9093"
timeout: 10s
- name: "Staging-Cluster"
uri: "http://alertmanager-staging:9093"
timeout: 10s
karma:
name: "Global Alert Dashboard"
grouping:
default:
groupBy: ["alertname", "cluster", "instance"]
ui:
refresh: 30s
theme: dark
Bước 2: Dựng service với docker-compose.yaml
version: '3.8'
services:
karma:
image: ghcr.io/prymitive/karma:latest
container_name: karma-dashboard
volumes:
- ./karma.yaml:/karma.yaml
environment:
- CONFIG_FILE=/karma.yaml
ports:
- "8080:8080"
restart: always
Bước 3: Kích hoạt
Chạy lệnh này để bắt đầu:
docker-compose up -d
Truy cập http://localhost:8080, bạn sẽ thấy toàn bộ cảnh báo hiện ra ngăn nắp.
Bí kíp sống sót qua mùa On-call
Cài xong thôi là chưa đủ. Để Karma thực sự phát huy sức mạnh, mình thường áp dụng 2 mẹo sau:
Tận dụng Regex Filter
Thanh tìm kiếm của Karma rất lợi hại. Hãy thử các câu lệnh:
alertname=~Cpu.*: Gom toàn bộ lỗi liên quan đến CPU.-cluster=dev: Ẩn các cảnh báo từ môi trường dev để tập trung vào Prod.@state=suppressed: Kiểm tra các alert đang bị tạm ẩn xem có cái nào sắp hết hạn silence không.
Gom nhóm thông minh
Khi một database sập, hàng chục service ăn theo sẽ báo lỗi. Nếu không group lại, màn hình sẽ đỏ rực khiến bạn hoảng loạn. Mình thường group theo job hoặc app để tìm đúng “tâm chấn” của sự cố.
# Thêm vào karma.yaml
karma:
grouping:
default:
groupBy: ["alertname", "service"]
groupMagicLabel: "cluster" # Tự động tách nhóm nếu alert đến từ cluster khác nhau
Kinh nghiệm thực tế từ hiện trường
Ngày mới làm SRE, mình cứ thấy alert là cuống cuồng đi fix. Sau này mình nhận ra khoảng 50% cảnh báo là nhiễu (noise). Karma giúp mình soi ra pattern của các đống nhiễu đó cực nhanh.
Ví dụ: Mình phát hiện một alert CPU thường xuyên nhảy vào 1 giờ sáng rồi tự biến mất. Nhìn trên Karma, mình thấy nó trùng khớp với lịch backup hệ thống. Thay vì thức đêm vô ích, mình tạo một Silence Rule định kỳ ngay trên giao diện Karma là xong.
Lưu ý quan trọng: Karma mặc định không có cơ chế login. Đừng bao giờ public nó thẳng ra Internet. Hãy đặt nó sau VPN hoặc dùng Nginx Basic Auth để tránh việc người lạ vào “tắt nhầm” cảnh báo của bạn.
Lời kết
Gom tất cả cảnh báo về một mối giúp tâm lý người on-call vững vàng hơn hẳn. Bạn không còn phải nhảy qua lại giữa các tab mà có cái nhìn bao quát về toàn bộ hệ thống phân tán. Nếu bạn đang quản lý từ 2 Alertmanager trở lên, hãy triển khai Karma ngay hôm nay để bảo vệ giấc ngủ của chính mình.

