Nem håndtering af komplekse alarmer. Eller historien om skabelsen af Balerter

Nem håndtering af komplekse alarmer. Eller historien om skabelsen af Balerter

Alle elsker alerter.

Selvfølgelig er det meget bedre at få en meddelelse, når noget er sket (eller er blevet løst), end at sidde og kigge på grafer og lede efter anomalier.

Og der er mange værktøjer skabt til dette. Alertmanager fra Prometheus-økosystemet og vmalert fra VictoriaMetrics-produktgruppen. Zabbix-beskeder og alerter i Grafana. Håndskrevne bash-scripts og Telegram-bots, der periodisk henter en bestemt URL og informerer, hvis noget er galt. Der er meget.

Vi i vores virksomhed har også brugt forskellige løsninger, indtil vi stødte på kompleksiteten, eller rettere sagt umuligheden af at oprette komplekse, sammensatte alerter. Hvad vi ønskede, og hvad vi i sidste ende har gjort - mere om dette nedenfor. TLDR: Så blev open source-projektet Balerter

I lang tid havde vi det godt med alerterne, der var opsat i Grafana. Ja, det er ikke den bedste vej. Det anbefales altid at bruge nogle specialiserede løsninger som Alertmanager. Og vi har også set mod at flytte flere gange. Og så, langsomt, ønskede vi os mere.

At sige, hvornår en given graf er faldet/stiget med XX% og har været der i N minutter sammenlignet med den forrige periode på M timer? Det virker som noget, der kan realiseres med Grafana eller Alertmanager, men det er ret svært. (Eller måske kan det ikke lade sig gøre, jeg kan lige nu ikke sige det.)

Det bliver endnu mere kompliceret, når beslutningen om en alert skal træffes ud fra data fra forskellige kilder. Et konkret eksempel:

Vi kontrollerer data fra to Clickhouse-databaser, sammenligner derefter med nogle data fra Postgres og træffer en beslutning om, hvorvidt vi skal sende en alert. Signalisere eller annullere.

Vi har samlet mange sådanne ønsker, så vi begyndte at tænke på vores eget løsning. Og så forsøgte vi at lave den første liste over krav/muligheder for denne endnu ikke eksisterende service.

  • At kunne tilgå forskellige datakilder. For eksempel Prometheus, Clickhouse, Postgres.

  • At sende alerter til forskellige kanaler - telegram, slack osv.

  • I løbet af overvejelserne blev det klart, at vi ikke ønsker en deklarativ beskrivelse, men muligheden for at skrive scripts.

  • At køre scripts efter en tidsplan.

  • Nem opdatering af scripts uden at genstarte tjenesten.

  • Muligheden for at udvide funktionaliteten uden at skulle genkompilere tjenesten fra kildekoderne.

Dette er en vejledende liste og er sandsynligvis ikke helt præcis. Nogle punkter blev ændret, mens andre døde. Som sædvanligt.

Faktisk er det præcis sådan, historien om Balerter begyndte.

Nem håndtering af komplekse alarmer. Eller historien om skabelsen af Balerter

Jeg vil kort beskrive, hvad resultatet blev, og hvordan det fungerer. (Ja, selvfølgelig er det ikke slutningen. Der er mange planer for produktudviklingen. Jeg vil blot koncentrere mig om i dag)

Hvordan fungerer det?

Du skriver et script i Lua, hvor du tydeligt sender forespørgsler (til Prometheus, Clickhouse osv.). Du modtager svar og behandler dem på en eller anden måde og sammenligner dem. Derefter tænder/slukker du en eller anden alert. Balerter sender selv notifikationer til de kanaler, du har indstillet (Email, Telegram, Slack osv.). Scriptet kører med en angivet frekvens. Og… det er faktisk det hele)

Det er bedst at vise det med et eksempel:

-- @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' forespørgselsfejl: " .. err)
    return
end

local resultRPS = res[1].rps

if resultRPS < minRequestsRPS then
    alert.error("rps-min-limit", "Requests RPS er meget lave: " .. tostring(resultRPS))
else
    alert.success("rps-min-limit", "Requests RPS ok")
end 

Hvad der sker her:

  • vi angiver, at dette script skal køre hvert 10. sekund

  • vi angiver navnet på scriptet (til API, til visning i logs, til brug i tests)

  • vi tilslutter modulet til logføring

  • vi tilslutter modulet til adgang til Clickhouse med navnet ch1 (selve forbindelsen konfigureres i konfigurationsfilen)

  • vi sender en forespørgsel til Clickhouse

  • i tilfælde af fejl - vi logger en besked og afslutter

  • vi sammenligner forespørgselsresultatet med konstanten (i et reelt eksempel kunne vi f.eks. få denne værdi fra en Postgres-database)

  • vi tænder eller slukker alerten med ID rps-min-limit

  • du vil modtage en notifikation, hvis alertens status ændres

Eksemplet er ret simpelt og forståeligt. Men naturligvis kan scripts i virkeligheden være ret omfattende og komplekse. Det er let at blive forvirret og lave fejl.

Derfor er ønsket om at have mulighed for at skrive tests til sine scripts opstået. Og i version v0.4.0 er dette blevet tilgængeligt.

Testning af scripts

Et eksempel på test for vores script fra ovenstående eksempel:

-- @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 er meget lave: 10')
test.alert().assertNotCalled('success', 'rps-min-limit', 'Requests RPS ok')

Trinserne:

  • vi angiver navnet på scriptet, som testen er skrevet til

  • navn på testen (til logs)

  • vi tilslutter testmodulet

  • Vi taler om, hvilket resultat der skal returneres ved en bestemt forespørgsel til ClickHouse ch1

  • Vi kontrollerer, at alerten (fejl) rps-min-limit blev kaldt med den angivne besked

  • Vi kontrollerer, at alerten rps-min-limit ikke blev deaktiveret (success)

Hvad kan Balerter ellers?

Jeg vil forsøge at berøre de vigtigste funktioner i Balerter, efter min mening. Du kan se alt i detaljer på den officielle hjemmeside https://balerter.com

  • modtage data fra

    • clickhouse

    • postgres

    • mysql

    • prometheus

    • loki

  • sende meddelelser til kanaler

    • slack

    • telegram

    • syslog

    • notiify (UI-meddelelser på din computer)

    • email

    • discord

  • bygge grafer på dine data, uploade billeder til et S3-kompatibelt lager og vedhæfte dem til meddelelser (Eksempel med billeder)

  • giver mulighed for at udveksle data mellem scripts — globalt Key/Value-lager

  • skrive dine egne biblioteker i Lua og bruge dem i scripts (der leveres som standard lua-biblioteker til arbejde med json, csv)

  • sende HTTP-forespørgsler fra dine scripts (og modtage svar, naturligvis)

  • tilbyder API (stadig ikke så funktionelt, som vi gerne ville)

  • eksporterer metrics i Prometheus-format

Hvad vil du gerne kunne endnu?

Det er allerede klart, at brugerne og vi ønsker muligheden for at styre kørsel af scripts med syntaks cron. Det vil blive gjort inden version v1.0.0

Vi ønsker at understøtte flere datakilder og kanaler til levering af meddelelser. For eksempel vil nogen helt sikkert mangle MongoDB. Nogen Elastic Search. Sende SMS og/eller foretage opkald til mobiltelefonen. Vi vil gerne kunne modtage scripts ikke kun fra filer, men også f.eks. fra databaser. Til sidst ønsker vi en mere brugervenlig hjemmeside til projektet og bedre dokumentation.

Alle mangler altid noget) Her håber vi på samfundets forespørgsler for at opstille de rigtige prioriteter. Og samfundets hjælp til at realisere alt

Afslutningsvis

Vi bruger Balerter har allerede haft det i et stykke tid. Duskere af scripts står vagt om vores fred. Jeg håber, dette arbejde vil være nyttigt for nogen andre.

Og velkommen med dine problemer og PR.

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster