Trabajo sencillo con alertas complejas. O la historia de la creación de Balerter

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

  • , S3 ( )

  • - Key/Value

  • Lua (- lua- json, csv)

  • HTTP ( , )

  • API ( , )

  • Prometheus

?

,  cron. v1.0.0

. , - MongoDB. - Elastic Search. SMS / . , , , . .

- - ) , . ,

Balerter . . , - .

Issue PR.




All Articles