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.

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

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

Izvor: www.habr.com

Dodajte komentar