کار آسان با هشدارهای پیچیده. یا تاریخچه ایجاد Balerter

کار آسان با هشدارهای پیچیده. یا تاریخچه ایجاد Balerter

همه هشدارها را دوست دارند.

البته، خیلی بهتر است زمانی که اتفاقی افتاده (یا درست شده است) مطلع شوید تا اینکه بنشینید و به نمودارها نگاه کنید و به دنبال ناهنجاری بگردید.

و ابزارهای زیادی برای این کار ساخته شده است. Alertmanager از اکوسیستم Prometheus و vmalert از گروه محصولات VictoriaMetrics. اعلان ها و هشدارهای Zabbix در Grafana. اسکریپت‌های خودنویس در ربات‌های bash و تلگرام که به صورت دوره‌ای مقداری URL را می‌آورند و به شما می‌گویند که آیا مشکلی وجود دارد. خیلی از همه چیز.

ما در شرکت خود نیز از راه‌حل‌های مختلفی استفاده کردیم تا اینکه با پیچیدگی یا بهتر بگوییم عدم امکان ایجاد هشدارهای پیچیده و ترکیبی مواجه شدیم. آنچه ما می‌خواستیم و در نهایت انجام می‌دادیم پایین‌تر است. TLDR: پروژه منبع باز اینگونه ظاهر شد بالتر

برای مدت طولانی ما با هشدارهای پیکربندی شده در Grafana به خوبی زندگی می کردیم. بله، این بهترین راه نیست. همیشه توصیه می شود از برخی راه حل های تخصصی مانند Alertmanager استفاده کنید. و همچنین بیش از یک بار به سمت حرکت نگاه کردیم. و بعد کم کم بیشتر خواستیم.

بگویید چه زمانی یک نمودار خاص XNUMX درصد کاهش/افزایش یافته است و در مقایسه با دوره قبلی M ساعت N دقیقه آنجا بوده است؟ به نظر می رسد که می توانید این را با Grafana یا Alertmanager پیاده سازی کنید، اما این کار چندان آسانی نیست. (یا شاید امکان پذیر نباشد، اکنون نمی گویم)

وقتی تصمیم هشدار باید بر اساس داده‌های منابع مختلف گرفته شود، اوضاع پیچیده‌تر می‌شود. مثال زنده:

ما داده های دو پایگاه داده Clickhouse را بررسی می کنیم، سپس آن را با برخی از داده های Postgres مقایسه می کنیم و در مورد هشدار تصمیم می گیریم. سیگنال دهید یا لغو کنید

ما خواسته های مشابه زیادی را برای خود جمع کرده ایم تا به تصمیم خود فکر کنیم. و سپس سعی کردیم اولین لیست از نیازمندی ها/قابلیت های این سرویس را که هنوز ایجاد نشده است تهیه کنیم.

  • دسترسی به منابع داده های مختلف به عنوان مثال، پرومتئوس، کلیک هاوس، پستگرس

  • ارسال هشدار به کانال های مختلف - تلگرام، اسلک و غیره.

  • در فرآیند فکر کردن، مشخص شد که من یک توصیف توضیحی نمی خواهم، بلکه توانایی نوشتن فیلمنامه را می خواهم

  • اجرای اسکریپت ها بر اساس برنامه

  • به روز رسانی آسان اسکریپت ها بدون راه اندازی مجدد سرویس

  • توانایی گسترش عملکرد بدون بازسازی سرویس از کدهای منبع

این لیست تقریبی است و به احتمال زیاد خیلی دقیق نیست. برخی از نقاط تغییر کرد، برخی مردند. همه چیز طبق معمول است.

در واقع، تاریخ Balerter اینگونه آغاز شد.

کار آسان با هشدارهای پیچیده. یا تاریخچه ایجاد Balerter

من سعی خواهم کرد به طور خلاصه توضیح دهم که در پایان چه اتفاقی افتاد و چگونه کار می کند. (بله، البته، این پایان کار نیست. برنامه های زیادی برای توسعه محصول وجود دارد. من فقط به همین امروز می پردازم)

چگونه کار می کند؟

شما یک اسکریپت در Lua می نویسید که در آن صریحاً درخواست ها را ارسال می کنید (به Prometheus، Clickhouse و غیره). شما پاسخ ها را دریافت می کنید و به نوعی آنها را پردازش و مقایسه می کنید. سپس نوعی هشدار را روشن/خاموش کنید. خود 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 (خود اتصال در پیکربندی پیکربندی شده است)

  • یک درخواست به کلیک هاوس ارسال کنید

  • در صورت بروز خطا، پیامی را در لاگ نمایش داده و از آن خارج می شویم

  • نتیجه پرس و جو را با یک ثابت مقایسه کنید (در یک مثال زنده، می توانیم این مقدار را مثلاً از پایگاه داده Postgres بدست آوریم)

  • فعال یا غیرفعال کردن هشدار با شناسه 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')

مراحل:

  • نام اسکریپتی که آزمون برای آن نوشته شده است را مشخص کنید

  • نام آزمون (برای گزارش ها)

  • ماژول تست را وصل کنید

  • ما می گوییم چه نتیجه ای باید برای یک درخواست خاص به خانه کلیک برگردانده شود ch1

  • بررسی می کنیم که هشدار (خطا) rps-min-limit با پیام مشخص شده فراخوانی شده باشد

  • بررسی کنید که هشدار rps-min-limit غیرفعال نشده باشد (موفقیت)

بالتر چه کار دیگری می تواند انجام دهد؟

من سعی خواهم کرد به مهمترین مهارت های Balerter، به نظر من، دست بزنم. شما می توانید همه چیز را با جزئیات در وب سایت رسمی مشاهده کنید https://balerter.com

  • دریافت داده از

    • خانه کلیک

    • postgres

    • خروجی زیر

    • پرومتئوس

    • لوکی

  • ارسال نوتیفیکیشن به کانال ها

    • شل

    • تلگراف

    • syslog

    • اطلاع رسانی (اعلان های UI در رایانه شما)

    • پست الکترونیک

    • اختلاف

  • نمودارها را بر اساس داده های خود بسازید، تصویر را در فضای ذخیره سازی سازگار با S3 آپلود کنید و آن را به اعلان ها وصل کنید (مثال با تصاویر)

  • به شما امکان می دهد داده ها را بین اسکریپت ها مبادله کنید - ذخیره سازی کلید/مقدار جهانی

  • کتابخانه های خود را در Lua بنویسید و از آنها در اسکریپت ها استفاده کنید (به طور پیش فرض، کتابخانه های lua برای کار با json، csv ارائه می شوند)

  • درخواست های HTTP را از اسکریپت های خود ارسال کنید (البته پاسخ ها را دریافت کنید)

  • یک API ارائه می دهد (هنوز به اندازه ای که ما می خواهیم کاربردی نیست)

  • معیارها را در قالب پرومتئوس صادر می کند

چه کار دیگری دوست دارید بتوانید انجام دهید؟

در حال حاضر واضح است که کاربران و ما می خواهیم توانایی کنترل راه اندازی اسکریپت ها با استفاده از نحو را داشته باشیم cron را. این کار قبل از نسخه v1.0.0 انجام خواهد شد

می‌خواهم از منابع داده و کانال‌های ارسال اعلان بیشتر پشتیبانی کنم. به عنوان مثال، کسی قطعا MongoDB را از دست خواهد داد. جستجوی الاستیک برای برخی به تلفن همراه خود اس ام اس بفرستید و/یا تماس بگیرید. ما می‌خواهیم بتوانیم اسکریپت‌ها را نه تنها از فایل‌ها، بلکه مثلاً از یک پایگاه داده نیز دریافت کنیم. در پایان، ما یک وب سایت کاربر پسندتر و مستندات بهتر برای پروژه می خواهیم.

کسی همیشه چیزی را از دست می دهد) در اینجا ما به درخواست انجمن تکیه می کنیم تا اولویت ها را به درستی تنظیم کنیم. و به کمک جامعه برای تحقق همه چیز

در نتیجه

ما استفاده می کنیم بالتر الان خیلی وقته دارمش ده ها فیلمنامه از آرامش ذهن ما محافظت می کنند. امیدوارم این کار برای دیگران مفید واقع شود.

و با موضوع و روابط عمومی خود خوش آمدید.

منبع: www.habr.com

اضافه کردن نظر