Könnyű munka összetett riasztásokkal. Vagy Balerter története
Mindenki szereti a figyelmeztetéseket.
Természetesen sokkal jobb értesítést kapni, ha valami történt (vagy kijavították), mint ülni, grafikonokat nézegetni, és anomáliákat keresni.
És ehhez számos eszközt készítettek. Alertmanager a Prometheus ökoszisztémából és vmalert a VictoriaMetrics termékcsoportból. Zabbix értesítések és figyelmeztetések a Grafana-ban. Ön által írt szkriptek bash és Telegram robotokban, amelyek időnként előhívnak valamilyen URL-t, és jelzik, ha valami nincs rendben. Sok minden.
Cégünknél is különböző megoldásokat alkalmaztunk, amíg bele nem ütköztünk az összetett, összetett riasztások létrehozásának bonyolultságába, vagy inkább lehetetlenségébe. Amit akartunk, és mire jutottunk, az a vágás alatt van. TLDR: Így jelent meg a nyílt forráskódú projekt Balerter
Elég sokáig jól éltünk a Grafanában konfigurált riasztásokkal. Igen, ez nem a legjobb módszer. Mindig ajánlott néhány speciális megoldás, például az Alertmanager használata. És a költözés felé is többször tekintettünk. Aztán apránként többet akartunk.
Mondjuk, amikor egy bizonyos diagram XX%-ot esett/nőtt, és N perce volt ott az előző M órás periódushoz képest? Úgy tűnik, hogy megpróbálhatja ezt megvalósítani a Grafana vagy az Alertmanager segítségével, de ez nem olyan egyszerű. (Vagy talán nem is lehetséges, most nem mondom)
A dolgok még bonyolultabbá válnak, ha a riasztási döntést különböző forrásokból származó adatok alapján kell meghozni. Élő példa:
Ellenőrizzük két Clickhouse adatbázis adatait, majd összehasonlítjuk a Postgres egyes adataival, és döntünk a riasztás mellett. Jelölje vagy törölje
Elég sok hasonló vágy halmozódott fel bennünk, hogy elgondolkodjunk a döntésünkön. Aztán megpróbáltuk összeállítani ennek a szolgáltatásnak az első követelményeit/képességeit, ami még nem készült el.
különböző adatforrásokhoz hozzáférni. Például Prometheus, Clickhouse, Postgres
riasztások küldése különböző csatornákra - távirat, laza stb.
a gondolkodás során világossá vált, hogy nem deklaratív leírást akarok, hanem forgatókönyvírás képességét
szkriptek ütemezett futtatása
a szkriptek egyszerű frissítése a szolgáltatás újraindítása nélkül
a funkcionalitás valamilyen módon történő bővítésének képessége anélkül, hogy a szolgáltatást forráskódokból újra kellene építeni
Ez a lista hozzávetőleges, és valószínűleg nem túl pontos. Néhány pont megváltozott, néhány elhalt. Minden a szokásos.
Valójában így kezdődött Balerter története.
Megpróbálom röviden leírni, mi történt végül és hogyan működik. (Igen, persze, ez még nem a vége. Sok terv van a termékfejlesztéssel kapcsolatban. A mai napon megállok)
Hogyan működik?
Írsz egy szkriptet a Lua-ban, ahol kifejezetten kéréseket küldesz (Prometheusnak, Clickhouse-nak stb.). Válaszokat kap, és valahogy feldolgozza és összehasonlítja őket. Ezután kapcsoljon be/ki valamilyen riasztást. Maga a Balerter értesítést küld az Ön által beállított csatornáknak (e-mail, távirat, slack stb.). A szkript meghatározott időközönként fut le. És... általában ennyi)
A legjobb egy példával bemutatni:
-- @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
Mi folyik itt:
jelezzük, hogy ezt a szkriptet 10 másodpercenként kell végrehajtani
adja meg a szkript nevét (az API-hoz, a naplókban való megjelenítéshez, a tesztekben való használatra)
csatlakoztassa a modult a naplók kiadásához
csatlakoztasson egy modult a névvel ellátott clickhouse eléréséhez ch1 (maga a kapcsolat a konfigurációban van konfigurálva)
küldjön kérést a clickhouse-nak
hiba esetén üzenetet jelenítünk meg a naplóban és kilépünk
hasonlítsa össze a lekérdezés eredményét egy konstanssal (egy élő példában ezt az értéket megkaphatjuk például a Postgres adatbázisból)
riasztás engedélyezése vagy letiltása azonosítóval rps-min-limit
értesítést kap, ha a riasztási állapot megváltozott
A példa meglehetősen egyszerű és érthető. Természetesen a való életben a forgatókönyvek meglehetősen hosszadalmasak és összetettek lehetnek. Könnyű összezavarodni és hibázni.
Ezért megérett egy logikus vágy – hogy tudjon teszteket írni a szkriptjeihez. És a v0.4.0 verzióban ez megjelent.
Szkriptek tesztelése
Példateszt a szkriptünkhöz a fenti példából:
-- @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')
A lépések:
adja meg a szkript nevét, amelyre a tesztet írták
tesztnév (naplókhoz)
csatlakoztassa a tesztelő modult
megmondjuk, hogy egy konkrét kérés esetén milyen eredményt kell visszaküldeni a clickhouse-nak ch1
ellenőrizzük, hogy a megadott üzenettel rendelkező riasztás (hiba) rps-min-limit meghívásra került-e
ellenőrizze, hogy az rps-min-limit riasztás nem lett-e letiltva (siker)
Mit tehet még Balerter?
Megpróbálom érinteni a véleményem szerint legfontosabb Balerter-készségeket. A hivatalos oldalon mindent részletesen megtekinthet https://balerter.com
adatot fogadni
clickhouse
postgres
mysql
Prométheusz
Loki
értesítéseket küldeni a csatornáknak
laza
távirat
syslog
értesítés (UI-értesítések a számítógépen)
email
viszály
grafikonokat készíthet adatai alapján, feltöltheti a képet S3-kompatibilis tárhelyre, és csatolhatja az értesítésekhez (Példa képekkel)
lehetővé teszi a szkriptek közötti adatcserét - globális kulcs/érték tároló
írja meg saját könyvtárait Lua-ban, és használja azokat szkriptekben (alapértelmezés szerint a lua-könyvtárak a json, csv-vel való munkavégzéshez vannak biztosítva)
HTTP-kérések küldése a szkriptekből (és természetesen válaszok fogadása)
API-t biztosít (még nem olyan működőképes, mint szeretnénk)
a mutatókat Prometheus formátumban exportálja
Mi mást szeretnél még csinálni?
Az már világos, hogy a felhasználók és mi is azt akarjuk, hogy a szintaxis segítségével irányíthassuk a szkriptek indítását cron. Ez a v1.0.0 verzió előtt fog megtörténni
Több adatforrást és értesítéskézbesítési csatornát szeretnék támogatni. Például valakinek biztosan hiányozni fog a MongoDB. Elasztikus Keresés néhány. Küldjön SMS-t és/vagy hívjon a mobiltelefonjára. Azt akarjuk, hogy ne csak fájlokból, hanem például adatbázisból is tudjunk szkripteket fogadni. Végül egy felhasználóbarátabb weboldalt és jobb dokumentációt szeretnénk a projekthez.
Valakinek mindig hiányzik valami) Itt a közösség kérésére hagyatkozunk a prioritások helyes felállítása érdekében. És a közösség segítségére, hogy mindent megvalósítson
Összefoglalva
Használunk Balerter Már egy jó ideje megvan. Több tucat forgatókönyv őrzi lelki békénket. Remélem, ez a munka másnak is hasznos lesz.