Madaling trabaho na may mga kumplikadong alerto. O ang kasaysayan ng Balerter

Madaling trabaho na may mga kumplikadong alerto. O ang kasaysayan ng Balerter

Gustung-gusto ng lahat ang mga alerto.

Siyempre, mas mahusay na maabisuhan kapag may nangyari (o naayos) kaysa umupo at tumingin sa mga graph at maghanap ng mga anomalya.

At maraming mga tool ang nilikha para dito. Alertmanager mula sa Prometheus ecosystem at vmalert mula sa pangkat ng produkto ng VictoriaMetrics. Mga abiso at alerto ng Zabbix sa Grafana. Mga self-written na script sa bash at Telegram bots na pana-panahong kumukuha ng ilang URL at nagsasabi sa iyo kung may mali. Marami sa lahat.

Kami, sa aming kumpanya, ay gumamit din ng iba't ibang mga solusyon hanggang sa naranasan namin ang pagiging kumplikado, o, sa halip, ang imposibilidad ng paglikha ng kumplikado, pinagsama-samang mga alerto. Ang gusto namin at kung ano ang natapos naming gawin ay below the cut. TLDR: Ito ay kung paano lumitaw ang open source na proyekto Balerter

Sa loob ng mahabang panahon, namuhay kami nang maayos sa mga alerto na na-configure sa Grafana. Oo, hindi ito ang pinakamahusay na paraan. Palaging inirerekomenda na gumamit ng ilang espesyal na solusyon, tulad ng Alertmanager. At tumingin din kami patungo sa paglipat ng higit sa isang beses. At pagkatapos, unti-unti, gusto namin ng higit pa.

Sabihin kung ang isang partikular na chart ay bumagsak/tumaas ng XX% at naroon nang N minuto kumpara sa nakaraang yugto ng M na oras? Mukhang maaari mong subukang ipatupad ito sa Grafana o Alertmanager, ngunit hindi ito masyadong madali. (O baka hindi pwede, hindi ko sasabihin ngayon)

Ang mga bagay ay nagiging mas kumplikado kapag ang alertong desisyon ay dapat gawin batay sa data mula sa iba't ibang pinagmulan. Live na halimbawa:

Sinusuri namin ang data mula sa dalawang database ng Clickhouse, pagkatapos ay ihambing ito sa ilang data mula sa Postgres, at nagpasya sa isang alerto. Signal o kanselahin

Marami na kaming naipon na katulad na mga hangarin para pag-isipan namin ang aming desisyon. At pagkatapos ay sinubukan naming i-compile ang unang listahan ng mga kinakailangan/kakayahan ng serbisyong ito, na hindi pa nagagawa.

  • i-access ang iba't ibang mapagkukunan ng data. Halimbawa, Prometheus, Clickhouse, Postgres

  • magpadala ng mga alerto sa iba't ibang mga channel - telegrama, slack, atbp.

  • sa proseso ng pag-iisip, naging malinaw na hindi ko gusto ang isang deklaratibong paglalarawan, ngunit ang kakayahang magsulat ng mga script

  • pagpapatakbo ng mga script sa isang iskedyul

  • madaling pag-update ng mga script nang hindi na-restart ang serbisyo

  • ang kakayahang kahit papaano ay palawakin ang pag-andar nang hindi muling itinatayo ang serbisyo mula sa mga source code

Ang listahang ito ay tinatayang at malamang na hindi masyadong tumpak. Ang ilang mga punto ay nagbago, ang ilan ay namatay. As usual ang lahat.

Sa totoo lang, ganito nagsimula ang kasaysayan ng Balerter.

Madaling trabaho na may mga kumplikadong alerto. O ang kasaysayan ng Balerter

Susubukan kong ilarawan nang maikli kung ano ang nangyari sa huli at kung paano ito gumagana. (Oo, siyempre, hindi ito ang katapusan. Maraming mga plano para sa pagbuo ng produkto. I'll just stop at today)

Paano ito gumagana?

Sumulat ka ng script sa Lua kung saan tahasan kang nagpapadala ng mga kahilingan (sa Prometheus, Clickhouse, atbp.). Makakatanggap ka ng mga sagot at kahit papaano ay iproseso at ikumpara mo ang mga ito. Pagkatapos ay i-on/i-off ang ilang uri ng alerto. Ang Balerter mismo ay magpapadala ng abiso sa mga channel na iyong na-configure (Email, telegrama, slack, atbp.). Ang script ay isinasagawa sa mga tinukoy na agwat. At... sa pangkalahatan, iyon lang)

Pinakamainam na ipakita gamit ang isang halimbawa:

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

Anong nangyayari dito:

  • ipinapahiwatig namin na ang script na ito ay dapat isagawa bawat 10 segundo

  • ipahiwatig ang pangalan ng script (para sa API, para sa pagpapakita sa mga log, para sa paggamit sa mga pagsubok)

  • ikonekta ang module para sa pag-output ng mga log

  • ikonekta ang isang module upang ma-access ang clickhouse na may pangalan ch1 (ang koneksyon mismo ay na-configure sa config)

  • magpadala ng kahilingan sa clickhouse

  • sa kaso ng isang error, ipinapakita namin ang isang mensahe sa log at exit

  • ihambing ang resulta ng query sa isang pare-pareho (sa isang live na halimbawa, maaari naming makuha ang halagang ito, halimbawa, mula sa database ng Postgres)

  • paganahin o huwag paganahin ang alerto na may ID rps-min-limit

  • makakatanggap ka ng abiso kung nagbago ang status ng alerto

Ang halimbawa ay medyo simple at naiintindihan. Gayunpaman, siyempre, ang mga script sa totoong buhay ay maaaring maging medyo mahaba at kumplikado. Madaling malito at magkamali.

Samakatuwid, ang isang lohikal na pagnanais ay tumanda - upang makapagsulat ng mga pagsubok para sa iyong mga script. At sa bersyon v0.4.0 ito ay lumitaw.

Pagsubok ng mga script

Halimbawa ng pagsubok para sa aming script mula sa halimbawa sa itaas:

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

Hakbang-hakbang:

  • ipahiwatig ang pangalan ng script kung saan isinulat ang pagsusulit

  • pangalan ng pagsubok (para sa mga log)

  • ikonekta ang module ng pagsubok

  • sinasabi namin kung anong resulta ang dapat ibalik para sa isang partikular na kahilingan sa clickhouse ch1

  • sinusuri namin na ang alerto (error) rps-min-limit na may tinukoy na mensahe ay tinawag

  • suriin na ang rps-min-limit alert ay hindi pinagana (tagumpay)

Ano pa ang magagawa ni Balerter?

Susubukan kong hawakan ang pinakamahalaga, sa aking opinyon, mga kasanayan sa Balerter. Maaari mong makita ang lahat nang detalyado sa opisyal na website https://balerter.com

  • makatanggap ng data mula sa

    • clickhouse

    • postgres

    • MySQL

    • Prometheus

    • loki

  • magpadala ng mga abiso sa mga channel

    • malubay

    • telegram

    • syslog

    • abisuhan (mga notification sa UI sa iyong computer)

    • email

    • alitan

  • bumuo ng mga graph batay sa iyong data, i-upload ang larawan sa S3 compatible na storage at ilakip ito sa mga notification (Halimbawa na may mga larawan)

  • nagbibigay-daan sa iyong makipagpalitan ng data sa pagitan ng mga script - pandaigdigang imbakan ng Key/Value

  • isulat ang iyong sariling mga aklatan sa Lua at gamitin ang mga ito sa mga script (bilang default, ang mga lua library ay ibinibigay para sa pagtatrabaho sa json, csv)

  • magpadala ng mga kahilingan sa HTTP mula sa iyong mga script (at tumanggap ng mga tugon, siyempre)

  • ay nagbibigay ng isang API (hindi pa gumagana gaya ng gusto namin)

  • nag-export ng mga sukatan sa Prometheus na format

Ano pa ang gusto mong magawa?

Malinaw na na ang mga user at gusto namin ang kakayahang kontrolin ang paglulunsad ng mga script gamit ang syntax cron. Gagawin ito bago ang bersyon v1.0.0

Gusto kong suportahan ang higit pang data source at mga channel sa paghahatid ng notification. Halimbawa, tiyak na mami-miss ng isang tao ang MongoDB. Nababanat na Paghahanap para sa ilan. Magpadala ng SMS at/o tumawag sa iyong mobile phone. Nais naming makatanggap ng mga script hindi lamang mula sa mga file, kundi pati na rin, halimbawa, mula sa isang database. Sa huli, gusto namin ng mas user-friendly na website at mas mahusay na dokumentasyon para sa proyekto.

Palaging may kulang sa isang tao) Dito kami umaasa sa kahilingan ng komunidad upang maitakda nang tama ang mga priyoridad. At sa tulong ng komunidad upang mapagtanto ang lahat

Sa pagtatapos

Gumagamit kami Balerter Medyo matagal ko na 'to. Dose-dosenang mga script ang nagbabantay sa ating kapayapaan ng isip. Umaasa ako na ang gawaing ito ay magiging kapaki-pakinabang sa ibang tao.

At maligayang pagdating sa iyong Isyu at PR.

Pinagmulan: www.habr.com

Magdagdag ng komento