Εύκολη εργασία με σύνθετες ειδοποιήσεις. Ή την ιστορία της δημιουργίας του Balerter

Εύκολη εργασία με σύνθετες ειδοποιήσεις. Ή την ιστορία της δημιουργίας του Balerter

Σε όλους αρέσουν οι ειδοποιήσεις.

Φυσικά, είναι πολύ καλύτερο να ειδοποιείστε όταν κάτι έχει συμβεί (ή διορθώθηκε) παρά να καθίσετε και να κοιτάξετε γραφήματα και να αναζητήσετε ανωμαλίες.

Και πολλά εργαλεία έχουν δημιουργηθεί για αυτό. Alertmanager από το οικοσύστημα Prometheus και vmalert από την ομάδα προϊόντων VictoriaMetrics. Ειδοποιήσεις και ειδοποιήσεις Zabbix στο Grafana. Αυτογραφικά σενάρια σε bot bash και Telegram που ανεβάζουν περιοδικά κάποια διεύθυνση URL και σας ενημερώνουν εάν κάτι δεν πάει καλά. Πολλά από όλα.

Εμείς, στην εταιρεία μας, χρησιμοποιήσαμε επίσης διαφορετικές λύσεις μέχρι να αντιμετωπίσουμε την πολυπλοκότητα ή, μάλλον, την αδυναμία δημιουργίας πολύπλοκων, σύνθετων ειδοποιήσεων. Αυτό που θέλαμε και αυτό που καταλήξαμε να κάνουμε είναι κάτω από την περικοπή. TLDR: Έτσι εμφανίστηκε το έργο ανοιχτού κώδικα Δεματοποιός

Για αρκετό καιρό ζούσαμε καλά με τις ειδοποιήσεις που διαμορφώθηκαν στη Γραφάνα. Ναι, αυτός δεν είναι ο καλύτερος τρόπος. Συνιστάται πάντα η χρήση ορισμένων εξειδικευμένων λύσεων, όπως το Alertmanager. Και κοιτάξαμε επίσης να κινηθούμε περισσότερες από μία φορές. Και μετά, σιγά σιγά, θέλαμε κι άλλα.

Ας πούμε πότε ένα συγκεκριμένο γράφημα έχει πέσει/αυξηθεί κατά XX% και ήταν εκεί για N λεπτά σε σύγκριση με την προηγούμενη περίοδο των M ωρών; Φαίνεται ότι μπορείτε να προσπαθήσετε να το εφαρμόσετε με το Grafana ή το Alertmanager, αλλά δεν είναι αρκετά εύκολο. (Ή ίσως δεν είναι δυνατό, δεν θα το πω τώρα)

Τα πράγματα γίνονται ακόμη πιο περίπλοκα όταν η απόφαση προειδοποίησης πρέπει να ληφθεί με βάση δεδομένα από διαφορετικές πηγές. Ζωντανό παράδειγμα:

Ελέγχουμε τα δεδομένα από δύο βάσεις δεδομένων Clickhouse, τα συγκρίνουμε με κάποια δεδομένα από την Postgres και αποφασίζουμε για μια ειδοποίηση. Σήμα ή ακύρωση

Έχουμε συσσωρεύσει πολλές παρόμοιες επιθυμίες για να σκεφτούμε την απόφασή μας. Και μετά προσπαθήσαμε να συντάξουμε την πρώτη λίστα απαιτήσεων/δυνατοτήτων αυτής της υπηρεσίας, η οποία δεν έχει δημιουργηθεί ακόμη.

  • πρόσβαση σε διαφορετικές πηγές δεδομένων. Για παράδειγμα, Prometheus, Clickhouse, Postgres

  • αποστολή ειδοποιήσεων σε διάφορα κανάλια - τηλεγράφημα, slack κ.λπ.

  • στη διαδικασία της σκέψης, έγινε σαφές ότι δεν ήθελα μια δηλωτική περιγραφή, αλλά την ικανότητα να γράφω σενάρια

  • εκτέλεση σεναρίων σε ένα χρονοδιάγραμμα

  • εύκολη ενημέρωση σεναρίων χωρίς επανεκκίνηση της υπηρεσίας

  • τη δυνατότητα να επεκτείνεται με κάποιο τρόπο η λειτουργικότητα χωρίς να αναδημιουργηθεί η υπηρεσία από πηγαίους κώδικες

Αυτή η λίστα είναι κατά προσέγγιση και πιθανότατα όχι πολύ ακριβής. Κάποια σημεία άλλαξαν, κάποια πέθαναν. Όλα είναι όπως συνήθως.

Στην πραγματικότητα, έτσι ξεκίνησε η ιστορία του Balerter.

Εύκολη εργασία με σύνθετες ειδοποιήσεις. Ή την ιστορία της δημιουργίας του Balerter

Θα προσπαθήσω να περιγράψω εν συντομία τι συνέβη στο τέλος και πώς λειτουργεί. (Ναι, φυσικά, αυτό δεν είναι το τέλος. Υπάρχουν πολλά σχέδια για την ανάπτυξη προϊόντων. Θα σταθώ μόνο στο σήμερα)

Πώς λειτουργεί;

Γράφεις ένα σενάριο στο Lua όπου στέλνεις ρητά αιτήματα (στο Prometheus, στο Clickhouse κ.λπ.). Λαμβάνετε απαντήσεις και με κάποιο τρόπο τις επεξεργάζεστε και τις συγκρίνετε. Στη συνέχεια, ενεργοποιήστε/απενεργοποιήστε κάποιο είδος ειδοποίησης. Το ίδιο το Balerter θα στείλει μια ειδοποίηση στα κανάλια που έχετε διαμορφώσει (email, τηλεγράφημα, 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 δευτερόλεπτα

  • υποδείξτε το όνομα του σεναρίου (για το API, για εμφάνιση σε αρχεία καταγραφής, για χρήση σε δοκιμές)

  • συνδέστε τη μονάδα για την έξοδο των αρχείων καταγραφής

  • συνδέστε μια μονάδα για να αποκτήσετε πρόσβαση στο clickhouse με το όνομα ch1 (η ίδια η σύνδεση έχει ρυθμιστεί στο config)

  • στείλτε ένα αίτημα στο 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;

Θα προσπαθήσω να θίξω τις πιο σημαντικές, κατά τη γνώμη μου, δεξιότητες του Balerter. Μπορείτε να δείτε τα πάντα αναλυτικά στην επίσημη ιστοσελίδα https://balerter.com

  • λήψη δεδομένων από

    • clickhouse

    • postgres

    • mysql

    • Προμηθέας

    • Loki

  • αποστολή ειδοποιήσεων στα κανάλια

    • χαλαρότητα

    • τηλεγράφημα

    • syslog

    • ειδοποίηση (ειδοποιήσεις διεπαφής χρήστη στον υπολογιστή σας)

    • ΗΛΕΚΤΡΟΝΙΚΗ ΔΙΕΥΘΥΝΣΗ

    • διχόνοια

  • δημιουργήστε γραφήματα με βάση τα δεδομένα σας, μεταφορτώστε την εικόνα σε αποθηκευτικό χώρο συμβατό με S3 και επισυνάψτε την στις ειδοποιήσεις (Παράδειγμα με εικόνες)

  • σας επιτρέπει να ανταλλάσσετε δεδομένα μεταξύ σεναρίων - καθολική αποθήκευση κλειδιού/τιμής

  • γράψτε τις δικές σας βιβλιοθήκες στο Lua και χρησιμοποιήστε τις σε σενάρια (από προεπιλογή, οι βιβλιοθήκες lua παρέχονται για εργασία με json, csv)

  • στείλτε αιτήματα HTTP από τα σενάρια σας (και λάβετε απαντήσεις, φυσικά)

  • παρέχει ένα API (δεν είναι ακόμη τόσο λειτουργικό όσο θα θέλαμε)

  • εξάγει μετρήσεις σε μορφή Prometheus

Τι άλλο θα θέλατε να μπορείτε να κάνετε;

Είναι ήδη σαφές ότι οι χρήστες και εμείς θέλουμε τη δυνατότητα ελέγχου της εκκίνησης σεναρίων χρησιμοποιώντας τη σύνταξη cron. Αυτό θα γίνει πριν από την έκδοση v1.0.0

Θα ήθελα να υποστηρίξω περισσότερες πηγές δεδομένων και κανάλια παράδοσης ειδοποιήσεων. Για παράδειγμα, σε κάποιον θα λείψει σίγουρα το MongoDB. Ελαστική αναζήτηση για κάποιους. Στείλτε SMS ή/και πραγματοποιήστε κλήσεις στο κινητό σας τηλέφωνο. Θέλουμε να μπορούμε να λαμβάνουμε σενάρια όχι μόνο από αρχεία, αλλά και, για παράδειγμα, από μια βάση δεδομένων. Στο τέλος, θέλουμε έναν πιο φιλικό προς τον χρήστη ιστότοπο και καλύτερη τεκμηρίωση για το έργο.

Σε κάποιον πάντα κάτι του λείπει) Εδώ βασιζόμαστε στο αίτημα της κοινότητας για να θέσουμε σωστά τις προτεραιότητες. Και στη βοήθεια της κοινότητας να συνειδητοποιήσουν τα πάντα

Εν κατακλείδι

Χρησιμοποιούμε Δεματοποιός Το έχω αρκετό καιρό τώρα. Δεκάδες σενάρια φρουρούν την ηρεμία μας. Ελπίζω αυτό το έργο να είναι χρήσιμο σε κάποιον άλλο.

Και καλώς ήρθατε με το Θέμα και τις δημόσιες σχέσεις σας.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο