Jednoduchá práca so zložitými upozorneniami. Alebo história Balertera

Jednoduchá práca so zložitými upozorneniami. Alebo história Balertera

Každý má rád upozornenia.

Samozrejme, je oveľa lepšie byť upozornený, keď sa niečo stalo (alebo bolo opravené), ako sedieť a pozerať sa na grafy a hľadať anomálie.

A na to bolo vytvorených mnoho nástrojov. Alertmanager z ekosystému Prometheus a vmalert zo skupiny produktov VictoriaMetrics. Upozornenia a upozornenia Zabbix v Grafane. Samostatne písané skripty v robotoch bash a telegram, ktoré pravidelne vyťahujú nejakú adresu URL a povedia vám, či niečo nie je v poriadku. Veľa všetkého.

Aj my v našej spoločnosti sme používali rôzne riešenia, kým sme nenarazili na zložitosť, respektíve nemožnosť vytvárať zložité, zložené výstrahy. To, čo sme chceli a čo sme nakoniec urobili, je pod rezom. TLDR: Takto sa objavil projekt s otvoreným zdrojovým kódom Balerter

Pomerne dlho sme dobre žili s upozorneniami nakonfigurovanými v Grafane. Áno, toto nie je najlepší spôsob. Vždy sa odporúča použiť nejaké špecializované riešenia, napríklad Alertmanager. A tiež sme sa viackrát pozreli na pohyb. A potom, kúsok po kúsku, sme chceli viac.

Povedzte, keď určitý graf klesol/zvýšil o XX % a bol tam N minút v porovnaní s predchádzajúcim obdobím M hodín? Zdá sa, že to môžete skúsiť implementovať pomocou Grafana alebo Alertmanager, ale nie je to celkom jednoduché. (Alebo to možno nie je možné, teraz nepoviem)

Veci sa ešte viac skomplikujú, keď sa rozhodnutie o výstrahe musí urobiť na základe údajov z rôznych zdrojov. Živý príklad:

Skontrolujeme údaje z dvoch databáz Clickhouse, potom ich porovnáme s niektorými údajmi z Postgres a rozhodneme sa pre upozornenie. Signál alebo zrušenie

Podobných túžob, aby sme sa zamysleli nad svojím rozhodnutím, sa nám nahromadilo pomerne veľa. A potom sme sa pokúsili zostaviť prvý zoznam požiadaviek/schopností tejto služby, ktorý ešte nie je vytvorený.

  • prístup k rôznym zdrojom údajov. Napríklad Prometheus, Clickhouse, Postgres

  • posielať upozornenia na rôzne kanály - telegram, uvoľnenie atď.

  • v procese uvažovania sa ukázalo, že nechcem deklaratívny popis, ale schopnosť písať scenáre

  • spúšťanie skriptov podľa plánu

  • jednoduchá aktualizácia skriptov bez reštartovania služby

  • schopnosť nejako rozšíriť funkčnosť bez prestavby služby zo zdrojových kódov

Tento zoznam je približný a s najväčšou pravdepodobnosťou nie je veľmi presný. Niektoré body sa zmenili, niektoré zomreli. Všetko je ako obvykle.

V skutočnosti sa takto začala história Balertera.

Jednoduchá práca so zložitými upozorneniami. Alebo história Balertera

Pokúsim sa stručne opísať, čo sa nakoniec stalo a ako to funguje. (Áno, samozrejme, toto nie je koniec. Plánov na vývoj produktu je veľa. Zastavím sa len pri dnešku)

Ako to funguje?

Napíšete skript v Lua, kde explicitne pošlete požiadavky (prometheus, Clickhouse atď.). Dostávate odpovede a nejako ich spracovávate a porovnávate. Potom zapnite / vypnite nejaký druh upozornenia. Balerter sám odošle upozornenie na kanály, ktoré ste nakonfigurovali (e-mail, telegram, rezerva atď.). Skript sa vykonáva v určených intervaloch. A... vo všeobecnosti je to všetko)

Najlepšie je ukázať na príklade:

-- @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 

Čo sa tu deje:

  • uvádzame, že tento skript by sa mal spustiť každých 10 sekúnd

  • uveďte názov skriptu (pre API, na zobrazenie v protokoloch, na použitie v testoch)

  • pripojte modul na výstup protokolov

  • pripojte modul pre prístup k clickhouse s názvom ch1 (samotné pripojenie je nakonfigurované v konfigurácii)

  • pošlite žiadosť spoločnosti clickhouse

  • v prípade chyby zobrazíme správu v protokole a ukončíme

  • porovnať výsledok dotazu s konštantou (v živom príklade by sme túto hodnotu mohli získať napríklad z databázy Postgres)

  • povoliť alebo zakázať upozornenie s ID rps-min-limit

  • ak sa stav upozornenia zmení, dostanete upozornenie

Príklad je celkom jednoduchý a zrozumiteľný. Avšak, samozrejme, v reálnom živote môžu byť skripty dosť zdĺhavé a zložité. Je ľahké sa zmiasť a urobiť chyby.

Preto dozrela logická túžba – vedieť písať testy pre svoje skriptá. A vo verzii v0.4.0 sa to objavilo.

Testovacie skripty

Príklad testu pre náš skript z vyššie uvedeného príkladu:

-- @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')

Kroky:

  • uveďte názov skriptu, pre ktorý je test napísaný

  • názov testu (pre denníky)

  • pripojte testovací modul

  • hovoríme, aký výsledok by sa mal vrátiť na konkrétnu požiadavku do clickhouse ch1

  • skontrolujeme, či bola vyvolaná výstraha (chyba) rps-min-limit so zadanou správou

  • skontrolujte, či upozornenie rps-min-limit nebolo vypnuté (úspech)

Čo ešte Balerter dokáže?

Pokúsim sa dotknúť najdôležitejších, podľa môjho názoru, Balerterových zručností. Všetko si podrobne môžete pozrieť na oficiálnej stránke https://balerter.com

  • prijímať údaje z

    • clickhouse

    • postgres

    • mysql

    • prometheus

    • loki

  • posielať upozornenia na kanály

    • voľný

    • telegram

    • syslog

    • upozorniť (upozornenia používateľského rozhrania na vašom počítači)

    • e-mail

    • zvar

  • vytvorte grafy na základe vašich údajov, nahrajte obrázok do úložiska kompatibilného s S3 a pripojte ho k upozorneniam (Príklad s obrázkami)

  • umožňuje výmenu dát medzi skriptami – globálne úložisko kľúča/hodnoty

  • napíšte si vlastné knižnice v Lua a použite ich v skriptoch (štandardne sú knižnice lua dodávané na prácu s json, csv)

  • odosielať požiadavky HTTP z vašich skriptov (a prijímať odpovede, samozrejme)

  • poskytuje API (zatiaľ nie také funkčné, ako by sme chceli)

  • exportuje metriky vo formáte Prometheus

Čo by ste ešte chceli vedieť?

Už teraz je jasné, že používatelia a my chceme mať možnosť ovládať spúšťanie skriptov pomocou syntaxe cron. Toto sa vykoná pred verziou v1.0.0

Chcel by som podporovať viac zdrojov údajov a kanálov na doručovanie upozornení. Niekomu bude určite chýbať napríklad MongoDB. Elastické vyhľadávanie niektorých. Posielajte SMS a/alebo volajte na svoj mobilný telefón. Chceme mať možnosť prijímať skripty nielen zo súborov, ale napríklad aj z databázy. V konečnom dôsledku chceme užívateľsky príjemnejšiu webovú stránku a lepšiu dokumentáciu k projektu.

Vždy niekomu niečo chýba) Tu sa spoliehame na požiadavku komunity správne stanoviť priority. A na pomoc komunite všetko realizovať

na záver

Používame Balerter Mám to už dosť dlho. Náš pokoj v duši strážia desiatky scenárov. Dúfam, že táto práca bude užitočná aj pre niekoho iného.

A vitajte s vaším problémom a PR.

Zdroj: hab.com

Pridať komentár