Peu à peu, cette idée est passée à la mise en œuvre, des idées d'amélioration y sont apparues, un suivi des hébergeurs est apparu, puis un suivi des applications, et, cerise sur le gâteau, des incidents avec notification.
En conséquence, nous avons obtenu un système de surveillance à part entière, qui est une solution d'auto-hôte entièrement open source qui n'a pas de communication externe, avec des incidents entièrement définis par l'utilisateur.
Et dans cet article, nous voulons vous présenter le produit résultant.
Détails techniques
Une architecture de microservice a été choisie pour le développement. Le backend a été développé en GoLang en tant que langage rapide et pratique pour le développement de microservices. Nous avons utilisé gRPC pour communiquer entre les services. En plus du fait que gRPC fonctionne sur HTTP / 2 avec tout ce que cela implique, la description des interfaces de service via proto vous permettra, en tant qu'utilisateurs, de créer vos propres implémentations de parties individuelles du système, si nécessaire.
Le projet utilise Mongo comme base de données à accès rapide et Postgres pour stocker les statistiques collectées.
Bazel a été utilisé pour l'assemblage et le déploiement. Bazel vous permet de décrire de manière déclarative les dépendances et les relations entre les packages dans Golang. De plus, nous avons commencé à tester Bazel avec un cache distant, ce qui a un effet positif sur la vitesse du système. Bazel collecte également toutes les applications dans Docker et organise les tests unitaires. Tout cela est intégré aux actions Github.
Le tableau de bord du système est écrit en Angular 9.
Nous essayons de garder la barre dans les tests unitaires, au moment où chaque entité est couverte. Dans un proche avenir, la mise en œuvre des tests d'intégration et E2E est prévue pour le support le plus complet du système
Description du système
Comme mentionné ci-dessus, Squzy est un ensemble de microservices interagissant les uns avec les autres, dont chacun traite une tâche distincte.
Liste des services:
- Agent Client — , . , . Agent Server.
- Agent Server — , . Mongo, Storage.
- Application Monitoiring — , / Squzy , . GoLang NodeJS, — PHP & Java .
- Monitoring — external/internal .
- Storage — . Postgres, ClickHouse.
- Incident Manager- . ( ). Mongo, Storage.
- Notification Manager — . Webhook & Slack.
- API — API Gateway
Le schéma d'interaction des services est le suivant:
Pour démontrer les capacités de Squzy, une démo a été développée qui surveille son propre serveur et vous permet de surveiller le système sur le tableau de bord: https://demo.squzy.app/ .
Certaines fonctionnalités, telles que l'ajout / la suppression de nouvelles entités, sont désactivées dans la démo, mais cela vous permet de voir et de ressentir toutes les parties du système. Ci-dessous, nous nous attarderons plus en détail sur chacun des types de surveillance.
Cette partie du système est responsable des contrôles externes / internes. Pour le moment, il vous permet d'envoyer des demandes et d'attendre des réponses aux types de points de terminaison suivants:
- Tcp - vérification du port ouvert;
- gRPC - vérification du protocole ;
- Http - vérifier la conformité avec le code d'état;
- SiteMap - vérifier que toutes les URL du sitemap répondent par 200 OK ;
- JsonValue - collection de valeurs spécifiques de la réponse JSON.
Squzy vous permet d'ajouter des en-têtes personnalisés à toutes sortes de vérifications HTTP.
L'interface pour ajouter une vérification via le tableau de bord Squzy ressemble à ceci:
Ici, l'intervalle est l'intervalle entre les vérifications en secondes, et le délai d'expiration est le temps après lequel la vérification est considérée comme infructueuse.
Après création, l'utilisateur a accès à la configuration du vérificateur:
Pour chaque type de contrôle, vous pouvez rédiger une règle d'incident. Plus de détails sur les incidents seront décrits ci-dessous, mais ici nous ne donnerons qu'un exemple:
dans ce cas, nous mesurons la valeur du taux de change du dollar à partir du site, et s'il est supérieur à 80, nous créerons un incident.
Lien vers la démo.
Les incidents peuvent être créés sur:
- Durée de la vérification (heure de réception d'une réponse du serveur);
- Statut (code d'état renvoyé);
- Valeur (informations transmises dans le vérificateur).
Agent squzy
Pour surveiller les hôtes du système, l'agent Squzy installé sur le serveur est utilisé. Il collecte actuellement les statistiques suivantes:
- CPU - charge par les processeurs;
- Mémoire - utilisée / libre / totale / partagée;
- Disque - Utilisé / Libre / Total pour chacun des disques;
- Net - pour chaque interface réseau.
Chronologie de l'agent:
- L'agent s'enregistre auprès du serveur d'agent et reçoit un ID (lors de l'enregistrement, il est possible de spécifier l'intervalle de surveillance et le nom de l'agent);
- L'agent envoie des statistiques au serveur à un certain intervalle;
- ….
- L'agent informe le serveur de l'arrêt.
S'il n'y a pas de connexion au serveur, l'agent continue de collecter des statistiques et elles seront envoyées lorsque la connexion sera rétablie.
La version de démonstration de l'agent peut être consultée ici: https://demo.squzy.app/agents/5f142b6141a1c6518723483a/live L'
agent peut également avoir un ensemble de règles pour vérifier les incidents:
Surveillance des applications Squzy
Pour les applications de surveillance, des intégrations ont été développées avec des frameworks populaires pour Go / NodeJs (plus loin, comme le disent les spécialistes du marketing à succès). Les intégrations déterminent le type de transaction ( Http / Router / gRPC / WebSocket / etc) et analysent les réponses des moteurs / requêtes.
Squzy prend également en charge le traçage des transactions, qui vous permet de surveiller les transactions associées de plusieurs serveurs / services. Un exemple de surveillance de telles transactions sur le tableau de bord: https://demo.squzy.app/transactions/om8l8LP96PRsvx67UxkES .
Bibliothèques à intégrer dans Go et Node Js.
- Allez - https://github.com/squzy/squzy_go (GIN / gRPC / Http);
- NodeJs - https://github.com/squzy/squzy_node (Express) + FE (angulaire + vanille).
À la base, les bibliothèques sont des intergiciels qui chronométrent le temps avant l'envoi d'une transaction et le temps après qu'elle a été traitée et analysent la réponse. Nous avons également écrit un exemple d'application de surveillance GO: https://github.com/squzy/test_tracing.
Vous pouvez créer vos propres transactions et mesurer leurs délais d'exécution, leurs statuts et leurs erreurs. Pour cela, utilisez le package Core. Pour faciliter la prise en charge du produit, toutes les langues utiliseront le même nom pour les packages qui définissent le comportement.
Vous pouvez créer des incidents par transaction en fonction des données suivantes:
- La durée de la transaction;
- Statut de la transaction;
- Erreurs reçues;
- Type de transaction.
Gestionnaire d'incidents Squzy + Gestionnaire de notifications
Les incidents dans Squzy sont basés sur des règles. Lorsqu'une nouvelle entité est ajoutée au stockage, la règle décrite est vérifiée, et si c'est le cas, un incident est créé (s'il n'a pas déjà été créé).
Les règles sont une version étendue de expr , à laquelle des règles spécifiques ont été ajoutées, en tenant compte de la spécification du système, telles que Last (prend les n derniers enregistrements de Storage), Use (utilise un filtre spécifique pour cela), etc. Une description détaillée de toutes les règles peut être trouvée sur https://squzy.app/usage/squzy-incident/incident-rules , ici nous nous concentrerons sur un exemple illustratif.
Disons que vous avez un serveur avec 1792 processeurs, 256 Go de RAM et 16 To d'espace disque. Et vous voulez vraiment vérifier que votre devops n'exécute pas Doom sur le moniteur de charge du processeur. Vous savez que la maintenance d'un site d'une page qui dessert votre serveur ne charge jamais à 100% plus de 8 processeurs pendant plus d'une minute. De plus, la RAM est à plus de la moitié libre. Alors que le disque dur a tout un To d'espace libre en réserve (si vous ne stockez pas les archives bien connues à la maison, votre femme verra). Dans ce cas, sachant que les métriques sont collectées toutes les 10 secondes, vous pouvez définir la règle suivante pour vérifier que votre serveur fonctionne correctement:
any(Last(7, UseType(All)),
{all(.CpuInfo.Cpus, {.Load > 80}) &&
.MemoryInfo.Mem.UsedPercent < 50 &&
.DiskInfo.Disks["System"].Free > 1000000000000}
)
De même, Squzy vous permet de décrire divers modèles de comportement indésirable du système.
Une fois la vérification des règles réussie (ou plutôt infructueuse), un incident est créé et l'utilisateur est averti, s'il est configuré.
Un incident actif, c'est-à-dire un incident qui n'a pas encore été vérifié par l'utilisateur, peut être fermé automatiquement, c'est-à-dire s'il n'a pas réussi la vérification à un moment donné, si l'option appropriée est sélectionnée.
Pour chaque entité cochée, que ce soit une application / un vérificateur / un agent, vous pouvez créer vos propres notifications d'incidents.
Conclusion
Nous sommes actuellement en train de collecter les retours et commentaires de la communauté informatique.
Nous avons déjà un certain nombre de plans pour le développement de produits:
- ajout d'intégrations Java / PHP;
- vérificateurs de bases de données;
- migration de Postgres vers ClickHouse;
- plus de méthodes de notification;
- intégration avec kubernetes;
- amélioration de la documentation;
- API GQL;
- Intégration et tests E2E;
- surveillance des applications mobiles.
- Saisie semi-automatique des règles d'incident sur l'interface utilisateur
Nous serons heureux de recevoir vos commentaires ou suggestions.
Liens
- Backend système: https://github.com/squzy/squzy
- Systèmes frontaux: https://github.com/squzy/squzy-dashboard
- Tableau de bord de démonstration: https://demo.squzy.app/
- Documentation: https://squzy.app/
- Auteurs: PxyUp DreamAndDrum
PS:
Merci pour l'article Vonotirax
Try en 1 clic