Jednostavan rad sa složenim alertima. Ili povijest stvaranja Balertera

Jednostavan rad sa složenim alertima. Ili povijest stvaranja Balertera

Svi vole alerte.

Naravno, mnogo je bolje dobiti obavijest kada se nešto dogodilo (ili se popravilo) nego sjediti, gledati grafikone i tražiti anomalije.

Ima mnogo alata stvorenih za to. Alertmanager iz ekosustava Prometheus i vmalert iz skupine proizvoda VictoriaMetrics. Obavijesti zabbix i interakcije s Grafanom. Skripte napisane u bashu i Telegram botovi koji povremeno pozivaju neki URL i govore ako nešto nije u redu. Puno toga.

I mi, u našoj tvrtki, koristili smo različita rješenja sve dok nismo naišli na složenost, ili bolje rečeno, nemogućnost stvaranja složenih, kombiniranih alerata. Ono što smo željeli i što smo na kraju napravili — ispod kapi. TLDR: Tako je nastao open source projekt Balerter

Dugo smo se prilično dobro snalazili s alertima postavljenim u Grafani. Da, to nije najbolji način. Uvijek se preporučuje korištenje nekih specijaliziranih rješenja, poput Alertmanagera. I mi smo ne jednom razmišljali o preseljenju. A zatim, polako, zaželjeli smo više.

Reći kada je neki grafikon pao/rastao za XX% i već se drži na toj razini N minuta u odnosu na prethodni period od M sati? Čini se da to može biti moguće realizirati s Grafanom ili Alertmanagerom, ali prilično je složeno. (Možda i nije moguće, ne mogu trenutno reći)

Sve postaje još složenije kada se odluka o alertu mora donijeti na temelju podataka iz različitih izvora. Živi primjer:

Provjeravamo podatke iz dvije baze Clickhouse, zatim ih uspoređujemo s nekim podacima iz Postgresa i donosimo odluku o alertu. Signalizirati ili otkazati.

Imamo dosta sličnih želja da smo se počeli razmišljati o svom rješenju. I tada smo pokušali sastaviti prvi popis zahtjeva/mogućnosti ovog, još nepostojećeg, servisa.

  • pristup različitim izvorima podataka. Na primjer, Prometheus, Clickhouse, Postgres.

  • slati alerte u različite kanale — telegram, slack itd.

  • u procesu razmišljanja postalo je jasno da ne želimo deklarativni opis, već mogućnost pisanja skripti.

  • pokretanje skripti prema rasporedu.

  • lako ažuriranje skripti bez ponovnog pokretanja servisa.

  • mogućnost proširivanja funkcionalnosti bez ponovne izrade servisa iz izvornog koda.

Ovo je okvirni popis i, vjerojatno, ne baš točan. Neki su se stavci mijenjali, neki su nestali. Sve kao i obično.

Upravo tako je započela priča o Balerteru.

Jednostavan rad sa složenim alertima. Ili povijest stvaranja Balertera

Pokušat ću ukratko opisati što je na kraju ispalo i kako to radi. (Da, naravno, ovo nije konačna verzija. Ima puno planova za razvoj proizvoda. Samo ću se osvrnuti na današnji dan)

Kako to radi?

Pišete skriptu na Lua, gdje izričito šaljete upite (u Prometheus, Clickhouse itd.). Dobivate odgovore i nekako ih obrađujete i uspoređujete. Nakon toga uključujete/isključujete neki alert. Balerter će sam poslati obavijest u kanale koje ste postavili (Email, telegram, slack itd.). Skripta se izvršava s zadanim vremenskim intervalom. I… to je otprilike to)

Najbolje je pokazati na primjeru:

-- @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 < minRequestsRPS then
    alert.error("rps-min-limit", "Requests RPS su vrlo mali: " .. tostring(resultRPS))
else
    alert.success("rps-min-limit", "Requests RPS su u redu")
end 

Što se ovdje događa:

  • navodimo da se ova skripta mora izvršavati svake 10 sekundi

  • navodimo ime skripte (za API, za prikaz u logovima, za upotrebu u testovima)

  • učitavamo modul za ispis logova

  • učitavamo modul za pristup Clickhouse-u po imenu ch1 (samo povezivanje se postavlja u konfiguraciji)

  • šaljemo upit u Clickhouse

  • u slučaju greške — ispisujemo poruku u log i izlazimo

  • uspoređujemo rezultat upita s konstantom (u stvarnom primjeru ovu bi vrijednost mogli primati, na primjer, iz baze podataka Postgres)

  • uključujemo ili isključujemo alert s ID-jem rps-min-limit

  • dobit ćete obavijest ako se status alert-a promijeni

Primjer je prilično jednostavan i razumljiv. Međutim, u stvarnom životu skripte mogu biti prilično složene i teške za praćenje. Lako se možete zabrljati i napraviti greške.

Zato je došla logična želja — imati mogućnost pisanja testova za svoje skripte. I u verziji v0.4.0 to je postalo moguće.

Testiranje skripti

Primjer testa za našu skriptu iz gornjeg primjera:

-- @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 su vrlo mali: 10')
test.alert().assertNotCalled('success', 'rps-min-limit', 'Requests RPS su u redu')

Koraci:

  • navodimo ime skripte za koju je napisan test

  • ime testa (za logove)

  • učitavamo modul za testiranje

  • rečemo koji rezultat treba vratiti pri određenom zahtjevu za ClickHouse ch1

  • provjeravamo je li pozvan alert (error) rps-min-limit s navedenom porukom

  • provjeravamo da alert rps-min-limit nije bio isključen (success)

Što još Balerter može?

Pokušat ću se dotaknuti najvažnijih, po mom mišljenju, mogućnosti Balertera. Sve detalje možete pogledati na službenoj stranici https://balerter.com

  • pribavljati podatke iz

    • clickhouse

    • postgres

    • mysql

    • prometheusa

    • lokija

  • slati obavijesti na kanale

    • slack

    • telegram

    • syslog

    • notiify (UI obavijesti na vašem računalu)

    • email

    • discord

  • graditi grafove na temelju vaših podataka, učitavati slike u S3 kompatibilno skladište i priložiti ih obavijestima (Primjer s slikama)

  • omogućuje razmjenu podataka između skripti — globalno Key/Value skladište

  • pisati svoje biblioteke na Lua-i i koristiti ih u skriptama (po defaultu dolaze lua biblioteke za rad s json, csv)

  • slati HTTP zahtjeve iz vaših skripti (a naravno i primati odgovore)

  • pruža API (još nije toliko funkcionalan koliko bismo željeli)

  • izvozi metrike u Prometheus formatu

A što bi još željeli moći?

Već je jasno da korisnici i mi želimo mogućnost upravljanja pokretanjem skripti pomoću sintakse cron. To će biti završeno do verzije v1.0.0

Želimo podržati više izvora podataka i kanala za isporuku obavijesti. Na primjer, nekome definitivno neće dovoljno biti MongoDB-a. Nekome Elastic Search. Slati SMS i/ili zvati mobilne telefone. Želimo moći primati skripte ne samo iz datoteka, već i, na primjer, iz baze podataka. Na kraju, želimo za projekt ugodniju web stranicu i bolju dokumentaciju.

Uvijek nekome nešto nedostaje) Ovdje se nadamo na zahtjev zajednice kako bismo ispravno postavili prioritete. I na pomoć zajednice kako bismo sve realizirali

Za kraj

Koristimo Balerter kod nas već duže vrijeme. Deseci skripti čuvaju naš mir. Nadam se da će ovaj rad biti koristan i nekome drugome.

I dobrodošli s vašim Issue i PR.

Izvor: habr.com

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster