Jednoduchá práce se složitými alerty. Nebo příběh vzniku Balerter

Jednoduchá práce se složitými alerty. Nebo příběh vzniku Balerter

Všichni mají rádi upozornění.

Samozřejmě je mnohem lepší dostat notifikaci, když se něco stalo (nebo to bylo opraveno), než sedět a sledovat grafy a hledat anomálie.

Existuje spousta nástrojů pro to. Alertmanager z ekosystému Prometheus a vmalert z produktové řady VictoriaMetrics. Upozornění zabbix a alerty v Grafana. Vlastní skripty napsané v bash a Telegram boti, kteří pravidelně kontrolují nějakou URL a říkají, pokud je něco špatně. Je toho hodně.

My, v naší společnosti, jsme také používali různá řešení, dokud jsme nenarazili na složitost, nebo spíše nemožnost vytvářet složité, kombinované alerty. Co jsme chtěli a co jsme nakonec udělali — pod tímto odstavcem. TLDR: Tak vznikl open source projekt Balerter

Docela dlouho jsme žili s alerty nastavenými v Grafana. Ano, to není nejlepší cesta. Vždy se doporučuje používat nějaká specializovaná řešení, jako je Alertmanager. A my jsme také několikrát uvažovali o přechodu. A pak, pomalu, jsme si přáli víc.

Říci, kdy nějaký graf klesl/vyrostl o XX% a nachází se tam už N minut ve srovnání s předchozím obdobím M hodin? To se zdá možné implementovat s Grafana nebo Alertmanager, ale docela komplikované. (A možná to ani není možné, teď to neřeknu)

Vše se stává ještě složitějším, když musí být rozhodnutí o alertu učiněno na základě dat z různých zdrojů. Živý příklad:

Kontrolujeme data ze dvou databází Clickhouse, poté je srovnáváme s některými daty z Postgresu a rozhodujeme se o alertu. Signalizovat nebo zrušit

Podobných požadavků se nám nashromáždilo dost, abychom začali přemýšlet o našem řešení. A tehdy jsme se pokusili sestavit první seznam požadavků/možností tohoto dosud nevytvořeného služby

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

  • odesílat alerty do různých kanálů — telegram, slack atd.

  • v průběhu uvažování se ukázalo, že chceme nikoli deklarativní popis, ale možnosti psát skripty

  • spouštět skripty podle plánu

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

  • možnost nějak rozšiřovat funkčnost bez překládání služby ze zdrojových kódů

Toto je příkladný seznam a pravděpodobně ne příliš přesný. Některé body se měnily, některé zanikly. Všechno, jak už je obvyklé.

Ve skutečnosti tak začala historie Balerter.

Jednoduchá práce se složitými alerty. Nebo příběh vzniku Balerter

Pokud to shrnu krátce, co jsme nakonec získali a jak to funguje. (Ano, samozřejmě, to není konec. Mám mnoho plánů na rozvoj produktu. Zastavím se ale u dnešního dne)

Jak to funguje?

Píšete skript v Lua, kde jasně posíláte dotazy (na Prometheus, Clickhouse atd.). Získáváte odpovědi a jaksi je zpracováváte a porovnáváte. Poté zapínáte/vypínáte nějaký alert. Balerter sám odešle oznámení do kanálů, které jste nastavili (Email, Telegram, Slack atd.). Skript se provádí s určenou periodicitou. A… to je v podstatě vše)

Nejlépe to 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' dotazová chyba: " .. err)
    return
end

local resultRPS = res[1].rps

if resultRPS < minRequestsRPS then
    alert.error("rps-min-limit", "Requests RPS jsou velmi nízké: " .. tostring(resultRPS))
else
    alert.success("rps-min-limit", "Requests RPS jsou v pořádku")
end 

Co se zde děje:

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

  • označujeme název skriptu (pro API, pro zobrazení v logách, pro použití v testech)

  • připojujeme modul pro výstup logů

  • připojujeme modul pro přístup k Clickhouse pod názvem ch1 (připojení se konfiguruje v konfiguračním souboru)

  • odesíláme dotaz do Clickhouse

  • v případě chyby — vypisujeme zprávu do logu a odcházíme

  • porovnáváme výsledek dotazu s konstantou (ve skutečném příkladu bychom tuto hodnotu mohli například získat z databáze Postgres)

  • zapneme nebo vypneme alert s ID rps-min-limit

  • dostanete oznámení, pokud se stav alertu změní

Příklad je docela jednoduchý a srozumitelný. Samozřejmě, ve skutečném životě mohou být skripty poměrně rozmanité a složité. Snadno se v nich můžete ztratit a udělat chyby.

Proto vznikla logická touha — mít možnost napsat testy pro své skripty. A ve verzi v0.4.0 se to objevilo.

Testování skriptů

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

-- @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 jsou velmi nízké: 10')
test.alert().assertNotCalled('success', 'rps-min-limit', 'Requests RPS jsou v pořádku')

Kroky:

  • označujeme název skriptu, pro který byl test napsán

  • název testu (pro logy)

  • připojujeme modul pro testování

  • Diskutujeme, jaký výsledek je třeba vrátit při určitém dotazu na ClickHouse. ch1

  • Ověřujeme, že byl vyvolán alert (error) rps-min-limit s uvedenou zprávou.

  • Ověřujeme, že alert rps-min-limit nebyl deaktivován (success).

Co dalšího umí Balerter?

Pokud se dotknu nejdůležitějších funkcí Balerter, podrobně si je můžete prohlédnout na oficiálních stránkách. https://balerter.com

  • získávat data z

    • ClickHouse

    • Postgres

    • mysql

    • Prometheus

    • Loki

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

    • Slack

    • telegram

    • Syslog

    • notiify (UI upozornění na vašem počítači)

    • email

    • Discord

  • budovat grafy na základě vašich dat, nahrávat obrázek do S3 kompatibilního úložiště a připojovat je k upozorněním (Příklad s obrázky)

  • umožňuje sdílet data mezi skripty — globální Key/Value úložiště.

  • píšete si vlastní knihovny v Lua a používáte je ve skriptech (ve výchozím nastavení jsou dodávány lua-knihovny pro práci s json, csv).

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

  • poskytuje API (zatím není tak funkční, jak bychom si přáli).

  • exportuje metriky v formátu Prometheus.

A co byste chtěli umět ještě?

Již je jasné, že uživatelé a my chceme mít možnost řídit spuštění skriptů pomocí syntaxe cron.To bude provedeno před verzí v1.0.0.

Chtěli bychom podporovat více zdrojů dat a kanálů pro doručování upozornění. Například někomu určitě nebude stačit MongoDB. Někdo jiný potřebuje Elastic Search. Odesílat SMS a/nebo provádět telefonní hovory na mobilní. Chceme mít možnost získávat skripty nejen z souborů, ale například také z databáze. Nakonec bychom chtěli pro projekt pohodlnější webové stránky a lepší dokumentaci.

Vždy někomu něco chybí) Doufáme, že se obrátíme na komunitu, abychom správně určili priority. A na pomoc komunity, abychom vše realizovali.

Na závěr

Používáme Balerter používáme už docela dlouho. Desítky skriptů chrání náš klid. Doufám, že tato práce bude užitečná i pro někoho jiného.

A vítejte se svými Issues a PR.

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster