Comment faire pour surveiller Uptime de 20 sites (Ping ou HTTP) dans Node.js / RoR
-
11-10-2019 - |
Question
Quelle est la meilleure façon de ping une liste de 20 sites toutes les 5 minutes (par exemple) afin de savoir si le site répond avec HTTP 202 ou non?
L'aucune idée brainer est de sauver les 20 URLS dans une base de données et il suffit d'exécuter la base de données et ping chacun. Cependant, ce qui se passe quand on ne répond pas? Qu'advient-il les après?
Aussi, est-il mieux, mais la solution non-tête pour cela? Je crains que la liste peut atteindre 20000 sites et il n'y a pas assez de temps pour les ping toutes les 5 minutes, je dois être pinger.
En fait, je décris comment Pingdom, UptimeRobot, et aime le travail.
Je construis ce système en utilisant Node.js et Ruby on Rails. Je suis également enclin à utiliser MongoDB pour sauver l'histoire de tous les pings et le suivi des résultats.
Suggestions?
Merci un groupe!
La solution
Github
Je aime vraiment Node.js et je voudrais aborder ce problème et nous espérons partager bientôt un code sur GitHub pour y parvenir. Gardez à l'esprit que je n'ai une configuration de base veryy actuellement hébergé https://github.com/alfredwesterveld/freakinping
Quelle est la meilleure façon de ping une liste de 20 sites toutes les 5 minutes (pour par exemple) afin de savoir si le site avec HTTP 202 répond ou non?
PING (ICMP)
D'abord, je voudrais savoir si vous voulez vraiment faire un ping (ICMP) ou si vous voulez juste savoir si le retour du site avec le code 200 (OK) et mesurer le temps qu'il faut. Je crois que le contexte que vous ne voulez pas vraiment faire un ping, mais juste une requête http et mesurer le temps. Je demande cela parce que (je crois) de pinger Node.js / ruby ??/ python ne peut pas être fait par un utilisateur normal car nous avons besoin raw sockets (utilisateur root) pour faire le pinger (ICMP) du langage de programmation. Je trouve par exemple ce script ping en python (je crois aussi que j'ai vu simple scénario ruby ??quelque part, bien que je ne suis pas un programmeur rubis vraiment grand) mais nécessite un accès root. Je ne crois pas qu'il y ait même pas encore un module de ping là-bas pour Node.js.
Message Queue
Aussi, est-il mieux, mais doux euphémisme solution pour cela? Je crains que la liste peut atteindre 20000 sites, puis il n'y a pas assez de temps pour les ping tous dans les 5 minutes que je dois être pinger.
En fait, je décris comment Pingdom, UptimeRobot, et aime le travail.
Ce que vous devez réaliser ce type d'échelle est d'utiliser une file d'attente de message comme par exemple Redis , beanstalkd ou gearmand. A l'échelle de Pingdom un processus de travail ne va pas le couper, mais dans votre cas (je suppose) un travailleur fera. Je pense (en supposant) Redis sera la file d'attente de messages le plus rapide en raison de la C (Node.js) l'extension, mais là encore je dois référence contre beanstalkd, qui est une autre file d'attente d'un message populaire (mais n'a pas encore une extension C).
Je crains que la liste peut atteindre 20000 sites
Si vous obtenez à cette échelle que vous pourriez avoir héberger plusieurs boîtes (un grand nombre de threads de travail / processus) pour gérer la charge mais vous n'êtes pas encore à cette échelle et Node.js est rapide fou. Il pourrait même être en mesure de gérer cette charge même avec une seule boîte, même si je ne suis pas sûr (que vous devez faire / exécuter certains points de référence).
Banque de données / Redis
Je pense que cela pourrait se faire assez facilement dans Node.js (je aime vraiment Node.js). La façon dont je le faire est d'utiliser Redis comme mon datastore, car il est FOU RAPIDEMENT!
PING: 20000 ops 46189.38 ops/sec 1/4/1.082
SET: 20000 ops 41237.11 ops/sec 0/6/1.210
GET: 20000 ops 39682.54 ops/sec 1/7/1.257
INCR: 20000 ops 40080.16 ops/sec 0/8/1.242
LPUSH: 20000 ops 41152.26 ops/sec 0/3/1.212
LRANGE (10 elements): 20000 ops 36563.07 ops/sec 1/8/1.363
LRANGE (100 elements): 20000 ops 21834.06 ops/sec 0/9/2.287
node_redis (avec hredis (Node.js) bibliothèque c). Je voudrais ajouter les URL à l'aide Redis sadd.
Exécuter des tâches toutes les 5 minutes
Cela pourrait se faire sans peine aucun effort. J'utiliser le setInterval(callback, delay, [arg], [...])
pour tester de manière répétée le temps de réponse des serveurs. Obtenez toutes les URL sur callback
de Redis en utilisant smembers . Je mettrais toutes les URL (messages) sur la file d'attente de messages en utilisant rpush .
Réponse Vérification (temps)
Cependant, ce qui se passe quand on ne le fait pas réponses? Qu'advient-il les après cela?
Je pourrais comprendre pas complètement cette phrase, mais ici il va. Si l'on échoue, il échoue juste. Vous pouvez essayer de vérifier la réponse (temps) à nouveau en 5 secondes ou quelque chose pour voir si elle est en ligne. Un algo précisrithme pour ce qui devrait être mis au point. Ceux après cela ne devrait pas avoir rien à voir avec les URL précédentes, sauf si le sont au même serveur. Aussi quelque chose que vous penser clairement, je suppose que vous ne devriez pas ping toutes les URL au même serveur en même temps, mais leur queue ou quelque chose.
URL Traitement
Dans le processus de travail (pour l'instant qu'un seul serait suffisant) un message fetch (URL) de Redis en utilisant la commande brpop . vérifier le temps de réponse pour l'URL (message) et chercher URL suivante (message) dans la liste. Je serais probablement faire quelques demande simultanée pour accélérer le processus.
Autres conseils
Il n'y a pas de « méthode de base », puisque vous devez gérer un grand nombre de cas d'utilisation:
- http réoriente,
- https pages,
- les délais d'attente de demande,
- la charge cpu du serveur que vous utilisez pour pinger,
- le type de rapport dont vous avez besoin (disponibilité? Uptime? Réceptivité? Downtime?)
- comment les mesures globales de QdS par le temps
- Durée de vie des données que vous collectez (pinger des dizaines de cibles toutes les cinq minutes produit rapidement un grand nombre de données)
- en temps réel des alertes
- etc.
Pingdom et autres ne sont pas des outils « de base », et si vous voulez quelque chose de similaire, vous voudrez peut-être payer pour cela ou se fonder sur une alternative open source existante. Je sais pour sûr parce que je construit une application de surveillance à distance moi-même. Il est appelé Uptime, il est écrit dans Node.js et MongoDB, et il est hébergé sur GitHub (https://github.com/fzaninotto/uptime). Il a fallu plusieurs semaines de travail acharné pour développer, alors croyez-moi. Ce n'est pas une évidence
utiliser des outils de surveillance comme Zabbix, Nagios, bla bla qui peut métriques différents paramètres de vos serveurs en nombre de masse.
si u voudrait mettre en œuvre dans js, u peut faire une demande http intervalle ed temps, puis de déterminer le code d'état de retour http et utiliser XPath ou regex pour valider certains éléments est correct
pour le rubis, un démon et d'utiliser un pool de threads (multithreading idée) et URI ouverte pour afficher le code http et le contenu, utiliser XPath pour vérifier si le contenu est correctement se tenir.
Si vous êtes curieux, j'ai créé une application appelée Pinger qui fait cela. Il est construit sur Ruby on Rails et Resque:
Il y a des services gratuits de qualité ce qui nous fournissent un site très stable jusqu'à vérification de l'heure et la notification. Vous pouvez vérifier cette instruction et revue http://fastjoomlahost.com/how-to- moniteur site-up-time
Vous pouvez aussi le faire en utilisant Node.js nœud-ping-moniteur paquet.