Հեշտ աշխատանք բարդ ազդանշաններով: Կամ Balerter-ի ստեղծման պատմությունը

Հեշտ աշխատանք բարդ ազդանշաններով: Կամ Balerter-ի ստեղծման պատմությունը

Բոլորը սիրում են ահազանգեր:

Իհարկե, շատ ավելի լավ է տեղեկացված լինել, երբ ինչ-որ բան է պատահել (կամ ուղղվել), քան նստել և նայել գրաֆիկներին և անոմալիաներ փնտրել:

Եվ դրա համար ստեղծվել են բազմաթիվ գործիքներ։ Alertmanager Prometheus էկոհամակարգից և vmalert VictoriaMetrics ապրանքային խմբից: Zabbix-ի ծանուցումներ և ծանուցումներ Grafana-ում: Ինքնուրույն գրված սկրիպտներ bash-ում և Telegram-ի բոտերում, որոնք պարբերաբար վերցում են որոշ URL և ասում ձեզ, եթե ինչ-որ բան այն չէ: Ամեն ինչից շատ.

Մենք՝ մեր ընկերությունում, նույնպես օգտագործում էինք տարբեր լուծումներ, մինչև հանդիպեցինք բարդության, ավելի ճիշտ՝ բարդ, կոմպոզիտային ազդանշաններ ստեղծելու անհնարինությանը: Այն, ինչ մենք ուզում էինք, և այն, ինչ մենք ի վերջո արեցինք, կտրվածքից ցածր է: TLDR. Այսպես հայտնվեց բաց կոդով նախագիծը Բալերատոր

Բավականին երկար ժամանակ մենք լավ էինք ապրում Grafana-ում կազմաձևված ահազանգերով: Այո, սա լավագույն միջոցը չէ։ Միշտ խորհուրդ է տրվում օգտագործել որոշ մասնագիտացված լուծումներ, ինչպիսիք են Alertmanager-ը: Եվ մենք նաև մեկից ավելի անգամ նայեցինք շարժվելու ուղղությամբ: Եվ հետո, կամաց-կամաց, մենք ավելին էինք ուզում։

Ասեք, երբ որոշակի գծապատկերն ընկել է/աճել է XX%-ով և այնտեղ եղել է N րոպե՝ համեմատած M ժամվա նախորդ ժամանակահատվածի հետ: Թվում է, որ դուք կարող եք փորձել դա իրականացնել Grafana-ի կամ Alertmanager-ի հետ, բայց դա այնքան էլ հեշտ չէ: (Կամ գուցե դա հնարավոր չէ, հիմա չեմ ասի)

Ամեն ինչ ավելի է բարդանում, երբ զգուշացման որոշումը պետք է կայացվի տարբեր աղբյուրների տվյալների հիման վրա: Կենդանի օրինակ.

Մենք ստուգում ենք երկու Clickhouse տվյալների բազաների տվյալները, այնուհետև դրանք համեմատում ենք Postgres-ի որոշ տվյալների հետ և որոշում ենք ահազանգի մասին: Ազդանշան կամ չեղարկում

Մենք բավականին շատ նմանատիպ ցանկություններ ենք կուտակել, որպեսզի մտածենք մեր որոշման մասին։ Իսկ հետո փորձեցինք կազմել այս ծառայության պահանջների/հնարավորությունների առաջին ցանկը, որը դեռ չի ստեղծվել։

  • մուտք գործել տվյալների տարբեր աղբյուրներ: Օրինակ՝ Պրոմեթեւսը, Քլիքհաուսը, Պոստգրեսը

  • ծանուցումներ ուղարկեք տարբեր ալիքներին՝ հեռագիր, անգործություն և այլն:

  • Մտածելու ընթացքում պարզ դարձավ, որ ես չեմ ուզում դեկլարատիվ նկարագրություն, այլ սցենարներ գրելու ունակություն

  • սկրիպտների գործարկում ժամանակացույցով

  • սցենարների հեշտ թարմացում՝ առանց ծառայության վերագործարկման

  • հնարավորություն՝ ինչ-որ կերպ ընդլայնելու ֆունկցիոնալությունը՝ առանց ծառայությունը վերակառուցելու աղբյուրի կոդերից

Այս ցուցակը մոտավոր է և, ամենայն հավանականությամբ, այնքան էլ ճշգրիտ չէ: Որոշ կետեր փոխվեցին, որոշները մահացան։ Ամեն ինչ սովորականի պես է։

Փաստորեն, այսպես սկսվեց Բալերթերի պատմությունը։

Հեշտ աշխատանք բարդ ազդանշաններով: Կամ Balerter-ի ստեղծման պատմությունը

Ես կփորձեմ համառոտ նկարագրել, թե ինչ եղավ վերջում և ինչպես է այն աշխատում: (Այո, իհարկե, սա վերջը չէ: Կան բազմաթիվ ծրագրեր արտադրանքի զարգացման համար: Ես պարզապես կանգ կառնեմ այսօր)

Ինչպես է դա աշխատում.

Դուք Լուաում գրում եք սցենար, որտեղ բացահայտ հարցումներ եք ուղարկում (Պրոմեթևսին, Քլիքհաուսին և այլն): Դուք ստանում եք պատասխաններ և ինչ-որ կերպ մշակում և համեմատում եք դրանք։ Այնուհետև միացրեք/անջատեք ինչ-որ ահազանգ: Ինքը՝ Balerter-ը ծանուցում կուղարկի ձեր կազմաձևած ալիքներին (էլ․ փոստ, հեռագիր, սլաք և այլն)։ Սցենարը կատարվում է սահմանված ընդմիջումներով: Եվ ընդհանրապես, այսքանը)

Ավելի լավ է ցույց տալ օրինակով.

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

Ինչ է այստեղ կատարվում:

  • մենք նշում ենք, որ այս սցենարը պետք է կատարվի յուրաքանչյուր 10 վայրկյանը մեկ

  • նշեք սկրիպտի անունը (API-ի համար, տեղեկամատյաններում ցուցադրելու, թեստերում օգտագործելու համար)

  • միացրեք մոդուլը տեղեկամատյանների ելքի համար

  • միացրեք մոդուլը, որպեսզի մուտք գործեք «կտտոց» անունով ch1 (միացումն ինքնին կազմաձևված է կազմաձևում)

  • հարցում ուղարկեք clickhouse-ին

  • սխալի դեպքում տեղեկամատյանում հաղորդագրություն ենք ցուցադրում և դուրս գալիս

  • համեմատեք հարցման արդյունքը հաստատունի հետ (կենդանի օրինակում մենք կարող ենք ստանալ այս արժեքը, օրինակ, Postgres տվյալների բազայից)

  • միացնել կամ անջատել ահազանգը ID-ով rps-min-limit

  • դուք ծանուցում կստանաք, եթե ահազանգի կարգավիճակը փոխվել է

Օրինակը բավականին պարզ է և հասկանալի։ Այնուամենայնիվ, իհարկե, իրական կյանքում սցենարները կարող են բավականին երկար և բարդ լինել: Հեշտ է շփոթվել ու սխալվել։

Ուստի տրամաբանական ցանկություն է հասունացել՝ կարողանալ թեստեր գրել ձեր սցենարների համար։ Իսկ v0.4.0 տարբերակում սա հայտնվեց.

Փորձարկման սցենարներ

Մեր սցենարի օրինակելի թեստը վերը նշված օրինակից.

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

Քայլ առ քայլ:

  • նշեք սցենարի անվանումը, որի համար գրված է թեստը

  • թեստի անունը (տեղեկամատյանների համար)

  • միացրեք փորձարկման մոդուլը

  • մենք ասում ենք, թե կոնկրետ հարցման համար ինչ արդյունք պետք է վերադարձվի clickhouse ch1

  • մենք ստուգում ենք, որ նշված հաղորդագրությամբ ահազանգ (սխալ) rps-min-limit է կանչվել

  • ստուգեք, որ rps-min-limit ազդանշանն անջատված չէ (հաջողված)

Էլ ի՞նչ կարող է անել Բալերթերը:

Կփորձեմ անդրադառնալ ամենակարեւոր, իմ կարծիքով, Բալերթերի հմտություններին։ Ամեն ինչ մանրամասն կարող եք տեսնել պաշտոնական կայքում https://balerter.com

  • ստանալ տվյալներ

    • clickhouse

    • postgres

    • MySQL

    • պրոմեթեւս

    • Loki

  • ծանուցումներ ուղարկել ալիքներին

    • լարվածություն

    • հեռագիր

    • syslog

    • տեղեկացնել (UI ծանուցումներ ձեր համակարգչում)

    • փոստ

    • դիսոնանս

  • կառուցեք գրաֆիկներ՝ հիմնվելով ձեր տվյալների վրա, վերբեռնեք պատկերը S3 համատեղելի պահեստում և կցեք այն ծանուցումներին (Օրինակ՝ նկարներով)

  • թույլ է տալիս տվյալների փոխանակում սկրիպտների միջև՝ գլոբալ Key/Value պահեստավորում

  • գրեք ձեր սեփական գրադարանները Lua-ում և օգտագործեք դրանք սկրիպտներում (լռելյայնորեն, lua գրադարանները տրամադրվում են json, csv-ի հետ աշխատելու համար)

  • ուղարկեք HTTP հարցումներ ձեր սկրիպտներից (և ստացեք պատասխաններ, իհարկե)

  • ապահովում է API (դեռևս ոչ այնքան ֆունկցիոնալ, որքան մենք կցանկանայինք)

  • արտահանում է չափումներ Պրոմեթևսի ձևաչափով

Էլ ի՞նչ կցանկանայիք, որ կարողանայիք անել:

Արդեն պարզ է, որ օգտվողները և մենք ցանկանում ենք շարահյուսության միջոցով վերահսկել սցենարների գործարկումը cron. Դա արվելու է մինչև v1.0.0 տարբերակը

Ես կցանկանայի աջակցել ավելի շատ տվյալների աղբյուրներին և ծանուցումների առաքման ուղիներին: Օրինակ, ինչ-որ մեկը անպայման կարոտի MongoDB-ին: Էլաստիկ որոնում որոշների համար: Ուղարկեք SMS և/կամ զանգեր կատարեք ձեր բջջային հեռախոսին: Մենք ցանկանում ենք, որպեսզի կարողանանք սկրիպտներ ստանալ ոչ միայն ֆայլերից, այլ նաև, օրինակ, տվյալների բազայից։ Ի վերջո, մենք ցանկանում ենք ավելի հարմար վեբ կայք և նախագծի համար ավելի լավ փաստաթղթեր:

Ինչ-որ մեկին միշտ ինչ-որ բան է պակասում) Այստեղ մենք հիմնվում ենք համայնքի խնդրանքին՝ առաջնահերթությունները ճիշտ սահմանելու համար: Եվ համայնքի օգնությանը՝ ամեն ինչ գիտակցելու համար

Վերջում

Մենք օգտագործում ենք Բալերատոր Արդեն բավական ժամանակ է, ինչ այն ունեմ: Տասնյակ սցենարներ պահպանում են մեր մտքի խաղաղությունը: Հուսով եմ, որ այս աշխատանքը օգտակար կլինի մեկ ուրիշի համար:

Եվ բարի գալուստ ձեր Թողարկման և PR-ի հետ:

Source: www.habr.com

Добавить комментарий