LĂ€tt arbete med komplexa varningar. Eller historien bakom Balerter

LĂ€tt arbete med komplexa varningar. Eller historien bakom Balerter

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 Balerter

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Ä.

LĂ€tt arbete med komplexa varningar. Eller historien bakom Balerter

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-limit

  • du 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. ch1

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

  • 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 (Exempel med bilder)

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

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster