
Toată lumea iubește alertele.
Desigur, este mult mai bine să fii anunțat când s-a întâmplat ceva (sau a fost remediat) decât să stai și să te uiți la grafice și să cauți anomalii.
Și multe instrumente au fost create pentru asta. Alertmanager din ecosistemul Prometheus și vmalert din grupul de produse VictoriaMetrics. Notificări și alerte Zabbix în Grafana. Scripturi auto-scrise în bash și telegrame roboți care aduc periodic o adresă URL și vă spun dacă ceva nu este în regulă. Mult din toate.
Noi, în compania noastră, am folosit și noi soluții diferite până ne-am întâlnit cu complexitatea sau, mai bine zis, cu imposibilitatea de a crea alerte complexe, compuse. Ce ne-am dorit și ceea ce am ajuns să facem este sub tăietură. TLDR: Așa a apărut proiectul open source
Destul de mult timp am trăit bine cu alertele configurate în Grafana. Da, acesta nu este cel mai bun mod. Este întotdeauna recomandat să folosiți unele soluții specializate, precum Alertmanager. Și ne-am uitat să ne mutăm de mai multe ori. Și apoi, încetul cu încetul, ne-am dorit mai mult.
Spuneți când un anumit grafic a scăzut/a crescut cu XX% și a fost acolo timp de N minute în comparație cu perioada anterioară de M ore? Se pare că puteți încerca să implementați acest lucru cu Grafana sau Alertmanager, dar nu este chiar ușor. (Sau poate nu este posibil, nu voi spune acum)
Lucrurile se complică și mai mult atunci când decizia de alertă trebuie luată pe baza datelor din diferite surse. Exemplu live:
Verificăm datele din două baze de date Clickhouse, apoi le comparăm cu unele date de la Postgres și decidem asupra unei alerte. Semnalați sau anulați
Am acumulat destul de multe dorințe similare ca să ne gândim la decizia noastră. Și apoi am încercat să alcătuim prima listă de cerințe/capacități a acestui serviciu, care nu a fost încă creată.
accesați diferite surse de date. De exemplu, Prometheus, Clickhouse, Postgres
trimite alerte către diverse canale - telegramă, slack etc.
în procesul de gândire, a devenit clar că nu vreau o descriere declarativă, ci capacitatea de a scrie scenarii
rulează scripturi într-un program
actualizare ușoară a scripturilor fără a reporni serviciul
capacitatea de a extinde cumva funcționalitatea fără a reconstrui serviciul din codurile sursă
Această listă este aproximativă și cel mai probabil nu foarte precisă. Unele puncte s-au schimbat, altele au murit. Totul este ca de obicei.
De fapt, așa a început istoria lui Balerter.

Voi încerca să descriu pe scurt ce s-a întâmplat până la urmă și cum funcționează. (Da, desigur, acesta nu este sfârșitul. Există multe planuri pentru dezvoltarea de produse. Mă opresc doar astăzi)
Cum funcționează?
Scrieți un script în Lua în care trimiteți explicit solicitări (către Prometheus, Clickhouse etc.). Primești răspunsuri și cumva le procesezi și compari. Apoi activați/dezactivați un fel de alertă. Balerter însuși va trimite o notificare către canalele pe care le-ați configurat (E-mail, telegramă, slack etc.). Scriptul este executat la intervale specificate. Și... în general, asta e tot)
Cel mai bine este să arătați cu un exemplu:
-- @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 Ce se petrece aici:
indicăm că acest script ar trebui să fie executat la fiecare 10 secunde
indicați numele scriptului (pentru API, pentru afișare în jurnale, pentru utilizare în teste)
conectați modulul pentru ieșirea jurnalelor
conectați un modul pentru a accesa caseta de clic cu numele
ch1(conexiunea în sine este configurată în configurație)trimiteți o solicitare către clickhouse
în cazul unei erori, afișăm un mesaj în jurnal și ieșim
comparați rezultatul interogării cu o constantă (într-un exemplu live, am putea obține această valoare, de exemplu, din baza de date Postgres)
activați sau dezactivați alerta cu ID
rps-min-limitveți primi o notificare dacă starea alertei s-a schimbat
Exemplul este destul de simplu și de înțeles. Cu toate acestea, desigur, în viața reală scenariile pot fi destul de lungi și complexe. Este ușor să fii confuz și să faci greșeli.
Prin urmare, s-a maturizat o dorință logică - de a putea scrie teste pentru scripturile tale. Și în versiunea v0.4.0 aceasta a apărut.
Testarea scripturilor
Exemplu de test pentru scriptul nostru din exemplul de mai sus:
-- @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')Pas cu pas:
indicați numele scenariului pentru care este scris testul
numele testului (pentru jurnalele)
conectați modulul de testare
spunem ce rezultat ar trebui returnat pentru o cerere specifică către clickhouse
ch1verificăm că a fost apelată alerta (eroare) rps-min-limit cu mesajul specificat
verificați dacă alerta rps-min-limit nu a fost dezactivată (succes)
Ce altceva poate face Balerter?
Voi încerca să ating cele mai importante, după părerea mea, abilitățile Balerter. Puteți vedea totul în detaliu pe site-ul oficial
primesc date de la
clickhouse
Postgres
MySQL
Prometheus
Loki
trimite notificări către canale
moale
telegramă
syslog
notifică (notificări UI pe computer)
e-mail
discordie
construiți grafice pe baza datelor dvs., încărcați imaginea în spațiul de stocare compatibil S3 și atașați-o la notificări ()
vă permite să faceți schimb de date între scripturi - stocare globală cheie/valoare
scrieți propriile biblioteci în Lua și utilizați-le în scripturi (în mod implicit, bibliotecile lua sunt furnizate pentru lucrul cu json, csv)
trimiteți solicitări HTTP din scripturile dvs. (și primiți răspunsuri, desigur)
oferă un API (nu este încă atât de funcțional pe cât ne-am dori)
exportă valorile în format Prometheus
Ce altceva ți-ar plăcea să poți face?
Este deja clar că utilizatorii și noi dorim posibilitatea de a controla lansarea scripturilor folosind sintaxa cron. Acest lucru se va face înainte de versiunea v1.0.0
Aș dori să sprijin mai multe surse de date și canale de livrare a notificărilor. De exemplu, cuiva îi va lipsi cu siguranță MongoDB. Caută elastic pentru unele. Trimiteți SMS-uri și/sau efectuați apeluri pe telefonul dvs. mobil. Dorim să putem primi scripturi nu numai din fișiere, ci și, de exemplu, dintr-o bază de date. În final, dorim un site web mai ușor de utilizat și o documentație mai bună pentru proiect.
Cuiva îi lipsește mereu ceva) Aici ne bazăm pe solicitarea comunității pentru a stabili prioritățile corect. Și în ajutorul comunității să realizeze totul
în concluzie
Folosim O am de ceva timp acum. Zeci de scenarii ne păzesc liniștea sufletească. Sper că această lucrare va fi de folos altcuiva.
Și bun venit cu problema și PR.
Sursa: www.habr.com
