
Alla Àlskar notifieringar.
SjÀlvklart Àr det mycket bÀttre att fÄ en notifikation nÀr nÄgot har hÀnt (eller fixats) Àn att sitta och titta pÄ diagram och leta efter anomalier.
Och det har skapats en hel del verktyg för detta. Alertmanager frÄn Prometheus-ekosystemet och vmalert frÄn VictoriaMetrics-produktgruppen. Zabbix-notifieringar och alertar i Grafana. Skript pÄ bash och Telegram-botar som regelbundet kollar en viss URL och meddelar om nÄgot Àr fel. Det finns mycket.
Vi, i vÄrt företag, anvÀnde ocksÄ olika lösningar tills vi stötte pÄ svÄrigheter, eller snarare, oförmÄgan att skapa komplexa, sammansatta alertar. Vad vi ville och vad vi slutligen gjorde - under rubriken. TLDR: SÄ föddes open source-projektet
Vi levde ganska lÀnge bra med alertar som var instÀllda i Grafana. Ja, det Àr inte den bÀsta vÀgen. Det rekommenderas alltid att anvÀnda nÄgra specialiserade lösningar, som Alertmanager. Och vi har ocksÄ flera gÄnger övervÀgt att flytta. Och sedan, sakta men sÀkert, började vi vilja ha mer.
Att sÀga nÀr en viss graf har fallit/ökat med XX% och har varit dÀr i N minuter jÀmfört med den föregÄende perioden pÄ M timmar? Det verkar som att man kan försöka genomföra detta med Grafana eller Alertmanager, men det Àr ganska komplicerat. (Eller kanske inte, jag kan inte sÀga just nu)
Allt blir Ànnu mer komplicerat nÀr beslutet om en alert mÄste fattas baserat pÄ data frÄn olika kÀllor. Ett aktuellt exempel:
Vi kontrollerar data frÄn tvÄ Clickhouse-databaser, jÀmför dem sedan med viss data frÄn Postgres och fattar beslut om alerten. Signalera eller avbryt.
Vi har samlat ganska mÄnga liknande önskemÄl sÄ att vi började tÀnka pÄ en egen lösning. Och dÄ försökte vi sammanstÀlla en första lista över krav/möjligheter för denna, Ànnu oexisterande, tjÀnst.
att kontakta olika datakÀllor. Till exempel, Prometheus, Clickhouse, Postgres.
skicka alertar till olika kanaler - telegram, slack osv.
i tankeprocessen blev det klart att vi ville ha möjligheten att skriva skript istÀllet för en deklarativ beskrivning.
köra skript enligt schema.
lÀtta att uppdatera skript utan att starta om tjÀnsten.
möjlighet att utöka funktionaliteten utan att behöva kompilera om tjÀnsten frÄn kÀllkoden.
Detta Àr en preliminÀr lista och Àr troligen inte helt exakt. NÄgra punkter har förÀndrats, andra har försvunnit. Som vanligt.
Egentligen sÄ började historien om Balerter just sÄ.

Jag ska försöka kort beskriva vad som blev resultatet och hur det fungerar. (Ja, det Àr klart, detta Àr inte slutet. MÄnga planer för produktutveckling. Jag stannar bara vid dagens datum)
Hur fungerar det?
Du skriver ett skript i Lua dÀr du tydligt skickar förfrÄgningar (till Prometheus, Clickhouse etc.). Du fÄr svar och bearbetar dem pÄ nÄgot sÀtt och jÀmför. Efter det aktiverar eller inaktiverar du nÄgon alert. Balerter skickar sjÀlv meddelandet till de kanaler du har konfigurerat (E-post, Telegram, Slack etc.). Skriptet körs med en angiven frekvens. Och⊠det Àr egentligen allt)
Det Àr bÀst att visa med ett exempel:
-- @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 < minRequestsRPS then
alert.error("rps-min-limit", "Requests RPS Àr vÀldigt lÄga: " .. tostring(resultRPS))
else
alert.success("rps-min-limit", "Requests RPS ok")
end Vad som hÀnder hÀr:
vi anger att det hÀr skriptet ska köras var tionde sekund
vi anger namnet pÄ skriptet (för API, för visning i loggar, för anvÀndning i tester)
vi laddar modulen för loggutskrift
vi laddar modulen för att fÄ tillgÄng till Clickhouse med namnet
ch1(sjÀlv anslutningen konfigureras i konfigurationsfilen)vi skickar en förfrÄgning till Clickhouse
i hĂ€ndelse av ett fel â skriver vi ett meddelande i loggen och gĂ„r ut
vi jÀmför resultatet av förfrÄgningen med konstanten (i ett verkligt exempel skulle vi kunna fÄ detta vÀrde exempelvis frÄn databasen Postgres)
vi aktiverar eller inaktiverar alerten med ID
rps-min-limitdu fÄr ett meddelande om statusen pÄ alerten har Àndrats
Exemplet Àr ganska enkelt och tydligt. Men i verkligheten kan skripten naturligtvis bli ganska komplexa och svÄra. Det Àr lÀtt att bli förvirrad och göra misstag.
DĂ€rför föddes en rimlig önskan â att kunna skriva tester för sina skript. Och i version v0.4.0 kom detta.
Testning av skript
Ett exempel pÄ test för vÄrt skript frÄn ovanstÄende exempel:
-- @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 Àr vÀldigt lÄga: 10')
test.alert().assertNotCalled('success', 'rps-min-limit', 'Requests RPS ok')Steg för steg:
vi anger namnet pÄ skriptet för vilket testet Àr skrivet
namnet pÄ testet (för loggar)
vi laddar testningsmodulen
Vi pratar om vilket resultat som ska returneras vid en viss frÄga till ClickHouse.
ch1Vi kontrollerar att en alert (error) rps-min-limit har anropats med det angivna meddelandet.
Vi kontrollerar att alerten rps-min-limit inte har stÀngts av (success).
Vad mer kan Balerter göra?
Jag ska försöka ta upp de viktigaste funktionerna enligt min Äsikt. Du kan titta pÄ allt i detalj pÄ den officiella webbplatsen.
hÀmta data frÄn
clickhouse
postgres
mysql
prometheus
loki
skicka meddelanden till kanaler
slack
telegram
syslog
notiify (UI-meddelanden pÄ din dator)
e-post
discord
bygga grafer baserade pÄ dina data, ladda upp bilder till S3-kompatibel lagring och bifoga till meddelanden ()
möjliggör datadelning mellan skript â globalt Key/Value-lagringssystem.
skriva egna bibliotek i Lua och anvÀnda dem i skripten (standard kommer lua-bibliotek för att arbeta med json, csv).
skicka HTTP-förfrÄgningar frÄn dina skript (och sjÀlvklart ta emot svar ocksÄ).
tillhandahÄller API (Ànnu inte sÄ funktionellt som önskat).
exporterar mÀtvÀrden i Prometheus-format.
Vad skulle vi vilja kunna mer?
Det Àr redan tydligt att anvÀndarna och vi vill ha möjlighet att styra körningen av skripten med hjÀlp av syntaxen cron. Detta kommer att göras före version v1.0.0.
Vi vill stödja fler datakÀllor och kanaler för att skicka meddelanden. Till exempel kommer nÄgon definitivt att sakna MongoDB. NÄgon annan Elastic Search. Skicka SMS och/eller göra samtal till mobiltelefoner. Vi vill kunna hÀmta skript inte bara frÄn filer utan ocksÄ, till exempel, frÄn databaser. I slutÀndan vill vi ha en mer anvÀndarvÀnlig webbplats för projektet och bÀttre dokumentation.
Det saknas alltid nÄgot för nÄgon) HÀr hoppas vi pÄ feedback frÄn gemenskapen för att korrekt stÀlla in prioriteringarna. Och pÄ gemenskapens hjÀlp för att genomföra allt.
Avslutningsvis
Vi anvÀnder har funnits hos oss ganska lÀnge nu. Dussintals skript stÄr vakt över vÄr frid. Jag hoppas att detta arbete kommer att vara till nytta för andra.
Och vÀlkommen med dina issue och PR.
KĂ€lla: habr.com
