ProHoster > Блог > Administracija > Jednostavan rad sa složenim upozorenjima. Ili istorija stvaranja Balertera
Jednostavan rad sa složenim upozorenjima. Ili istorija stvaranja Balertera
Svi vole upozorenja.
Naravno, mnogo je bolje biti obaviješten kada se nešto dogodilo (ili popravljeno) nego sjediti i gledati grafikone i tražiti anomalije.
I za to su stvoreni mnogi alati. Alertmanager iz Prometheus ekosistema i vmalert iz VictoriaMetrics grupe proizvoda. Zabbix obavještenja i upozorenja u Grafani. Samostalne skripte u bash 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 kompaniji koristili različita rješenja sve dok nismo naišli na složenost, odnosno nemogućnost kreiranja složenih, kompozitnih upozorenja. Ono što smo željeli i što smo na kraju uradili je ispod reza. TLDR: Ovako se pojavio projekat otvorenog koda Balerter
Dosta dugo smo dobro živjeli sa upozorenjima konfiguriranim u Grafani. Da, ovo nije najbolji način. Uvijek se preporučuje korištenje nekih specijaliziranih rješenja, kao što je Alertmanager. I više puta smo gledali da se preselimo. A onda smo, malo po malo, hteli još.
Recimo kada je određeni grafikon pao/porastao za XX% i bio je tamo N minuta u odnosu na prethodni period od M sati? Čini se da ovo 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š složenije kada se odluka o uzbuni mora donijeti na osnovu podataka iz različitih izvora. Primjer uživo:
Provjeravamo podatke iz dvije Clickhouse baze podataka, zatim ih upoređujemo sa nekim podacima iz Postgresa i odlučujemo se za upozorenje. Signalizirajte ili otkažite
Nakupilo se dosta sličnih želja da razmislimo o svojoj odluci. A onda smo pokušali da sastavimo prvu listu zahtjeva/mogućnosti ovog servisa, koja još nije kreirana.
pristupiti različitim izvorima podataka. Na primjer, Prometheus, Clickhouse, Postgres
slanje upozorenja na razne kanale - telegram, slack, itd.
u procesu razmišljanja, postalo je jasno da ne želim deklarativni opis, već mogućnost pisanja skripti
pokretanje skripti po rasporedu
jednostavno ažuriranje skripti bez ponovnog pokretanja usluge
mogućnost da se nekako proširi funkcionalnost bez ponovne izgradnje usluge iz izvornih kodova
Ova lista je približna i najvjerovatnije nije baš tačna. Neke tačke su se promijenile, neke su umrle. Sve je kao i obično.
Zapravo, tako je započela istorija Balertera.
Pokušat ću ukratko opisati šta se na kraju dogodilo i kako to funkcionira. (Da, naravno, ovo nije kraj. Mnogo je planova za razvoj proizvoda. Zaustaviću se samo na danas)
Как это работает?
Pišete skriptu u Lua-i gdje eksplicitno šaljete zahtjeve (Prometheusu, Clickhouseu, itd.). Dobijate odgovore i nekako ih obradite i uporedite. Zatim uključite/isključite neku vrstu upozorenja. Balerter će sam poslati obavijest na kanale koje ste konfigurirali (e-mail, telegram, slack, itd.). Skripta se izvršava u određenim intervalima. I... generalno, 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
sta se desava ovde:
ukazujemo da ovaj skript treba da se izvršava svakih 10 sekundi
navedite naziv skripte (za API, za prikaz u zapisnicima, za upotrebu u testovima)
spojite modul za izlaz logova
povežite modul za pristup kućici za klikove sa imenom ch1 (sama veza je konfigurisana u konfiguraciji)
pošaljite zahtjev Clickhouseu
u slučaju greške prikazujemo poruku u logu i izlazimo
uporedite rezultat upita sa konstantom (u živom primjeru, ovu vrijednost bismo mogli dobiti, na primjer, iz Postgres baze podataka)
omogućite ili onemogućite upozorenje sa ID-om rps-min-limit
dobit ćete obavijest ako se status upozorenja promijenio
Primjer je prilično jednostavan i razumljiv. Međutim, naravno, u stvarnom životu skripte mogu biti prilično dugačke i složene. Lako se zbuniti i pogriješiti.
Stoga je sazrela logična želja - da možete pisati testove za svoje skripte. I u verziji v0.4.0 ovo se pojavilo.
Testiranje skripti
Primjer testa za našu skriptu iz primjera iznad:
-- @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')
U koracima:
navedite naziv skripte za koju je test napisan
naziv testa (za zapisnike)
povežite modul za testiranje
kažemo koji rezultat treba da se vrati za određeni zahtev kući za klikove ch1
provjeravamo da li je pozvano upozorenje (greška) rps-min-limit sa navedenom porukom
provjerite da upozorenje o rps-min-limit nije onemogućeno (uspjeh)
Šta još Balerter može učiniti?
Pokušaću da se dotaknem najvažnijih, po mom mišljenju, Balerterovih veština. Sve detaljno možete pogledati na službenoj web stranici https://balerter.com
primati podatke od
clickhouse
postgres
mysql
Prometej
loki
slati obavještenja kanalima
Lagano
telegram
syslog
obavijesti (UI obavještenja na vašem računaru)
E-mail
razdora
napravite grafikone na osnovu vaših podataka, otpremite sliku u S3 kompatibilnu pohranu i priložite je obavijestima (Primjer sa slikama)
omogućava vam razmjenu podataka između skripti - globalno skladište ključa/vrijednosti
napišite vlastite biblioteke u Lua-i i koristite ih u skriptama (podrazumevano, lua biblioteke se isporučuju za rad sa json, csv)
šaljite HTTP zahtjeve iz vaših skripti (i primajte odgovore, naravno)
pruža API (još nije funkcionalan koliko bismo željeli)
izvozi metriku u Prometheus formatu
Šta biste još voljeli da radite?
Već je jasno da korisnici i mi želimo mogućnost kontrole pokretanja skripti pomoću sintakse Cron. Ovo će biti urađeno prije verzije v1.0.0
Želio bih podržati više izvora podataka i kanala za dostavu obavještenja. Na primjer, nekome će sigurno nedostajati MongoDB. Elastična Potražite neke. Šaljite SMS i/ili pozovite svoj mobilni telefon. Želimo da budemo u mogućnosti da primamo skripte ne samo iz datoteka, već i, na primjer, iz baze podataka. Na kraju, želimo web stranicu jednostavniju za korištenje i bolju dokumentaciju za projekat.
Nekome uvijek nešto nedostaje) Ovdje se oslanjamo na zahtjev zajednice kako bismo ispravno postavili prioritete. I uz pomoć zajednice da se sve realizuje
U zaključku
Koristimo Balerter Imam ga već duže vrijeme. Desetine scenarija čuvaju naš duševni mir. Nadam se da će ovaj rad biti koristan još nekome.