Conectando Grafana a los logs de tu aplicación con Elasticsearch y Filebeat

Conectaremos Grafana a los logs de una aplicación mediante Elasticsearch y Filebeat, lo cual nos permitirá generar un dashboard basado en trazas de log de nuestra aplicación (errores, eventos, etc.).


0 - Entorno

  • Hardware: MacBook Pro (13 pulgadas, 2019, cuatro puertos Thunderbolt 3)

En este manual supondremos que tenemos listo un fichero de logs de alguna de nuestras aplicaciones.


1 - Localiza un fichero de log de tu aplicación

Nosotros usaremos un fichero situado en la siguiente ruta:

/Users/Yo/Desktop/elasticsearch/fichero.log

Que contiene unas cuantas trazas de log de una aplicación cualquiera:


Ahora instalaremos todos los servicios que necesitamos.


2 - Levanta Elasticsearch, Kibana y Grafana en Docker

Basándonos en está guía de Elastic que nos proporciona un fichero docker-compose.yml que levanta Elasticsearch y Kibana, haremos unas pequeñas modificaciones para:
  • Usar el siguiente elasticsearch.yml personalizado, necesario para poder conectar luego desde Grafana (http.cors properties):
cluster.name: "docker-cluster"
network.host: 0.0.0.0
http.cors.enabled: true
http.cors.allow-origin: "*"
  • Levantar 2 nodos de elasticsearch en vez de 3, por simplicidad.
El fichero docker-compose customizado queda así:

version: '2.2'
services:
  es01:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.14.0
    container_name: es01
    environment:
      - node.name=es01
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=es02
      - cluster.initial_master_nodes=es01,es02
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - data01:/usr/share/elasticsearch/data
      - /Users/Yo/Desktop/elasticstack/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
    ports:
      - 9200:9200
    networks:
      - elastic

  es02:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.14.0
    container_name: es02
    environment:
      - node.name=es02
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=es01
      - cluster.initial_master_nodes=es01,es02
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - data02:/usr/share/elasticsearch/data
      - /Users/Yo/Desktop/elasticstack/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
    networks:
      - elastic

  kib01:
    image: docker.elastic.co/kibana/kibana:7.14.0
    container_name: kib01
    ports:
      - 5601:5601
    environment:
      ELASTICSEARCH_URL: http://es01:9200
      ELASTICSEARCH_HOSTS: '["http://es01:9200","http://es02:9200"]'
    networks:
      - elastic

volumes:
  data01:
    driver: local
  data02:
    driver: local

networks:
  elastic:
    driver: bridge

Ahora podremos verificar que todo funciona:


Además añadiremos el servicio de Grafana al docker-compose anterior, como otro 'service', de esta manera todos los servicios estarán en la misma red:

  graf01:
    image: grafana/grafana
    container_name: graf01
    ports:
      - 3000:3000
    networks:
      - elastic


3 - Levantar Filebeat

Ahora instalaremos filebeat en nuestro PC, siguiendo el siguiente tutorial:


Por ejemplo en mac lanzaríamos los siguientes comandos:

curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.14.0-darwin-x86_64.tar.gz
tar xzvf filebeat-7.14.0-darwin-x86_64.tar.gz
cd filebeat-7.14.0-darwin-x86_64
vi filebeat.yml

Debemos editar el fichero 'filebeat.yml', para realizar las siguientes acciones:

  • Habilitar el input type 'log' indicando el path donde tenemos los logs.
  • Indicar IP y puerto de nuestro Kibana local.
  • Indicar IP y puerto de nuestro Elasticsearch local.

Tendrá algo similar a lo siguiente:

filebeat.inputs:
- type: log
  # Change to true to enable this input configuration.
  enabled: true
  # Paths that should be crawled and fetched. Glob based paths.
  paths:
    - /Users/Yo/Desktop/elasticsearch/*.log
    #- c:\programdata\elasticsearch\logs\*.log
- type: filestream
  # Change to true to enable this input configuration.
  enabled: false
  # Paths that should be crawled and fetched. Glob based paths.
  paths:
    #- /var/log/*.log
    #- c:\programdata\elasticsearch\logs\*
# ============================== Filebeat modules ==============================
filebeat.config.modules:
  path: ${path.config}/modules.d/*.yml
  reload.enabled: false
# ======================= Elasticsearch template setting =======================
setup.template.settings:
  index.number_of_shards: 1
# =================================== Kibana ===================================
setup.kibana:
  # Kibana Host
  host: "localhost:5601"
# ================================== Outputs ===================================
# ---------------------------- Elasticsearch Output ----------------------------
output.elasticsearch:
  # Array of hosts to connect to.
  hosts: ["localhost:9200"]
# ================================= Processors =================================
processors:
  - add_host_metadata:
      when.not.contains.tags: forwarded
  - add_cloud_metadata: ~
  - add_docker_metadata: ~
  - add_kubernetes_metadata: ~

Luego lanzaremos los siguientes comandos para configurar y arrancar filebeat.

./filebeat setup -e
./filebeat -e

En este momento Filebeat está levantado y enviando a Elasticsearch todo el contenido de los logs.


4 - Comprobar que vemos los logs en Kibana

Ahora deberíamos ver nuestros logs cargados en Kibana.

Veremos que solo existe un Space llamado 'Default' y un índice llamado 'filebeat-*'



5 - Crea un datasource en Grafana

Ahora solo falta crear un Data source de tipo Elasticsearch, podemos seguir esta guía.

Aquí adjuntamos un pantallazo que resume las opciones marcadas para que el Data Source funcione:



Comentarios