
Jeder liebt Warnungen.
Natürlich ist es viel besser, benachrichtigt zu werden, wenn etwas passiert (oder behoben) ist, als herumzusitzen und die Grafiken zu betrachten und nach Anomalien zu suchen.
Dafür wurden viele Tools erstellt. Alertmanager aus dem Prometheus-Ökosystem und vmalert aus der VictoriaMetrics-Produktgruppe. Zabbix Benachrichtigungen und Warnungen in Grafana. Selbstgeschriebene Skripte für Bash- und Telegramm-Bots, die regelmäßig eine URL abrufen und angeben, ob etwas nicht stimmt. Viel von allem.
In unserem Unternehmen haben wir auch verschiedene Lösungen verwendet, bis wir auf die Komplexität bzw. Unmöglichkeit gestoßen sind, komplexe, zusammengesetzte Warnungen zu erstellen. Was wir wollten und was wir am Ende getan haben, ist unter dem Schnitt. TLDR: So erschien das Open-Source-Projekt Balerter
Wir haben lange Zeit ziemlich gut mit in Grafana konfigurierten Warnungen gelebt. Ja, das ist nicht der beste Weg. Es wird immer empfohlen, spezielle Lösungen wie Alertmanager zu verwenden. Und wir haben mehr als einmal in Richtung der Kreuzung geschaut. Und dann wollten wir nach und nach mehr.
Sagen wir, wenn ein bestimmtes Diagramm um XX% gefallen ist / gewachsen ist und es N Minuten im Vergleich zum vorherigen Zeitraum von M Stunden gibt? Es scheint, dass Sie versuchen können, es mit Grafana oder Alertmanager zu implementieren, aber es ist nicht einfach. (Oder vielleicht auch nicht, werde ich jetzt nicht sagen)
, . :
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.