Punë e lehtë me alarome të komplikuara. Ose historia e krijimit të Balerter

Punë e lehtë me alarome të komplikuara. Ose historia e krijimit të Balerter

Të gjithë e duan alertin.

Sigurisht, është shumë më mirë të marrësh një njoftim kur diçka ka ndodhur (apo është rregulluar), sesa të qëndrosh dhe të shohësh grafiku dhe të kërkosh anomalitë.

Dhe janë krijuar shumë mjete për këtë. Alertmanager nga ekosistemi Prometheus dhe vmalert nga grupi i produkteve VictoriaMetrics. Njoftimet zabbix dhe alertet në Grafana. Skripte të shkruara nga ne në bash dhe bot Telegram që tërheqin periodikisht ndonjë URL dhe thonë nëse diçka nuk është në rregull. Shumë gjëra.

Ne, nĂ« kompaninĂ« tonĂ«, gjithashtu kemi pĂ«rdorur zgjidhje tĂ« ndryshme derisa u pĂ«rballĂ«m me kompleksitetin, ose ndoshta mĂ« saktĂ«, me pamundĂ«sinĂ« e krijimit tĂ« alertave tĂ« komplikuar, tĂ« pĂ«rbĂ«rĂ«. ÇfarĂ« dĂ«shironim dhe çfarĂ« bĂ«mĂ« nĂ« fund — nĂ« titullin poshtĂ«. TLDR: KĂ«shtu filloi projekti open source Balerter

Mjaft gjatë kaluam mirë me alertat e konfiguruara në Grafana. Po, kjo nuk është rruga më e mirë. Gjithmonë rekomandohet përdorimi i ndonjë zgjidhjeje të specializuar, si Alertmanager. Edhe ne nuk kemi hequr dorë ndonjëherë nga ideja për të migruar. Pastaj, ngadalë, na erdhi dëshira për më shumë.

Të thuash kur një grafik ka rënë/rritur me XX% dhe ndodhet atje për N minuta krahasuar me periudhën e kaluar në M orë? Kjo, duket, mund të provohet të realizohet me Grafana ose Alertmanager, por është mjaft e vështirë. (Ose ndoshta nuk është e mundur, tani nuk po e them dot)

Gjithçka bëhet edhe më e komplikuar kur vendimi për alertin duhet të merret në bazë të të dhënave nga burime të ndryshme. Një rast i gjallë:

Kontrollojmë të dhënat nga dy bazat e të dhënave Clickhouse, pastaj i krahasojmë ato me disa të dhëna nga Postgres, dhe marrim një vendim për alertin. Sinjalizo ose anulo

Këto dëshira të ngjashme u grumbulluan mjaft për ne që të mendojmë për një zgjidhje tonën. Dhe atëherë përpiqemi të hartojmë listën e parë të kërkesave/mundësive për këtë shërbim, që ende nuk është krijuar

  • tĂ« lidhemi me burime tĂ« ndryshme tĂ« tĂ« dhĂ«nave. PĂ«r shembull, Prometheus, Clickhouse, Postgres

  • tĂ« dĂ«rgojmĂ« alertet nĂ« kanale tĂ« ndryshme — telegram, slack, etj.

  • nĂ« procesin e mendimit bĂ«het e qartĂ« se dĂ«shirohet jo njĂ« pĂ«rshkrim deklarativ, por mundĂ«sia pĂ«r tĂ« shkruar skripte

  • tĂ« nisim skripte sipas njĂ« programi

  • pĂ«rditĂ«simi i lehtĂ« i skripteve pa rrestartuar shĂ«rbimin

  • mundĂ«sia pĂ«r tĂ« zgjeruar funksionalitetin pa e rindĂ«rtuar shĂ«rbimin nga kodet burimore

Ky është një listë shembujsh dhe, për shumë të mundshme, jo shumë e saktë. Disa pika janë modifikuar, disa kanë vdekur. Siç ndodh zakonisht.

Në të vërtetë, pikërisht kështu filloi historia e Balerter.

Punë e lehtë me alarome të komplikuara. Ose historia e krijimit të Balerter

Do të përpiqem të përshkruaj shkurtimisht se çfarë rezultati arritëm dhe si funksionon. (Po, sigurisht, kjo nuk është përfundimtare. Ka shumë plane për zhvillimin e produktit. Do të ndalem posaçërisht në ditën e sotme)

Si funksionon kjo?

Ju shkruani njĂ« script nĂ« Lua, ku dĂ«rgoni drejtpĂ«rdrejt kĂ«rkesa (nĂ« Prometheus, Clickhouse etj.). Merrni pĂ«rgjigje dhe siç i ĐŸĐ±Ń€Đ°Đ±ĐŸŃ‚uoni dhe i krahasoni ato. Pas kĂ«saj, aktivizoni/çaktivizoni ndonjĂ« alert. Balerter do tĂ« dĂ«rgojĂ« vetĂ« njoftimin nĂ« kanalet qĂ« keni cilĂ«suar (Email, telegram, slack etj.). Scripti ekzekutohet me njĂ« periudhĂ« tĂ« caktuar kohore. Dhe... kjo Ă«shtĂ« gjithçka)

Më mirë është ta tregojmë me një shembull:

-- @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 < minRequestsRPS then
    alert.error("rps-min-limit", "Requests RPS janë shumë të vogla: " .. tostring(resultRPS))
else
    alert.success("rps-min-limit", "Requests RPS janë në rregull")
end 

ÇfarĂ« ndodh kĂ«tu:

  • specifikojmĂ« se ky script duhet tĂ« ekzekutohet çdo 10 sekonda

  • specifikojmĂ« emrin e scriptit (pĂ«r API, pĂ«r shfaqje nĂ« regjistrime, pĂ«r pĂ«rdorim nĂ« teste)

  • lidhim modul pĂ«r regjistrimin e log-eve

  • lidhim modul pĂ«r qasje nĂ« Clickhouse me emrin ch1 (vetĂ« lidhja konfigurohet nĂ« konfigurim)

  • dĂ«rgojmĂ« kĂ«rkesĂ«n nĂ« Clickhouse

  • nĂ«se ndodhi njĂ« gabim — tregojmĂ« njĂ« mesazh nĂ« log dhe dalim

  • krahasoni rezultatin e kĂ«rkesĂ«s me konstantĂ«n (nĂ« njĂ« shembull jetĂ«sor, mund ta merrnim kĂ«tĂ« vlerĂ«, pĂ«r shembull, nga baza e tĂ« dhĂ«nave Postgres)

  • aktivizojmĂ« ose çaktivizojmĂ« alertin me ID rps-min-limit

  • do tĂ« merrni njĂ« njoftim nĂ«se statusi i alertit ka ndryshuar

Shembulli është mjaft i thjeshtë dhe i kuptueshëm. Megjithatë, natyrisht, në jetën reale, scriptet mund të jenë mjaft të përziera dhe komplekse. Ato lehtë mund të bëhen konfuz dhe të bëjnë gabime.

Prandaj, lindi dĂ«shira logjike — tĂ« kemi mundĂ«sinĂ« pĂ«r tĂ« shkruar teste pĂ«r scriptet tona. Dhe nĂ« versionin v0.4.0, kjo u bĂ« e mundur.

Testimi i scriptëve

Shembulli i testit për scriptin tonë nga shembulli më sipër:

-- @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 janë shumë të vogla: 10')
test.alert().assertNotCalled('success', 'rps-min-limit', 'Requests RPS janë në rregull')

Hapat

  • specifikojmĂ« emrin e scriptit, pĂ«r tĂ« cilin Ă«shtĂ« shkruar testi

  • emri i testit (pĂ«r regjistrat)

  • lidhim modul testimi

  • diskutojmĂ« se çfarĂ« rezultati duhet tĂ« kthehet pĂ«r njĂ« kĂ«rkesĂ« tĂ« caktuar nĂ« Clickhouse ch1

  • kontrollojmĂ« qĂ« Ă«shtĂ« thirrur alarmin (error) rps-min-limit me mesazhin e specifikuar

  • kontrollojmĂ« qĂ« alarmi rps-min-limit nuk Ă«shtĂ« ç aktivizuar (success)

ÇfarĂ« tjetĂ«r mund tĂ« bĂ«jĂ« Balerter?

Do të përpiqem të prek aftësitë më të rëndësishme të Balerter. Mund të shihni më shumë në faqen zyrtare https://balerter.com

  • tĂ« marrim tĂ« dhĂ«na nga

    • clickhouse

    • postgres

    • mysql

    • prometheus

    • loki

  • tĂ« dĂ«rgojmĂ« njoftime nĂ« kanale

    • slack

    • telegram

    • syslog

    • notiify (njoftime UI nĂ« kompjuterin tuaj)

    • email

    • discord

  • tĂ« ndĂ«rtojmĂ« grafika mbi tĂ« dhĂ«nat tuaja, tĂ« ngarkojmĂ« imazhe nĂ« njĂ« ruajtje tĂ« kompatibilshme me S3 dhe t’i bashkojmĂ« ato me njoftimet (Shembuj me imazhe)

  • lejon shkĂ«mbimin e tĂ« dhĂ«nave midis skripteve — njĂ« ruajtje globale Key/Value

  • tĂ« shkruajmĂ« bibliotekat tona nĂ« Lua dhe t'i pĂ«rdorim ato nĂ« skripte (me default vijnĂ« biblioteka lua pĂ«r tĂ« punuar me json, csv)

  • tĂ« dĂ«rgojmĂ« kĂ«rkesa HTTP nga skriptet tuaja (dhe sigurisht tĂ« marrim pĂ«rgjigje)

  • siguron API (ende nuk Ă«shtĂ« aq funksional sa do tĂ« doja)

  • eksporton metrika nĂ« formatin Prometheus

ÇfarĂ« do tĂ« doja tĂ« dija mĂ« shumĂ«?

Tani është e qartë se përdoruesit dhe ne duam mundësinë për të menaxhuar fillimin e skripteve me ndihmën e sintaksës cron. Kjo do të realizohet deri në versionin v1.0.0

Dëshirojmë të mbështesim më shumë burime të dhënash dhe kanale njoftimi. Për shembull, disa sigurisht që do të kishin nevojë për MongoDB. Disa për Elastic Search. Të dërgojmë SMS dhe/ose të bëjmë telefonata në celular. Duam të jemi në gjendje të marrim skriptet jo vetëm nga skedarët, por edhe, për shembull, nga databaza. Në fund, duam një faqe më të përshtatshme për projektin dhe dokumentacion më të mirë.

Dikush gjithmonë i mungon diçka) Këtu shpresojmë për kërkesat e komunitetit, për të vendosur përparësitë e duhura. Dhe për ndihmën e komunitetit, për ta realizuar të gjitha

Në përfundim

Ne përdorim Balerter mjaft kohë. Dhjetëra skripte qëndrojnë në mbrojtje të qetësisë sonë. Shpresoj që ky punë të jetë e dobishme për dikë tjetër.

Dhe mirëseardhje me çështjet tuaja dhe PR.

Burimi: habr.com

Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster