Повысьте уровень своей истории оболочки с Loki и fzf

Loki – это платформа для агрегирования журналов с открытым исходным кодом под лицензией Apache 2.0, разработанная Grafana Labs и созданная при огромной поддержке растущего сообщества. Это также проект, над которым я работаю каждый день. В этой статье, вместо того, чтобы просто говорить о том, как работает Loki, я дам практическое введение в решение реальных проблем с его помощью.

Проблема: надежная централизованная история оболочки

Мне нравится история моей оболочки, и я всегда был фанатичным пользователем CTRL + R.

Внезапно поиск команд пошел отсюда:

 

К этому:

Хотя fzf значительно улучшил качество моей жизни, в моей истории оболочки все еще отсутствовали некоторые детали:

  • Потеря истории оболочки, когда терминалы внезапно закрываются, компьютеры выходят из строя, компьютеры умирают, ключи шифрования всего диска забываются
  • Имея доступ к моей истории оболочки со всех моих компьютеров на всех моих компьютерах

Я думаю о своей истории оболочки как о документации: это важная история, которую я не хочу терять. Объединение Loki с моей историей оболочки помогает решить эти и другие проблемы.

О Локи

 

Loki использует интуитивно понятную модель меток, которую проект Prometheus с открытым исходным кодом использует для показателей, и расширяет ее до мира агрегирования журналов. Это позволяет разработчикам и операторам легко переключаться между своими метриками и журналами, используя один и тот же набор ярлыков. Даже если вы не используете Prometheus, есть еще множество причин, по которым Loki может хорошо подходить для ваших нужд хранения журналов:

 

  • Низкие накладные расходы: Loki не выполняет полнотекстовую индексацию журналов; он только создает индекс ярлыков, которые вы помещаете в свои журналы. Сохранение небольшого индекса существенно снижает эксплуатационные требования Loki. Я запускаю свой проект loki-shell, в котором Loki используется для хранения истории оболочки, на Raspberry Pi, используя чуть более 50 МБ памяти.
  • Низкая стоимость: содержимое журнала сжимается и хранится в хранилищах объектов, таких как Amazon S3, Google Cloud Storage, Azure Blob, или даже непосредственно в файловой системе. Наша цель – использовать недорогое и долговечное хранилище.
  • Гибкость: Loki доступен в виде единого двоичного файла, который можно загрузить и запустить напрямую, или как образ Docker для запуска в любой среде контейнера. Для быстрого начала работы в Kubernetes доступна диаграмма Helm . Если вы многого требуете от инструментов ведения журналов, взгляните на производственную установку, запущенную в Grafana Labs. Он использует Jsonnet и Tanka с открытым исходным кодом для развертывания одного и того же образа Loki в качестве дискретных строительных блоков, чтобы обеспечить массовое горизонтальное масштабирование, высокую доступность, репликацию, раздельное масштабирование путей чтения и записи, высокую степень распараллеливания запросов и многое другое.

Таким образом, подход Loki состоит в том, чтобы вести небольшой индекс метаданных о ваших журналах (метках) и хранить неиндексированное и сжатое содержимое журнала в недорогих хранилищах объектов, чтобы упростить и удешевить работу. Приложение создано для работы как единый процесс и легко превращается в высокодоступную распределенную систему. Вы можете получить высокую производительность запросов при больших рабочих нагрузках журналирования за счет распараллеливания и сегментирования запросов – что-то вроде MapReduce для ваших журналов.

Кроме того, эта функция доступна для всех бесплатно. Как с графана открытой наблюдаемости платформы, графана Labs стремится сделать Локи полнофункциональный, полностью открыт журнал агрегации программного обеспечения каждый может использовать.

Начать

Я запускаю Loki на Raspberry Pi в своей домашней сети и храню свою историю оболочки за пределами сайта в корзине S3.

Когда я нажимаю CTRL + R, интерфейс командной строки Loki LogCLI делает несколько запросов на пакетную обработку, которые передаются в fzf. Вот пример – в верхней части показаны журналы сервера Loki на Pi.

 

Готовы попробовать? Следующее руководство поможет вам настроить и запустить Loki для интеграции с историей оболочки. Поскольку это руководство призвано упростить задачу, эта установка будет запускать Loki локально на вашем компьютере и сохранять все файлы в файловой системе.

Вы можете найти все это, а также информацию о том, как настроить более сложную установку, в репозитории loki-shell на GitHub .

Обратите внимание, что это руководство не изменит какое-либо существующее поведение в вашей истории, поэтому существующие команды истории оболочки и настройки истории останутся нетронутыми. Вместо этого это дублирует историю команд в Loki $PROMPT_COMMANDв Bash и precmdZsh. Что касается CTRL + R, он перегружает функцию, которую fzf использует для доступа к команде CTRL + R. Это безопасно, и если вы решите, что вам это не нравится, просто следуйте инструкциям по удалению в репозитории GitHub, чтобы удалить все следы. История вашей оболочки останется нетронутой.

Шаг 1. Установите fzf

Есть несколько способов установить fzf, но я предпочитаю метод Git :

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

Скажите да на все вопросы.

Если у вас уже установлен fzf, убедитесь, что у вас включены привязки клавиш (т.е. убедитесь, что при нажатии CTRL + R появляется сообщение fzf). Вы можете повторно запустить установку fzf, чтобы при необходимости включить привязку клавиш.

Шаг 2: Установите loki-shell

Как и fzf, loki-shell также имеет репозиторий Git и скрипт установки:

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

Сначала сценарий создает ~/.loki-shellкаталог, в котором будут храниться все файлы (включая данные Loki). Затем он загрузит двоичные файлы для Promtail , LogCLI и Loki.

Потом спросит:

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

Если у вас уже есть централизованный Loki, работающий для loki-shell, вы можете ответить n; однако для этого руководства ответьте yили нажмите Enter.

Есть два варианта локального запуска Loki: как образ Docker или как отдельный двоичный файл (с поддержкой добавления службы systemd). Я рекомендую использовать Docker, если он доступен, так как я думаю, что он немного упрощает операции, но оба работают нормально.

Запуск с докером

Чтобы запустить Loki как образ 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

Если вы запускаете установку впервые, не обращайте внимания на сообщения об ошибках. Этот сценарий остановит и заменит работающий контейнер Loki, если версия не совпадает, что позволяет повторно запустить этот сценарий для обновления Loki.

Это оно! Loki теперь работает как контейнер Docker.

Данные от Loki будут храниться в формате ~/.loki-shell/data.

Образ запускается с --restart=unless-stopped, поэтому он перезапустится при перезагрузке, но останется остановленным, если вы запустите docker stop loki-shell.

(Если вы используете Docker, вы можете перейти к интеграции с оболочкой .)

Работает как двоичный

Есть много способов запустить двоичный файл в системе Linux. Этот сценарий может установить службу systemd. Если у вас нет systemd, вы все равно можете использовать двоичную установку:

[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

Сценарий выдаст команду, которую необходимо использовать для запуска Loki, и вы сможете самостоятельно настроить сценарий инициализации или другой метод его автоматического запуска.

Вы можете запустить команду напрямую, если хотите, и запустить Loki из текущей оболочки.

Если же у Systemd, у вас есть возможность позволить сценарий установки Systemd службы или показывая вам команды для запуска его самостоятельно:

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)

Интеграция с оболочкой

Независимо от того, как вы установили Loki, теперь вы должны увидеть подсказку:

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

Если вы настроили централизованный Loki, вы должны ввести этот URL здесь. Однако в этой демонстрации просто используется значение по умолчанию, поэтому вы можете нажать Enter.

Появится много текста, объясняющего все записи, добавленные к вам ~.bashrcили ~.zshrc(или к обоим).

Это оно!

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

Шаг 3: Попробуйте!

Начните использовать свою оболочку и используйте CTRL + R, чтобы увидеть свои команды.

Откройте несколько окон терминала, введите команду в одном и CTRL + R в другом, и вы сразу увидите, что ваши команды доступны.

Также обратите внимание, что когда вы переключаетесь между терминалами и вводите команды, они становятся доступными сразу с помощью CTRL + R, но на работу стрелки вверх между терминалами не влияет. (Это может быть неверно, если у вас установлен Oh My Zsh , поскольку он автоматически добавляет все команды в историю.)

Используйте CTRL + R несколько раз, чтобы переключаться между сортировкой по времени и по релевантности.

Обратите внимание, что эта конфигурация будет отображать только историю запросов текущих хостов, даже если вы отправляете данные оболочки с нескольких хостов в Loki. Я думаю, что по умолчанию это наиболее разумно. Вы можете многое изменить, если хотите, чтобы это поведение изменилось; см. репозиторий loki-shell, чтобы узнать больше.

Он также установил псевдоним под названием hist:

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

LogCLI можно использовать для запроса и поиска в вашей истории непосредственно в Loki, в том числе для поиска на других хостах. Ознакомьтесь с руководством по началу работы с LogCLI, чтобы узнать больше о запросах.

Язык запросов журнала Loki (LogQL) предоставляет метрические запросы, которые позволяют вам делать некоторые интересные вещи; например, я могу увидеть, сколько раз я kcвводил команду (мой псевдоним для kubectl) за последние 30 дней:

Дополнительный кредит

Установите Grafana и поэкспериментируйте со своей историей оболочки:

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

Откройте веб-браузер http://localhost:3000и войдите в систему, используя имя пользователя и пароль admin / admin по умолчанию .

Слева перейдите в раздел «Конфигурация» -> «Источники данных» , нажмите кнопку « Добавить источник данных» и выберите « Локи» .

Для URL-адреса вы должны иметь возможность использовать http://localhost:4100(однако на моем компьютере WSL2 мне пришлось использовать фактический IP-адрес компьютера).

Щелкните Сохранить и проверить . Вы должны увидеть Источник данных подключен и метки найдены .

Щелкните значок « Обзор» слева, убедитесь, что выбран источник данных Loki , и попробуйте выполнить запрос:

{job="shell"}

Если у вас есть несколько хостов, отправляющих команды оболочки, вы можете ограничить результаты определенным хостом, используя hostnameметку:

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

Вы также можете искать определенные команды с помощью выражений фильтра:

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

Или вы можете начать изучать мир метрик из журналов, чтобы узнать, как часто вы используете свою оболочку:

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

Хотите восстановить хронологию происшествия? Вы можете фильтровать по конкретной команде и видеть, когда она запускалась.

 

Чтобы узнать, что еще вы можете сделать, и узнать больше о языке запросов Loki, ознакомьтесь с руководством по LogQL .

Последние мысли

Для получения дополнительных идей, устранения неполадок и обновлений следите за репозиторием GitHub .