Facila laboro kun kompleksaj atentigoj. Aŭ la historio de la kreado de Balerter

Facila laboro kun kompleksaj atentigoj. Aŭ la historio de la kreado de Balerter

Ĉiuj amas atentigojn.

Kompreneble, estas multe pli bone esti sciigita kiam io okazis (aŭ riparis) ol sidi kaj rigardi grafikaĵojn kaj serĉi anomaliojn.

Kaj multaj iloj estis kreitaj por tio. Alertmanager de la Prometheus-ekosistemo kaj vmalert de la produktgrupo VictoriaMetrics. Sciigoj kaj atentigoj de Zabbix en Grafana. Memverkitaj skriptoj en bash kaj Telegram-rotoj kiuj periode tiras iun URL kaj diras al vi ĉu io estas malĝusta. Multe da ĉio.

Ni, en nia kompanio, ankaŭ uzis malsamajn solvojn ĝis ni renkontis la kompleksecon, aŭ, pli ĝuste, la neeblon krei kompleksajn, kunmetitajn atentigojn. Kion ni volis kaj kion ni finis fari estas sub la tranĉo. TLDR: Jen kiel aperis la malfermkoda projekto Balerter

Dum sufiĉe longa tempo ni vivis bone kun atentigoj agorditaj en Grafana. Jes, ĉi tio ne estas la plej bona maniero. Ĉiam rekomendas uzi iujn specialajn solvojn, kiel Alertmanager. Kaj ni ankaŭ rigardis al moviĝado pli ol unufoje. Kaj tiam, iom post iom, ni volis pli.

Diru kiam certa diagramo falis/pliiĝis je XX% kaj estis tie dum N minutoj kompare kun la antaŭa periodo de M horoj? Ŝajnas, ke vi povas provi efektivigi ĉi tion per Grafana aŭ Alertmanager, sed ĝi ne estas tute facila. (Aŭ eble ne eblas, mi ne diros nun)

Aferoj eĉ pli komplikiĝas kiam la atentiga decido devas esti farita surbaze de datumoj de malsamaj fontoj. Viva ekzemplo:

Ni kontrolas la datumojn de du datumbazoj de Clickhouse, poste komparas ĝin kun iuj datumoj de Postgres, kaj decidas pri atentigo. Signalu aŭ nuligi

Ni amasigis sufiĉe multajn similajn dezirojn por ke ni pensu pri nia decido. Kaj tiam ni provis kompili la unuan liston de postuloj/kapabloj de ĉi tiu servo, kiu ankoraŭ ne estis kreita.

  • aliri malsamajn datumfontojn. Ekzemple, Prometheus, Clickhouse, Postgres

  • sendu atentigojn al diversaj kanaloj - telegramo, malstreĉo, ktp.

  • en la procezo de pensado, evidentiĝis, ke mi ne volas deklaran priskribon, sed la kapablon skribi skriptojn.

  • rulante skriptojn laŭ horaro

  • facila ĝisdatigo de skriptoj sen rekomenci la servon

  • la kapablo iel vastigi funkciecon sen rekonstrui la servon de fontkodoj

Ĉi tiu listo estas proksimuma kaj plej verŝajne ne tre preciza. Kelkaj punktoj ŝanĝiĝis, kelkaj mortis. Ĉio estas kiel kutime.

Fakte, jen kiel komenciĝis la historio de Balerter.

Facila laboro kun kompleksaj atentigoj. Aŭ la historio de la kreado de Balerter

Mi provos priskribi mallonge kio okazis finfine kaj kiel ĝi funkcias. (Jes, kompreneble, ĉi tio ne estas la fino. Estas multaj planoj por produkt-disvolviĝo. Mi nur ĉesos hodiaŭ)

Kiel ĝi funkcias?

Vi skribas skripton en Lua kie vi eksplicite sendas petojn (al Prometheus, Clickhouse, ktp.). Vi ricevas respondojn kaj iel prilaboras kaj komparas ilin. Poste ŝaltu/malŝaltu ian atentigon. Balerter mem sendos sciigon al la kanaloj, kiujn vi agordis (Retpoŝto, telegramo, malstreĉo, ktp.). La skripto estas ekzekutita je difinitaj intervaloj. Kaj... ĝenerale, jen ĉio)

Plej bone estas montri per ekzemplo:

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

Kio okazas ĉi tie:

  • ni indikas, ke ĉi tiu skripto devus esti ekzekutita ĉiujn 10 sekundojn

  • indiku la nomon de la skripto (por la API, por montri en protokoloj, por uzo en testoj)

  • konekti la modulon por eligi protokolojn

  • konekti modulon por aliri la klakdomon kun la nomo ch1 (la konekto mem estas agordita en la agordo)

  • sendu peton al clickhouse

  • en kazo de eraro, ni montras mesaĝon en la protokolo kaj eliras

  • komparu la serĉrezulton kun konstanto (en viva ekzemplo, ni povus akiri ĉi tiun valoron, ekzemple, el la datumbazo Postgres)

  • ebligu aŭ malŝalti alarmon kun ID rps-min-limit

  • vi ricevos sciigon se la atentiga stato ŝanĝiĝis

La ekzemplo estas sufiĉe simpla kaj komprenebla. Tamen, kompreneble, en reala vivo skriptoj povas esti sufiĉe longaj kaj kompleksaj. Estas facile konfuziĝi kaj fari erarojn.

Tial maturiĝis logika deziro - povi skribi testojn por viaj skriptoj. Kaj en versio v0.4.0 ĉi tio aperis.

Testante skriptojn

Ekzempla testo por nia skripto el la supra ekzemplo:

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

Paŝon post paŝo:

  • indiku la nomon de la skripto por kiu la testo estas skribita

  • testa nomo (por protokoloj)

  • konekti la testan modulon

  • ni diras, kian rezulton oni redonu por specifa peto al la klakdomo ch1

  • ni kontrolas, ke la atentigo (eraro) rps-min-limit kun la specifita mesaĝo estis vokita

  • kontrolu, ke la atentigo rps-min-limit ne estis malŝaltita (sukceso)

Kion alian povas fari Balerter?

Mi provos tuŝi la plej gravajn, laŭ mi, Balerter-kapablojn. Vi povas vidi ĉion detale en la oficiala retejo https://balerter.com

  • ricevi datumojn de

    • klakdomo

    • postgresoj

    • mysql

    • prometeo

    • loki

  • sendi sciigojn al kanaloj

    • malrapida

    • telegramo

    • syslog

    • sciigi (UI-sciigoj en via komputilo)

    • retpoŝto

    • malakordo

  • konstruu grafikaĵojn bazitajn sur viaj datumoj, alŝutu la bildon al S3-kongrua stokado kaj aligu ĝin al sciigoj (Ekzemplo kun bildoj)

  • permesas vin interŝanĝi datumojn inter skriptoj - tutmonda Ŝlosilo/Valo-stokado

  • skribu viajn proprajn bibliotekojn en Lua kaj uzu ilin en skriptoj (defaŭlte, lua bibliotekoj estas provizitaj por labori kun json, csv)

  • sendu HTTP-petojn de viaj skriptoj (kaj ricevu respondojn, kompreneble)

  • provizas API (ankoraŭ ne tiel funkcia kiel ni ŝatus)

  • eksportas metrikojn en Prometheus-formato

Kion alian vi ŝatus povi fari?

Jam estas certe ke uzantoj kaj ni volas la kapablon kontroli la lanĉon de skriptoj uzante la sintakson cron. Ĉi tio estos farita antaŭ la versio v1.0.0

Mi ŝatus subteni pli da datumfontoj kaj sciigaj liverkanaloj. Ekzemple, iu certe maltrafos MongoDB. Elasta Serĉu iujn. Sendu SMS kaj/aŭ faru vokojn al via poŝtelefono. Ni volas povi ricevi skriptojn ne nur de dosieroj, sed ankaŭ, ekzemple, de datumbazo. En la fino, ni volas pli uzeblan retejon kaj pli bonan dokumentadon por la projekto.

Iu ĉiam mankas ion) Ĉi tie ni fidas je la peto de la komunumo por ĝuste agordi prioritatojn. Kaj al la helpo de la komunumo realigi ĉion

En konkludo

Ni uzas Balerter Mi havas ĝin jam de sufiĉe da tempo. Dekoj da skriptoj gardas nian trankvilon. Mi esperas, ke ĉi tiu laboro estos utila al iu alia.

Kaj bonvenon kun via Afero kaj PR.

fonto: www.habr.com

Aldoni komenton