ProHoster > Blog > uprava > Jednostavan rad sa složenim upozorenjima. Ili povijest Balertera
Jednostavan rad sa složenim upozorenjima. Ili povijest Balertera
Svatko voli upozorenja.
Naravno, puno je bolje biti obaviješten kada se nešto dogodi (ili popravi) nego sjediti i gledati grafikone i tražiti anomalije.
I za to su stvoreni mnogi alati. Alertmanager iz ekosustava Prometheus i vmalert iz grupe proizvoda VictoriaMetrics. Zabbix obavijesti i upozorenja u Grafani. Samostalno napisane skripte u bashu i Telegram botovima koji povremeno izvlače neki URL i govore vam ako nešto nije u redu. Puno svega.
I mi smo u našoj tvrtki koristili različita rješenja dok nismo naišli na kompleksnost, odnosno nemogućnost izrade složenih, kompozitnih upozorenja. Ono što smo željeli i što smo na kraju napravili je ispod granice. TLDR: Tako se pojavio projekt otvorenog koda Balerter
Dugo smo dobro živjeli s dojavama konfiguriranim u Grafani. Da, ovo nije najbolji način. Uvijek se preporučuje korištenje nekih specijaliziranih rješenja, poput Alertmanagera. Također smo više puta gledali prema selidbi. A onda smo, malo po malo, htjeli još.
Recimo kada je određeni grafikon pao/porastao za XX% i bio tamo N minuta u usporedbi s prethodnim razdobljem od M sati? Čini se da to možete pokušati implementirati s Grafanom ili Alertmanagerom, ali nije baš lako. (Ili možda nije moguće, neću sad reći)
Stvari postaju još kompliciranije kada se odluka o uzbuni mora donijeti na temelju podataka iz različitih izvora. Primjer uživo:
Provjeravamo podatke iz dvije baze podataka Clickhouse, zatim ih uspoređujemo s nekim podacima iz Postgresa i odlučujemo o upozorenju. Signaliziraj ili odustani
Nakupilo se dosta sličnih želja da razmislimo o svojoj odluci. I tada smo pokušali sastaviti prvi popis zahtjeva/mogućnosti ove usluge, koji još nije izrađen.
pristup različitim izvorima podataka. Na primjer, Prometheus, Clickhouse, Postgres
šaljite upozorenja na različite kanale - telegram, slack itd.
u procesu razmišljanja postalo je jasno da ne želim deklarativni opis, već mogućnost pisanja skripti
pokretanje skripti prema rasporedu
jednostavno ažuriranje skripti bez ponovnog pokretanja usluge
mogućnost da se nekako proširi funkcionalnost bez ponovne izgradnje usluge iz izvornih kodova
Ovaj popis je približan i najvjerojatnije nije baš točan. Neke su se točke promijenile, neke su umrle. Sve je kao i obično.
Zapravo, tako je započela povijest Balertera.
Pokušat ću ukratko opisati što se na kraju dogodilo i kako to funkcionira. (Da, naravno, ovo nije kraj. Mnogo je planova za razvoj proizvoda. Zaustavit ću se samo na danas)
Kako se to radi?
Napišete skriptu u Lui gdje eksplicitno šaljete zahtjeve (Prometheusu, Clickhouseu itd.). Dobivate odgovore i nekako ih obrađujete i uspoređujete. Zatim uključite/isključite neku vrstu upozorenja. Sam Balerter će poslati obavijest na kanale koje ste konfigurirali (e-mail, telegram, slack itd.). Skripta se izvršava u određenim intervalima. I... općenito, to je sve)
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 < minResultRPS then
alert.error("rps-min-limit", "Requests RPS are very small: " .. tostring(resultRPS))
else
alert.success("rps-min-limit", "Requests RPS ok")
end
Što se ovdje događa:
ukazujemo da se ova skripta treba izvršavati svakih 10 sekundi
navedite naziv skripte (za API, za prikaz u zapisnicima, za upotrebu u testovima)
spojite modul za izlaz logova
spojite modul za pristup kućici klikova s imenom ch1 (sama veza je konfigurirana u konfiguraciji)
pošalji zahtjev clickhouseu
u slučaju greške prikazujemo poruku u dnevniku i izlazimo
usporedite rezultat upita s konstantom (u živom primjeru ovu bismo vrijednost mogli dobiti, na primjer, iz baze podataka Postgres)
omogućiti ili onemogućiti upozorenje s ID-om rps-min-limit
primit ćete obavijest ako se status upozorenja promijenio
Primjer je vrlo jednostavan i razumljiv. Međutim, naravno, u stvarnom životu scenariji mogu biti prilično dugi i složeni. Lako se zbuniti i pogriješiti.
Stoga je sazrela logična želja - moći pisati testove za svoje skripte. A u verziji v0.4.0 ovo se pojavilo.
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 are very small: 10')
test.alert().assertNotCalled('success', 'rps-min-limit', 'Requests RPS ok')
Korak po korak:
navesti naziv skripte za koju je test napisan
naziv testa (za dnevnike)
spojite modul za testiranje
mi kažemo koji rezultat treba vratiti za određeni zahtjev u Clickhouse ch1
provjeravamo da li je pozvano upozorenje (greška) rps-min-limit s navedenom porukom
provjerite da upozorenje o rps-min-limit nije onemogućeno (uspjeh)
Što još Balerter može učiniti?
Pokušat ću se dotaknuti najvažnije, po mom mišljenju, Balerter vještine. Sve možete detaljno vidjeti na službenim stranicama https://balerter.com
primati podatke od
klikanica
postgres
mysql
Prometej
Loki
slati obavijesti kanalima
zatišje
telegram
syslog
obavijesti (obavijesti korisničkog sučelja na vašem računalu)
e-mail
nesloga
izgradite grafikone na temelju svojih podataka, prenesite sliku na S3 kompatibilnu pohranu i priložite je obavijestima (Primjer sa slikama)
omogućuje razmjenu podataka između skripti - globalna pohrana ključeva/vrijednosti
napišite svoje vlastite biblioteke u Lua i koristite ih u skriptama (prema zadanim postavkama, lua biblioteke se isporučuju za rad s json, csv)
slanje HTTP zahtjeva iz vaših skripti (i primanje odgovora, naravno)
pruža API (još nije funkcionalan koliko bismo željeli)
izvozi metriku u Prometheus format
Što biste još voljeli raditi?
Već je jasno da korisnici i mi želimo mogućnost kontrole pokretanja skripti pomoću sintakse cron. To će biti učinjeno prije verzije v1.0.0
Želio bih podržati više izvora podataka i kanala za dostavu obavijesti. Na primjer, nekome će sigurno nedostajati MongoDB. Elastična pretraga za neke. Šaljite SMS i/ili pozivajte na svoj mobilni telefon. Želimo moći primati skripte ne samo iz datoteka, već i, na primjer, iz baze podataka. Na kraju, želimo web stranicu lakšu za korištenje i bolju dokumentaciju za projekt.
Nekome uvijek nešto nedostaje) Ovdje se oslanjamo na zahtjev zajednice kako bismo ispravno postavili prioritete. I na pomoć zajednice da se sve realizira
U zaključku
Koristimo Balerter Imam ga već neko vrijeme. Deseci skripti čuvaju naš duševni mir. Nadam se da će ovaj rad biti koristan još nekome.