Loki es un marco de agregación de registros de código abierto con licencia de Apache 2.0 diseñado por Grafana Labs y construido con un tremendo apoyo de una comunidad en crecimiento. También es el proyecto en el que trabajo todos los días. En este artículo, en lugar de solo hablar sobre cómo funciona Loki, proporcionaré una introducción práctica para resolver problemas reales con él.
El problema:un historial duradero de shell centralizado
Me encanta mi historial de shell y siempre he sido un usuario fanático de CTRL+R. Hace aproximadamente un año, mi vida como terminal cambió para siempre cuando mi colega Dieter Plaetinck me presentó el buscador difuso de línea de comandos fzf .
De repente, la búsqueda a través de los comandos pasó de esto:
A esto:
Si bien fzf mejoró significativamente mi calidad de vida, todavía faltaban algunas piezas en mi historial de shell:
- Perder el historial de shell cuando las terminales se cierran abruptamente, las computadoras fallan, las computadoras mueren, las claves de cifrado de disco completo se olvidan
- Tener acceso a mi historial de shell desde todas mis computadoras encendidas todas mis computadoras
Pienso en mi historial de shell como documentación:es una historia importante que no quiero perder. Combinar Loki con mi historial de shell ayuda a resolver estos problemas y más.
Sobre Loki
Explore la nube de código abierto
- Comprender las nubes
- Curso en línea gratuito:desarrollo de aplicaciones nativas de la nube con arquitecturas de microservicios
- ¿Qué es la nube híbrida?
- eBook:Creación de una estrategia de nube híbrida
- ¿Qué es Kubernetes?
- Comprender la informática perimetral
- Últimos artículos para arquitectos de TI
Loki toma el modelo de etiqueta intuitivo que el proyecto Prometheus de código abierto usa para las métricas y lo expande al mundo de la agregación de registros. Esto permite a los desarrolladores y operadores alternar sin problemas entre sus métricas y registros utilizando el mismo conjunto de etiquetas. Incluso si no está utilizando Prometheus, todavía hay muchas razones por las que Loki podría ser una buena opción para sus necesidades de almacenamiento de registros:
- Baja sobrecarga: Loki no realiza la indexación de registros de texto completo; solo crea un índice de las etiquetas que coloca en sus registros. Mantener un índice pequeño reduce sustancialmente los requisitos operativos de Loki. Estoy ejecutando mi proyecto loki-shell, que usa Loki para almacenar el historial de shell, en una Raspberry Pi usando solo un poco más de 50 MB de memoria.
- Bajo coste: El contenido del registro se comprime y almacena en almacenes de objetos como Amazon S3, Google Cloud Storage, Azure Blob o incluso directamente en un sistema de archivos. El objetivo es utilizar un almacenamiento económico y duradero.
- Flexibilidad: Loki está disponible en un solo binario que se puede descargar y ejecutar directamente o como una imagen de Docker para ejecutar en cualquier entorno de contenedor. Un gráfico de Helm está disponible para comenzar rápidamente en Kubernetes. Si exige mucho de sus herramientas de registro, eche un vistazo a la configuración de producción que se ejecuta en Grafana Labs. Utiliza Jsonnet y Tanka de código abierto para implementar la misma imagen de Loki como bloques de construcción discretos para permitir escalado horizontal masivo, alta disponibilidad, replicación, escalado separado de rutas de lectura y escritura, consultas altamente paralelizables y más.
En resumen, el enfoque de Loki es mantener un pequeño índice de metadatos sobre sus registros (etiquetas) y almacenar el contenido de registro sin indexar y comprimido en almacenes de objetos económicos para que la operación sea más fácil y económica. La aplicación está diseñada para ejecutarse como un solo proceso y evolucionar fácilmente hacia un sistema distribuido de alta disponibilidad. Puede obtener un alto rendimiento de consultas en cargas de trabajo de registro más grandes a través de la paralelización y fragmentación de consultas, un poco como MapReduce para sus registros.
Además, esta funcionalidad está disponible para que cualquiera la use de forma gratuita. Al igual que con su plataforma de observabilidad abierta Grafana, Grafana Labs se compromete a hacer de Loki un software de agregación de registros completamente abierto y con todas las funciones que cualquiera pueda usar.
Comenzar
Ejecuto Loki en una Raspberry Pi en mi red doméstica y almaceno mi historial de shell fuera del sitio en un depósito S3.
Cuando presiono CTRL+R, la interfaz de línea de comandos LogCLI de Loki realiza varias solicitudes de procesamiento por lotes que se transmiten a fzf. Aquí hay un ejemplo:la parte superior muestra los registros del servidor Loki en el Pi.
¿Listo para intentarlo? La siguiente guía lo ayudará a configurar y ejecutar Loki para que se integre con su historial de shell. Dado que este tutorial tiene como objetivo simplificar las cosas, esta configuración ejecutará Loki localmente en su computadora y almacenará todos los archivos en el sistema de archivos.
Puede encontrar todo esto, además de información sobre cómo configurar una instalación más elaborada, en el repositorio de GitHub de loki-shell.
Tenga en cuenta que este tutorial no cambiará ningún comportamiento existente en torno a su historial, por lo que su comando de historial de shell existente y la configuración del historial no se modificarán. En cambio, esto duplica el historial de comandos de Loki con $PROMPT_COMMAND
en Bash y precmd
en Zsh. En el lado de CTRL+R, sobrecarga la función que usa fzf para acceder al comando CTRL+R. Probar esto es seguro, y si decide que no le gusta, simplemente siga los pasos de desinstalación en el repositorio de GitHub para eliminar todos los rastros. Su historial de shell no se modificará.
Paso 1:Instalar fzf
Hay varias formas de instalar fzf, pero prefiero el método Git:
git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf
~/.fzf/install
Di sí a todas las indicaciones de preguntas.
Si ya tiene fzf instalado, asegúrese de tener habilitadas las combinaciones de teclas (es decir, asegúrese de que cuando escriba CTRL+R, fzf aparezca). Puede volver a ejecutar la instalación de fzf para habilitar las combinaciones de teclas si es necesario.
Paso 2:Instalar loki-shell
Al igual que fzf, loki-shell también tiene un repositorio de Git y un script de instalación:
git clone --depth 1 https://github.com/slim-bean/loki-shell.git ~/.loki-shell
~/.loki-shell/install
Primero, el script crea el ~/.loki-shell
directorio donde se guardarán todos los archivos (incluidos los datos de Loki). A continuación, descargará binarios para Promtail, LogCLI y Loki.
Luego preguntará:
Do you want to install Loki? ([y]/n)
Si ya tiene un Loki centralizado ejecutándose para loki-shell, puede responder n
; sin embargo, para este tutorial, responda y
o presione Entrar.
Hay dos opciones disponibles para ejecutar Loki localmente:como una imagen de Docker o como un solo binario (con soporte para agregar un servicio systemd). Recomiendo usar Docker si está disponible, ya que creo que simplifica un poco las operaciones, pero ambos funcionan bien.
Ejecutando con Docker
Para ejecutar Loki como una imagen de Docker:
[y] to run Loki in Docker, [n] to run Loki as a binary ([y]/n) y
Error: No such object: loki-shell
Error response from daemon: No such container: loki-shell
Error: No such container: loki-shell
54843ff3392f198f5cac51a6a5071036f67842bbc23452de8c3efa392c0c2e1e
Si es la primera vez que ejecuta la instalación, puede ignorar los mensajes de error. Este script detendrá y reemplazará un contenedor de Loki en ejecución si la versión no coincide, lo que le permite volver a ejecutar este script para actualizar Loki.
¡Eso es todo! Loki ahora se ejecuta como un contenedor Docker.
Los datos de Loki se almacenarán en ~/.loki-shell/data
.
La imagen se ejecuta con --restart=unless-stopped
, por lo que se reiniciará al reiniciar, pero permanecerá detenido si ejecuta docker stop loki-shell
.
(Si está utilizando Docker, puede saltar a la integración de Shell).
Ejecutando como binario
Hay muchas formas de ejecutar un binario en un sistema Linux. Este script puede instalar un servicio systemd. Si no tiene systemd, aún puede usar la instalación binaria:
[y] to run Loki in Docker, [n] to run Loki as a binary ([y]/n) n
Run Loki with systemd? ([y]/n) n
This is as far as this script can take you
You will need to setup an auto-start for Loki
It can be run with this command: /home/username/.loki-shell/bin/loki -config.file=/home/username/.loki-shell/config/loki-binary-config.yaml
El script escupirá el comando que necesita usar para ejecutar Loki, y usted estará solo para configurar un script de inicio u otro método para iniciarlo automáticamente.
Puede ejecutar el comando directamente, si lo desea, y ejecutar Loki desde su shell actual.
Si haces tiene systemd, tiene la opción de dejar que el script instale el servicio systemd o mostrarle los comandos para ejecutarlo usted mismo:
Run Loki with systemd? ([y]/n) y
Installing the systemd service requires root permissions.
[y] to run these commands with sudo [n] to print out the commands and you can run them yourself. ([y]/n) n
sudo cp /home/ed/.loki-shell/config/loki-shell.service /etc/systemd/system/loki-shell.service
sudo systemctl daemon-reload
sudo systemctl enable loki-shell
sudo systemctl start loki-shell
Copy these commands and run them when the script finishes. (press enter to continue)
Integración Shell
Independientemente de cómo hayas instalado Loki, ahora deberías ver un mensaje:
Enter the URL for your Loki server or press enter for default (http://localhost:4100)
Si hubiera configurado un Loki centralizado, ingresaría esa URL aquí. Sin embargo, esta demostración solo usa el valor predeterminado, por lo que puede presionar Enter.
Una gran cantidad de texto escupirá explicando todas las entradas agregadas a su ~.bashrc
o ~.zshrc
(o ambos).
¡Eso es!
Finished. Restart your shell or reload config file.
source ~/.bashrc # bash
source ~/.zshrc # zsh
Paso 3:¡Pruébalo!
Comience a usar su shell y use CTRL+R para ver sus comandos.
Abra varias ventanas de terminal, escriba un comando en una y CTRL+R en otra, y verá sus comandos disponibles de inmediato.
Además, observe que cuando cambia entre terminales e ingresa comandos, están disponibles inmediatamente con CTRL+R, pero la operación de la flecha hacia arriba no se ve afectada entre terminales. (Es posible que esto no sea cierto si tiene instalado Oh My Zsh, ya que agrega automáticamente todos los comandos al historial).
Use CTRL+R varias veces para alternar entre ordenar por tiempo y por relevancia.
Tenga en cuenta que esta configuración mostrará solo el historial de consultas de los hosts actuales, incluso si está enviando datos de shell desde varios hosts a Loki. Creo que por defecto esto tiene más sentido. Hay muchas cosas que puede modificar si desea que cambie este comportamiento; consulte el repositorio de loki-shell para obtener más información.
También instaló un alias llamado hist
:
alias hist="$HOME/.loki-shell/bin/logcli --addr=$LOKI_URL"
LogCLI se puede usar para consultar y buscar su historial directamente en Loki, incluso permitiéndole buscar otros hosts. Consulte la guía de inicio de LogCLI para obtener más información sobre las consultas.
El lenguaje de consulta de registros de Loki (LogQL) proporciona consultas métricas que le permiten hacer algunas cosas interesantes; por ejemplo, puedo ver cuántas veces emití el kc
comando (mi alias para kubectl) en los últimos 30 días:
Crédito extra
Instala Grafana y juega con tu historial de shell:
docker run -d -p 3000:3000 --name=grafana grafana/grafana
Abra un navegador web en http://localhost:3000
e inicie sesión con el admin/admin predeterminado nombre de usuario y contraseña.
A la izquierda, vaya a Configuración -> Fuentes de datos , haga clic en Agregar fuente de datos y selecciona Loki .
Para la URL, debería poder usar http://localhost:4100
(sin embargo, en mi máquina WSL2, tuve que usar la dirección IP real de la computadora).
Haz clic en Guardar y probar . Debería ver Fuente de datos conectada y etiquetas encontradas .
Haga clic en Explorar icono de la izquierda, asegúrate de que Loki selecciona la fuente de datos y prueba una consulta:
{job="shell"}
Si tiene más hosts que envían comandos de shell, puede limitar los resultados a un determinado host usando el hostname
etiqueta:
{job="shell", hostname="myhost"}.
También puede buscar comandos específicos con expresiones de filtro:
{job="shell"} |= "docker"
O puede comenzar a explorar el mundo de las métricas de los registros para ver con qué frecuencia usa su shell:
rate({job="shell"}[1m])
¿Quiere reconstruir una línea de tiempo a partir de un incidente? Puede filtrar por un comando específico y ver cuándo se ejecutó.
Para ver qué más puede hacer y obtener más información sobre el lenguaje de consulta de Loki, consulte la guía de LogQL.
Pensamientos finales
Para obtener más ideas, solución de problemas y actualizaciones, siga el repositorio de GitHub. Esto todavía es un trabajo en progreso, así que informe cualquier problema allí.
Para obtener más información sobre Loki, consulte la documentación, las publicaciones del blog y el repositorio de GitHub, o pruébelo en Grafana Cloud.
Un agradecimiento especial a mi colega Jack Baldry por plantar la semilla de esta idea. Tenía el conocimiento de Loki para hacer que esto sucediera, pero si no fuera por su sugerencia, no creo que jamás hubiera llegado aquí.