Mesurer
Le monde n'est que data. Les ordinateurs se nourrissent de datas, et en plus ils en produisent, garantissant ainsi leur propre utilité. Quantité de mémoire, utilisation du processeur, volume téléchargé, place disponible, température d'un des composants... tout est mesurable et potentiellement intéressant. Avec des mesures, on peut faire de jolis graphiques, retrouver ce qu'il s'est passé, comprendre ce qu'il se passe, extrapoler ce qui se passera, valider des choix.
SNMP
SNMP est un protocole des plus classiques pour exposer des données d'usages d'une machine au reste du monde. Les routeurs fournissent ce genre d'informations, mais aussi les serveurs, grâce à l'indéboulonnable Net-SNMP . Ce protocole, conçu comme peu intrusif est prévu pour fonctionner au sein d'un réseau privé. Il n'est absolument pas conçu pour être exposé à la face du monde, comme le fait si bien HTTP. La mode est actuellement à l'open data. La mise à disposition de données brutes pour que des personnes puissent les agglomérer, les recouper pour finalement les faire parler.
Exposer
Net-SNMP propose de calculer des valeurs, à la demande, via un simple script. Combien de personnes sont actuellement connectées via Wifi, par exemple. Mais ceci est juste théorique, le calcul est effectué à chaque demande, et de toutes façons, Net-SNMP crash assez vite, sans trop donner d'explications quand on l'utilise avec des scripts. Le protocole SNMP n'est pas prévu pour être exposé à tous les vents ni même filtré. Pour ça, le plus sage est d'utiliser de l'HTTP, en lecture seule, pour afficher des données consolidées. Pas de surprises, pas de calcul, il suffit d'afficher un ensemble de clefs/valeurs disponibles en mémoire. Les valeurs peuvent être créées par un simple script shell en envoyant la paire clef/valeur sur une socket TCP. Un bête netcat pour écrire (en privé), un simple serveur HTTP pour lire (en public).
Mesures
Voici donc le cahier des charges de Mesures . L'implémentation est en nodejs , langage roi pour le prototypage de code asynchrone. Le projet est simple, nécessite un serveur de socket, un serveur HTTP et même de pouvoir laisser ouvert une connexion. Le service tournera sur une petite machine qu'il ne faut pas perturber, et surtout devra se faire oublier.
Les capacités asynchrones de nodejs permettent une petite fantaisie. Plutôt que de se contenter d'un bête polling en demandant toutes les minutes quelles sont les valeurs, il est plus efficace de laisser ouverte la connexion et d'envoyer les nouveautés au fur et à mesure. Le terme commercial est "lance à incendie" (firehose), on laisse le robinet ouvert et l'on voit ce qui arrive. Le W3C a normalisé ça sous le nom de Server Sent Event , et les navigateurs webs modernes le gèrent directement. On peut voir cet outil comme un websocket plus simple parce qu'unidirectionnelle. Pour ne gêner personne, il y a toujours la possibilité de poller régulièrement pour avoir des données, mais gérer du server sent event depuis un script n'est pas compliqué.
L'application est simplissime et se contente d'être une passerelle. D'un coté, on publie des valeurs, de l'autre, on les expose. Un système basique de plugin permet de choisir les fonctionnalités que l'on active et d'en rajouter de nouvelles. Mesure propose un système simpliste d'affichage, qui affiche les valeurs au fur et à mesure de leurs arrivées, ainsi que des petits graphiques.
L'application peut s'installer via npm et les sources sont disponibles sur github , sous licence GPL v3. Une démo est disponible : les mesures de bearstech .