ProHoster > Blog > podávání > Snadná práce se složitými upozorněními. Nebo historie vzniku Balertera
Snadná práce se složitými upozorněními. Nebo historie vzniku Balertera
Každý má rád upozornění.
Samozřejmě je mnohem lepší být upozorněni, když se něco stalo (nebo bylo opraveno), než sedět a dívat se na grafy a hledat anomálie.
A k tomu bylo vytvořeno mnoho nástrojů. Alertmanager z ekosystému Prometheus a vmalert z produktové skupiny VictoriaMetrics. Oznámení a výstrahy Zabbix v Grafaně. Samostatně psané skripty v robotech bash a telegram, které pravidelně vytahují nějakou adresu URL a řeknou vám, jestli je něco špatně. Hodně všeho.
I my v naší společnosti jsme používali různá řešení, dokud jsme nenarazili na složitost, respektive nemožnost vytvářet složité, složené výstrahy. To, co jsme chtěli a co jsme nakonec udělali, je pod řezem. TLDR: Takto se objevil projekt s otevřeným zdrojovým kódem Balerter
Poměrně dlouhou dobu jsme dobře žili s výstrahami nakonfigurovanými v Grafaně. Ano, toto není nejlepší způsob. Vždy se doporučuje používat nějaká specializovaná řešení, jako je Alertmanager. A také jsme se více než jednou podívali na přesun. A pak, kousek po kousku, jsme chtěli víc.
Řekněme, kdy určitý graf klesl/vzrostl o XX % a byl tam N minut ve srovnání s předchozím obdobím M hodin? Zdá se, že to můžete zkusit implementovat pomocí Grafana nebo Alertmanager, ale není to úplně snadné. (Nebo to možná není možné, teď neřeknu)
Věci se ještě více zkomplikují, když musí být rozhodnutí o varování učiněno na základě údajů z různých zdrojů. Živý příklad:
Zkontrolujeme data ze dvou databází Clickhouse, poté je porovnáme s některými daty z Postgresu a rozhodneme o upozornění. Signál nebo zrušení
Podobných tužeb, abychom se nad svým rozhodnutím zamysleli, se nám nashromáždilo poměrně dost. A pak jsme se pokusili sestavit první seznam požadavků/schopností této služby, který ještě nevznikl.
přístup k různým zdrojům dat. Například Prometheus, Clickhouse, Postgres
posílat výstrahy na různé kanály - telegramy, nevyužité funkce atd.
v procesu přemýšlení bylo jasné, že nechci deklarativní popis, ale schopnost psát scénáře
spouštění skriptů podle plánu
snadná aktualizace skriptů bez restartování služby
schopnost nějak rozšířit funkčnost bez přestavby služby ze zdrojových kódů
Tento seznam je přibližný a pravděpodobně není příliš přesný. Některé body se změnily, některé zemřely. Všechno je jako obvykle.
Ve skutečnosti tak začala historie Balerter.
Pokusím se stručně popsat, co se nakonec stalo a jak to funguje. (Ano, samozřejmě, to není konec. Plánů na vývoj produktu je mnoho. Zastavím se jen u dneška)
Jak to funguje?
Napíšete skript v Lua, kde explicitně posíláte požadavky (pro Prometheus, Clickhouse atd.). Dostáváte odpovědi a nějak je zpracováváte a porovnáváte. Pak zapněte/vypněte nějaký druh upozornění. Balerter sám odešle upozornění na kanály, které jste nakonfigurovali (e-mail, telegram, slack atd.). Skript se spouští v určených intervalech. A... obecně, to je vše)
Nejlepší je ukázat na příkladu:
-- @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
Co se tam děje:
označujeme, že tento skript by měl být spuštěn každých 10 sekund
uveďte název skriptu (pro API, pro zobrazení v protokolech, pro použití v testech)
připojte modul pro výstup protokolů
připojte modul pro přístup k clickhouse se jménem ch1 (samotné připojení se nastavuje v konfiguraci)
odeslat požadavek na clickhouse
v případě chyby zobrazíme zprávu v protokolu a ukončíme
porovnejte výsledek dotazu s konstantou (v živém příkladu bychom tuto hodnotu mohli získat např. z databáze Postgres)
povolit nebo zakázat upozornění s ID rps-min-limit
pokud se stav výstrahy změnil, obdržíte upozornění
Příklad je celkem jednoduchý a srozumitelný. V reálném životě však mohou být skripty samozřejmě poměrně zdlouhavé a složité. Je snadné se splést a udělat chyby.
Proto uzrála logická touha - umět psát testy pro své skripty. A ve verzi v0.4.0 se to objevilo.
Testovací skripty
Příklad testu pro náš skript z příkladu výše:
-- @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')
Krok za krokem:
uveďte název skriptu, pro který je test napsán
název testu (pro protokoly)
připojte testovací modul
říkáme, jaký výsledek by měl být vrácen pro konkrétní požadavek do clickhouse ch1
zkontrolujeme, že byla vyvolána výstraha (chyba) rps-min-limit se zadanou zprávou
zkontrolujte, že upozornění na omezení otáček/min nebylo deaktivováno (úspěch)
Co ještě Balerter umí?
Pokusím se dotknout podle mého názoru nejdůležitějších dovedností Balertera. Vše si můžete podrobně prohlédnout na oficiálních stránkách https://balerter.com
přijímat data od
clickhouse
postgres
mysql
Prometheus
Loki
posílat upozornění na kanály
uvolnit
telegram
syslog
upozornit (upozornění uživatelského rozhraní na vašem počítači)
e-mail
svár
vytvořte grafy na základě vašich dat, nahrajte obrázek do úložiště kompatibilního s S3 a připojte jej k oznámením (Příklad s obrázky)
umožňuje výměnu dat mezi skripty - globální úložiště klíčů/hodnot
psát své vlastní knihovny v Lua a používat je ve skriptech (ve výchozím nastavení jsou knihovny lua dodávány pro práci s json, csv)
odesílat požadavky HTTP z vašich skriptů (a přijímat odpovědi, samozřejmě)
poskytuje API (zatím není tak funkční, jak bychom chtěli)
exportuje metriky ve formátu Prometheus
Co byste ještě chtěl umět?
Již nyní je jasné, že uživatelé i my chceme mít možnost ovládat spouštění skriptů pomocí syntaxe cron. To bude provedeno před verzí v1.0.0
Chtěl bych podporovat více zdrojů dat a kanálů pro doručování oznámení. Někomu bude například určitě chybět MongoDB. Elastické vyhledávání pro některé. Odesílejte SMS a/nebo volejte na svůj mobilní telefon. Chceme mít možnost přijímat skripty nejen ze souborů, ale také například z databáze. Nakonec chceme uživatelsky přívětivější web a lepší dokumentaci k projektu.
Vždy někomu něco chybí) Zde se spoléháme na požadavek komunity, abychom správně nastavili priority. A na pomoc komunitě vše realizovat
Konečně,
Používáme Balerter Mám to už docela dlouho. Náš klid hlídají desítky scénářů. Doufám, že tato práce bude užitečná i pro někoho dalšího.