Enkelt arbete med komplexa varningar. Eller historien om Balerters skapelse

Enkelt arbete med komplexa varningar. Eller historien om Balerters skapelse

Alla älskar varningar.

Det är förstås mycket bättre att få besked när något har hänt (eller åtgärdats) än att sitta och titta på grafer och leta efter anomalier.

Och många verktyg har skapats för detta. Alertmanager från Prometheus ecosystem och vmalert från VictoriaMetrics produktgrupp. Zabbix-meddelanden och varningar i Grafana. Självskrivna skript i bash- och Telegram-botar som med jämna mellanrum drar upp någon URL och berättar om något är fel. Mycket av allt.

Vi i vårt företag använde också olika lösningar tills vi stötte på komplexiteten, eller snarare omöjligheten, att skapa komplexa, sammansatta varningar. Vad vi ville och vad vi gjorde är under snittet. TLDR: Så här såg open source-projektet ut Balpressare

Under ganska lång tid levde vi bra med varningar konfigurerade i Grafana. Ja, detta är inte det bästa sättet. Det rekommenderas alltid att använda vissa specialiserade lösningar, såsom Alertmanager. Och vi tittade också på att flytta mer än en gång. Och sedan, lite i taget, ville vi ha mer.

Сказать, когда некий график упал/вырос на XX% и находится там уже N минут по сравнению с предыдущим периодом в M часов? Это, кажется, можно попробовать реализовать с Grafana или Alertmanager, но довольно не просто. (А может и нельзя, я сейчас и не скажу)

Все становится еще сложнее, когда решение об алерте надо принять на основе данных из разных источников. Живой пример:

Vi kontrollerar data från två Clickhouse-databaser, jämför dem sedan med data från Postgres och beslutar om en varning. Signalera eller avbryt

Vi har samlat på oss ganska många liknande önskemål om att vi ska tänka på vårt beslut. Och sedan försökte vi sammanställa den första listan med krav/funktioner för denna tjänst, som ännu inte har skapats.

  • tillgång till olika datakällor. Till exempel Prometheus, Clickhouse, Postgres

  • skicka varningar till olika kanaler - telegram, slack, etc.

  • i tankeprocessen blev det tydligt att jag inte ville ha en deklarativ beskrivning, utan förmågan att skriva manus

  • köra skript enligt ett schema

  • enkel uppdatering av skript utan att starta om tjänsten

  • möjligheten att på något sätt utöka funktionaliteten utan att bygga om tjänsten från källkoder

Denna lista är ungefärlig och troligen inte särskilt exakt. Vissa punkter ändrades, några dog. Allt är som vanligt.

Egentligen var det så här Balerters historia började.

Enkelt arbete med komplexa varningar. Eller historien om Balerters skapelse

Jag ska försöka beskriva kort vad som hände till slut och hur det fungerar. (Ja, naturligtvis, detta är inte slutet. Det finns många planer för produktutveckling. Jag slutar bara vid idag)

Hur fungerar det?

Вы пишите скрипт на Lua, где явно отправляете запросы (в Prometheus, Clickhouse и т.д). Получаете ответы и как-то их обрабатываете и сравниваете. После чего включаете/выключаете какой-то алерт. Balerter сам отправит уведомление в каналы, которые вы настроили (Email, telegram, slack и т.д.). Скрипт выполняется с заданной периодичностью. И… в общем-то это все)

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 < minResultRPS then
    alert.error("rps-min-limit", "Requests RPS are very small: " .. tostring(resultRPS))
else
    alert.success("rps-min-limit", "Requests RPS ok")
end 

Vad händer här:

  • vi anger att detta skript ska köras var tionde sekund

  • ange namnet på skriptet (för API, för visning i loggar, för användning i tester)

  • anslut modulen för utmatning av loggar

  • anslut en modul för att komma åt klickhuset med namnet ch1 (само подкчлючение настраивается в конфиге)

  • skicka en förfrågan till clickhouse

  • в случае ошибки — выводим сообщение в лог и выходим

  • jämför frågeresultatet med en konstant (i ett levande exempel kan vi få det här värdet, till exempel från Postgres-databasen)

  • включаем или выключаем алерт с ID rps-min-limit

  • du kommer att få ett meddelande om varningsstatusen har ändrats

Exemplet är ganska enkelt och förståeligt. Men naturligtvis kan manus i verkliga livet vara ganska långa och komplexa. Det är lätt att bli förvirrad och göra misstag.

Поэтому созрело логичное желание — иметь возможность напистать тесты для своих скриптов. И в версии v0.4.0 это появилось.

Testa skript

Exempeltest för vårt skript från exemplet ovan:

-- @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')

Steg för steg:

  • указываем имя скрипта, для которого написан тест

  • testnamn (för loggar)

  • anslut testmodulen

  • говорим, какой результат надо вернуть при определенном запросе к кликхаусу ch1

  • vi kontrollerar att larmet (fel) rps-min-limit med det angivna meddelandet anropades

  • kontrollera att varningen rps-min-limit inte var inaktiverad (framgång)

Vad mer kan Balerter göra?

Jag ska försöka beröra de viktigaste, enligt min mening, Balerter-kunskaperna. Du kan se allt i detalj på den officiella webbplatsen https://balerter.com

  • ta emot data från

    • klickhus

    • postgres

    • mysql

    • prometheus

    • loki

  • skicka aviseringar till kanaler

    • slak

    • telegram

    • syslog

    • notify (UI-aviseringar på din dator)

    • e-mail

    • oenighet

  • skapa grafer baserat på dina data, ladda upp bilden till S3-kompatibel lagring och bifoga den till aviseringar (Exempel med bilder)

  • låter dig utbyta data mellan skript - global nyckel-/värdelagring

  • skriv dina egna bibliotek i Lua och använd dem i skript (som standard tillhandahålls lua-bibliotek för att arbeta med json, csv)

  • отправлять HTTP запросы из ваших скриптов (ну и получать ответы, разумеется)

  • tillhandahåller ett API (ännu inte så funktionellt som vi skulle vilja)

  • exporterar mätvärden i Prometheus-format

Vad mer skulle du vilja kunna göra?

Det är redan klart att användare och vi vill ha möjligheten att styra lanseringen av skript med hjälp av syntaxen cron. Detta kommer att göras före version v1.0.0

Jag skulle vilja stödja fler datakällor och aviseringskanaler. Till exempel kommer någon definitivt att sakna MongoDB. Elastisk Sök efter några. Skicka SMS och/eller ring samtal till din mobiltelefon. Vi vill kunna ta emot skript inte bara från filer, utan även från till exempel en databas. I slutändan vill vi ha en mer användarvänlig hemsida och bättre dokumentation för projektet.

Någon saknar alltid något) Här förlitar vi oss på samhällets begäran för att prioritera korrekt. Och till samhällets hjälp att förverkliga allt

Sammanfattningsvis

Vi använder Balpressare у себя уже довольно давно. Десятки скриптов стоят на страже нашего спокойствия. Надеюсь, эта работа станет полезна кому-то еще.

И добро пожаловать с вашими Issue и PR.

Källa: will.com

Lägg en kommentar