輕鬆應對複雜警報。 或者 Balerter 的歷史

輕鬆應對複雜警報。 或者 Balerter 的歷史

每個人都喜歡警報。

當然,當事情發生(或修復)時得到通知比坐下來查看圖表並尋找異常要好得多。

為此創建了許多工具。 來自 Prometheus 生態系統的 Alertmanager 和來自 VictoriaMetrics 產品組的 vmalert。 Grafana 中的 Zabbix 通知和警報。 在 bash 和 Telegram 機器人中自行編寫的腳本,定期提取一些 URL 並告訴您是否有問題。 很多一切。

我們公司也使用了不同的解決方案,直到我們遇到複雜性,或者更確切地說,無法創建複雜的複合警報。 我們想要的和我們最終做的都低於標準。 TLDR:這就是開源專案的出現方式 巴勒特

在相當長的一段時間裡,我們都在 Grafana 中配置的警報生活得很好。 是的,這不是最好的方法。 始終建議使用一些專門的解決方案,例如 Alertmanager。 我們也不只一次考慮搬家。 然後,一點一點地,我們想要更多。

比如說某個圖表與之前的 M 小時相比,何時下跌/上漲了 XX% 並且已經存在了 N 分鐘? 看來你可以嘗試使用 Grafana 或 Alertmanager 來實現這一點,但這並不容易。 (或者也許不可能,我現在不說)

當必須根據不同來源的數據做出警報決策時,事情會變得更加複雜。 實例:

我們檢查兩個 Clickhouse 資料庫中的數據,然後將其與 Postgres 中的一些數據進行比較,並決定發出警報。 發出信號或取消

我們已經累積了許多類似的願望,讓我們思考我們的決定。 然後我們嘗試編譯該服務的第一個需求/功能列表,該列表尚未建立。

  • 存取不同的資料來源。 例如,普羅米修斯、Clickhouse、Postgres

  • 向各種管道發送警報 - telegram、slack 等。

  • 在思考的過程中,我清楚地意識到我想要的不是聲明性描述,而是編寫腳本的能力

  • 按計劃運行腳本

  • 無需重新啟動服務即可輕鬆更新腳本

  • 無需從原始碼重建服務即可以某種方式擴展功能的能力

該列表是近似的,很可能不是很準確。 有些點發生了變化,有些點消失了。 一切如常。

事實上,Balerter 的歷史就是這樣開始的。

輕鬆應對複雜警報。 或者 Balerter 的歷史

我將嘗試簡要描述最終發生的事情以及它是如何運作的。 (是的,當然,這還沒結束,產品開發還有很多計劃,今天就到此為止)

它是如何工作的呢?

您用 Lua 編寫一個腳本,在其中明確發送請求(到 Prometheus、Clickhouse 等)。 您收到答案並以某種方式處理和比較它們。 然後打開/關閉某種警報。 Balerter 本身會向您配置的管道(電子郵件、電報、slack 等)發送通知。 該腳本按指定的時間間隔執行。 而且......總的來說,就是這樣)

最好用一個例子來展示:

-- @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 

這裡發生了什麼事:

  • 我們指示該腳本應每 10 秒執行一次

  • 指示腳本的名稱(用於 API、用於在日誌中顯示、用於測試)

  • 連接日誌輸出模組

  • 連接模組以存取具有名稱的 clickhouse ch1 (連接本身在配置中配置)

  • 向 clickhouse 發送請求

  • 如果出現錯誤,我們會在日誌中顯示一則訊息並退出

  • 將查詢結果與常數進行比較(在實際範例中,我們可以例如從 Postgres 資料庫取得該值)

  • 啟用或停用帶有 ID 的警報 rps-min-limit

  • 如果警報狀態發生變化,您將收到通知

這個例子非常簡單易懂。 然而,當然,現實生活中的腳本可能相當冗長且複雜。 很容易感到困惑並犯錯。

因此,一個合乎邏輯的願望已經成熟——能夠為腳本編寫測試。 在 v0.4.0 版本中出現了這個。

測試腳本

對上面範例中的腳本進行範例測試:

-- @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')

一步步:

  • 指示為其編寫測試的腳本的名稱

  • 測試名稱(用於日誌)

  • 連接測試模組

  • 我們說針對 clickhouse 的特定請求應該回傳什麼結果 ch1

  • 我們檢查是否呼叫了帶有指定訊息的警報(錯誤)rps-min-limit

  • 檢查 rps-min-limit 警報是否未停用(成功)

巴勒特還能做什麼?

我將嘗試談談我認為最重要的 Balerter 技能。 你可以在官方網站上看到所有詳細信息 https://balerter.com

  • 接收資料來自

    • 點擊之家

    • Postgres的

    • MySQL的

    • 普羅米修斯

    • 洛基

  • 向頻道發送通知

    • 鬆弛

    • 電報

    • 系統日誌

    • 通知(電腦上的 UI 通知)

    • 電子郵件

    • 不和諧

  • 根據您的數據建立圖表,將圖像上傳到 S3 相容儲存並將其附加到通知中(帶圖片的例子)

  • 允許您在腳本之間交換資料 - 全域鍵/值存儲

  • 在 Lua 中編寫您自己的庫並在腳本中使用它們(預設情況下,提供 lua 庫用於處理 json、csv)

  • 從您的腳本發送 HTTP 請求(當然,也接收回應)

  • 提供 API(尚未達到我們想要的功能)

  • 以 Prometheus 格式匯出指標

您還希望能夠做些什麼?

很明顯,使用者和我們希望能夠使用語法控制腳本的啟動 cron的。 這將在 v1.0.0 版本之前完成

我想支援更多的資料來源和通知傳遞管道。 例如,有人肯定會懷念 MongoDB。 彈性搜尋一些。 向您的手機發送簡訊和/或撥打電話。 我們希望不僅能夠從文件接收腳本,而且還能夠從資料庫接收腳本。 最後,我們希望有一個更用戶友好的網站和更好的專案文件。

總是有人會遺漏一些東西)在這裡,我們依靠社區的要求來正確設定優先順序。 並在社區的幫助下實現一切

總之

我們用 巴勒特 我已經堅持了一段時間了。 幾十個腳本守護著我們內心的平靜。 我希望這項工作對其他人有用。

歡迎提出您的問題和公關。

來源: www.habr.com

添加評論