Travail facile avec des alertes complexes. Ou l'histoire de la création de Balerter

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

  • , S3 ( )

  • - Key/Value

  • Lua (- lua- json, csv)

  • HTTP ( , )

  • API ( , )

  • Prometheus

?

,  cron. v1.0.0

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

- - ) , . ,

Balerter . . , - .

Issue PR.




All Articles