Prohoster > Blog > quản lý > Dễ dàng làm việc với các cảnh báo phức tạp. Hoặc lịch sử hình thành Balerter
Dễ dàng làm việc với các cảnh báo phức tạp. Hoặc lịch sử hình thành Balerter
Mọi người đều thích cảnh báo.
Tất nhiên, sẽ tốt hơn nhiều nếu được thông báo khi có điều gì đó xảy ra (hoặc đã được khắc phục) hơn là ngồi nhìn vào biểu đồ và tìm kiếm những điều bất thường.
Và nhiều công cụ đã được tạo ra cho việc này. Alertmanager từ hệ sinh thái Prometheus và vmalert từ nhóm sản phẩm VictoriaMetrics. Thông báo và cảnh báo Zabbix trong Grafana. Các tập lệnh tự viết trong bot bash và Telegram định kỳ lấy một số URL và cho bạn biết nếu có điều gì sai. Rất nhiều thứ.
Trong công ty của mình, chúng tôi cũng đã sử dụng các giải pháp khác nhau cho đến khi gặp phải sự phức tạp, hay nói đúng hơn là không thể tạo các cảnh báo tổng hợp, phức tạp. Những gì chúng tôi muốn và những gì chúng tôi đã làm đều nằm dưới mức cắt giảm. TLDR: Đây là cách dự án nguồn mở xuất hiện thợ đóng kiện
Trong một thời gian khá dài, chúng tôi đã sống tốt với các cảnh báo được định cấu hình trong Grafana. Vâng, đây không phải là cách tốt nhất. Chúng tôi luôn khuyến nghị sử dụng một số giải pháp chuyên dụng, chẳng hạn như Alertmanager. Và chúng tôi cũng đã nhiều lần hướng tới việc di chuyển. Và rồi dần dần, chúng tôi muốn nhiều hơn nữa.
Giả sử khi một biểu đồ nhất định giảm/tăng XX% và ở đó được N phút so với khoảng thời gian M giờ trước đó? Có vẻ như bạn có thể thử triển khai điều này bằng Grafana hoặc Alertmanager, nhưng việc này không hoàn toàn dễ dàng. (Hoặc có thể là không thể, bây giờ tôi sẽ không nói)
Mọi chuyện càng trở nên phức tạp hơn khi quyết định cảnh báo phải được đưa ra dựa trên dữ liệu từ nhiều nguồn khác nhau. Ví dụ trực tiếp:
Chúng tôi kiểm tra dữ liệu từ hai cơ sở dữ liệu Clickhouse, sau đó so sánh dữ liệu đó với một số dữ liệu từ Postgres và quyết định cảnh báo. Tín hiệu hoặc hủy bỏ
Chúng tôi đã tích lũy khá nhiều mong muốn giống nhau để chúng tôi suy nghĩ về quyết định của mình. Và sau đó chúng tôi đã cố gắng biên soạn danh sách các yêu cầu/khả năng đầu tiên của dịch vụ này, danh sách này vẫn chưa được tạo.
truy cập các nguồn dữ liệu khác nhau. Ví dụ: Prometheus, Clickhouse, Postgres
gửi thông báo đến nhiều kênh khác nhau - telegram, Slack, v.v.
Trong quá trình suy nghĩ, rõ ràng là tôi không muốn một mô tả mang tính khai báo mà là khả năng viết kịch bản
chạy tập lệnh theo lịch trình
dễ dàng cập nhật các tập lệnh mà không cần khởi động lại dịch vụ
khả năng bằng cách nào đó mở rộng chức năng mà không cần xây dựng lại dịch vụ từ mã nguồn
Danh sách này là gần đúng và rất có thể không chính xác lắm. Một số điểm thay đổi, một số đã chết. Mọi thứ vẫn như thường lệ.
Trên thực tế, đây là cách lịch sử của Balerter bắt đầu.
Tôi sẽ cố gắng mô tả ngắn gọn điều gì đã xảy ra và cách thức hoạt động của nó. (Vâng, tất nhiên, đây chưa phải là kết thúc. Còn rất nhiều kế hoạch phát triển sản phẩm. Tôi sẽ chỉ dừng lại ở hôm nay)
Nó hoạt động như thế nào?
Bạn viết một tập lệnh bằng Lua nơi bạn gửi yêu cầu một cách rõ ràng (tới Prometheus, Clickhouse, v.v.). Bạn nhận được câu trả lời và bằng cách nào đó xử lý và so sánh chúng. Sau đó bật/tắt một số loại cảnh báo. Bản thân Balerter sẽ gửi thông báo đến các kênh mà bạn đã định cấu hình (Email, telegram, Slack, v.v.). Tập lệnh được thực thi theo các khoảng thời gian được chỉ định. Và... nói chung là vậy thôi)
Tốt nhất là hiển thị bằng một ví dụ:
-- @interval 10s
-- @name script1
local minRequestsRPS = 100
local log = require("log")
local ch1 = require("datasource.clickhouse.ch1")
local res, err = ch1.query("SELECT sum(requests) AS rps FROM some_table WHERE date = now()")
if err ~= nil then
log.error("clickhouse 'ch1' query error: " .. err)
return
end
local resultRPS = res[1].rps
if resultRPS < minResultRPS then
alert.error("rps-min-limit", "Requests RPS are very small: " .. tostring(resultRPS))
else
alert.success("rps-min-limit", "Requests RPS ok")
end
Những gì đang xảy ra ở đây:
chúng tôi chỉ ra rằng tập lệnh này sẽ được thực thi cứ sau 10 giây
cho biết tên của tập lệnh (đối với API, để hiển thị trong nhật ký, để sử dụng trong các thử nghiệm)
kết nối mô-đun để xuất nhật ký
kết nối một mô-đun để truy cập clickhouse với tên ch1 (bản thân kết nối được cấu hình trong cấu hình)
gửi yêu cầu tới clickhouse
trong trường hợp có lỗi, chúng tôi hiển thị thông báo trong nhật ký và thoát
so sánh kết quả truy vấn với một hằng số (trong ví dụ trực tiếp, chúng ta có thể lấy giá trị này, ví dụ: từ cơ sở dữ liệu Postgres)
bật hoặc tắt cảnh báo bằng ID rps-min-limit
bạn sẽ nhận được thông báo nếu trạng thái cảnh báo đã thay đổi
Ví dụ khá đơn giản và dễ hiểu. Tuy nhiên, tất nhiên, trong đời thực, kịch bản có thể khá dài và phức tạp. Rất dễ bị nhầm lẫn và mắc sai lầm.
Vì vậy, mong muốn hợp lý đã trưởng thành - có thể viết bài kiểm tra cho tập lệnh của bạn. Và trong phiên bản v0.4.0 điều này đã xuất hiện.
Kịch bản thử nghiệm
Kiểm tra ví dụ cho tập lệnh của chúng tôi từ ví dụ trên:
-- @test script1
-- @name script1-test
test = require('test')
local resp = {
{
rps = 10
}
}
test.datasource('clickhouse.ch1').on('query', 'SELECT sum(requests) AS rps FROM some_table WHERE date = now()').response(resp)
test.alert().assertCalled('error', 'rps-min-limit', 'Requests RPS are very small: 10')
test.alert().assertNotCalled('success', 'rps-min-limit', 'Requests RPS ok')
Từng bước một:
cho biết tên của tập lệnh mà bài kiểm tra được viết
tên kiểm tra (đối với nhật ký)
kết nối mô-đun thử nghiệm
chúng tôi cho biết kết quả nào sẽ được trả lại cho một yêu cầu cụ thể tới clickhouse ch1
chúng tôi kiểm tra xem cảnh báo (lỗi) rps-min-limit với thông báo được chỉ định đã được gọi chưa
kiểm tra xem cảnh báo giới hạn rps-min không bị tắt (thành công)
Balerter có thể làm gì khác?
Theo tôi, tôi sẽ cố gắng đề cập đến điều quan trọng nhất là kỹ năng của Balerter. Bạn có thể xem mọi thứ chi tiết trên trang web chính thức https://balerter.com
nhận dữ liệu từ
nhà nhấp chuột
bưu điện
mysql
Prometheus
Loki
gửi thông báo tới các kênh
lún xuống
điện tín
syslog
thông báo (thông báo UI trên máy tính của bạn)
e-mail
bất hòa
xây dựng biểu đồ dựa trên dữ liệu của bạn, tải hình ảnh lên bộ lưu trữ tương thích S3 và đính kèm nó vào thông báo (Ví dụ bằng hình ảnh)
cho phép bạn trao đổi dữ liệu giữa các tập lệnh - lưu trữ Khóa/Giá trị chung
viết thư viện của riêng bạn bằng Lua và sử dụng chúng trong tập lệnh (theo mặc định, thư viện lua được cung cấp để làm việc với json, csv)
gửi yêu cầu HTTP từ tập lệnh của bạn (và tất nhiên là nhận được phản hồi)
cung cấp API (chưa có chức năng như chúng tôi mong muốn)
xuất số liệu ở định dạng Prometheus
Bạn còn muốn có thể làm gì nữa?
Rõ ràng là người dùng và chúng tôi muốn có khả năng kiểm soát việc khởi chạy tập lệnh bằng cú pháp cron. Việc này sẽ được thực hiện trước phiên bản v1.0.0
Tôi muốn hỗ trợ nhiều nguồn dữ liệu và kênh gửi thông báo hơn. Ví dụ, ai đó chắc chắn sẽ nhớ MongoDB. Tìm kiếm đàn hồi cho một số. Gửi SMS và/hoặc thực hiện cuộc gọi đến điện thoại di động của bạn. Chúng tôi muốn có thể nhận các tập lệnh không chỉ từ các tệp mà còn từ cơ sở dữ liệu chẳng hạn. Cuối cùng, chúng tôi muốn có một trang web thân thiện hơn với người dùng và tài liệu tốt hơn cho dự án.
Ai đó luôn thiếu thứ gì đó) Ở đây chúng tôi dựa vào yêu cầu của cộng đồng để đặt mức độ ưu tiên một cách chính xác. Và với sự giúp đỡ của cộng đồng để nhận ra mọi thứ
Kết luận
Chúng tôi sử dụng thợ đóng kiện Tôi đã có nó được một thời gian rồi. Hàng tá kịch bản bảo vệ sự an tâm của chúng ta. Tôi hy vọng công việc này sẽ hữu ích cho người khác.