Pekerjaan mudah dengan peringatan kompleks. Atau cerita di balik Balerter

Semua orang menyukai peringatan.

Tentu saja, jauh lebih baik untuk diberi tahu ketika sesuatu terjadi (atau diperbaiki) daripada hanya duduk-duduk melihat grafik dan mencari anomali.

Dan banyak alat telah dibuat untuk ini. Alertmanager dari ekosistem Prometheus dan vmalert dari grup produk VictoriaMetrics. Pemberitahuan dan peringatan Zabbix di Grafana. Skrip yang ditulis sendiri pada bot bash dan Telegram yang secara berkala menarik beberapa URL dan mengatakan jika ada yang salah. Segalanya.

Kami, di perusahaan kami, juga menggunakan solusi yang berbeda sampai kami mengalami kerumitan, atau lebih tepatnya kemustahilan untuk membuat lansiran gabungan yang rumit. Apa yang kami inginkan dan apa yang kami lakukan pada akhirnya akan dipotong. TLDR: Ini adalah bagaimana proyek open source Balerter muncul

Untuk waktu yang lama, kami hidup cukup baik dengan peringatan yang dikonfigurasi di Grafana. Ya, ini bukan cara terbaik. Itu selalu disarankan untuk menggunakan beberapa jenis solusi khusus, seperti Alertmanager. Dan kami juga melihat ke arah penyeberangan lebih dari satu kali. Dan kemudian, sedikit demi sedikit, kami menginginkan lebih.

Katakanlah ketika grafik tertentu turun / tumbuh sebesar XX% dan apakah ada selama N menit dibandingkan dengan periode M jam sebelumnya? Tampaknya Anda dapat mencoba menerapkannya dengan Grafana atau Alertmanager, tetapi itu tidak mudah. (Atau mungkin tidak, saya tidak akan mengatakannya sekarang)

, . :

Clickhouse, Postgres, .

, . / , ,

  • . , Prometheus, Clickhouse, Postgres

  • - telegram, slack ..

  • , ,

  • -

, , . - , - . .

, Balerter.

, . (, , . . )

?

Lua, ( Prometheus, Clickhouse .). - . / - . Balerter , (Email, telegram, 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, , )

  • ch1 ( )

  • -

  • ( , , 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')

:

  • ,

  • ( )

  • , ch1

  • , (error) rps-min-limit

  • , rps-min-limit (success)

Balerter?

, , Balerter. https://balerter.com

    • clickhouse

    • postgres

    • mysql

    • prometheus

    • loki

    • slack

    • telegram

    • syslog

    • notiify (UI )

    • email

    • discord

  • , S3 ( )

  • - Key/Value

  • Lua (- lua- json, csv)

  • HTTP ( , )

  • API ( , )

  • Prometheus

?

,  cron. v1.0.0

. , - MongoDB. - Elastic Search. SMS / . , , , . .

- - ) , . ,

Balerter . . , - .

Issue PR.




All Articles