GNU/Linux >> Linux Esercitazione >  >> Linux

Migliora la tua cronologia delle shell con Loki e fzf

Loki è un framework di aggregazione di log open source con licenza Apache 2.0 progettato da Grafana Labs e creato con il supporto straordinario di una comunità in crescita. È anche il progetto su cui lavoro ogni giorno. In questo articolo, invece di parlare solo di come funziona Loki, fornirò un'introduzione pratica per risolvere i problemi reali con esso.

Il problema:una cronologia di shell centralizzata durevole

Amo la mia storia di shell e sono sempre stato un fanatico utente CTRL+R. Circa un anno fa, la mia vita da terminale è cambiata per sempre quando il mio collega Dieter Plaetinck mi ha presentato il cercatore fuzzy da riga di comando fzf .

Improvvisamente, la ricerca tra i comandi è andata da questo:

A questo:

Sebbene fzf abbia migliorato significativamente la mia qualità di vita, c'erano ancora alcuni pezzi mancanti nella storia della mia shell:

  • Perdita della cronologia della shell quando i terminali si chiudono bruscamente, i computer si bloccano, i computer muoiono, le chiavi di crittografia dell'intero disco vengono dimenticate
  • Avere accesso alla cronologia della mia shell da tutti i miei computer accesi tutti i miei computer

Penso alla storia della mia shell come a una documentazione:è una storia importante che non voglio perdere. La combinazione di Loki con la cronologia della mia shell aiuta a risolvere questi problemi e altro ancora.

Informazioni su Loki

Esplora il cloud open source

  • Capire le nuvole
  • Corso online gratuito:Sviluppo di applicazioni cloud native con architetture di microservizi
  • Cos'è il cloud ibrido?
  • eBook:costruire una strategia di cloud ibrido
  • Cos'è Kubernetes?
  • Capire l'edge computing
  • Ultimi articoli per architetti IT

Loki prende l'intuitivo modello di etichetta utilizzato dal progetto open source Prometheus per le metriche e lo espande nel mondo dell'aggregazione dei log. Ciò consente a sviluppatori e operatori di passare senza problemi tra le loro metriche e i log utilizzando lo stesso set di etichette. Anche se non stai utilizzando Prometheus, ci sono ancora molte ragioni per cui Loki potrebbe essere adatto alle tue esigenze di archiviazione dei registri:

  • Basso sovraccarico: Loki non esegue l'indicizzazione del registro full-text; crea solo un indice delle etichette che metti sui tuoi log. Mantenere un piccolo indice riduce sostanzialmente i requisiti operativi di Loki. Sto eseguendo il mio progetto loki-shell, che utilizza Loki per archiviare la cronologia della shell, su un Raspberry Pi utilizzando poco più di 50 MB di memoria.
  • Basso costo: Il contenuto del registro viene compresso e archiviato in archivi oggetti come Amazon S3, Google Cloud Storage, Azure Blob o anche direttamente su un filesystem. L'obiettivo è utilizzare uno spazio di archiviazione economico e durevole.
  • Flessibilità: Loki è disponibile in un unico binario che può essere scaricato ed eseguito direttamente o come immagine Docker da eseguire in qualsiasi ambiente container. È disponibile un grafico Helm per iniziare rapidamente a Kubernetes. Se richiedi molto dai tuoi strumenti di registrazione, dai un'occhiata all'impostazione di produzione in esecuzione su Grafana Labs. Utilizza Jsonnet e Tanka open source per distribuire la stessa immagine Loki come elementi costitutivi discreti per consentire un massiccio ridimensionamento orizzontale, alta disponibilità, replica, ridimensionamento separato dei percorsi di lettura e scrittura, query altamente parallelizzabili e altro ancora.

In sintesi, l'approccio di Loki consiste nel mantenere un piccolo indice di metadati sui log (etichette) e archiviare il contenuto del log non indicizzato e compresso in negozi di oggetti economici per rendere il funzionamento più semplice ed economico. L'applicazione è progettata per funzionare come un unico processo e trasformarsi facilmente in un sistema distribuito ad alta disponibilità. Puoi ottenere prestazioni elevate delle query su carichi di lavoro di registrazione più grandi tramite la parallelizzazione e lo sharding delle query, un po' come MapReduce per i tuoi log.

Inoltre, questa funzionalità può essere utilizzata da chiunque gratuitamente. Come con la sua piattaforma di osservabilità aperta Grafana, Grafana Labs si impegna a rendere Loki un software di aggregazione di log completamente aperto e completo che chiunque possa utilizzare.

Inizia

Sto eseguendo Loki su un Raspberry Pi sulla mia rete domestica e sto archiviando la cronologia della mia shell fuori sede in un bucket S3.

Quando premo CTRL+R, l'interfaccia della riga di comando LogCLI di Loki effettua diverse richieste di batch che vengono trasmesse in streaming in fzf. Ecco un esempio:la parte superiore mostra i log del server Loki sul Pi.

Pronto a provarlo? La seguente guida ti aiuterà a configurare ed eseguire Loki per integrarlo con la cronologia della shell. Poiché questo tutorial mira a semplificare le cose, questa configurazione eseguirà Loki localmente sul tuo computer e memorizzerà tutti i file sul filesystem.

Puoi trovare tutto questo, oltre a informazioni su come impostare un'installazione più elaborata, nel repository GitHub di loki-shell.

Nota che questo tutorial non cambierà alcun comportamento esistente intorno alla cronologia, quindi il comando della cronologia della shell esistente e le impostazioni della cronologia rimarranno inalterati. Invece, questo duplica la cronologia dei comandi su Loki con $PROMPT_COMMAND in Bash e precmd in Zsh. Sul lato CTRL+R delle cose, sovraccarica la funzione che fzf usa per accedere al comando CTRL+R. Provarlo è sicuro e, se decidi che non ti piace, segui i passaggi di disinstallazione nel repository GitHub per rimuovere tutte le tracce. La cronologia della tua shell non verrà modificata.

Passaggio 1:installa fzf

Esistono diversi modi per installare fzf, ma io preferisco il metodo Git:

git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf
~/.fzf/install

Dì di sì a tutte le richieste di domande.

Se hai già installato fzf, assicurati di avere le associazioni di tasti abilitate (cioè assicurati che quando digiti CTRL+R, fzf si apre). È possibile eseguire nuovamente l'installazione di fzf per abilitare le associazioni di tasti, se necessario.

Passaggio 2:installa loki-shell

Come fzf, anche loki-shell ha un repository Git e uno script di installazione:

git clone --depth 1 https://github.com/slim-bean/loki-shell.git ~/.loki-shell
~/.loki-shell/install

Innanzitutto, lo script crea il ~/.loki-shell directory in cui verranno conservati tutti i file (inclusi i dati Loki). Successivamente, scaricherà i binari per Promtail, LogCLI e Loki.

Quindi chiederà:

Do you want to install Loki? ([y]/n)

Se hai già un Loki centralizzato in esecuzione per loki-shell, puoi rispondere a n; tuttavia, per questo tutorial, rispondi y oppure premi Invio.

Sono disponibili due opzioni per eseguire Loki localmente:come immagine Docker o come singolo binario (con supporto per l'aggiunta di un servizio systemd). Consiglio di usare Docker se è disponibile, perché penso che semplifichi un po' le operazioni, ma entrambi funzionano bene.

Esecuzione con Docker

Per eseguire Loki come immagine 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 è la prima volta che esegui l'installazione, puoi ignorare i messaggi di errore. Questo script interromperà e sostituirà un contenitore Loki in esecuzione se la versione non corrisponde, il che ti consente di eseguire nuovamente questo script per aggiornare Loki.

Questo è tutto! Loki è ora in esecuzione come contenitore Docker.

I dati di Loki verranno archiviati in ~/.loki-shell/data .

L'immagine viene eseguita con --restart=unless-stopped , quindi si riavvierà al riavvio ma rimarrà interrotto se esegui docker stop loki-shell .

(Se stai usando Docker, puoi passare all'integrazione con Shell.)

In esecuzione come binario

Esistono molti modi per eseguire un binario su un sistema Linux. Questo script può installare un servizio systemd. Se non hai systemd, puoi comunque utilizzare l'installazione 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

Lo script sputerà fuori il comando che devi usare per eseguire Loki e sarai tu a configurare uno script init o un altro metodo per avviarlo automaticamente.

Puoi eseguire il comando direttamente, se lo desideri, ed eseguire Loki dalla shell corrente.

Se fai hai systemd, hai la possibilità di lasciare che lo script installi il servizio systemd o di mostrarti i comandi per eseguirlo tu stesso:

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)

Integrazione della shell

Indipendentemente da come hai installato Loki, ora dovresti vedere un messaggio:

Enter the URL for your Loki server or press enter for default (http://localhost:4100)

Se avessi impostato un Loki centralizzato, inseriresti quell'URL qui. Tuttavia, questa demo utilizza solo l'impostazione predefinita, quindi puoi premere Invio.

Verrà sputato un sacco di testo che spiega tutte le voci aggiunte al tuo ~.bashrc o ~.zshrc (o entrambi).

Ecco fatto!

Finished. Restart your shell or reload config file.
   source ~/.bashrc  # bash
   source ~/.zshrc   # zsh

Fase 3:provalo!

Inizia a usare la tua shell e usa CTRL+R per vedere i tuoi comandi.

Apri più finestre di terminale, digita un comando in una e CTRL+R in un'altra e vedrai i tuoi comandi immediatamente disponibili.

Notare inoltre che quando si passa da un terminale all'altro e si immettono comandi, questi sono immediatamente disponibili con CTRL+R, ma l'operazione della freccia su non è influenzata tra i terminali. (Questo potrebbe non essere vero se hai installato Oh My Zsh, poiché aggiunge automaticamente tutti i comandi alla cronologia.)

Usa CTRL+R più volte per alternare tra l'ordinamento per ora e per pertinenza.

Tieni presente che questa configurazione mostrerà solo la cronologia delle query degli host correnti, anche se invii dati shell da più host a Loki. Penso che per impostazione predefinita questo abbia più senso. C'è molto che puoi modificare se vuoi che questo comportamento cambi; guarda il repository loki-shell per saperne di più.

Ha anche installato un alias chiamato hist :

alias hist="$HOME/.loki-shell/bin/logcli --addr=$LOKI_URL"

LogCLI può essere utilizzato per interrogare ed eseguire ricerche nella cronologia direttamente in Loki, inclusa la possibilità di cercare altri host. Consulta la guida introduttiva di LogCLI per ulteriori informazioni sulle query.

Il log query language di Loki (LogQL) fornisce query metriche che ti consentono di fare cose interessanti; ad esempio, posso vedere quante volte ho emesso il kc command (il mio alias per kubectl) negli ultimi 30 giorni:

Credito extra

Installa Grafana e gioca con la cronologia della shell:

docker run -d -p 3000:3000 --name=grafana grafana/grafana

Apri un browser web su http://localhost:3000 e accedi utilizzando l'impostazione predefinita admin/admin nome utente e password.

Sulla sinistra, vai a Configurazione -> Origini dati , fai clic su Aggiungi origine dati e seleziona Loki .

Per l'URL, dovresti essere in grado di utilizzare http://localhost:4100 (tuttavia, sulla mia macchina WSL2, dovevo utilizzare l'indirizzo IP effettivo del computer).

Fai clic su Salva e verifica . Dovresti vedere Sorgente dati collegata ed etichette trovate .

Fai clic su Esplora icona a sinistra, assicurati che il Loki l'origine dati è selezionata e prova una query:

{job="shell"}

Se hai più host che inviano comandi shell, puoi limitare i risultati a un determinato host usando il hostname etichetta:

{job="shell", hostname="myhost"}.

Puoi anche cercare comandi specifici con espressioni di filtro:

{job="shell"} |= "docker"

Oppure puoi iniziare a esplorare il mondo delle metriche dai log per vedere quanto spesso usi la tua shell:

rate({job="shell"}[1m])

Vuoi ricostruire una sequenza temporale da un incidente? Puoi filtrare in base a un comando specifico e vedere quando è stato eseguito.

Per vedere cos'altro puoi fare e saperne di più sul linguaggio di query di Loki, consulta la guida LogQL.

Pensieri finali

Per ulteriori idee, risoluzione dei problemi e aggiornamenti, segui il repository GitHub. Questo è ancora un lavoro in corso, quindi segnala eventuali problemi lì.

Per saperne di più su Loki, controlla la documentazione, i post del blog e il repository GitHub, oppure provalo in Grafana Cloud.

Un ringraziamento speciale al mio collega Jack Baldry per aver piantato il seme per questa idea. Conoscevo Loki per far sì che ciò accadesse, ma se non fosse stato per il suo suggerimento, non credo che ce l'avrei mai fatta qui.


Linux
  1. Come programmare con Bash:sintassi e strumenti

  2. Navigazione nella shell Bash con pushd e popd

  3. Come rendere natalizio il tuo terminale e shell Linux

  4. Stai colorando il tuo terminale e l'ambiente della shell?

  5. Cronologia dei comandi di Linux con data e ora

Come lavorare con File e Shell Provisioner in Vagrant

Comando della cronologia con esempi

Usa il tuo Chromecast da Linux e MacOS con mkchromecast

Bash Beginner Series n. 1:crea ed esegui il tuo primo script Bash Shell

Come trovare la posizione dei tuoi server con Traceroute e WHOIS

Leggi e analizza i tuoi log di sistema Linux con Journalctl