Vector: herramienta de monitorización en tiempo real de Netflix
Hace unos días Netflix liberaba la herramienta que utilizan internamente para analizar el rendimiento de sus instancias: Vector. Esta herramienta no deja de ser una aplicación web que se conecta a la API de PCP para obtener las métricas. PCP es un demonio que se instala en cada una de las instancias o servidores que se quiere monitorizar.
Para hacerlo funcionar se pueden seguir varios manuales:
- Introducing Vector: Netflix’s On-Host Performance Monitoring Tool
- Taking Netflix’s Vector (Performance Monitoring Tool) For A Spin
En este último explica como compilar PCP para generar paquetes .rpm o .deb según la distribución GNU/Linux donde lo querramos instalar. Para crear el procedimiento se basa en el fichero Vagrantfile del Github de PCP. Entonces para crear nuestros paquetes y poder redistribuirlos en varias máquinas seguiremos los siguientes pasos:
RPM
Clonaremos el repositorio de PCP:
$ git clone git://git.pcp.io/pcp
Instalaremos las dependencias y compilamos con el script Makepkgs. Hay que tener en cuenta que existen dependencias obligatorias y otras opcionales. Se pueden comprobar lanzando el script ./qa/admin/check-vm. Si falla alguna de las opcionales, como la libmicrohttpd-devel, es posible que algunas funcionalidades o paquetes no se creen.
$ cd pcp
$ yum -y groupinstall 'Development Tools'
$ yum -y install git ncurses-devel readline-devel man libmicrohttpd-devel qt4-devel\
python26 python26-devel perl-JSON sysstat perl-TimeDate \
perl-XML-TokeParser perl-ExtUtils-MakeMaker perl-Time-HiRes \
systemd-devel bc cairo-devel cyrus-sasl-devel \
systemd-devel libibumad-devel libibmad-devel papi-devel libpfm-devel \
rpm-devel perl-Spreadsheet-WriteExcel perl-Text-CSV_XS bind-utils httpd \
python-devel nspr-devel nss-devel python-ctypes nss-tools \
perl-Spreadsheet-XLSX ed cpan valgrind time xdpyinfo rrdtool-perl
$ ./Makepkgs
Una vez compilado podemos instalar los paquetes que se acaban de crear:
$ rpm -ivh pcp-*/build/rpm/*.rpm
Los servicios ya se pueden habilitar y arrancar y verificaremos que el servicio pmwebd está escuchando en el puerto 44323:
$ systemctl enable pmcd
$ systemctl enable pmwebd
$ systemctl start pmcd
$ systemctl start pmwebd
$ netstat -anp | grep ':44323'
tcp 0 0 0.0.0.0:44323 0.0.0.0:* LISTEN 8970/pmwebd
tcp 0 0 :::44323 :::* LISTEN 8970/pmwebd
DEB
Para generar los .deb empezaremos también clonando el repositorio, instalando las dependencias y compilando. El script Makepkgs detecta que se trata de una distribución basada en Debian y generará los paquetes .deb:
# apt-get update
# apt-get install -y '^(libreadline|libpapi|libpfm4|libcoin80|libicu)-dev$' \
bc bison curl flex git g++ dpkg-dev pkg-config debhelper chrpath \
python-all python-all-dev libnspr4-dev libnss3-dev libsasl2-dev libmicrohttpd-dev libavahi-common-dev \
libqt4-dev autotools-dev autoconf gawk libxml-tokeparser-perl libspreadsheet-read-perl gdb sysv-rc-conf \
libcairo2-dev sysstat valgrind apache2 realpath unbound \
libibumad-dev libsoqt-dev libsoqt-dev-common libnss3-tools libibmad-dev x11-utils
#./Makepkgs
Una vez generados los paquetes se podrán instalar, arrancar los servicios y comprobar que el demonio pmwebd esta escuchando en el puerto 44323:
# dpkg -i build/deb/*.deb
# service pcp start
# service pmwebd start
Instalación de Vector:
El último paso será la instalación del propio Vector. Deberemos tener instalados con antelación NodeJS ya que los instaladores se basan en el. Una vez instalado, instalaremos las herramientas bower y gulp (en Red Hat):
$ yum install nodejs npm
$ npm install -g bower
$ npm install -g gulp
A continuación clonaremos el repositorio de Vector en github e instalaremos las dependencias con bower. Accederemos al directorio app y arrancaremos un servidor HTTP con Python escuchando en el puerto 8080:
$ git clone https://github.com/Netflix/vector.git
$ cd vector/
$ bower install
$ cd app/
$ python -m SimpleHTTPServer 8080
Con un navegador apuntaríamos a http://localhost:8080 y ya aparecerá la interfaz de Vector. En el campo de host podemos poner el nombre o la IP de la máquina que queremos monitorizar. Así es como se muestran las gráficas al iniciar un Benchmark:

