Aumente o nível do seu histórico de shell com Loki e fzf
Loki expande o modelo que o Prometheus usa para métricas de monitoramento e agregação de logs.
Loki é uma estrutura de agregação de log de código aberto licenciada pelo Apache 2.0, projetada por Grafana Labs e construída com enorme suporte de uma comunidade em crescimento. É também o projeto em que trabalho todos os dias. Neste artigo, em vez de apenas falar sobre como o Loki funciona, fornecerei uma introdução prática para resolver problemas reais com ele.
O problema: um histórico de shell centralizado e durável
Adoro meu histórico de shell e sempre fui um usuário fanático de CTRL+R. Há cerca de um ano, minha vida no terminal mudou para sempre quando meu colega Dieter Plaetinck me apresentou o fuzzy finder de linha de comando fzf.
De repente, a pesquisa nos comandos passou a ser isto:
(Ed Welch, CC BY-SA 4.0)
Para isso:
opensource. com
(Ed Welch, CC BY-SA 4.0)
Embora o fzf tenha melhorado significativamente minha qualidade de vida, ainda faltavam algumas peças em meu histórico de shell:
- Perder o histórico do shell quando os terminais fecham abruptamente, os computadores travam, os computadores morrem, as chaves de criptografia de disco inteiras são esquecidas
- Ter acesso ao meu histórico de shell de todos os meus computadores em todos os meus computadores
Penso no meu histórico de shell como uma documentação: é uma história importante que não quero perder. Combinar o Loki com meu histórico de shell ajuda a resolver esses problemas e muito mais.
Sobre Loki
Loki pega o modelo de rótulo intuitivo que o projeto de código aberto Prometheus usa para métricas e o expande para o mundo da agregação de logs. Isso permite que desenvolvedores e operadores alternem perfeitamente entre métricas e registros usando o mesmo conjunto de rótulos. Mesmo se você não estiver usando o Prometheus, ainda há muitos motivos pelos quais o Loki pode ser uma boa opção para suas necessidades de armazenamento de log:
- Baixa sobrecarga: Loki não faz indexação de log de texto completo; ele apenas cria um índice dos rótulos que você coloca em seus logs. Manter um índice pequeno reduz substancialmente os requisitos operacionais do Loki. Estou executando meu projeto loki-shell, que usa Loki para armazenar o histórico do shell, em um Raspberry Pi usando pouco mais de 50 MB de memória.
- Baixo custo: o conteúdo do log é compactado e armazenado em armazenamentos de objetos como Amazon S3, Google Cloud Storage, Azure Blob ou até mesmo diretamente em um sistema de arquivos. O objetivo é usar armazenamento que seja barato e durável.
- Flexibilidade: o Loki está disponível em um único binário que pode ser baixado e executado diretamente ou como uma imagem Docker para execução em qualquer ambiente de contêiner. Um gráfico Helm está disponível para começar rapidamente no Kubernetes. Se você exige muito de suas ferramentas de registro, dê uma olhada na configuração de produção em execução no Grafana Labs. Ele usa Jsonnet e Tanka de código aberto para implantar a mesma imagem Loki como blocos de construção discretos para permitir escalonamento horizontal massivo, alta disponibilidade, replicação, escalonamento separado de caminhos de leitura e gravação, consultas altamente paralelizáveis e muito mais.
Em resumo, a abordagem do Loki é manter um pequeno índice de metadados sobre seus logs (rótulos) e armazenar o conteúdo do log compactado e não indexado em armazenamentos de objetos baratos para tornar a operação mais fácil e barata. O aplicativo foi desenvolvido para ser executado como um processo único e evoluir facilmente para um sistema distribuído altamente disponível. Você pode obter alto desempenho de consulta em cargas de trabalho de registro maiores por meio de paralelização e fragmentação de consultas, um pouco como o MapReduce para seus registros.
Além disso, essa funcionalidade está disponível gratuitamente para qualquer pessoa. Tal como acontece com sua plataforma de observabilidade aberta Grafana, o Grafana Labs está empenhado em tornar o Loki um software de agregação de log totalmente aberto e com todos os recursos que qualquer pessoa possa usar.
iniciar
Estou executando o Loki em um Raspberry Pi na minha rede doméstica e armazenando meu histórico de shell externamente em um bucket S3.
Quando eu clico em CTRL+R, a interface de linha de comando LogCLI do Loki faz várias solicitações em lote que são transmitidas para o fzf. Aqui está um exemplo – a parte superior mostra os logs do servidor Loki no Pi.
(Ed Welch, CC BY-SA 4.0)
Pronto para experimentar? O guia a seguir ajudará você a configurar e executar o Loki para ser integrado ao seu histórico do shell. Como este tutorial pretende manter as coisas simples, esta configuração executará o Loki localmente no seu computador e armazenará todos os arquivos no sistema de arquivos.
Você pode encontrar tudo isso, além de informações sobre como configurar uma instalação mais elaborada, no repositório loki-shell GitHub.
Observe que este tutorial não alterará nenhum comportamento existente em seu histórico, portanto seu comando de histórico de shell existente e configurações de histórico permanecerão intactos. Em vez disso, isso duplica o histórico de comando para Loki com $PROMPT_COMMAND
no Bash e precmd
no Zsh. No lado CTRL+R, ele sobrecarrega a função que fzf usa para acessar o comando CTRL+R. Tentar fazer isso é seguro e, se você decidir que não gosta, basta seguir as etapas de desinstalação no repositório GitHub para remover todos os rastros. Seu histórico de shell permanecerá intacto.
Passo 1: Instale o fzf
Existem várias maneiras de instalar o fzf, mas prefiro o método Git:
git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf
~/.fzf/install
Diga sim a todas as perguntas.
Se você já tem o fzf instalado, certifique-se de ter as combinações de teclas habilitadas (ou seja, certifique-se de que quando você digita CTRL+R, o fzf aparece). Você pode executar novamente a instalação do fzf para ativar as combinações de teclas, se necessário.
Passo 2: Instale o loki-shell
Assim como o fzf, o loki-shell também possui um repositório Git e um script de instalação:
git clone --depth 1 https://github.com/slim-bean/loki-shell.git ~/.loki-shell
~/.loki-shell/install
Primeiro, o script cria o diretório ~/.loki-shell
onde todos os arquivos serão mantidos (incluindo os dados do Loki). Em seguida, ele baixará binários para Promtail, LogCLI e Loki.
Então ele perguntará:
Do you want to install Loki? ([y]/n)
Se você já possui um Loki centralizado rodando no loki-shell, você pode responder n
; entretanto, para este tutorial, responda y
ou pressione Enter.
Existem duas opções disponíveis para executar o Loki localmente: como uma imagem Docker ou como um único binário (com suporte para adicionar um serviço systemd). Recomendo usar o Docker se estiver disponível, pois acho que simplifica um pouco as operações, mas ambos funcionam bem.
Executando com Docker
Para executar o Loki como uma imagem 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
Se esta for a primeira vez que você está executando a instalação, você pode desconsiderar as mensagens de erro. Este script irá parar e substituir um contêiner Loki em execução se a versão não corresponder, o que permite executar novamente este script para atualizar o Loki.
É isso! Loki agora está rodando como um contêiner Docker.
Os dados do Loki serão armazenados em ~/.loki-shell/data
.
A imagem é executada com --restart=unless-stopped
, portanto ela será reiniciada na reinicialização, mas permanecerá parada se você executar docker stop loki-shell
.
(Se estiver usando o Docker, você pode pular para a integração do Shell.)
Executando como binário
Existem muitas maneiras de executar um binário em um sistema Linux. Este script pode instalar um serviço systemd. Se você não possui o systemd, ainda pode usar a instalação binária:
[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
O script exibirá o comando que você precisa usar para executar o Loki, e você estará por conta própria para configurar um script de inicialização ou outro método de iniciá-lo automaticamente.
Você pode executar o comando diretamente, se desejar, e executar o Loki a partir do seu shell atual.
Se você tem o systemd, você tem a opção de deixar o script instalar o serviço systemd ou mostrar os comandos para executá-lo você mesmo:
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)
Integração de shell
Independentemente de como você instalou o Loki, agora você verá um prompt:
Enter the URL for your Loki server or press enter for default (http://localhost:4100)
Se você tivesse configurado um Loki centralizado, você inseriria esse URL aqui. No entanto, esta demonstração usa apenas o padrão, então você pode pressionar Enter.
Muito texto será exibido explicando todas as entradas adicionadas ao seu ~.bashrc
ou ~.zshrc
(ou ambos).
É isso!
Finished. Restart your shell or reload config file.
source ~/.bashrc # bash
source ~/.zshrc # zsh
Etapa 3: experimente!
Comece a usar seu shell e use CTRL+R para ver seus comandos.
Abra várias janelas de terminal, digite um comando em uma e CTRL+R em outra, e você verá seus comandos disponíveis imediatamente.
Além disso, observe que quando você alterna entre terminais e insere comandos, eles ficam disponíveis imediatamente com CTRL+R, mas a operação da seta para cima não é afetada entre terminais. (Isso pode não ser verdade se você tiver o Oh My Zsh instalado, pois ele anexa automaticamente todos os comandos ao histórico.)
Use CTRL+R várias vezes para alternar entre a classificação por tempo e por relevância.
Observe que essa configuração mostrará apenas o histórico de consultas dos hosts atuais, mesmo se você estiver enviando dados de shell de vários hosts para o Loki. Acho que, por padrão, isso faz mais sentido. Há muitas coisas que você pode ajustar se quiser que esse comportamento mude; veja o repositório loki-shell para saber mais.
Ele também instalou um alias chamado hist
:
alias hist="$HOME/.loki-shell/bin/logcli --addr=$LOKI_URL"
O LogCLI pode ser usado para consultar e pesquisar seu histórico diretamente no Loki, inclusive permitindo pesquisar outros hosts. Confira o guia de primeiros passos do LogCLI para saber mais sobre consultas.
A linguagem de consulta de log do Loki (LogQL) fornece consultas métricas que permitem fazer algumas coisas interessantes; por exemplo, posso ver quantas vezes emiti o comando kc
(meu alias para kubectl) nos últimos 30 dias:
(Ed Welch, CC BY-SA 4.0)
Crédito extra
Instale o Grafana e brinque com seu histórico de shell:
docker run -d -p 3000:3000 --name=grafana grafana/grafana
Abra um navegador da web em http://localhost:3000
e faça login usando o nome de usuário e a senha admin/admin padrão.
À esquerda, navegue até Configuração -> Fontes de dados, clique no botão Adicionar fonte de dados e selecione Loki.
Para a URL, você deve poder usar http://localhost:4100
(no entanto, na minha máquina WSL2, tive que usar o endereço IP real do computador).
Clique em Salvar e testar. Você deverá ver Fonte de dados conectada e rótulos encontrados.
Clique no ícone Explorar à esquerda, certifique-se de que a fonte de dados Loki esteja selecionada e tente uma consulta:
{job="shell"}
Se você tiver mais hosts enviando comandos shell, poderá limitar os resultados a um determinado host usando o rótulo hostname
:
{job="shell", hostname="myhost"}.
Você também pode procurar comandos específicos com expressões de filtro:
{job="shell"} |= "docker"
Ou você pode começar a explorar o mundo das métricas dos logs para ver com que frequência você usa seu shell:
rate({job="shell"}[1m])
(Ed Welch, CC BY-SA 4.0)
Quer reconstruir uma linha do tempo a partir de um incidente? Você pode filtrar por um comando específico e ver quando ele foi executado.
(Ed Welch, CC BY-SA 4.0)
Para ver o que mais você pode fazer e aprender mais sobre a linguagem de consulta do Loki, confira o guia LogQL.
Pensamentos finais
Para obter mais ideias, solução de problemas e atualizações, siga o repositório GitHub. Este ainda é um trabalho em andamento, portanto, relate quaisquer problemas.
Para saber mais sobre o Loki, confira a documentação, as postagens do blog e o repositório GitHub, ou experimente no Grafana Cloud.
Um agradecimento especial ao meu colega Jack Baldry por plantar a semente desta ideia. Eu tinha o conhecimento de Loki para fazer isso acontecer, mas se não fosse pela sugestão dele, acho que nunca teria chegado aqui.