Lucru ușor cu alerte complexe. Sau istoria creării lui Balerter

Lucru ușor cu alerte complexe. Sau istoria creării lui Balerter

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 Balerter

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.

Lucru ușor cu alerte complexe. Sau istoria creării 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-limit

  • veț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 ch1

  • verifică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 https://balerter.com

  • 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 (Exemplu cu poze)

  • 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 Balerter 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

Adauga un comentariu