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.

Jednostavan rad sa složenim upozorenjima. Ili istorija stvaranja 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.

I dobrodošli sa svojim izdanjem i PR-om.

izvor: www.habr.com

Dodajte komentar