Travail simplifié avec des alertes complexes. Ou l'histoire de création de Balerter

Travail simplifié avec des alertes complexes. Ou l'histoire de création de Balerter

Tout le monde aime les alertes.

Bien sûr, il est beaucoup mieux de recevoir une notification quand quelque chose s'est produit (ou a été réparé) que de rester assis, à regarder des graphiques et à chercher des anomalies.

Et il existe de nombreux outils pour cela. Alertmanager de l'écosystÚme Prometheus et vmalert du groupe de produits VictoriaMetrics. Notifications Zabbix et alertes dans Grafana. Des scripts faits maison en bash et des bots Telegram qui vérifient réguliÚrement une URL et signalent s'il y a un problÚme. Beaucoup de choses.

Nous, dans notre entreprise, avons Ă©galement utilisĂ© diffĂ©rentes solutions jusqu'Ă  ce que nous rencontrions la complexitĂ©, ou plutĂŽt, l'impossibilitĂ© de crĂ©er des alertes complexes et composĂ©es. Ce que nous voulions et ce que nous avons finalement rĂ©alisĂ© — sous le spoiler. TLDR : Ainsi est nĂ© le projet open source Balerter

Nous avons assez bien vécu avec les alertes configurées dans Grafana pendant un long moment. Oui, ce n'est pas la meilleure façon. Il est toujours recommandé d'utiliser certaines solutions spécialisées, comme Alertmanager. Et nous avons aussi envisagé plusieurs fois de déménager. Puis, petit à petit, nous avons voulu plus.

Dire qu'un certain graphique a chutĂ©/augmentĂ© de XX% et reste lĂ  depuis N minutes par rapport Ă  la pĂ©riode prĂ©cĂ©dente de M heures ? Cela semble rĂ©alisable avec Grafana ou Alertmanager, mais ce n'est pas trĂšs simple. (Ou peut-ĂȘtre que ce n'est pas possible, je ne peux pas le dire maintenant)

Tout devient encore plus compliquĂ© lorsque la dĂ©cision d'alerte doit ĂȘtre prise sur la base de donnĂ©es provenant de diffĂ©rentes sources. Un exemple concret :

Nous vérifions les données provenant de deux bases Clickhouse, puis nous les comparons avec certaines données issues de Postgres, et prenons une décision d'alerte. Signaler ou annuler.

Nous avons accumulé suffisamment de demandes de ce type pour envisager notre propre solution. Nous avons alors essayé de dresser une premiÚre liste des exigences/possibilités de ce service qui n'était pas encore créé.

  • AccĂ©der Ă  diffĂ©rentes sources de donnĂ©es. Par exemple, Prometheus, Clickhouse, Postgres.

  • Envoyer des alertes vers diffĂ©rents canaux — telegram, slack, etc.

  • En rĂ©flĂ©chissant, il est devenu clair que nous voulions non pas une description dĂ©clarative, mais la possibilitĂ© d'Ă©crire des scripts.

  • Lancer des scripts selon un calendrier.

  • Mise Ă  jour facile des scripts sans redĂ©marrage du service.

  • PossibilitĂ© d'Ă©tendre la fonctionnalitĂ© sans reconstruire le service Ă  partir du code source.

C'est une liste approximative et, probablement, pas trÚs exacte. Certains points ont évolué, d'autres ont disparu. Comme d'habitude.

C'est ainsi que l'histoire de Balerter a réellement commencé.

Travail simplifié avec des alertes complexes. Ou l'histoire de création de Balerter

Je vais essayer de décrire briÚvement ce que nous avons accompli et comment cela fonctionne. (Oui, bien sûr, ce n'est pas la fin. Beaucoup de projets de développement pour le produit. Je vais simplement me concentrer sur le jour d'aujourd'hui)

Comment cela fonctionne ?

Vous Ă©crivez un script en Lua, oĂč vous envoyez clairement des requĂȘtes (vers Prometheus, Clickhouse, etc.). Vous obtenez des rĂ©ponses et les traitez et les comparez d'une certaine maniĂšre. Ensuite, vous activez/dĂ©sactivez une alerte. Balerter enverra lui-mĂȘme des notifications dans les canaux que vous avez configurĂ©s (Email, telegram, slack, etc.). Le script s'exĂ©cute Ă  intervalles prĂ©dĂ©finis. Et
 c'est Ă  peu prĂšs tout)

Le mieux est de montrer par un exemple :

-- @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("erreur de requĂȘte clickhouse 'ch1' : " .. err)
    return
end

local resultRPS = res[1].rps

if resultRPS < minRequestsRPS then
    alert.error("rps-min-limit", "Les RPS de demandes sont trĂšs faibles : " .. tostring(resultRPS))
else
    alert.success("rps-min-limit", "RPS de demandes corrects")
end 

Que se passe-t-il ici :

  • nous spĂ©cifions que ce script doit s'exĂ©cuter toutes les 10 secondes

  • nous spĂ©cifions le nom du script (pour l'API, pour l'affichage dans les journaux, pour une utilisation dans les tests)

  • nous connectons le module pour afficher les journaux

  • nous connectons le module pour accĂ©der Ă  Clickhouse nommĂ© ch1 (la connexion elle-mĂȘme est configurĂ©e dans le fichier de configuration)

  • nous envoyons une requĂȘte Ă  Clickhouse

  • en cas d'erreur, nous affichons un message dans le journal et sortons

  • nous comparons le rĂ©sultat de la requĂȘte avec une constante (dans un exemple rĂ©el, nous pourrions obtenir cette valeur, par exemple, Ă  partir d'une base de donnĂ©es Postgres)

  • nous activons ou dĂ©sactivons l'alerte avec l'ID rps-min-limit

  • vous recevrez une notification si le statut de l'alerte change

L'exemple est assez simple et comprĂ©hensible. Cependant, il va sans dire que dans la rĂ©alitĂ©, les scripts peuvent ĂȘtre assez volumineux et complexes. Il est facile de s'y perdre et de commettre des erreurs.

C'est pourquoi une envie logique est nĂ©e — avoir la possibilitĂ© d'Ă©crire des tests pour ses scripts. Et dans la version v0.4.0, cela est apparu.

Tests de scripts

Exemple de test pour notre script de l'exemple précédent :

-- @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', 'Les RPS de demandes sont trĂšs faibles : 10')
test.alert().assertNotCalled('success', 'rps-min-limit', 'RPS de demandes corrects')

Par étapes :

  • nous spĂ©cifions le nom du script pour lequel le test est Ă©crit

  • le nom du test (pour les journaux)

  • nous connectons le module de test

  • nous discutons du rĂ©sultat Ă  retourner pour une certaine requĂȘte vers ClickHouse ch1

  • nous vĂ©rifions qu'une alerte (erreur) rps-min-limit a bien Ă©tĂ© appelĂ©e avec le message spĂ©cifiĂ©

  • nous vĂ©rifions que l'alerte rps-min-limit n'a pas Ă©tĂ© dĂ©sactivĂ©e (succĂšs)

Quelles sont les autres capacités de Balerter ?

Je vais essayer d'aborder les compétences les plus importantes de Balerter selon moi. Vous pouvez voir tous les détails sur le site officiel https://balerter.com

  • obtenir des donnĂ©es de

    • clickhouse

    • postgres

    • mysql

    • prometheus

    • loki

  • envoyer des notifications vers des canaux

    • slack

    • telegram

    • syslog

    • notiify (notifications UI sur votre ordinateur)

    • email

    • discord

  • construire des graphiques Ă  partir de vos donnĂ©es, tĂ©lĂ©charger des images dans un stockage compatible S3 et les joindre aux notifications (Exemple avec images)

  • permet d'Ă©changer des donnĂ©es entre des scripts — un stockage Key/Value global

  • Ă©crire vos propres bibliothĂšques en Lua et les utiliser dans des scripts (des bibliothĂšques Lua pour travailler avec json, csv sont fournies par dĂ©faut)

  • envoyer des requĂȘtes HTTP depuis vos scripts (et bien sĂ»r recevoir des rĂ©ponses)

  • fournit une API (pas encore aussi fonctionnelle que souhaitĂ©)

  • exporte les mĂ©triques au format Prometheus

Quels autres souhaits aimerions-nous ?

Il est déjà clair que les utilisateurs et nous voulons la possibilité de gérer le lancement des scripts avec une syntaxe cron. Cela sera fait avant la version v1.0.0

Nous aimerions prendre en charge plus de sources de données et de canaux de livraison de notifications. Par exemple, certains manqueront sûrement MongoDB. D'autres Elastic Search. Envoyer des SMS et/ou passer des appels sur des mobiles. Nous souhaitons pouvoir obtenir des scripts non seulement à partir de fichiers, mais aussi, par exemple, à partir d'une base de données. En fin de compte, nous voulons un site plus convivial pour le projet et une meilleure documentation.

Il y a toujours quelque chose qui manque à quelqu'un) Ici, nous espérons compter sur les demandes de la communauté pour établir correctement les priorités. Et sur l'aide de la communauté pour tout réaliser

En conclusion

Nous utilisons Balerter nous l'avons déjà utilisé depuis un bon moment. Des dizaines de scripts veillent sur notre tranquillité. J'espÚre que ce travail sera utile à d'autres.

Et bienvenue avec vos problĂšmes et vos PR.

Source : habr.com

Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS đŸ”„ Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster