Loki: recopilación de registros utilizando el enfoque Prometheus

¡Saludos, khabrovitas! En previsión del inicio de una nueva matrícula para el curso "Prácticas y herramientas de DevOps" preparado una traducción de material interesante para usted.

Este artículo es una breve introducción a Loki. Proyecto Loki apoyado por Grafana y tiene como objetivo la recopilación centralizada de registros (de servidores o contenedores).

La principal inspiración para Loki fue Prometeo con la idea de aplicar sus enfoques a la gestión de logs:

  • uso de etiquetas para almacenar datos
  • bajo consumo de recursos

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

Unas palabras sobre Prometeo

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

Una de las características distintivas de Prometheus es la extracción de métricas de los puntos de recopilación (a través de exportadores) y su almacenamiento en una TSDB (Base de datos de series temporales, base de datos de series temporales) con la adición de metadatos en forma de etiquetas.

Por qué esto 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 simple y un clúster de Kubernetes inicialmente tiene un punto final para Prometheus. Prometheus también puede extraer métricas de aplicaciones implementadas en un contenedor mientras mantiene etiquetas específicas. Por lo tanto, el monitoreo de aplicaciones es muy fácil de implementar.

Desafortunadamente, todavía no existe una solución llave en mano para la gestión de registros, y debe encontrar una solución por sí mismo:

  • servicio de nube administrado para centralizar registros (AWS, Azure o Google)
  • servicio de monitoreo "monitoreo como servicio" (por ejemplo, Datadog)
  • crear su propio servicio de recopilación de registros.

Para la tercera opción, tradicionalmente he usado Elasticsearch, a pesar de que no siempre estaba contento con él (especialmente por su pesadez y complejidad de configuración).

Loki fue diseñado para ser fácil de implementar de acuerdo con los siguientes principios:

  • ser fácil de empezar
  • consumir pocos recursos
  • trabajar de forma independiente sin ningún mantenimiento especial
  • servir como un complemento de Prometheus para ayudar con las investigaciones de errores

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

Investigación del incidente

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

Loki: recopilación de registros utilizando el enfoque Prometheus
1 Alerta → 2 Tablero → 3 Consulta ad hoc → 4 Agregación de registros → 5 Seguimiento distribuido → 6 ¡Corrección!
(1 Advertencia → 2 Tablero → 3 Consulta ad hoc → 4 Agregación de registros → 5 Seguimiento distribuido → 6 ¡Corrección!)

La idea es que nos llegue algún tipo de alerta (Notificación de Slack, SMS, etc.) y después de eso:

  • mira los tableros de Grafana
  • mira las métricas de servicio (por ejemplo, en Prometheus)
  • mire las entradas de registro (por ejemplo, en Elasticsearch)
  • tal vez eche un vistazo a los rastros distribuidos (Jaeger, Zipkin, etc.)
  • y finalmente solucionar el problema original.

Aquí, en el caso de la pila Grafana + Prometheus + Elasticsearch + Zipkin, tendrás que usar cuatro herramientas diferentes. Para ahorrar tiempo, sería bueno poder hacer todos estos pasos con una sola herramienta: Grafana. Vale la pena señalar que este enfoque de investigación se implementó en Grafana desde la versión 6. Por lo tanto, es posible acceder a los datos de Prometheus directamente desde Grafana.

Loki: recopilación de registros utilizando el enfoque Prometheus
Pantalla del explorador dividida entre Prometheus y Loki

Desde esta pantalla, puede 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 le permite analizar la identificación de rastreo en las entradas de registro de Loki para seguir los enlaces a sus herramientas de rastreo distribuidas favoritas (Jaeger).

Prueba local de Loki

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

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

Luego debe cambiar al directorio de producción:

$ cd production

Después de eso, puede obtener las últimas imágenes de Docker:

$ docker-compose pull

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

$ docker-compose up

arquitectura loki

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

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

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

$ docker ps

En el caso de un Docker recién instalado, el comando debería devolver el siguiente resultado:

IMAGE               PORTS                  NAMES
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 encargado de centralizar logs
  • Grafana: la famosa herramienta de tablero
  • Loki: demonio de centralización de datos

Como parte de una infraestructura clásica (por ejemplo, basada en máquinas virtuales), el agente Promtail debe implementarse en cada máquina. Grafana y Loki se pueden instalar en la misma máquina.

Implementación en Kubernetes

La instalación de los componentes de Loki en Kubernetes será la siguiente:

  • daemonSet para implementar el agente Promtail en cada una de las máquinas en el clúster de servidores
  • Despliegue de Loki
  • y el último es el despliegue de Grafana.

Afortunadamente, Loki está disponible como paquete Helm, lo que facilita su implementación.

Instalación a través de Heml

Ya deberías tener Heml instalado. Se puede descargar desde el repositorio de GitHub del proyecto. Se instala extrayendo el archivo apropiado para su arquitectura y agregando helm a $PATH.

Nota: Recientemente se lanzó la versión 3.0.0 de Helm. Dado que ha habido muchos cambios en él, se recomienda al lector esperar un poco antes de comenzar a usarlo..

Agregar fuente para Helm

El primer paso es agregar el repositorio "loki" con el siguiente comando:

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

Después de eso, puede buscar paquetes llamados "loki":

$ helm search loki

Resultado:

loki/loki       0.17.2 v0.4.0 Loki: like Prometheus, but for logs.
loki/loki-stack 0.19.1 v0.4.0 Loki: like Prometheus, but for logs.
loki/fluent-bit 0.0.2  v0.0.1 Uses fluent-bit Loki go plugin for...
loki/promtail   0.13.1 v0.4.0 Responsible for gathering logs and...

Estos paquetes tienen las siguientes características:

  • пакет loki/loki solo coincide con el servidor Loki
  • пакет loki/un poco fluido le permite implementar DaemonSet usando fluent-bin para recopilar registros en lugar de Promtail
  • пакет loki / cola de baile contiene un agente de recopilación de registros
  • пакет loki/loki-pila, le permite implementar inmediatamente Loki junto con Promtail.

Instalando Loki

Para implementar Loki en Kubernetes, ejecute el siguiente comando en el espacio de nombres de "supervisión":

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

Para guardar en el disco, agregue la opción --set loki.persistence.enabled = true:

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

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

Cuando ejecute este comando, debería obtener el siguiente resultado:

LAST DEPLOYED: Tue Nov 19 15:56:54 2019
NAMESPACE: monitoring
STATUS: DEPLOYED
RESOURCES:
==> v1/ClusterRole
NAME AGE
loki-promtail-clusterrole 189d
…
NOTES:
The Loki stack has been deployed to your cluster. Loki can now be added as a datasource in Grafana.
See <a href="http://docs.grafana.org/features/datasources/loki/">http://docs.grafana.org/features/datasources/loki/</a> for more details.

Al observar el estado de los pods en el espacio de nombres de "supervisión", podemos ver que todo está implementado:

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

Resultado:

NAME                 READY  STATUS   RESTARTS  AGE
loki-0               1/1    Running  0         147m
loki-promtail-9zjvc  1/1    Running  0         3h25m
loki-promtail-f6brf  1/1    Running  0         11h
loki-promtail-hdcj7  1/1    Running  0         3h23m
loki-promtail-jbqhc  1/1    Running  0         11h
loki-promtail-mj642  1/1    Running  0         62m
loki-promtail-nm64g  1/1    Running  0         24m

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

Conexión a Grafana

Para conectarse a Grafana bajo Kubernetes, debe abrir un túnel a su módulo. El siguiente es el comando para abrir el puerto 3000 para un pod Grafana:

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

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

Para restaurarlo, debe ejecutar el siguiente comando:

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

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

Definición de fuente de datos de Loki en Grafana

En primer lugar, asegúrese de que se haya creado la fuente de datos de Loki (Configuración / Fuente de datos).
He aquí un ejemplo:

Loki: recopilación de registros utilizando el enfoque Prometheus
Un ejemplo de configuración de una fuente de datos para Loki

Al hacer clic en "Probar" puede probar la conexión con Loki.

Haciendo peticiones a Loki

Ahora ve a Grafana y ve a la sección "Explorar". Al recibir registros de contenedores, Loki agrega metadatos de Kubernetes. Por lo tanto, es posible ver los registros de un contenedor específico.

Por ejemplo, para seleccionar los registros del contenedor promtail, puede usar la siguiente consulta: {container_name = "promtail"}.
No olvide seleccionar aquí también la fuente de datos de Loki.

Esta consulta devolverá la actividad del contenedor de la siguiente manera:

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

Agregando al tablero

A partir de Grafana 6.4, es posible colocar información de registro directamente en el tablero. Después de eso, el usuario podrá cambiar rápidamente entre la cantidad de solicitudes en su sitio y los seguimientos de la aplicación.

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

Loki: recopilación de registros utilizando el enfoque Prometheus
Tablero de muestra con métricas de Prometheus y registros de Loki

El futuro de Loki

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

Hay que admitir que la versión 0.1 no era lo suficientemente estable. Pero la 0.3 ya mostraba verdaderos signos de madurez, y las siguientes versiones (0.4, luego 1.0) solo reforzaron esta impresión.

Después de 1.0.0, nadie puede tener una excusa para no usar esta maravillosa herramienta.

Las mejoras adicionales no deberían ser sobre Loki, sino más bien sobre su integración con el excelente Grafana. De hecho, Grafana 6.4 ya tiene una buena integración con los paneles.

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

El siguiente video muestra un pequeño ejemplo de este mecanismo:

Loki: recopilación de registros utilizando el enfoque Prometheus
Usando cuerdas de Loki renderizadas en Grafana

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

  • enlaces a una herramienta externa
  • filtrado de contenido de registro

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

Como de costumbre, esperamos sus comentarios y los invitamos a seminario web abierto, donde hablaremos sobre cómo se ha desarrollado la industria DevOps durante 2019 y discutiremos posibles caminos de desarrollo para 2020.

Fuente: habr.com