La suite ELK para monitorización de salud y rendimiento de nuestras aplicaciones

ago. 15, 2024

La monitorización es otra de las piezas fundamentales en el desarrollo de software, nos ayuda a garantizar la estabilidad y el rendimiento de los sistemas. La capacidad de detectar problemas antes de que afecten a los usuarios finales, analizar el comportamiento y optimizar el rendimiento es vital para cualquier organización que quiera conocer el estado de su negocio.

Con la ingente cantidad de métricas y logs que generan o se pueden generar en las aplicaciones modernas, podemos obtener una visión detallada del funcionamiento interno tanto de las aplicaciones como de la infraestructura. Éstos no sólo contienen información sobre errores y fallos, sino que también proporcionan datos valiosos sobre el uso de recursos, la actividad del usuario, el rendimiento de las consultas a bases de datos y tiempos de respuesta, entre otros aspectos críticos.

La capacidad de recolectar, centralizar y analizar estos datos en tiempo real permite a las organizaciones no solo reaccionar rápidamente ante problemas emergentes, sino también predecir tendencias, identificar cuellos de botella y optimizar continuamente el rendimiento de sus aplicaciones. Esta analítica avanzada transforma los logs de un mero registro histórico a una herramienta proactiva de gestión y mejora continua.

Además, en un entorno donde la infraestructura se distribuye en múltiples contextos (nubes públicas, privadas, híbridas, o incluso on-premise), es fundamental contar con una solución de monitorización que pueda unificar y relacionar datos provenientes de diversas fuentes. De esta manera, se obtiene una visión holística del estado del sistema, lo que es crucial para el mantenimiento de altos niveles de disponibilidad y rendimiento.

¿Qué es ELK?

El stack ELK es un conjunto de herramientas de código abierto que se ha convertido en una fiable alternativa para la gestión, análisis y visualización de logs y métricas en tiempo real. Se trata de un acrónimo que agrupa tres componentes fundamentales: Elasticsearch, Logstash y Kibana, cada uno de los cuales cumple un papel crucial en el proceso de monitorización y análisis de datos.

  • Elasticsearch: Es el núcleo del stack ELK. Se trata de un motor de búsqueda y análisis basado en Lucene, permite almacenar, buscar y analizar grandes volúmenes de datos de manera rápida y eficiente. Es capaz de indexar datos estructurados y no estructurados, lo que lo convierte en una herramienta muy versátil para diversas aplicaciones, desde la búsqueda de texto hasta el análisis de logs. Gracias a su arquitectura distribuida, Elasticsearch puede escalar horizontalmente, permitiendo a las organizaciones gestionar enormes cantidades de datos sin sacrificar rendimiento.

  • Logstash: Es la herramienta de procesamiento y recolección de datos dentro del stack ELK. Puede ingerir datos de múltiples fuentes, transformarlos y enviarlos a destinos como Elasticsearch. Su flexibilidad en el procesamiento de datos lo hace ideal para limpiar, filtrar y enriquecer los logs antes de almacenarlos. Logstash soporta una amplia gama de entradas, salidas y filtros, lo que permite a los usuarios adaptar su flujo de datos a sus necesidades específicas.

  • Kibana: Es la interfaz de usuario del stack ELK, proporcionando capacidades de visualización y exploración de los datos almacenados en Elasticsearch. Con Kibana, los usuarios pueden crear dashboards interactivos, realizar búsquedas avanzadas y explorar datos en tiempo real. Esto facilita la identificación de patrones, tendencias y anomalías en los logs, además de sus métricas, permitiendo a los equipos de operaciones y desarrollo tomar decisiones informadas de manera rápida y fiable.

En conjunto, ELK ofrece una solución robusta para la monitorización de sistemas, permitiendo a las organizaciones no solo almacenar y buscar grandes volúmenes de datos, sino también analizarlos y visualizarlos de manera efectiva. Esta capacidad integral es lo que ha llevado a ELK a ser una opción preferida para la monitorización de aplicaciones y la gestión de logs en entornos empresariales de todo el mundo.

Hay que tener en cuenta que, aunque ELK es una solución potente y versátil, su elevado consumo de recursos hace que sea necesario un despliegue cuidadoso y una configuración adecuada para garantizar un rendimiento óptimo en el servidor sin afectar a otros servicios, si es que los comparte.

¿Cómo funciona?

Todo comienza con Logstash, el responsable de recibir datos desde múltiples fuentes, como logs de aplicaciones, métricas del sistema, datos de redes, entre otros. Logstash actúa como un puente entre el origen de los datos y su destino final, capturando toda la información relevante y asegurando que ninguna pieza se pierda en el camino. Pero no se trata solo de capturar datos; Logstash también los procesa, aplicando una serie de filtros y transformaciones para limpiarlos, normalizarlos y enriquecerlos. Esto permite que los datos sean más consistentes y útiles para el análisis posterior.

Una vez que los datos han sido recolectados y procesados, son enviados a Elasticsearch. Aquí es donde ocurre el almacenamiento y la indexación. Elasticsearch toma estos datos, los organiza y los indexa de manera que puedan ser buscados y analizados de forma rápida y eficiente. Este almacenamiento estructurado es esencial para que la gran cantidad de información que maneja un sistema moderno sea accesible y útil, permitiendo realizar búsquedas complejas y obtener resultados en tiempo real.

El siguiente paso en el flujo de trabajo de ELK es la visualización de datos, que se lleva a cabo a través de Kibana. Kibana se conecta a Elasticsearch y permite al usuario explorar los datos almacenados mediante una interfaz gráfica intuitiva. Con Kibana, es posible crear dashboards interactivos, mapas, realizar búsquedas avanzadas y visualizar tendencias y patrones de manera clara y comprensible. Esta capacidad de interpretación es clave para transformar los datos en información útil, que facilite la toma de decisiones.

Además de estas funcionalidades básicas, el stack ELK ofrece características avanzadas como la configuración de alertas y notificaciones en tiempo real. Elasticsearch y Kibana pueden ser configurados para monitorear los datos continuamente y enviar alertas cuando se detecten condiciones anómalas o umbrales críticos. Esto permite a los equipos de operaciones y desarrollo reaccionar de manera proactiva ante problemas emergentes, minimizando el impacto en los usuarios finales.

Por último y gracias a la capacidad de Elasticsearch para manejar grandes volúmenes de datos, es posible utilizar herramientas de machine learning y otras técnicas avanzadas para identificar tendencias, patrones y anomalías que no serían evidentes a simple vista. Este nivel de análisis permite a las organizaciones no sólo resolver problemas actuales, sino también anticiparse a futuros cambios y, sobre todo, conocer bien el estado de nuestra infraestructura.

Caso práctico

Instalar y configurar el stack ELK puede ser una tarea compleja, ya que cada uno de sus componentes requiere de configuraciones detalladas y precisas para funcionar correctamente en conjunto. Sin embargo, gracias al uso de contenedores Docker, podemos simplificar tanto el proceso de instalación como el de despliegue. Para quienes deseen evitar la complejidad de configurar manualmente cada componente, existe un repositorio en GitHub que facilita enormemente este proceso y será el que utilicemos.

El repositorio docker-elk creado por deviantony proporciona una configuración predefinida y optimizada para levantar un entorno ELK completo utilizando Docker Compose. Este repositorio incluye todos los archivos necesarios para configurar y ejecutar los contenedores Docker de Elasticsearch, Logstash y Kibana, además de proporcionar configuraciones adicionales para agregar persistencia de datos, seguridad y otros ajustes importantes.

Lo primero será clonar el repositorio en nuestra máquina local y acceder al directorio docker-elk:

  
  git clone https://github.com/deviantony/docker-elk.git
  cd docker-elk
   

Una vez dentro del nuevo directorio docker-elk, podemos ejecutar el comando docker-compose up setup para inicializar y configurar los contenedores, cuando haya terminado tendremos que levantarlos de nuevo con un up -d:

  
  docker-compose up setup
  docker-compose up -d
   

Tras esperar unos segundos para que todo el entorno se inicie correctamente, podremos acceder a Kibana en nuestro navegador web a través de la dirección http://localhost:5601. Al entrar por primera vez, Kibana nos pedirá un usuario y contraseña, que, aunque no son aptos para producción, son suficientes para realizar pruebas, estos son elastic y changeme respectivamente.

Una vez dentro de Kibana, podremos comenzar a explorar los datos y crear visualizaciones personalizadas. La explicación de su uso y todas sus funcionalidades escapa del alcance de este artículo, en su documentación oficial tienes todo lo necesario. Ahora veremos un uso básico del stack ELK para monitorizar logs a partir de un script de ejemplo.

Para enviar logs a nuestro entorno ELK utilizaremos un script en Python que genere logs de manera aleatoria y los envíe a Logstash a través del protocolo TCP. Esto simularía el envío de registros desde una aplicación o dispositivo real a nuestro sistema de monitorización. El script que utilizaremos para registrar logs aleatorios es el siguiente:


    import time
    import random
    import json
    from datetime import datetime
    from socket import socket, AF_INET, SOCK_STREAM
    
    # Configuración del cliente para enviar logs a Logstash a través de Beats
    logstash_host = 'localhost'
    logstash_port = 5044
    
    # Función para enviar logs a Logstash
    def send_log(log_data):
        log_message = json.dumps(log_data)
        sock = socket(AF_INET, SOCK_STREAM)
        sock.connect((logstash_host, logstash_port))
        sock.sendall(log_message.encode('utf-8'))
        sock.close()
    
    # Función para generar un log aleatorio
    def generate_dummy_log():
        log_levels = ["INFO", "WARNING", "ERROR", "DEBUG"]
        messages = [
            "User logged in",
            "User logged out",
            "Error accessing database",
            "Page not found",
            "New order created",
            "Order failed",
        ]
        user_ids = range(1, 101)  # Simulación de 100 usuarios
    
        log = {
            "timestamp": datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%S.%fZ'),
            "level": random.choice(log_levels),
            "message": random.choice(messages),
            "user_id": random.choice(user_ids)
        }
        return log
    
    # Generar y enviar logs continuamente
    try:
        while True:
            log_data = generate_dummy_log()
            send_log(log_data)
            print(f"Sent log: {log_data}")
            time.sleep(random.uniform(0.5, 2.0))  # Enviar un log cada 0.5 a 2 segundos
    except KeyboardInterrupt:
        print("Log generation stopped.")
    

Con este script lo que haremos será generar logs aleatorios y enviarlos a Logstash a través del puerto 5044. Para ejecutarlo sólo necesitaríamos tener instalado Python en nuestra máquina y ejecutarlo con el siguiente comando:

  
  python log_generator.py
   

Una vez que el script esté en funcionamiento, podremos ver los logs generados en Kibana accediendo a la sección de Discover dentro de Analytics, desde allí podremos buscar, filtrar y visualizar los logs en tiempo real. A partir de aquí, podremos crear dashboards personalizados, configurar alertas y realizar análisis avanzados de los datos generados.

Pero eso es tema para otro artículo, por ahora hemos visto cómo instalar y configurar un entorno ELK básico y enviar logs a través de Logstash, una base sólida para comenzar a explorar las capacidades de esta avanzada suite de monitorización.

Espero que este artículo haya sido de utilidad y que tu cajón de conocimientos esté ahora un poco más lleno. Recuerda que se trata de una configuración para pruebas y no apta para producción, por lo que si deseas desplegar ELK en un entorno de producción, te recomiendo seguir las mejores prácticas de seguridad y rendimiento, en su documentación oficial encontrarás toda la información necesaria para ello.

¿Te ha servido esta información?

Tu apoyo nos permite seguir compartiendo conocimiento de calidad. Si alguno de nuestros artículos te han aportado valor, considera hacer una donación para mantener este espacio en marcha y actualizado. ¡Gracias por tu contribución! 😊

Artículos relacionados

Quizá te puedan interesar