Instalación y Configuración de FluentD con Elasticsearch + Kibana

FluentD se divide en tres bloques: filtro y envío de datos a un buffer, transforma o simplemente recoge los datos para una cadencia continua y los enruta o envía a otro destino.

En nuestro caso, instalaremos y configuraremos FluentD para enviar los datos a un servicio de Elasticsearch que almacenará los eventos que ocurran. Luego mostraremos la información de manera legible con Kibana. ¿Qué información puede recoger? No hay límites, ya que está preparado un gran volúmen de datos pero, en caso de tener múltiples orígenes de datos, siempre es mejor utilizar FluentD Aggregator entre FluentD Agent y Elasticsearch. A continuación podemos ver un antes de FluentD:

Before FluentD

Instalación y Configuración de FluentD

Usaremos FluentD como método de comunicación para el envío de datos a Elasticsearch (o MongoDB), por ejemplo, que almacenará y nos va a permitir utilizar el servicio como Base de Datos en memoria y así: indexar Datos y poder buscar entre ellos según nuestras necesidades. En el siguiente Diagrama podemos ver una muestra esquemática de lo que vamos a montar, cambiando Logs por Datos operacionales de Aplicaciones:

Puesta en marcha de Elasticsearch

Como comentabamos anteriormente, la opción ideal, es tener FluentD Aggregator para tener una High Availability Configuration, pero como comentabamos anteriormente, instalaremos directamente en origen el FluentD Agent (td-agent).

Ahora si, el primer paso Real será poner en marcha nuestro Elasticsearch, para ello usaremos una imagen Docker simple, recordando que Elasticsearch publica por los puertos 9200 y 9300.

docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 elasticsearch

Podremos validar su correcto funcionamiento, haciendo una llamada HTTP a la IP del docker por el puerto 9200 (http://IP-DOCKER-ELASTICSEARCH:9200/) vía navegador. Deberíamos tener como resultado, por ejemplo:

{
  "name" : "VqVV-u4",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "Afi2ayycR-68oWd-XEUcxg",
  "version" : {
    "number" : "5.5.2",
    "build_hash" : "b2f0c09",
    "build_date" : "2017-08-14T12:33:14.154Z",
    "build_snapshot" : false,
    "lucene_version" : "6.6.0"
  },
  "tagline" : "You Know, for Search"
}

NOTA: Si hemos optado por la High Availability Configuration, en el mismo contenedor Docker donde se ha instalado Elasticsearch deberemos instalar el FluentD Aggregator.

Instalación + Configuración de FluentD Agent en Nodo

Nosotros lo estamos instalando en un Ubuntu 16.04.3 LTS (Xenial Xerus), para ello deberemos ejecutar:

curl -L https://toolbelt.treasuredata.com/sh/install-ubuntu-xenial-td-agent2.sh | sh

NOTA: Si tenemos otra distribución basada en Debian/Ubuntu, podemos localizar los diferentes instaladores en: https://docs.fluentd.org/v0.12/articles/install-by-deb

Seguidamente deberemos instalar el Plugin para Elasticsearch:

sudo /usr/sbin/td-agent-gem install fluent-plugin-elasticsearch --no-document

Una vez esté todo instalado, hay que modificar el fichero de configuración de FluentD Agent: /etc/td-agent/td-agent.conf Por ejemplo, en nuestro caso hemos realizado dicha configuración:

<source>
  @type tail
  path /var/log/httpd-access.log #...or where you placed your Apache access log
  pos_file /var/log/td-agent/httpd-access.log.pos # This is where you record file position
  tag apache.access #fluentd tag!
  format apache2 # Do you have a custom format? You can write your own regex.
</source>

<match **>
  @type elasticsearch
  logstash_format true
  host <hostname> #(optional; default="localhost")
  port <port> #(optional; default=9200)
  index_name <index name> #(optional; default=fluentd)
  type_name <type name> #(optional; default=fluentd)
</match>

Haremos un restart de FluentD Agent para que coja la nueva configuración: sudo /etc/init.d/td-agent start

Visualización en Kibana

Usaremos kibana como visualizador, Kibana conectará con el Index que hemos creado en Elasticsearch, repositorio de todos los eventos que se le mandan. Para lanzar el contenedor de Kibana podemos realizar:

docker run -d --name kibana -e ELASTICSEARCH_URL=http://IP-DOCKER-ELASTICSEARCH:9200 -p 5601:5601 -d kibana

De todos los parámetros que hemos pasado en el docker run, el más interesante y distinto es:

  • -e ELASTICSEARCH_URL=http://IP-DOCKER-ELASTICSEARCH:9200, aquí estaremos haciendo un enlace con nuestro Elasticsearch, configurando su URL y puerto de comunicación.

Ya accediendo vía navegador (http://IP_HOST_KIBANA:5601), podremos ver en Kibana todos los eventos que se estén almacenando en Elasticsearch.