Loki — recopilación de registros utilizando el enfoque de Prometheus

¡Hola, amigos de Habr! Con la llegada de un nuevo grupo para el curso «Prácticas y herramientas de DevOps» hemos preparado para ustedes la traducción de un material interesante.

Este artículo es una breve introducción a Loki. El proyecto Loki es respaldado por Grafana y está dirigido a la recopilación centralizada de registros (desde servidores o contenedores).

La principal fuente de inspiración para Loki fue Prometheus con la idea de aplicar sus enfoques a la gestión de registros:

  • uso de etiquetas (labels) para almacenar datos
  • consumir pocos recursos

Volveremos a los principios de funcionamiento de Prometheus y proporcionaremos algunos ejemplos de su uso en el contexto de Kubernetes.

Algunas palabras sobre Prometheus

Para comprender completamente cómo funciona Loki, es importante dar un paso atrás y recordar un poco sobre Prometheus.

Una de las características distintivas de Prometheus es la extracción de métricas desde puntos de recolección (a través de exportadores) y su almacenamiento en TSDB (Base de Datos de Series Temporales) con la adición de metadatos en forma de etiquetas.

¿Por qué es necesario?

Recientemente, Prometheus se ha convertido en el estándar de facto en el mundo de los contenedores y Kubernetes: su instalación es muy sencilla y en un clúster de Kubernetes hay, por defecto, un endpoint para Prometheus. Prometheus también puede extraer métricas de aplicaciones desplegadas en contenedores, manteniendo ciertas etiquetas. Por lo tanto, la supervisión de aplicaciones es muy fácil de implementar.

Desafortunadamente, todavía no hay una solución 'llave en mano' para la gestión de registros y debes encontrar una solución para ti:

  • un servicio en la nube gestionado para la centralización de registros (AWS, Azure o Google)
  • un servicio de monitoreo 'monitoreo como servicio' (por ejemplo, Datadog)
  • crear tu propio servicio de recopilación de registros.

Para la tercera opción, tradicionalmente he utilizado Elasticsearch, aunque no siempre he estado satisfecho con él (especialmente por su pesadez y complejidad de configuración).

Loki fue diseñado con el objetivo de simplificar su implementación de acuerdo con los siguientes principios:

  • ser fácil de iniciar
  • consumir pocos recursos
  • funcionar de manera autónoma sin ningún mantenimiento especial
  • servir como complemento de Prometheus para ayudar en la investigación de errores

Sin embargo, esta simplicidad se logra a expensas de algunos compromisos. Uno de ellos es no indexar el contenido. Por lo tanto, la búsqueda de texto no es muy eficiente o rica y no permite llevar estadísticas sobre el contenido del texto. Pero dado que Loki quiere ser equivalente a grep y un complemento para Prometheus, esto no es una desventaja.

Investigación de incidentes

Para entender mejor por qué Loki no necesita indexación, volvamos al método de investigación de incidentes que utilizaron los desarrolladores de Loki:

Loki — recopilación de registros utilizando el enfoque de Prometheus
1 Alerta → 2 Dashboard → 3 Consulta Adhoc → 4 Agregación de registros → 5 Trazado distribuido → 6 ¡Solucionar!
(1 Alerta → 2 Dashboard → 3 Consulta Adhoc → 4 Agregación de registros → 5 Trazado distribuido → 6 ¡Solucionar!)

La idea es que recibimos alguna alerta (notificación de Slack, SMS, etc.) y después:

  • miramos los dashboards de Grafana
  • vemos las métricas de los servicios (por ejemplo, en Prometheus)
  • revisamos los registros (por ejemplo, en Elasticsearch)
  • posiblemente, echamos un vistazo a los trazos distribuidos (Jaeger, Zipkin, etc.)
  • y, finalmente, solucionamos el problema subyacente.

Aquí, en el caso de la pila Grafana + Prometheus + Elasticsearch + Zipkin, se tendrán que usar cuatro herramientas diferentes. Para reducir el tiempo, sería ideal poder realizar todos estos pasos utilizando una sola herramienta: Grafana. Es importante señalar que este enfoque de investigación se implementó en Grafana a partir de la versión 6. Así, se hace posible acceder a los datos de Prometheus directamente desde Grafana.

Loki — recopilación de registros utilizando el enfoque de Prometheus
La pantalla Explorer se divide entre Prometheus y Loki

En esta pantalla se pueden ver los registros en Loki relacionados con las métricas de Prometheus, utilizando el concepto de pantalla dividida. Desde la versión 6.5, Grafana permite manejar el identificador de trazado (trace id) en los registros de Loki para acceder a sus herramientas de trazado distribuido favoritas (Jaeger).

Prueba local de Loki

La forma más sencilla de probar Loki localmente es usar docker-compose. El archivo docker-compose se encuentra en el repositorio de Loki. Se puede obtener el repositorio con el siguiente comando git:

$ git clone https://github.com/grafana/loki.git

Luego, necesita ingresar al directorio de producción:

$ cd production

Después de esto, puede obtener la última versión de las imágenes de Docker:

$ docker-compose pull

Finalmente, la pila de Loki se inicia con el siguiente comando:

$ docker-compose up

Arquitectura de Loki

Aquí hay un pequeño diagrama con la arquitectura de Loki:

Loki — recopilación de registros utilizando el enfoque de Prometheus
Principios de la arquitectura de Loki

El cliente web ejecuta aplicaciones en el servidor, Promtail recopila los registros y los envía a Loki, el cliente web también envía metadatos a Loki. Loki los agrega y los envía a Grafana.
Loki está en funcionamiento. Para ver los componentes disponibles, ejecute el siguiente comando:

$ docker ps

En caso de que se haya instalado Docker recientemente, el comando debería devolver el siguiente resultado:

IMAGEN               PUERTOS                  NOMBRES
grafana/promtail:                          production_promtail_1
grafana/grafana: m  0.0.0.0:3000->3000/tcp production_grafana_1
grafana/loki: late  80/tcp,0.0.0.0:3100... production_loki_1

Vemos los siguientes componentes:

  • Promtail: agente responsable de la centralización de registros
  • Grafana: herramienta conocida para dashboards
  • Loki: demonio de centralización de datos

Dentro de una infraestructura clásica (por ejemplo, basada en máquinas virtuales), cada máquina debe tener un agente Promtail desplegado. Grafana y Loki pueden ser instalados en una sola máquina.

Despliegue en Kubernetes

La instalación de los componentes de Loki en Kubernetes consistirá en lo siguiente:

  • daemonSet para desplegar el agente Promtail en cada una de las máquinas del clúster de servidores
  • despliegue (Deployment) de Loki
  • y por último, el despliegue de Grafana.

Afortunadamente, Loki está disponible como un paquete Helm, lo que simplifica su despliegue.

Instalación a través de Helm

Helm ya debería estar instalado en su sistema. Se puede descargar desde el repositorio de GitHub del proyecto. Se instala descomprimiendo el archivo correspondiente a su arquitectura y agregando helm a $PATH.

Nota: la versión 3.0.0 de Helm fue lanzada recientemente. Debido a que se hicieron muchos cambios, se recomienda al lector esperar un poco antes de comenzar a usarla..

Agregar fuente para Helm

El primer paso será agregar el repositorio 'loki' con el siguiente comando:

$ helm add loki https://grafana.github.io/loki/charts

Después de esto, se pueden buscar paquetes con el nombre 'loki':

$ helm search loki

Resultado:

loki/loki       0.17.2 v0.4.0 Loki: como Prometheus, pero para registros.
loki/loki-stack 0.19.1 v0.4.0 Loki: como Prometheus, pero para registros.
loki/fluent-bit 0.0.2  v0.0.1 Usa el plugin de Loki para fluent-bit para...
loki/promtail   0.13.1 v0.4.0 Responsable de recopilar registros y...

Estos paquetes tienen las siguientes funcionalidades:

  • paquete loki/loki corresponde únicamente al servidor Loki
  • paquete loki/fluent-bit le permite desplegar DaemonSet, utilizando fluent-bit para recopilar registros en lugar de Promtail
  • paquete loki/promtail contiene el agente de recopilación de registros
  • paquete loki/loki-stack, permite desplegar Loki junto con Promtail de una vez.

Instalación de Loki

Para desplegar Loki en Kubernetes, ejecute el siguiente comando en el espacio de nombres 'monitoring':

$ helm upgrade --install loki loki/loki-stack --namespace monitoring

Para guardar en disco, agregue el parámetro --set loki.persistence.enabled = true:

$ helm upgrade --install loki loki/loki-stack 
              --namespace monitoring 
              --set loki.persistence.enabled=true

Nota: si desea desplegar Grafana al mismo tiempo, agregue el parámetro --set grafana.enabled = true

Al ejecutar este comando, debería obtener la siguiente salida:

ÚLTIMO DESPLIEGUE: Mar Nov 19 15:56:54 2019
NOMBRE DEL ESPACIO: monitoring
ESTADO: DESPLEGADO
RECURSOS:
==> v1/ClusterRole
NOMBRE EDAD
loki-promtail-clusterrole 189d
…
NOTAS:
La pila de Loki ha sido desplegada en tu clúster. Loki ahora puede ser agregado como una fuente de datos en Grafana.
Ver <a href="http://docs.grafana.org/features/datasources/loki/">http://docs.grafana.org/features/datasources/loki/</a> para más detalles.

Al revisar el estado de los pods en el espacio de nombres “monitoring”, veremos que todo está desplegado:

$ kubectl -n monitoring get pods -l release=loki

Resultado:

NOMBRE                 LISTO  ESTADO   REINICIOS  EDAD
loki-0               1/1    En ejecución  0         147m
loki-promtail-9zjvc  1/1    En ejecución  0         3h25m
loki-promtail-f6brf  1/1    En ejecución  0         11h
loki-promtail-hdcj7  1/1    En ejecución  0         3h23m
loki-promtail-jbqhc  1/1    En ejecución  0         11h
loki-promtail-mj642  1/1    En ejecución  0         62m
loki-promtail-nm64g  1/1    En ejecución  0         24m

Todos los pods están en funcionamiento. ¡Ahora es el momento de hacer algunas pruebas!

Conectándose a Grafana

Para conectarse a Grafana desde Kubernetes, es necesario abrir un túnel a su pod. A continuación se muestra el comando para abrir el puerto 3000 para el pod de Grafana:

$ kubectl -n port-forward monitoring svc/loki-grafana 3000:80

Otro aspecto importante es la necesidad de recuperar la contraseña del administrador de Grafana. La contraseña se almacena en el secreto loki-grafana en el campo .data.admin-user en formato base64.

Para recuperarla, ejecute el siguiente comando:

$ kubectl -n monitoring get secret loki-grafana 
 --template '{{index .data "admin-password" | base64decode}}'; echo

Use esta contraseña junto con la cuenta de administrador predeterminada (admin).

Definiendo el origen de datos Loki en Grafana

Primero, asegúrese de que se haya creado el origen de datos Loki (Configuración / Origen de datos).
Aquí hay un ejemplo:

Loki — recopilación de registros utilizando el enfoque de Prometheus
Ejemplo de configuración del origen de datos para Loki

Al hacer clic en “Probar”, puede verificar la conexión con Loki.

Realizando consultas a Loki

Ahora dirígete a Grafana en la sección “Explorar”. Al recibir registros de los contenedores, Loki agrega metadatos de Kubernetes. Así, es posible ver los registros de un contenedor específico.

Por ejemplo, para seleccionar los registros del contenedor promtail, puedes usar la siguiente consulta: {container_name = "promtail"}.
Aquí tampoco olvide seleccionar el origen de datos Loki.

Esta consulta devolverá la actividad de los contenedores en la siguiente forma:

Loki — recopilación de registros utilizando el enfoque de Prometheus
Resultado de la consulta en Grafana

Añadiendo al tablero

A partir de Grafana 6.4, se puede colocar la información de los registros directamente en el tablero. Después de esto, el usuario podrá alternar rápidamente entre la cantidad de solicitudes en su sitio y los rastreos de la aplicación.

A continuación, se muestra un ejemplo de un panel que implementa esta interacción:

Loki — recopilación de registros utilizando el enfoque de Prometheus
Ejemplo de panel con métricas de Prometheus y registros de Loki

El futuro de Loki

Comencé a usar Loki en mayo/junio con la versión 0.1. Hoy ya se ha lanzado la versión 1, e incluso las 1.1 y 1.2.

Es necesario reconocer que la versión 0.1 no fue lo suficientemente estable. Pero la 0.3 mostró verdaderas señales de madurez, y las versiones siguientes (0.4, luego 1.0) solo reforzaron esta impresión.

Después de 1.0.0, nadie puede tener excusas para no usar esta magnífica herramienta.

Las mejoras futuras deben centrarse no en Loki, sino más bien en su integración con la excelente Grafana. De hecho, en Grafana 6.4 ya apareció una buena integración con los paneles.

Grafana 6.5, que se lanzó recientemente, mejora aún más esta integración, reconociendo automáticamente el contenido de los registros en formato JSON.

A continuación en el video hay un pequeño ejemplo de este mecanismo:

Loki — recopilación de registros utilizando el enfoque de Prometheus
Uso de las cadenas de Loki mostradas en Grafana

Es posible utilizar uno de los campos JSON, por ejemplo, para:

  • vínculo a una herramienta externa
  • filtrado de contenido de registros

Por ejemplo, puede hacer clic en traceId para ir a Zipkin o Jaeger.

Tradicionalmente esperamos sus comentarios y los invitamos a un seminario web abierto, donde hablaremos sobre cómo ha evolucionado la industria de DevOps durante 2019 y discutiremos posibles vías de desarrollo para 2020.

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster