Estoy dejando ELK por Loki + Grafana

Estoy dejando ELK por Loki + Grafana

Me imagino que llegas aquí buscando algo de luz sobre el log aggregation o la administración de logs para aplicaciones de software, específicamente aplicaciones web, entonces en este artículo explicaré mi experiencia con Elasticsearch y porque decidí abandonarlo y moverme hacia Loki.

Debo dejar muy claro que el motivo principal que me llevó a realizar este cambio, fue la necesidad de optimizar recursos y eficiencia en la gestión de logs (aparte de un tema económico).

La versatilidad de Elasticsearch

Elasticsearch, sin duda, merece su reputación como una solución versátil y robusta en el ámbito de la administración de registros y el análisis de datos. Esta reputación se fundamenta en su capacidad para ofrecer un ecosistema integral que abarca desde el almacenamiento inicial hasta la búsqueda y el análisis avanzado de datos en tiempo real.

Motor de Búsqueda Textual Completa: La capacidad de Elasticsearch para realizar búsquedas de texto completo es una de las características más destacadas. Esta habilidad le permite buscar y analizar documentos basados en palabras clave, frases, sinónimos e incluso gramática. En escenarios donde la precisión en la búsqueda es esencial, como en motores de búsqueda y análisis de contenido, Elasticsearch brilla al proporcionar resultados relevantes y exactos.

Potente Análisis y Agregación de Datos: No solo es una herramienta de búsqueda; Elasticsearch ofrece capacidades de análisis y agregación de datos sumamente poderosas. Puede realizar análisis estadísticos y cálculos resumidos, así como generar visualizaciones que ayudan a identificar patrones y tendencias en los datos. Esto es valioso para la toma de decisiones informadas y la obtención de conocimientos profundos.

Escalabilidad y Flexibilidad: La arquitectura distribuida de Elasticsearch le brinda la capacidad de escalar horizontalmente para adaptarse al crecimiento de los volúmenes de datos y la demanda de procesamiento. Esto es esencial para proyectos que requieren una solución que pueda crecer con la carga de trabajo sin sacrificar el rendimiento.

Pero todo eso requiere cierto grado de procesamiento y eso es algo que yo no estaba dispuesto a ceder y ahí es donde entra Loki, porque seamos sinceros, Elasticsearch consume recursos que da gusto!.

Loki es más eficiente

Una creación de Grafana Labs que está ganando impulso en el campo de la gestión de logs. Loki adopta un enfoque diferente y eficiente para la agregación y consulta de logs. En lugar de indexar logs como Elasticsearch, Loki almacena registros en segmentos de series de tiempo, utilizando etiquetas para identificar y agrupar datos. Esta aproximación minimiza el uso de recursos mientras mantiene la capacidad de búsqueda y análisis, lo he configurado de tal forma que los logs se almacenan en buckets de S3 por lo que el almacenamiento es mucho más efectivo y menos costoso, eso agregado a algunas políticas de retención de datos, ayuda a mantener un presupuesto relativamente bajo.

De Elasticsearch a Loki

Del proyecto que hablo, es una api escríta en nodejs, utilizando winston como librería de manejo de logs. En un primer momento, me incliné por utilizar el transportador de logs de Elasticsearch para gestionar mis registros. A medida que la API ganó tracción, los registros se multiplicaron, y con ello, los recursos necesarios para mantener Elasticsearch fueron creciendo también.

La transición de Elasticsearch a Loki fue un proceso marcado por su simplicidad y eficacia. Migrar de un transportador de logs a otro apenas requirió modificaciones mínimas en el código existente. Por ejemplo, mientras que antes utilizaba el módulo winston-elasticsearch, el cambio a Loki se logró mediante el módulo winston-loki, manteniendo la misma estructura de llamadas y opciones de configuración.

Antes, mi implementación empleaba winston-elasticsearch para enviar los registros a Elasticsearch, algo así como:

const winston = require('winston');
const ElasticsearchTransport = require('winston-elasticsearch');

const logger = winston.createLogger({
  transports: [
    new ElasticsearchTransport({
      level: 'info',
      clientOpts: { node: 'http://elasticsearch-server-url:9200' },
      index: 'api-logs',
    }),
  ],
});

logger.info('Registro de ejemplo en Elasticsearch');

Y luego del cambio hacia winston-loki, se ve de esta manera:

const winston = require('winston');
const LokiTransport = require('winston-loki');

const logger = winston.createLogger({
  transports: [
    new LokiTransport({
      host: 'loki-server-url',
      labels: { app: 'api-logs' },
    }),
  ],
});

logger.info('Registro de ejemplo en Loki');

Comparando almacenamiento y consulta

En Elasticsearch, los registros deben ser transformados en cadenas de texto plano antes de ser almacenados. Esto generalmente se logra a través de la función JSON.stringify(), que convierte la estructura de los registros en una representación de cadena de caracteres. Si bien este enfoque es funcional, puede conllevar la pérdida de la estructura original de los datos y metadatos que podrían ser de gran valor en un análisis posterior. La conversión a texto plano puede dificultar la identificación y el análisis de datos estructurados, lo que podría restringir la capacidad de aprovechar todo el potencial de los registros almacenados.

Loki, por otro lado, ofrece una perspectiva refrescantemente diferente. Almacenar objetos JSON completos como registros implica que la estructura de los datos se mantiene intacta durante todo el proceso. Esto es particularmente beneficioso cuando los registros contienen información estructurada o metadatos importantes para su análisis. Como resultado, los datos almacenados en Loki conservan su forma original, facilitando la contextualización y análisis de la información en su estado más puro. La capacidad de almacenar y mantener la estructura de los registros puede llevar a un análisis más preciso y una comprensión más profunda de los patrones y tendencias presentes en los datos.

Conclusión

Después de explorar ambas opciones a fondo, la elección entre Elasticsearch y Loki se vuelve más clara en términos de optimización de recursos y eficiencia. Si estás en una situación similar, donde la gestión de logs es crítica y los recursos son limitados, Loki emerge como una solución eficaz, básicamente me he ahorrado varios cientos en AWS con este cambio, quizás hay algunas otros costos escondidos y no mencionados, pero ha valido la pena la migración; hay algunos retos como el aprender a realizar consultas en Loki que es un poco diferente, pero nada que no se pueda lograr leyendo un poco la documentación.

Happy coding! :D


Photo by Artiom Vallat on Unsplash

Jack Fiallos

Jack Fiallos

Te gustó este artículo?