Mürəkkəb xəbərdarlıqlarla asan iş. Və ya Balerterin tarixi

Mürəkkəb xəbərdarlıqlarla asan iş. Və ya Balerterin tarixi

Hər kəs xəbərdarlıqları sevir.

Əlbəttə ki, bir şey baş verdikdə (yaxud düzələndə) xəbərdar olmaq, oturub qrafiklərə baxmaq və anomaliyaları axtarmaqdan daha yaxşıdır.

Və bunun üçün bir çox vasitə var. Prometheus ekosistemindən Alertmanager və VictoriaMetrics məhsul qrupundan vmalert. Grafana-da zabbix bildirişləri və xəbərdarlıqları. Bash və Telegram botlarında öz-özünə yazılmış skriptlər vaxtaşırı bəzi URL-ləri çıxarır və bir şeyin səhv olub olmadığını söyləyir. Hər şeydən çox.

Mürəkkəblik, daha doğrusu, mürəkkəb, mürəkkəb siqnallar yaratmağın qeyri-mümkünlüyü ilə qarşılaşana qədər şirkətimizdə də müxtəlif həllərdən istifadə etdik. Nə istədik və nə ilə nəticələndik - kəsik altında. TLDR: Açıq mənbə layihəsi belə yarandı Balerter

Uzun müddətdir ki, biz Grafana-da konfiqurasiya edilmiş xəbərdarlıqlarla yaxşı yaşayırdıq. Bəli, bu ən yaxşı yol deyil. Həmişə Alertmanager kimi bəzi xüsusi həllərdən istifadə etmək tövsiyə olunur. Və biz də bir dəfədən çox hərəkətə baxdıq. Və sonra yavaş-yavaş daha çox istədik.

Müəyyən bir qrafikin nə vaxt XX% azaldığını / yüksəldiyini və M saatlıq əvvəlki dövrlə müqayisədə N dəqiqə orada olduğunu söyləyin? Deyəsən, bunu Grafana və ya Alertmanager ilə həyata keçirməyə cəhd edə bilərsiniz, lakin bu, olduqca çətindir. (Yoxsa yox, indi deməyəcəyəm)

Xəbərdarlıq qərarı müxtəlif mənbələrdən alınan məlumatlar əsasında verildikdə işlər daha da mürəkkəbləşir. Canlı nümunə:

İki Clickhouse verilənlər bazasındakı məlumatları yoxlayırıq, sonra onu Postgres-dən bəzi məlumatlar ilə müqayisə edirik və xəbərdarlıq barədə qərar veririk. Siqnal verin və ya ləğv edin

Qərarımızı düşünmək üçün kifayət qədər oxşar İstək Siyahısı topladıq. Və sonra biz hələ yaradılmamış bu xidmətin tələblərinin / imkanlarının ilk siyahısını tərtib etməyə çalışdıq

  • müxtəlif məlumat mənbələrinə daxil olmaq. Məsələn, Prometheus, Clickhouse, Postgres

  • müxtəlif kanallara xəbərdarlıq göndərin - telegram, slack və s.

  • düşünmə prosesində aydın oldu ki, mən deklarativ təsvir deyil, ssenari yazmaq bacarığı istəyirəm.

  • skriptləri cədvəl üzrə işlədir

  • xidməti yenidən başlatmadan skriptlərin asan yenilənməsi

  • mənbə kodlarından xidməti yenidən qurmadan funksionallığı birtəhər genişləndirmək imkanı

Bu siyahı təxminidir və çox güman ki, o qədər də dəqiq deyil. Bəzi əşyalar dəyişdi, bəziləri öldü. Hər şey həmişəki kimidir.

Əslində, Balerterin tarixi belə başladı.

Mürəkkəb xəbərdarlıqlarla asan iş. Və ya Balerterin tarixi

Sonda nə baş verdiyini və bunun necə işlədiyini qısaca təsvir etməyə çalışacağam. (Bəli, əlbəttə ki, bu son deyil. Məhsulun inkişafı üçün çoxlu planlar var. Mən yalnız bu günə diqqət yetirəcəyəm)

Necə işləyir?

Siz açıq şəkildə sorğu göndərdiyiniz bir Lua skripti yazırsınız (Prometheus, Clickhouse və s.). Siz cavablar alırsınız və birtəhər onları emal edir və müqayisə edirsiniz. Sonra bir növ siqnalı yandırın/söndürün. Balerter avtomatik olaraq qurduğunuz kanallara bildiriş göndərəcək (E-poçt, teleqram, boşluq və s.). Skript müəyyən edilmiş tezlikdə yerinə yetirilir. Və ... ümumiyyətlə, hamısı budur)

Bunu bir nümunə ilə göstərmək daha yaxşıdır:

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

Burda nə baş verir:

  • bu skriptin hər 10 saniyədən bir icra edilməli olduğunu müəyyən edin

  • skriptin adını təyin edin (APİ üçün, jurnallarda göstərmək, testlərdə istifadə etmək üçün)

  • logların çıxarılması üçün modulu birləşdirin

  • adı ilə klik evinə daxil olmaq üçün modulu birləşdirin ch1 (bağlantı özü konfiqurasiyada konfiqurasiya edilmişdir)

  • clickhouse-a sorğu göndərin

  • səhv olarsa, logda bir mesaj göstəririk və çıxırıq

  • sorğu nəticəsini sabitlə müqayisə edin (canlı nümunədə bu dəyəri, məsələn, Postgres verilənlər bazasından əldə edə bilərik)

  • ID ilə siqnalı aktivləşdirin və ya söndürün rps-min-limit

  • xəbərdarlıq statusu dəyişdikdə bildiriş alacaqsınız

Nümunə olduqca sadə və aydındır. Ancaq təbii ki, real həyatda skriptlər kifayət qədər geniş və mürəkkəb ola bilər. Qarışıq olmaq və səhv etmək asandır.

Buna görə də, məntiqi bir istək yetişdi - skriptləriniz üçün testlər yaza bilmək. Və v0.4.0 versiyasında o ortaya çıxdı.

Skript testi

Yuxarıdakı nümunədən skriptimiz üçün nümunə testi:

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

Addım addım:

  • testin yazıldığı skriptin adını göstərin

  • test adı (loglar üçün)

  • test modulunu birləşdirin

  • klikxanaya konkret sorğu üçün hansı nəticənin qaytarılması lazım olduğunu deyirik ch1

  • göstərilən mesajla siqnalın (səhv) rps-min-limitinin çağırıldığını yoxlayın

  • rps-min-limit siqnalının söndürülmədiyini yoxlayın (uğurlu)

Balerter başqa nə edə bilər?

Mən Balerterin ən vacib, mənim fikrimcə, bacarıqlarına toxunmağa çalışacağam. Rəsmi saytda hər şeyi ətraflı şəkildə görə bilərsiniz. https://balerter.com

  • -dən məlumat almaq

    • klik evi

    • postgres

    • mysql

    • prometeyus

    • Loki

  • kanallara bildirişlər göndərin

    • boşluq

    • teleqram

    • syslog

    • bildirin (kompüterinizdə UI bildirişləri)

    • e-poçt

    • qarşıdurma

  • məlumatlarınız əsasında qrafiklər qurun, şəkli S3 uyğun yaddaşa yükləyin və bildirişlərə əlavə edin (Şəkillərlə nümunə)

  • skriptlər arasında məlumat mübadiləsinə imkan verir - qlobal Açar / Dəyər saxlama

  • Lua-da öz kitabxanalarınızı yazın və onlardan skriptlərdə istifadə edin (defolt olaraq, lua kitabxanaları json, csv ilə işləmək üçün verilir)

  • skriptlərinizdən HTTP sorğuları göndərin (və əlbəttə ki, cavablar alın)

  • API təmin edir (hələ bizim istədiyimiz qədər funksional deyil)

  • Metrikləri Prometey formatında ixrac edir

Başqa nə bilmək istərdiniz?

Artıq aydındır ki, istifadəçilər və biz sintaksisdən istifadə edərək skriptlərin işə salınmasına nəzarət etmək imkanı istəyirik cron. Bu, v1.0.0 versiyasından əvvəl ediləcək

Mən daha çox məlumat mənbəyi və bildiriş çatdırma kanallarını dəstəkləmək istərdim. Məsələn, kimsə MongoDB üçün mütləq darıxacaq. Kimsə Elastik Axtarış. Mobil telefona SMS göndərin və/və ya yığın. Biz skriptləri təkcə fayllardan deyil, həm də, məsələn, verilənlər bazasından qəbul etmək istəyirik. Sonda biz layihə üçün daha rahat sayt və daha yaxşı sənədləşmə istəyirik.

Hər zaman kimsə üçün çatışmayan bir şey var) Burada düzgün prioritet vermək üçün cəmiyyətdən bir sorğu gözləyirik. Və hər şeyi həyata keçirmək üçün cəmiyyətin köməyi üçün

Nəticədə

İstifadə edirik Balerter artıq bir müddətdir ki, sahibidir. Onlarla ssenari bizim dincliyimizi qoruyur. Ümid edirəm ki, bu iş başqasına faydalı olacaq.

Probleminiz və PR ilə xoş gəlmisiniz.

Mənbə: www.habr.com

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