Snadná práce se složitými upozorněními. Nebo historie vzniku Balertera

Snadná práce se složitými upozorněními. Nebo historie vzniku Balertera

Každý má rád upozornění.

Samozřejmě je mnohem lepší být upozorněni, když se něco stalo (nebo bylo opraveno), než sedět a dívat se na grafy a hledat anomálie.

A k tomu bylo vytvořeno mnoho nástrojů. Alertmanager z ekosystému Prometheus a vmalert z produktové skupiny VictoriaMetrics. Oznámení a výstrahy Zabbix v Grafaně. Samostatně psané skripty v robotech bash a telegram, které pravidelně vytahují nějakou adresu URL a řeknou vám, jestli je něco špatně. Hodně všeho.

I my v naší společnosti jsme používali různá řešení, dokud jsme nenarazili na složitost, respektive nemožnost vytvářet složité, složené výstrahy. To, co jsme chtěli a co jsme nakonec udělali, je pod řezem. TLDR: Takto se objevil projekt s otevřeným zdrojovým kódem Balerter

Poměrně dlouhou dobu jsme dobře žili s výstrahami nakonfigurovanými v Grafaně. Ano, toto není nejlepší způsob. Vždy se doporučuje používat nějaká specializovaná řešení, jako je Alertmanager. A také jsme se více než jednou podívali na přesun. A pak, kousek po kousku, jsme chtěli víc.

Řekněme, kdy určitý graf klesl/vzrostl o XX % a byl tam N minut ve srovnání s předchozím obdobím M hodin? Zdá se, že to můžete zkusit implementovat pomocí Grafana nebo Alertmanager, ale není to úplně snadné. (Nebo to možná není možné, teď neřeknu)

Věci se ještě více zkomplikují, když musí být rozhodnutí o varování učiněno na základě údajů z různých zdrojů. Živý příklad:

Zkontrolujeme data ze dvou databází Clickhouse, poté je porovnáme s některými daty z Postgresu a rozhodneme o upozornění. Signál nebo zrušení

Podobných tužeb, abychom se nad svým rozhodnutím zamysleli, se nám nashromáždilo poměrně dost. A pak jsme se pokusili sestavit první seznam požadavků/schopností této služby, který ještě nevznikl.

  • přístup k různým zdrojům dat. Například Prometheus, Clickhouse, Postgres

  • posílat výstrahy na různé kanály - telegramy, nevyužité funkce atd.

  • v procesu přemýšlení bylo jasné, že nechci deklarativní popis, ale schopnost psát scénáře

  • spouštění skriptů podle plánu

  • snadná aktualizace skriptů bez restartování služby

  • schopnost nějak rozšířit funkčnost bez přestavby služby ze zdrojových kódů

Tento seznam je přibližný a pravděpodobně není příliš přesný. Některé body se změnily, některé zemřely. Všechno je jako obvykle.

Ve skutečnosti tak začala historie Balerter.

Snadná práce se složitými upozorněními. Nebo historie vzniku Balertera

Pokusím se stručně popsat, co se nakonec stalo a jak to funguje. (Ano, samozřejmě, to není konec. Plánů na vývoj produktu je mnoho. Zastavím se jen u dneška)

Jak to funguje?

Napíšete skript v Lua, kde explicitně posíláte požadavky (pro Prometheus, Clickhouse atd.). Dostáváte odpovědi a nějak je zpracováváte a porovnáváte. Pak zapněte/vypněte nějaký druh upozornění. Balerter sám odešle upozornění na kanály, které jste nakonfigurovali (e-mail, telegram, slack atd.). Skript se spouští v určených intervalech. A... obecně, to je vše)

Nejlepší je ukázat na příkladu:

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

Co se tam děje:

  • označujeme, že tento skript by měl být spuštěn každých 10 sekund

  • uveďte název skriptu (pro API, pro zobrazení v protokolech, pro použití v testech)

  • připojte modul pro výstup protokolů

  • připojte modul pro přístup k clickhouse se jménem ch1 (samotné připojení se nastavuje v konfiguraci)

  • odeslat požadavek na clickhouse

  • v případě chyby zobrazíme zprávu v protokolu a ukončíme

  • porovnejte výsledek dotazu s konstantou (v živém příkladu bychom tuto hodnotu mohli získat např. z databáze Postgres)

  • povolit nebo zakázat upozornění s ID rps-min-limit

  • pokud se stav výstrahy změnil, obdržíte upozornění

Příklad je celkem jednoduchý a srozumitelný. V reálném životě však mohou být skripty samozřejmě poměrně zdlouhavé a složité. Je snadné se splést a udělat chyby.

Proto uzrála logická touha - umět psát testy pro své skripty. A ve verzi v0.4.0 se to objevilo.

Testovací skripty

Příklad testu pro náš skript z příkladu výše:

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

Krok za krokem:

  • uveďte název skriptu, pro který je test napsán

  • název testu (pro protokoly)

  • připojte testovací modul

  • říkáme, jaký výsledek by měl být vrácen pro konkrétní požadavek do clickhouse ch1

  • zkontrolujeme, že byla vyvolána výstraha (chyba) rps-min-limit se zadanou zprávou

  • zkontrolujte, že upozornění na omezení otáček/min nebylo deaktivováno (úspěch)

Co ještě Balerter umí?

Pokusím se dotknout podle mého názoru nejdůležitějších dovedností Balertera. Vše si můžete podrobně prohlédnout na oficiálních stránkách https://balerter.com

  • přijímat data od

    • clickhouse

    • postgres

    • mysql

    • Prometheus

    • Loki

  • posílat upozornění na kanály

    • uvolnit

    • telegram

    • syslog

    • upozornit (upozornění uživatelského rozhraní na vašem počítači)

    • e-mail

    • svár

  • vytvořte grafy na základě vašich dat, nahrajte obrázek do úložiště kompatibilního s S3 a připojte jej k oznámením (Příklad s obrázky)

  • umožňuje výměnu dat mezi skripty - globální úložiště klíčů/hodnot

  • psát své vlastní knihovny v Lua a používat je ve skriptech (ve výchozím nastavení jsou knihovny lua dodávány pro práci s json, csv)

  • odesílat požadavky HTTP z vašich skriptů (a přijímat odpovědi, samozřejmě)

  • poskytuje API (zatím není tak funkční, jak bychom chtěli)

  • exportuje metriky ve formátu Prometheus

Co byste ještě chtěl umět?

Již nyní je jasné, že uživatelé i my chceme mít možnost ovládat spouštění skriptů pomocí syntaxe cron. To bude provedeno před verzí v1.0.0

Chtěl bych podporovat více zdrojů dat a kanálů pro doručování oznámení. Někomu bude například určitě chybět MongoDB. Elastické vyhledávání pro některé. Odesílejte SMS a/nebo volejte na svůj mobilní telefon. Chceme mít možnost přijímat skripty nejen ze souborů, ale také například z databáze. Nakonec chceme uživatelsky přívětivější web a lepší dokumentaci k projektu.

Vždy někomu něco chybí) Zde se spoléháme na požadavek komunity, abychom správně nastavili priority. A na pomoc komunitě vše realizovat

Konečně,

Používáme Balerter Mám to už docela dlouho. Náš klid hlídají desítky scénářů. Doufám, že tato práce bude užitečná i pro někoho dalšího.

A vítejte s vaším problémem a PR.

Zdroj: www.habr.com

Přidat komentář