Contenido

Monitorización con ElasticSearch, Kibana y TopBeat

Los que me conocéis sabéis que soy un obseso del control… de mis sistemas. Cuando ocurre algo, me gusta saber por qué ha ocurrido así.

Por esta razón trato de mejorar los sistemas de monitorización. Me interesa tanto encontrar cosas que sean útiles como rápidas de montar. Y también eficientes.

Eso me llevó a comenzar a desarrollar mi propio sistema de monitorización y alertado. Pero he conocido ElasticSearch, Kibana y TopBeat

ELK: ElasticSearch, Logstash y Kibana

Lo que voy a contar

En los 10 breves minutos que se tarda en leer este post vamos a tener montado todo un sistema de monitorización, tanto local como remoto, totalmente escalable y de alta disponibilidad. Los únicos requisitos son tener un servidor con Java y Git, y monitorización completa de la máquina. No tendremos monitorización de logs, cosa que podríamos añadir fácilmente con FileBeat.

Y sin más, comenzamos.

¿Tienes prisa?

Si tenéis prisa y no queréis leer todo el artículo, aquí podéis ver cómo monto todo el sistema, sin editar los archivos de configuración y en modo localhost, en tan solo 4 minutos, pifias incluídas:

Aquí tenéis el script del vídeo, aunque no aseguro que siga funcionando:

1
2
3
4
5
6
7
#!/bin/bash

wget https://download.elasticsearch.org/elasticsearch/release/org/elasticsearch/distribution/zip/elasticsearch/2.1.1/elasticsearch-2.1.1.zip
wget https://download.elastic.co/beats/topbeat/topbeat-1.0.1-x86_64.tar.gz
wget https://download.elastic.co/kibana/kibana/kibana-4.3.1-linux-x64.tar.gz

git clone https://github.com/elastic/beats-dashboards.git

ElasticSearch

ElasticSearch es una base de datos distribuida, escalable y de alta disponibilidad, que permite búsquedas en tiempo real.

Será el cerebro de nuestra estructura, y por ello irá en el servidor.

Para desplegarla, basta con descargarnos el zip, editar la configuración y lanzar.

La configuración básica que necesitaremos será la siguiente (archivo config/elasticsearch.yml):

1
network.host: 123.123.123.123

Sí, es la IP externa del servidor. Por defecto sólo escucharía en localhost y no podríamos conectar TopBeat externos. Si queremos montra varios en cluster, además tendríamos que modificar:

1
discovery.zen.ping.unicast.hosts: ["host1", "host2"]

Evidentemente, con la lista de hosts que forman el cluster.

Echad un ojo al resto de la configuración si queréis añadir seguridad o algo.

A continuación lo lanzamos:

1
$ bin/elasticsearch

Y se quedará ejecutando en esa ventana. Elegirá un nombre aleatorio de algún villano de Marvel y escuchará en el puerto 9200.

TopBeat

La idea es empezar a obtener métricas lo antes posible, así que vamos con los agentes: TopBeat.

Si ElasticSearch es el cerebro, TopBeat son los nervios. TopBeat es un programa que consume muy pocos recursos, pensado para alterar lo mínimo posible la máquina en la que se ejecuta.

El procedimiento de instalación es similar: descargar el zip, configurar y lanzar. En este caso, instalaremos en la máquina remota que queremos monitorizar.

La configuración es un archivo yaml que se suele encontrar en /etc/topbeat/topbeat.yml, aunque podemos cambiar la ubicación, como haremos. Dejad la configuración como está y cambiad sólo lo siguiente:

1
2
3
output:
    elasticsearch:
        hosts: ["whatever:9200"]

Evidentemente, la variable output.elasticsearch.hosts contiene la lista de nodos que forman el cluster. Si estáis usando sólo uno, pues ponded ése (si usasteis la IP externa, debeis usar la misma; si elegisteis localhost, pues localhost).

Y lanzar:

1
2
$ ./topbeat -c topbeat.yml # usando el archivo de configuración local
$ ./topbeat   # usando el archivo de configuración por defecto

Y nuestro sistema de monitorización está terminado. Repetid la instalación de TopBeat en todos los nodos que queráis.

¿Qué estamos monitorizando?

TopBeat es muy configurable, pero por defecto monitoriza:

  • CPU
  • RAM
  • Espacio en disco
  • CPU y RAM de todos los procesos en ejecución (aunque puede cambiarse por configuración).

Kibana

Lo único que nos queda es visualizar los resultados.

Podríamos decir que Kibana es la piel de nuestro sistema.

El procedimiento es el mismo: descargar, configurar y lanzar.

La configuración mínima vuelve a ser indicar el host en el que está ElasticSearch, y se encuentra en el directorio relativo config/kibana.yml:

1
2
3
server.host: "0.0.0.0"
elasticsearch.url: "https://123.123.123.123:9200"
kibana.index: ".kibana"

En este caso sólo se atacará una instancia de ElasticSearch, y tendremos que indicar también dónde escucha el propio Kibana. Además hay que indicar un nombre para sus índices.

A continuación lanzamos:

1
$ ./bin/kibana

Y ya tendremos Kibana disponible en el puerto 5601. Cuando entréis hará un auto-check para comprobar que está todo bien y os preguntará un índice por defecto. Cualquiera está bien, pero yo pondría topbeat-* o simplemente *. Si hacéis esto, al crear el índice veréis que tiene un montón de datos.

Sin embargo, crear los paneles para TopBeat puede ser insufrible, así que vamos a hacerlo de forma automática:

Creando los Dashboards

Hay un proyecto que guarda los dashboards a mostrar: Beats Dashboard.

No tiene pérdida: descargar y ejecutar:

1
2
3
$ git clone https://github.com/elastic/beats-dashboards.git
$ cd beats-dashboards
$ ./load.sh -l https://123.123.123.123:9200

Si no indicáis URL, usará localhost. Ojo, porque es la URL de un nodo del cluster de ElasticSearch.

Ahora podéis pulsar la pestaña Dashboard de la web de Kibana y a la derecha, arriba, tendréis un pequeño panel de control. Seleccionad Load Saved Dashboard y a continuación cualquiera de ellos.

Todos tienen un primer panel de navegación desde el que podéis saltar a otros. Y seguramente todos estén vacíos, salvo el de TopBeat, que mostrará todos los datos.

ElasticSearch vs Sensu

Sensu es mucho más sencillo de lanzar, pero también mucho más limitado. Además, los agentes son mucho más pesados, ya que por defecto tienen que tener 3 hilos: uno para indicar que están vivos, otro para gestionar los checks standalone y finalmente, otro para las subscripciones.

El agente Sensu por defecto en Windows ocupa 300 Mb de disco (necesita todo Ruby) y recursos ilimitados, ya que lanza un proceso por cada check, llegando a consumir hasta el 10% de CPU. Usando el agente Sensu en c# he reducido el footprint a 20 Mb y menos de un 1% de CPU. TopBeat utiliza 8 Mb y apenas se nota el consumo de CPU.

También hay que decir que utilizar Sensu con Graphite es trivial, y montar un Grafana por encima también. Pero claro… es que se puede usar Grafana con ElasticSearch también… :)

Alertas

La ventaja de Sensu es que permite alertado. El motor de Sensu de alertado es realmente potente. Sin embargo, requiere bastantes recursos y, desgraciadamente, en momentos de pico podría fallar.

ElasticSearch tiene a Watcher, el cual, desgraciadamente, no es libre ni gratis. También hay que pensar que la gente de ElasticSearch tiene que comer.

Pero la gente de Yelp se ha currado ElastAlert que es un sistema de alertas libre y gratuíto. Aún no me ha dado tiempo a probarlo, y quizá se merezca otro artículo.

En fin… Para gustos colores :)