Tout le monde aime les alertes.
Bien sûr, il est bien préférable d'être averti quand quelque chose s'est produit (ou corrigé) que de rester assis à regarder les graphiques et à rechercher des anomalies.
Et de nombreux outils ont été créés pour cela. Alertmanager de l'écosystème Prometheus et vmalert du groupe de produits VictoriaMetrics. Notifications et alertes Zabbix dans Grafana. Des scripts auto-écrits sur les bots bash et Telegram qui extraient périodiquement une URL et indiquent si quelque chose ne va pas. Beaucoup de tout.
Nous, dans notre entreprise, avons également utilisé différentes solutions jusqu'à ce que nous nous heurtions à la complexité, ou plutôt à l'impossibilité de créer des alertes complexes et composites. Ce que nous voulions et ce que nous avons fait à la fin est sous la coupe. TLDR: Voici comment le projet open source Balerter est apparu
Pendant longtemps, nous avons plutôt bien vécu avec des alertes configurées dans Grafana. Oui, ce n'est pas la meilleure façon. Il est toujours recommandé d'utiliser une sorte de solutions spécialisées, telles qu'Alertmanager. Et nous avons également regardé dans la direction du croisement plus d'une fois. Et puis, lentement, nous en voulions plus.
Dites quand un certain graphique a chuté / augmenté de XX% et est-ce qu'il y en a pendant N minutes par rapport à la période précédente de M heures? Il semble que vous puissiez essayer de l'implémenter avec Grafana ou Alertmanager, mais ce n'est pas facile. (Ou peut-être pas, je ne dirai pas maintenant)
, . :
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.