ProHoster > Blog > Administrácia > 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.
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.