Łatwa praca ze złożonymi alertami. Albo historia powstania Balertera
Wszyscy uwielbiają alerty.
Oczywiście znacznie lepiej jest zostać powiadomionym, gdy coś się wydarzyło (lub zostało naprawione), niż siedzieć i patrzeć na wykresy i szukać anomalii.
I do tego stworzono wiele narzędzi. Alertmanager z ekosystemu Prometheus oraz vmalert z grupy produktów VictoriaMetrics. Powiadomienia i alerty Zabbix w Grafanie. Samodzielnie napisane skrypty w botach bash i Telegram, które okresowo pobierają adres URL i informują, czy coś jest nie tak. Dużo wszystkiego.
My w naszej firmie również korzystaliśmy z różnych rozwiązań, aż natknęliśmy się na złożoność, a raczej niemożność tworzenia złożonych, złożonych alertów. To, czego chcieliśmy i co ostatecznie zrobiliśmy, jest poniżej normy. TLDR: Tak pojawił się projekt open source Balerator
Przez dość długi czas dobrze sobie radziliśmy z alertami skonfigurowanymi w Grafanie. Tak, to nie jest najlepszy sposób. Zawsze zaleca się skorzystanie z wyspecjalizowanych rozwiązań, np. Alertmanager. Rozważaliśmy także możliwość przeprowadzki więcej niż raz. A potem, krok po kroku, chcieliśmy więcej.
Powiedzmy, kiedy dany wykres spadł/wzrósł o XX% i był tam przez N minut w porównaniu z poprzednim okresem M godzin? Wygląda na to, że możesz spróbować zaimplementować to za pomocą Grafany lub Alertmanagera, ale nie jest to całkiem łatwe. (A może nie jest to możliwe, nie powiem teraz)
Sprawa komplikuje się jeszcze bardziej, gdy decyzję o powiadomieniu należy podjąć w oparciu o dane z różnych źródeł. Przykład na żywo:
Sprawdzamy dane z dwóch baz Clickhouse, następnie porównujemy je z niektórymi danymi z Postgresa i decydujemy się na alert. Sygnał lub anuluj
Nagromadziliśmy całkiem sporo podobnych pragnień, abyśmy zastanowili się nad naszą decyzją. A potem próbowaliśmy stworzyć pierwszą listę wymagań/możliwości tej usługi, która jeszcze nie powstała.
uzyskać dostęp do różnych źródeł danych. Na przykład Prometheus, Clickhouse, Postgres
wysyłaj alerty na różne kanały - telegram, slack itp.
w trakcie myślenia stało się jasne, że nie chcę deklaratywnego opisu, ale umiejętności pisania skryptów
uruchamianie skryptów zgodnie z harmonogramem
łatwa aktualizacja skryptów bez ponownego uruchamiania usługi
możliwość pewnego rozszerzenia funkcjonalności bez konieczności przebudowywania usługi z kodów źródłowych
Ta lista jest przybliżona i najprawdopodobniej niezbyt dokładna. Niektóre punkty uległy zmianie, niektóre umarły. Wszystko jest jak zwykle.
Właściwie tak zaczęła się historia Balertera.
Postaram się pokrótce opisać co się ostatecznie wydarzyło i jak to działa. (Tak, oczywiście, to nie koniec. Planów rozwoju produktu jest wiele. Na tym poprzestanę)
Jak to działa?
Piszesz skrypt w Lua, w którym wyraźnie wysyłasz żądania (do Prometheusa, Clickhouse itp.). Otrzymujesz odpowiedzi, które w jakiś sposób przetwarzasz i porównujesz. Następnie włącz/wyłącz jakiś rodzaj alertu. Balerter sam wyśle powiadomienie do skonfigurowanych przez Ciebie kanałów (E-mail, telegram, Slack itp.). Skrypt jest wykonywany w określonych odstępach czasu. I... ogólnie to wszystko)
Najlepiej pokazać to na przykładzie:
-- @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 tu się dzieje:
wskazujemy, że ten skrypt powinien być wykonywany co 10 sekund
wskazać nazwę skryptu (dla API, do wyświetlenia w logach, do wykorzystania w testach)
podłącz moduł do wysyłania logów
podłącz moduł, aby uzyskać dostęp do domku z nazwą ch1 (same połączenie jest skonfigurowane w konfiguracji)
wyślij zapytanie do Clickhouse
w przypadku błędu wyświetlamy komunikat w logu i wychodzimy
porównaj wynik zapytania ze stałą (w żywym przykładzie moglibyśmy tę wartość uzyskać np. z bazy Postgres)
włączyć lub wyłączyć alert z identyfikatorem rps-min-limit
otrzymasz powiadomienie, jeśli status alertu ulegnie zmianie
Przykład jest dość prosty i zrozumiały. Jednakże, oczywiście, w prawdziwym życiu skrypty mogą być dość długie i złożone. Łatwo się pomylić i popełnić błąd.
Dlatego dojrzało logiczne pragnienie - móc pisać testy dla swoich skryptów. A w wersji v0.4.0 pojawiło się to.
Testowanie skryptów
Przykładowy test naszego skryptu z powyższego przykładu:
-- @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 po kroku:
podać nazwę skryptu, dla którego napisany jest test
nazwa testu (dla logów)
podłącz moduł testujący
mówimy, jaki wynik powinien zostać zwrócony w przypadku konkretnego żądania do Clickhouse ch1
sprawdzamy, czy został wywołany alert (błąd) rps-min-limit z podanym komunikatem
sprawdź, czy alert Rps-min-limit nie został wyłączony (sukces)
Co jeszcze potrafi Balerter?
Postaram się poruszyć najważniejsze, moim zdaniem, umiejętności Balertera. Wszystko szczegółowo można zobaczyć na oficjalnej stronie internetowej https://balerter.com
odbierać dane z
dom kliknięć
Postgres
mysql
prometheus
Loki
wysyłaj powiadomienia do kanałów
luźny
telegram
syslog
powiadamiaj (powiadomienia interfejsu użytkownika na Twoim komputerze)
E-mail
niezgoda
twórz wykresy na podstawie swoich danych, przesyłaj obraz do pamięci kompatybilnej z S3 i dołącz go do powiadomień (Przykład ze zdjęciami)
umożliwia wymianę danych pomiędzy skryptami - globalne przechowywanie kluczy/wartości
pisz własne biblioteki w Lua i używaj ich w skryptach (domyślnie dostarczane są biblioteki Lua do pracy z json, csv)
wysyłaj żądania HTTP ze swoich skryptów (i oczywiście otrzymuj odpowiedzi)
zapewnia API (jeszcze nie tak funkcjonalne, jak byśmy chcieli)
eksportuje metryki w formacie Prometheus
Co jeszcze chciałbyś umieć?
Jest już jasne, że użytkownikom i nam zależy na możliwości kontrolowania uruchamiania skryptów za pomocą składni cron. Zostanie to zrobione przed wersją v1.0.0
Chciałbym obsługiwać więcej źródeł danych i kanałów dostarczania powiadomień. Na przykład komuś na pewno będzie brakować MongoDB. Elastyczne Szukaj niektórych. Wysyłaj SMS-y i/lub dzwoń na swój telefon komórkowy. Chcemy mieć możliwość odbierania skryptów nie tylko z plików, ale też np. z bazy danych. Docelowo chcemy bardziej przyjaznej dla użytkownika strony internetowej i lepszej dokumentacji projektu.
Zawsze komuś czegoś brakuje) Tutaj zdajemy się na prośbę społeczności, aby prawidłowo ustalić priorytety. I z pomocą społeczności, aby wszystko zrealizować
Na zakończenie
Używamy Balerator Mam to już od jakiegoś czasu. Dziesiątki skryptów strzegą naszego spokoju ducha. Mam nadzieję, że ta praca przyda się komuś innemu.