
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
- Key/Value
Lua (- lua- json, csv)
HTTP ( , )
API ( , )
Prometheus
?
, cron. v1.0.0
. , - MongoDB. - Elastic Search. SMS / . , , , . .
- - ) , . ,
Balerter . . , - .
Issue PR.