ProHoster > Օրագիր > Վարչակազմը > Հեշտ աշխատանք բարդ ազդանշաններով: Կամ Balerter-ի ստեղծման պատմությունը
Հեշտ աշխատանք բարդ ազդանշաններով: Կամ Balerter-ի ստեղծման պատմությունը
Բոլորը սիրում են ահազանգեր:
Իհարկե, շատ ավելի լավ է տեղեկացված լինել, երբ ինչ-որ բան է պատահել (կամ ուղղվել), քան նստել և նայել գրաֆիկներին և անոմալիաներ փնտրել:
Եվ դրա համար ստեղծվել են բազմաթիվ գործիքներ։ Alertmanager Prometheus էկոհամակարգից և vmalert VictoriaMetrics ապրանքային խմբից: Zabbix-ի ծանուցումներ և ծանուցումներ Grafana-ում: Ինքնուրույն գրված սկրիպտներ bash-ում և Telegram-ի բոտերում, որոնք պարբերաբար վերցում են որոշ URL և ասում ձեզ, եթե ինչ-որ բան այն չէ: Ամեն ինչից շատ.
Մենք՝ մեր ընկերությունում, նույնպես օգտագործում էինք տարբեր լուծումներ, մինչև հանդիպեցինք բարդության, ավելի ճիշտ՝ բարդ, կոմպոզիտային ազդանշաններ ստեղծելու անհնարինությանը: Այն, ինչ մենք ուզում էինք, և այն, ինչ մենք ի վերջո արեցինք, կտրվածքից ցածր է: TLDR. Այսպես հայտնվեց բաց կոդով նախագիծը Բալերատոր
Բավականին երկար ժամանակ մենք լավ էինք ապրում Grafana-ում կազմաձևված ահազանգերով: Այո, սա լավագույն միջոցը չէ։ Միշտ խորհուրդ է տրվում օգտագործել որոշ մասնագիտացված լուծումներ, ինչպիսիք են Alertmanager-ը: Եվ մենք նաև մեկից ավելի անգամ նայեցինք շարժվելու ուղղությամբ: Եվ հետո, կամաց-կամաց, մենք ավելին էինք ուզում։
Ասեք, երբ որոշակի գծապատկերն ընկել է/աճել է XX%-ով և այնտեղ եղել է N րոպե՝ համեմատած M ժամվա նախորդ ժամանակահատվածի հետ: Թվում է, որ դուք կարող եք փորձել դա իրականացնել Grafana-ի կամ Alertmanager-ի հետ, բայց դա այնքան էլ հեշտ չէ: (Կամ գուցե դա հնարավոր չէ, հիմա չեմ ասի)
Ամեն ինչ ավելի է բարդանում, երբ զգուշացման որոշումը պետք է կայացվի տարբեր աղբյուրների տվյալների հիման վրա: Կենդանի օրինակ.
Մենք ստուգում ենք երկու Clickhouse տվյալների բազաների տվյալները, այնուհետև դրանք համեմատում ենք Postgres-ի որոշ տվյալների հետ և որոշում ենք ահազանգի մասին: Ազդանշան կամ չեղարկում
Մենք բավականին շատ նմանատիպ ցանկություններ ենք կուտակել, որպեսզի մտածենք մեր որոշման մասին։ Իսկ հետո փորձեցինք կազմել այս ծառայության պահանջների/հնարավորությունների առաջին ցանկը, որը դեռ չի ստեղծվել։
մուտք գործել տվյալների տարբեր աղբյուրներ: Օրինակ՝ Պրոմեթեւսը, Քլիքհաուսը, Պոստգրեսը
ծանուցումներ ուղարկեք տարբեր ալիքներին՝ հեռագիր, անգործություն և այլն:
Մտածելու ընթացքում պարզ դարձավ, որ ես չեմ ուզում դեկլարատիվ նկարագրություն, այլ սցենարներ գրելու ունակություն
սկրիպտների գործարկում ժամանակացույցով
սցենարների հեշտ թարմացում՝ առանց ծառայության վերագործարկման
հնարավորություն՝ ինչ-որ կերպ ընդլայնելու ֆունկցիոնալությունը՝ առանց ծառայությունը վերակառուցելու աղբյուրի կոդերից
Այս ցուցակը մոտավոր է և, ամենայն հավանականությամբ, այնքան էլ ճշգրիտ չէ: Որոշ կետեր փոխվեցին, որոշները մահացան։ Ամեն ինչ սովորականի պես է։
Փաստորեն, այսպես սկսվեց Բալերթերի պատմությունը։
Ես կփորձեմ համառոտ նկարագրել, թե ինչ եղավ վերջում և ինչպես է այն աշխատում: (Այո, իհարկե, սա վերջը չէ: Կան բազմաթիվ ծրագրեր արտադրանքի զարգացման համար: Ես պարզապես կանգ կառնեմ այսօր)
Ինչպես է դա աշխատում.
Դուք Լուաում գրում եք սցենար, որտեղ բացահայտ հարցումներ եք ուղարկում (Պրոմեթևսին, Քլիքհաուսին և այլն): Դուք ստանում եք պատասխաններ և ինչ-որ կերպ մշակում և համեմատում եք դրանք։ Այնուհետև միացրեք/անջատեք ինչ-որ ահազանգ: Ինքը՝ 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-ի հետ աշխատելու համար)
ապահովում է API (դեռևս ոչ այնքան ֆունկցիոնալ, որքան մենք կցանկանայինք)
արտահանում է չափումներ Պրոմեթևսի ձևաչափով
Էլ ի՞նչ կցանկանայիք, որ կարողանայիք անել:
Արդեն պարզ է, որ օգտվողները և մենք ցանկանում ենք շարահյուսության միջոցով վերահսկել սցենարների գործարկումը cron. Դա արվելու է մինչև v1.0.0 տարբերակը
Ես կցանկանայի աջակցել ավելի շատ տվյալների աղբյուրներին և ծանուցումների առաքման ուղիներին: Օրինակ, ինչ-որ մեկը անպայման կարոտի MongoDB-ին: Էլաստիկ որոնում որոշների համար: Ուղարկեք SMS և/կամ զանգեր կատարեք ձեր բջջային հեռախոսին: Մենք ցանկանում ենք, որպեսզի կարողանանք սկրիպտներ ստանալ ոչ միայն ֆայլերից, այլ նաև, օրինակ, տվյալների բազայից։ Ի վերջո, մենք ցանկանում ենք ավելի հարմար վեբ կայք և նախագծի համար ավելի լավ փաստաթղթեր:
Ինչ-որ մեկին միշտ ինչ-որ բան է պակասում) Այստեղ մենք հիմնվում ենք համայնքի խնդրանքին՝ առաջնահերթությունները ճիշտ սահմանելու համար: Եվ համայնքի օգնությանը՝ ամեն ինչ գիտակցելու համար
Վերջում
Մենք օգտագործում ենք Բալերատոր Արդեն բավական ժամանակ է, ինչ այն ունեմ: Տասնյակ սցենարներ պահպանում են մեր մտքի խաղաղությունը: Հուսով եմ, որ այս աշխատանքը օգտակար կլինի մեկ ուրիշի համար: