سهولة العمل مع التنبيهات المعقدة. أو تاريخ Balerter

سهولة العمل مع التنبيهات المعقدة. أو تاريخ Balerter

الجميع يحب التنبيهات.

بالطبع، من الأفضل أن يتم إعلامك عند حدوث شيء ما (أو إصلاحه) بدلاً من الجلوس وإلقاء نظرة على الرسوم البيانية والبحث عن الحالات الشاذة.

وقد تم إنشاء العديد من الأدوات لهذا الغرض. Alertmanager من النظام البيئي Prometheus وvmalert من مجموعة منتجات VictoriaMetrics. إخطارات وتنبيهات Zabbix في Grafana. نصوص برمجية مكتوبة ذاتيًا في روبوتات bash وTelegram والتي تسحب بشكل دوري بعض عناوين URL وتخبرك إذا كان هناك خطأ ما. الكثير من كل شيء.

نحن أيضًا، في شركتنا، استخدمنا حلولًا مختلفة حتى واجهنا التعقيد، أو بالأحرى، استحالة إنشاء تنبيهات معقدة ومركبة. ما أردناه وما انتهينا إليه هو أقل من الخفض. TLDR: هكذا ظهر المشروع مفتوح المصدر باليرتر

لقد عشنا جيدًا لفترة طويلة مع التنبيهات التي تم تكوينها في Grafana. نعم، هذه ليست الطريقة الأفضل. يُنصح دائمًا باستخدام بعض الحلول المتخصصة، مثل Alertmanager. وتطلعنا أيضًا إلى التحرك أكثر من مرة. وبعد ذلك، شيئًا فشيئًا، أردنا المزيد.

لنفترض متى انخفض/زاد مخطط معين بنسبة XX% وكان هناك لمدة N دقيقة مقارنة بالفترة السابقة التي تبلغ M ساعة؟ يبدو أنه يمكنك محاولة تنفيذ ذلك باستخدام Grafana أو Alertmanager، لكن الأمر ليس سهلاً تمامًا. (أو ربما هذا غير ممكن، لن أقول الآن)

وتزداد الأمور تعقيدًا عندما يجب اتخاذ قرار التنبيه بناءً على بيانات من مصادر مختلفة. مثال حي:

نحن نتحقق من البيانات من قاعدتي بيانات Clickhouse، ثم نقارنها ببعض البيانات من Postgres، ونقرر إصدار تنبيه. إشارة أو إلغاء

لقد تراكمت لدينا الكثير من الرغبات المماثلة لكي نفكر في قرارنا. ومن ثم حاولنا تجميع القائمة الأولى لمتطلبات/قدرات هذه الخدمة، والتي لم يتم إنشاؤها بعد.

  • الوصول إلى مصادر البيانات المختلفة. على سبيل المثال، بروميثيوس، كليكهاوس، بوستجرس

  • إرسال تنبيهات إلى قنوات مختلفة - برقية، سلاك، الخ.

  • في عملية التفكير، أصبح من الواضح أنني لا أريد وصفًا تعريفيًا، بل القدرة على كتابة النصوص

  • تشغيل البرامج النصية على جدول زمني

  • تحديث سهل للبرامج النصية دون إعادة تشغيل الخدمة

  • القدرة على توسيع الوظائف بطريقة أو بأخرى دون إعادة بناء الخدمة من أكواد المصدر

هذه القائمة تقريبية وعلى الأرجح ليست دقيقة للغاية. تغيرت بعض النقاط، ومات البعض. كل شيء كالمعتاد.

في الواقع، هكذا بدأ تاريخ باليرتر.

سهولة العمل مع التنبيهات المعقدة. أو تاريخ Balerter

سأحاول أن أصف بإيجاز ما حدث في النهاية وكيف حدث ذلك. (نعم بالطبع هذه ليست النهاية. هناك العديد من الخطط لتطوير المنتج. سأتوقف عند هذا اليوم فقط)

كيف يعمل؟

تكتب نصًا في Lua حيث ترسل الطلبات بشكل صريح (إلى Prometheus، وClickhouse، وما إلى ذلك). تتلقى إجابات وتقوم بمعالجتها ومقارنتها بطريقة ما. ثم قم بتشغيل/إيقاف نوع من التنبيه. سيقوم Balerter نفسه بإرسال إشعار إلى القنوات التي قمت بتكوينها (البريد الإلكتروني، البرقية، Slack، وما إلى ذلك). يتم تنفيذ البرنامج النصي على فترات زمنية محددة. و... بشكل عام، هذا كل شيء)

من الأفضل أن تظهر بمثال:

-- @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 ثوانٍ

  • الإشارة إلى اسم البرنامج النصي (لواجهة برمجة التطبيقات، للعرض في السجلات، للاستخدام في الاختبارات)

  • قم بتوصيل الوحدة لإخراج السجلات

  • قم بتوصيل وحدة للوصول إلى Clickhouse بالاسم ch1 (تم تكوين الاتصال نفسه في التكوين)

  • إرسال طلب إلى Clickhouse

  • في حالة وجود خطأ، نعرض رسالة في السجل ونخرج

  • مقارنة نتيجة الاستعلام بثابت (في مثال حي، يمكننا الحصول على هذه القيمة، على سبيل المثال، من قاعدة بيانات 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')

خطوة بخطوة:

  • حدد اسم البرنامج النصي الذي تم كتابة الاختبار من أجله

  • اسم الاختبار (للسجلات)

  • قم بتوصيل وحدة الاختبار

  • نقول ما هي النتيجة التي ينبغي إرجاعها لطلب محدد إلى Clickhouse ch1

  • نتحقق من استدعاء التنبيه (الخطأ) rps-min-limit بالرسالة المحددة

  • تأكد من عدم تعطيل التنبيه rps-min-limit (نجاح)

ماذا يمكن أن يفعل باليرتر أيضًا؟

سأحاول أن أتطرق إلى أهم مهارات Balerter في رأيي. يمكنك رؤية كل شيء بالتفصيل على الموقع الرسمي https://balerter.com

  • تلقي البيانات من

    • بيت النقر

    • بوستجرس

    • ك

    • محب العمل

    • لوكي

  • إرسال الإخطارات إلى القنوات

    • تثاقل

    • تيليجرام

    • سيسلوغ

    • إعلام (إشعارات واجهة المستخدم على جهاز الكمبيوتر الخاص بك)

    • البريد الإلكتروني

    • خلاف

  • أنشئ رسومًا بيانية بناءً على بياناتك، وقم بتحميل الصورة إلى وحدة تخزين متوافقة مع S3 وأرفقها بالإشعارات (مثال مع الصور)

  • يسمح لك بتبادل البيانات بين البرامج النصية - تخزين المفتاح/القيمة العالمي

  • اكتب مكتباتك الخاصة في Lua واستخدمها في البرامج النصية (افتراضيًا، يتم توفير مكتبات Lua للعمل مع json وcsv)

  • إرسال طلبات HTTP من البرامج النصية الخاصة بك (وتلقي الردود بالطبع)

  • يوفر واجهة برمجة التطبيقات (لم تعمل بعد كما نرغب)

  • تصدير المقاييس بتنسيق بروميثيوس

ما هو الشيء الآخر الذي تريد أن تكون قادرًا على فعله؟

من الواضح بالفعل أننا نريد القدرة على التحكم في تشغيل البرامج النصية باستخدام بناء الجملة كرون. سيتم ذلك قبل الإصدار v1.0.0

أرغب في دعم المزيد من مصادر البيانات وقنوات توصيل الإشعارات. على سبيل المثال، سيفتقد شخص ما بالتأكيد MongoDB. بحث مرن عن البعض. إرسال الرسائل القصيرة و/أو إجراء مكالمات إلى هاتفك المحمول. نريد أن نكون قادرين على تلقي البرامج النصية ليس فقط من الملفات، ولكن أيضًا، على سبيل المثال، من قاعدة البيانات. في النهاية، نريد موقعًا إلكترونيًا أكثر سهولة في الاستخدام ووثائق أفضل للمشروع.

هناك من يفتقد شيئاً دائماً) وهنا نعتمد على طلب المجتمع من أجل تحديد الأولويات بشكل صحيح. ولمساعدة المجتمع على إدراك كل شيء

في الختام

نحن نستخدم باليرتر لقد كان ذلك لبعض الوقت الآن. العشرات من النصوص تحمي راحة بالنا. آمل أن يكون هذا العمل مفيدًا لشخص آخر.

ومرحبا بكم في قضيتك والعلاقات العامة.

المصدر: www.habr.com

إضافة تعليق