Einfache Arbeit mit komplexen Warnungen. Oder die Entstehungsgeschichte von Balerter

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

  • , S3 ( )

  • - Key/Value

  • Lua (- lua- json, csv)

  • HTTP ( , )

  • API ( , )

  • Prometheus

?

,  cron. v1.0.0

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

- - ) , . ,

Balerter . . , - .

Issue PR.




All Articles