Monitoreando NGINX con Nodejs

Hace unos meses en Genwise, empresa en donde trabajo, lanzaron un desafio al equipo, que consistía en crear un pequeño monitor para una aplicación que desarrolla la empresa. Este desafio era personal, a cada programador se le daba como meta desarrollar una aplicación de monitoreo con una serie de especificaciones sobre las tecnologías a utilizar.

A mí me tocó desarrollar con PhoneGap para Android (utilizando librerías Jquery y Jquery Mobile). En ese momento se me ocurrió que quizás sería importante realizar una aplicación de monitoreo en tiempo real. Pero luego de discutirlo con el equipo, llegamos a la conclusión de que utilizar tecnologías como websockets no resultaban necesarias.

Y como desde hace un tiempo, vengo leyendo sobre nodejs, quise crear algo similar al monitor de Genwise pero para nginx (un server web para linux).

Decidí llamar a la aplicación Nginx Monitoring Tool que, por supuesto, es open source.

Básicamente -como ya les comente- su principal tarea será monitorear en tiempo real un server nginx.

¿Qué debemos monitorear?

La idea es monitorear un server web Nginx, y para esto deberemos habilitar la opción de status que se hace de la siguiente manera.

location /nginx_status {
  stub_status  on;
  access_log   off;
  allow SOME.IP.ADD.RESS;
  deny all;
}

Faye para el server

Primero debía crear el server Faye, en donde pueda implementar los distintos canales de monitoreo. Crear un server FAYE en nodejs es muy fácil. Miren estas líneas.

var Faye = require('faye'),
jsdom = require('jsdom'),
server = new Faye.NodeAdapter({mount: '/'});

server.listen(1337, "localhost");

console.log("Server faye corriendo...");

Con eso ya tenemos un server faye corriendo en el puerto 1337, pero esto no es todo. Debemos crear los distintos canales de monitoreo (visitas, lecturas, esperas, etc.) que veremos más adelante. También vamos a obtener los fuentes del status de nginx y realizar un pequeño “parseo”.

setInterval(sendData, 3000);

function sendData(){
        jsdom.env(
                "http://localhost/nginx_status",
                [ 'http://code.jquery.com/jquery-1.5.min.js' ],
                function (errors, window){
                        var $ = window.jQuery;

                        var lines = $('body').text().split("\n");

                        //visits (active connections)
                        var visitsPieces = lines[0].split(" ");
                        var visits = visitsPieces[visitsPieces.length - 2];

                        server.getClient().publish('/act', {
                          text:       visits
                        });
                        //

                        var lastLinePieces = lines[3].split(" ");

                        //Readings
                        var readings = lastLinePieces[1];

                        server.getClient().publish('/rea', {
                          text:       readings
                        });

                        //Writing
                        var writing = lastLinePieces[3];

                        server.getClient().publish('/wri', {
                          text:       writing
                        });

                        //Wainting
                        var waiting = lastLinePieces[5];

                        server.getClient().publish('/wai', {
                          text:       waiting
                        });

                }
        );
}

El cliente

Los datos obtenidos del server lo representaremos en forma de gráficos estadísticos, usando una librería javascript muy utilizada llamada jqplot.

También necesitaremos la librería browser de Faye para poder inscribirnos a los distintos canales de monitoreo. Ver codigo completo del archivo client.js

Conclusión:

Si bien existen muchas cosas por solucionar y mejorar en Nginx Monitoring Tool. Podemos decir que se encuentra en una fase pre-alpha ;). Nunca pensé que diría esto, pero JS me está gustando mucho. Y todo gracias a nodejs :P

Una Respuesta para “Monitoreando NGINX con Nodejs”

  1. José Romaniello

    muy bueno! A mi también me esta gustando mucho node.js

    Responder

Deja una Respuesta