A todo el mundo le encantan las alertas.
Por supuesto, es mucho mejor recibir una notificación cuando sucedió algo (o se solucionó) que sentarse a mirar los gráficos y buscar anomalías.
Y se han creado muchas herramientas para ello. Alertmanager del ecosistema Prometheus y vmalert del grupo de productos VictoriaMetrics. Notificaciones y alertas de Zabbix en Grafana. Scripts autoescritos en bots de bash y Telegram que periódicamente extraen alguna URL y dicen si algo anda mal. Mucho de todo.
Nosotros, en nuestra empresa, también usamos diferentes soluciones hasta que nos topamos con la complejidad, o más bien la imposibilidad de crear alertas compuestas complejas. Lo que queríamos y lo que hicimos al final está por debajo del corte. TLDR: así apareció el proyecto de código abierto Balerter
Durante mucho tiempo vivimos bastante bien con las alertas configuradas en Grafana. Sí, esta no es la mejor forma. Siempre se recomienda utilizar algún tipo de soluciones especializadas, como Alertmanager. Y también miramos en la dirección del cruce más de una vez. Y luego, poco a poco, quisimos más.
Digamos cuando un gráfico determinado cayó / creció un XX% y ¿hay N minutos en comparación con el período anterior de M horas? Parece que puedes intentar implementarlo con Grafana o Alertmanager, pero no es fácil. (O tal vez no, no lo diré ahora)
, . :
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.