GNU/Linux >> Tutoriels Linux >  >> Linux

Améliorez votre historique de shell avec Loki et fzf

Loki est un framework d'agrégation de journaux open source sous licence Apache 2.0 conçu par Grafana Labs et construit avec un soutien considérable d'une communauté en pleine croissance. C'est aussi le projet sur lequel je travaille au quotidien. Dans cet article, plutôt que de simplement parler du fonctionnement de Loki, je vais fournir une introduction pratique à la résolution de vrais problèmes.

Le problème :un historique centralisé durable du shell

J'adore l'histoire de mon shell et j'ai toujours été un utilisateur fanatique de CTRL+R. Il y a environ un an, ma vie de terminal a changé pour toujours lorsque mon collègue Dieter Plaetinck m'a présenté le chercheur flou en ligne de commande fzf .

Soudain, la recherche dans les commandes est passée de ceci :

À ceci :

Bien que fzf ait considérablement amélioré ma qualité de vie, il manquait encore quelques éléments dans mon historique de shell :

  • Perte de l'historique du shell lorsque les terminaux se ferment brusquement, les ordinateurs plantent, les ordinateurs meurent, les clés de chiffrement du disque entier sont oubliées
  • Avoir accès à mon historique de shell depuis tous mes ordinateurs sur tous mes ordinateurs

Je considère l'histoire de mon shell comme de la documentation :c'est une histoire importante que je ne veux pas perdre. La combinaison de Loki avec mon historique de shell aide à résoudre ces problèmes et plus encore.

À propos de Loki

Explorez le cloud open source

  • Comprendre les nuages
  • Cours en ligne gratuit :Développer des applications cloud natives avec des architectures de microservices
  • Qu'est-ce que le cloud hybride ?
  • eBook :Élaborer une stratégie de cloud hybride
  • Qu'est-ce que Kubernetes ?
  • Comprendre l'informatique en périphérie
  • Derniers articles pour les architectes informatiques

Loki prend le modèle d'étiquette intuitif que le projet open source Prometheus utilise pour les métriques et l'étend au monde de l'agrégation de journaux. Cela permet aux développeurs et aux opérateurs de basculer de manière transparente entre leurs métriques et leurs journaux en utilisant le même ensemble d'étiquettes. Même si vous n'utilisez pas Prometheus, il existe encore de nombreuses raisons pour lesquelles Loki pourrait convenir à vos besoins de stockage de journaux :

  • Faible surcharge : Loki ne fait pas d'indexation de journal en texte intégral; il crée uniquement un index des étiquettes que vous mettez sur vos journaux. Garder un petit index réduit considérablement les besoins de fonctionnement de Loki. J'exécute mon projet loki-shell, qui utilise Loki pour stocker l'historique du shell, sur un Raspberry Pi en utilisant un peu plus de 50 Mo de mémoire.
  • Faible coût : Le contenu du journal est compressé et stocké dans des magasins d'objets comme Amazon S3, Google Cloud Storage, Azure Blob, ou même directement sur un système de fichiers. L'objectif est d'utiliser un stockage peu coûteux et durable.
  • Flexibilité : Loki est disponible dans un seul binaire qui peut être téléchargé et exécuté directement ou en tant qu'image Docker pour s'exécuter dans n'importe quel environnement de conteneur. Un chart Helm est disponible pour démarrer rapidement dans Kubernetes. Si vous exigez beaucoup de vos outils de journalisation, jetez un œil à la configuration de production en cours d'exécution chez Grafana Labs. Il utilise Jsonnet et Tanka open source pour déployer la même image Loki sous forme de blocs de construction discrets afin de permettre une mise à l'échelle horizontale massive, une haute disponibilité, une réplication, une mise à l'échelle séparée des chemins de lecture et d'écriture, des requêtes hautement parallélisables, etc.

En résumé, l'approche de Loki consiste à conserver un petit index de métadonnées sur vos journaux (étiquettes) et à stocker le contenu des journaux non indexé et compressé dans des magasins d'objets bon marché pour rendre l'exploitation plus facile et moins chère. L'application est conçue pour s'exécuter en tant que processus unique et évoluer facilement vers un système distribué hautement disponible. Vous pouvez obtenir des performances de requête élevées sur des charges de travail de journalisation plus importantes grâce à la parallélisation et au partitionnement des requêtes, un peu comme MapReduce pour vos journaux.

De plus, cette fonctionnalité est disponible gratuitement pour tous. Comme pour sa plate-forme d'observabilité ouverte Grafana, Grafana Labs s'engage à faire de Loki un logiciel d'agrégation de journaux complet et entièrement ouvert que tout le monde peut utiliser.

Commencer

J'exécute Loki sur un Raspberry Pi sur mon réseau domestique et stocke mon historique de shell hors site dans un compartiment S3.

Lorsque j'appuie sur CTRL + R, l'interface de ligne de commande LogCLI de Loki effectue plusieurs requêtes de traitement par lots qui sont diffusées dans fzf. Voici un exemple :la partie supérieure montre les journaux du serveur Loki sur le Pi.

Prêt à essayer ? Le guide suivant vous aidera à configurer et à exécuter Loki pour qu'il soit intégré à l'historique de votre shell. Étant donné que ce didacticiel vise à simplifier les choses, cette configuration exécutera Loki localement sur votre ordinateur et stockera tous les fichiers sur le système de fichiers.

Vous pouvez trouver tout cela, ainsi que des informations sur la façon de configurer une installation plus élaborée, dans le référentiel GitHub loki-shell.

Notez que ce didacticiel ne modifiera aucun comportement existant autour de votre historique, donc votre commande d'historique de shell existante et vos paramètres d'historique ne seront pas modifiés. Au lieu de cela, cela duplique l'historique des commandes à Loki avec $PROMPT_COMMAND dans Bash et precmd en Zsh. Du côté CTRL+R, il surcharge la fonction que fzf utilise pour accéder à la commande CTRL+R. Essayer ceci est sûr, et si vous décidez que vous ne l'aimez pas, suivez simplement les étapes de désinstallation dans le référentiel GitHub pour supprimer toutes les traces. Votre historique de shell sera intact.

Étape 1 :Installer fzf

Il existe plusieurs façons d'installer fzf, mais je préfère la méthode Git :

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

Dites oui à toutes les invites de questions.

Si vous avez déjà installé fzf, assurez-vous que les raccourcis clavier sont activés (c'est-à-dire, assurez-vous que lorsque vous tapez CTRL + R, fzf apparaît). Vous pouvez relancer l'installation de fzf pour activer les raccourcis clavier si nécessaire.

Étape 2 :Installer loki-shell

Comme fzf, loki-shell dispose également d'un référentiel Git et d'un script d'installation :

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

Tout d'abord, le script crée le ~/.loki-shell répertoire où tous les fichiers seront conservés (y compris les données Loki). Ensuite, il téléchargera les fichiers binaires pour Promtail, LogCLI et Loki.

Ensuite, il vous demandera :

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

Si vous avez déjà un Loki centralisé fonctionnant pour loki-shell, vous pouvez répondre n; cependant, pour ce tutoriel, répondez y ou appuyez sur Entrée.

Deux options sont disponibles pour exécuter Loki localement :en tant qu'image Docker ou en tant que binaire unique (avec prise en charge de l'ajout d'un service systemd). Je recommande d'utiliser Docker s'il est disponible, car je pense que cela simplifie un peu les opérations, mais les deux fonctionnent très bien.

Exécuter avec Docker

Pour exécuter Loki en tant qu'image 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 c'est la première fois que vous exécutez l'installation, vous pouvez ignorer les messages d'erreur. Ce script arrêtera et remplacera un conteneur Loki en cours d'exécution si la version ne correspond pas, ce qui vous permet de réexécuter ce script pour mettre à niveau Loki.

C'est ça! Loki fonctionne maintenant en tant que conteneur Docker.

Les données de Loki seront stockées dans ~/.loki-shell/data .

L'image s'exécute avec --restart=unless-stopped , il redémarrera donc au redémarrage mais restera arrêté si vous exécutez docker stop loki-shell .

(Si vous utilisez Docker, vous pouvez passer directement à l'intégration Shell.)

Exécuter en binaire

Il existe de nombreuses façons d'exécuter un binaire sur un système Linux. Ce script peut installer un service systemd. Si vous n'avez pas systemd, vous pouvez toujours utiliser l'installation binaire :

[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

Le script crachera la commande que vous devez utiliser pour exécuter Loki, et vous serez seul pour configurer un script d'initialisation ou une autre méthode de démarrage automatique.

Vous pouvez exécuter la commande directement, si vous le souhaitez, et exécuter Loki à partir de votre shell actuel.

Si vous faites ont systemd, vous avez la possibilité de laisser le script installer le service systemd ou de vous montrer les commandes pour l'exécuter vous-même :

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)

Intégration Shell

Quelle que soit la manière dont vous avez installé Loki, vous devriez maintenant voir une invite :

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

Si vous aviez configuré un Loki centralisé, vous entreriez cette URL ici. Cependant, cette démo utilise uniquement la valeur par défaut, vous pouvez donc appuyer sur Entrée.

Beaucoup de texte crachera expliquant toutes les entrées ajoutées à votre ~.bashrc ou ~.zshrc (ou les deux).

C'est tout !

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

Étape 3 :essayez-le !

Commencez à utiliser votre shell et utilisez CTRL+R pour voir vos commandes.

Ouvrez plusieurs fenêtres de terminal, tapez une commande dans l'une et CTRL+R dans une autre, et vous verrez vos commandes disponibles immédiatement.

Notez également que lorsque vous basculez entre les terminaux et entrez des commandes, elles sont disponibles immédiatement avec CTRL+R, mais le fonctionnement de la flèche vers le haut n'est pas affecté entre les terminaux. (Cela peut ne pas être vrai si vous avez installé Oh My Zsh, car il ajoute automatiquement toutes les commandes à l'historique.)

Utilisez CTRL+R plusieurs fois pour basculer entre le tri par heure et par pertinence.

Notez que cette configuration n'affichera que l'historique des requêtes des hôtes actuels, même si vous envoyez des données de shell de plusieurs hôtes à Loki. Je pense que par défaut, cela a le plus de sens. Il y a beaucoup de choses que vous pouvez modifier si vous voulez que ce comportement change; consultez le référentiel loki-shell pour en savoir plus.

Il a également installé un alias appelé hist :

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

LogCLI peut être utilisé pour interroger et rechercher votre historique directement dans Loki, vous permettant notamment de rechercher d'autres hôtes. Consultez le guide de démarrage de LogCLI pour en savoir plus sur les requêtes.

Le langage de requête de journal de Loki (LogQL) fournit des requêtes métriques qui vous permettent de faire des choses intéressantes ; par exemple, je peux voir combien de fois j'ai émis le kc commande (mon alias pour kubectl) au cours des 30 derniers jours :

Crédit supplémentaire

Installez Grafana et jouez avec l'historique de votre shell :

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

Ouvrez un navigateur Web à l'adresse http://localhost:3000 et connectez-vous en utilisant l'admin/admin par défaut nom d'utilisateur et mot de passe.

Sur la gauche, accédez à Configuration -> Sources de données , cliquez sur Ajouter une source de données et sélectionnez Loki .

Pour l'URL, vous devriez pouvoir utiliser http://localhost:4100 (cependant, sur ma machine WSL2, je devais utiliser l'adresse IP réelle de l'ordinateur).

Cliquez sur Enregistrer et tester . Vous devriez voir Source de données connectée et libellés trouvés .

Cliquez sur Explorer sur la gauche, assurez-vous que le Loki la source de données est sélectionnée et essayez une requête :

{job="shell"}

Si plusieurs hôtes envoient des commandes shell, vous pouvez limiter les résultats à un certain hôte en utilisant le hostname étiquette :

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

Vous pouvez également rechercher des commandes spécifiques avec des expressions de filtre :

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

Ou vous pouvez commencer à explorer le monde des métriques à partir des journaux pour voir à quelle fréquence vous utilisez votre shell :

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

Vous souhaitez reconstruire une chronologie à partir d'un incident ? Vous pouvez filtrer par une commande spécifique et voir quand elle a été exécutée.

Pour voir ce que vous pouvez faire d'autre et en savoir plus sur le langage de requête de Loki, consultez le guide LogQL.

Réflexions finales

Pour plus d'idées, de dépannage et de mises à jour, suivez le référentiel GitHub. Il s'agit toujours d'un travail en cours, veuillez donc signaler tout problème.

Pour en savoir plus sur Loki, consultez la documentation, les articles de blog et le référentiel GitHub, ou essayez-le dans Grafana Cloud.


Un merci spécial à mon collègue Jack Baldry pour avoir semé la graine de cette idée. J'avais les connaissances de Loki pour que cela se produise, mais sans sa suggestion, je ne pense pas que j'aurais jamais réussi ici.


Linux
  1. Contrôlez l'heure et la date de votre ordinateur avec systemd

  2. Comment programmer avec Bash :syntaxe et outils

  3. Naviguer dans le shell Bash avec pushd et popd

  4. Vélocité terminale :se déplacer rapidement dans votre coquille

  5. Enregistrez votre terminal avec script et scriptreplay

Comment travailler avec File and Shell Provisioner dans Vagrant

Commande d'historique avec exemples

Utilisez votre Chromecast depuis Linux et MacOS avec mkchromecast

Bash Beginner Series #1 :Créez et exécutez votre premier script shell Bash

Comment trouver l'emplacement de vos serveurs avec Traceroute et WHOIS

Lisez et analysez vos journaux système Linux avec Journalctl