Trabalho fácil com alertas complexos. Ou a história por trás de Balerter

Todo mundo adora alertas.

Claro, é muito melhor ser notificado quando algo aconteceu (ou corrigido) do que ficar sentado olhando os gráficos e procurando por anomalias.

E muitas ferramentas foram criadas para isso. Alertmanager do ecossistema Prometheus e vmalert do grupo de produtos VictoriaMetrics. Notificações e alertas do Zabbix no Grafana. Scripts auto-escritos em bots bash e Telegram que periodicamente puxam algum URL e dizem se algo está errado. Muito de tudo.

Nós, em nossa empresa, também utilizamos soluções diferentes até que nos deparamos com a complexidade, ou melhor, a impossibilidade de criar alertas complexos e compostos. O que queríamos e o que fizemos no final está sob o corte. TLDR: É assim que o projeto de código aberto Balerter apareceu

Por muito tempo, convivemos muito bem com os alertas configurados no Grafana. Sim, esta não é a melhor maneira. É sempre recomendável usar algum tipo de solução especializada, como Alertmanager. E também olhamos na direção do cruzamento mais de uma vez. E então, aos poucos, queríamos mais.

Diga quando um determinado gráfico caiu / cresceu XX% e existe por N minutos em comparação com o período anterior de M horas? Parece que você pode tentar implementá-lo com Grafana ou Alertmanager, mas não é fácil. (Ou talvez não, não direi agora)

, . :

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