Cảnh Báo Bất Thường Trên Prometheus
Hiện nay, nhiều công ty đang cố gắng nghiên cứu và triển khai các giải pháp để dự đoán sự bất thường nhằm đưa ra các cảnh báo kịp thời. Tuy nhiên, với một người quản trị hệ thống (System Admin) thông thường tại các công ty, việc mua hoặc nghiên cứu các giải pháp chuyên sâu đôi khi là điều không khả thi.
Tuy nhiên, vẫn có những phương pháp giúp các System Admin như chúng ta có thể trải nghiệm việc "nhận biết sự bất thường" một cách miễn phí. GitLab đã giới thiệu một giải pháp giúp phát hiện cảnh báo bất thường trên Prometheus. Chúng ta sẽ cùng nhau khám phá giải pháp này trong bài viết.
Trong giới hạn của bài viết này, chúng ta sẽ tập trung vào những bất thường không có tính chu kỳ (seasonality), điều này thường xảy ra trong quá trình vận hành hệ thống.
Lợi Ích Của Việc Phát Hiện Sự Bất Thường
Việc nhận biết và phát hiện những bất thường trong hệ thống mang lại nhiều lợi ích:
Loại Bỏ Các Cảnh Báo Có Tính Chu Kỳ
Nếu một cảnh báo lặp đi lặp lại mà không gây ảnh hưởng đến hệ thống, ta có thể coi đó là cảnh báo dư thừa và có tính bình thường. Các cảnh báo dư thừa có thể làm kênh cảnh báo của bạn bị spam, làm mất đi những cảnh báo quan trọng. Thậm chí, những cảnh báo này có thể gây ảnh hưởng đến giấc ngủ của người vận hành hệ thống khi chúng xuất hiện vào ban đêm.
Ví dụ: Giả sử bạn đã thiết lập một job chạy vào lúc 2h sáng hàng đêm trên một server. Bạn nhận được cảnh báo về ngưỡng CPU vào thời điểm này, nhưng sau khi theo dõi, bạn nhận ra rằng CPU có thể giảm sau khi job hoàn tất, và điều này không ảnh hưởng đến hệ thống. Để xử lý cảnh báo này, thay vì nâng cấp CPU hoặc tối ưu hóa job, bạn có thể tăng ngưỡng cảnh báo thành giá trị tối đa trong quá trình chạy job. Tuy nhiên, điều này sẽ trở nên khó khăn khi số lượng server mà bạn vận hành ngày càng tăng.
Cải Thiện Các Cảnh Báo Cận Trên và Cận Dưới
Khi sử dụng Prometheus, chúng ta thường đặt các cảnh báo với cận trên và cận dưới. Tuy nhiên, một số metrics chỉ sử dụng cận trên và cận dưới là chưa đủ.
Ví dụ: Bạn có một trang web và đã theo dõi số lượng truy cập. Sau 2 tháng, bạn nhận thấy số lượng người truy cập vào thời điểm 10-11h sáng hàng ngày là khoảng 2000 người. Bạn đã đặt ngưỡng cảnh báo khi số lượng người truy cập lớn hơn hoặc bằng 2100. Nhưng vào một đêm nào đó, website của bạn đã gặp sự cố do bị DDOS, trong khi đó số lượng người truy cập vào ban đêm lại thấp hơn ngưỡng cảnh báo và không được phát hiện. Sự gia tăng đột ngột về lượt truy cập vào ban đêm là một trường hợp bất thường.
Khái Niệm Độ Lệch Chuẩn và Phân Phối Chuẩn
- Độ lệch chuẩn: Là đại lượng thống kê mô tả độ phân tán của một tập dữ liệu. (trích từ Wikipedia)
- Phân phối chuẩn: Còn gọi là phân phối Gauss hay hình chuông Gauss, là một phân phối xác suất quan trọng trong nhiều lĩnh vực. (trích từ Wikipedia)
Áp Dụng Công Thức Gauss Trong Prometheus
Để bắt đầu, chúng ta sẽ lấy metrics node_load1
dưới dạng PromQL:
node_load1{instance="${instance}"}
Tiếp theo, để tính phương sai, chúng ta sử dụng hàm stddev_over_time
:
stddev_over_time(node_load1{instance=~"${instance}"}[khoảng thời gian lấy mẫu])
Sau đó, để tìm giá trị trung bình, chúng ta sử dụng hàm avg_over_time
:
avg_over_time(node_load1{instance="${instance}"}[khoảng thời gian lấy mẫu])
Cuối cùng, để tìm cận trên và cận dưới mà được coi là bình thường:
# Cận trên
avg_over_time(node_load1{instance="${instance}"}[khoảng thời gian lấy mẫu]) + độ lệch chuẩn * stddev_over_time(node_load1{instance=~"${instance}"}[khoảng thời gian lấy mẫu])
# Cận dưới
avg_over_time(node_load1{instance="${instance}"}[khoảng thời gian lấy mẫu]) - độ lệch chuẩn * stddev_over_time(node_load1{instance=~"${instance}"}[khoảng thời gian lấy mẫu])
Hiển Thị Trên Grafana
Giá trị độ lệch chuẩn cần được điều chỉnh theo các metrics đã lấy. Để trực quan hơn, chúng ta có thể vẽ đồ thị lên Grafana:
- Đặt biến cho độ lệch chuẩn: Chỉnh sửa độ lệch chuẩn theo từng metrics, ví dụ với giá trị 3.
- Điền hàm tính cận trên và cận dưới: Chỉnh thời gian lấy mẫu phù hợp, ví dụ với 2 tuần.
- Điền hàm tính giá trị trung bình.
- Điền hàm hiển thị dữ liệu hiện tại.
- Làm đẹp đồ thị.
Các metrics nằm ngoài khoảng giới hạn sẽ được coi là có tính bất thường.
Kết Luận
Chúng ta đã tạo một dashboard Grafana hiển thị sự bất thường với chu kỳ 1 tuần. Tuy nhiên, để phát hiện những bất thường có chu kỳ lớn hơn 1 tuần (ví dụ như dịp lễ, Tết), chúng ta cần áp dụng phương pháp tương ứng.
Tài Liệu Tham Khảo
- Cách sử dụng Prometheus cho phát hiện bất thường từ GitLab.
source: viblo