GNU/Linux >> Linux の 問題 >  >> Linux

Lokiとfzfでシェルの履歴をレベルアップ

Lokiは、Apache 2.0ライセンスのオープンソースログ集約フレームワークであり、Grafana Labsによって設計され、成長するコミュニティからの多大なサポートを受けて構築されています。それは私が毎日取り組んでいるプロジェクトでもあります。この記事では、Lokiのしくみについて話すだけでなく、Lokiの実際の問題を解決するための実践的な紹介を提供します。

問題:耐久性のある集中型シェル履歴

私は自分のシェルの歴史が大好きで、常に熱狂的なCTRL+Rユーザーでした。約1年前、同僚のディーター・プレティンクがコマンドラインのあいまい検索ツール fzf を紹介してくれたとき、私の終末期は一変しました。 。

突然、コマンドの検索は次のようになりました:

これに:

fzfは私の生活の質を大幅に改善しましたが、シェルの歴史にはまだいくつかの部分が欠けていました:

  • 端末が突然閉じたり、コンピューターがクラッシュしたり、コンピューターが停止したり、ディスク全体の暗号化キーが忘れられたりすると、シェルの履歴が失われます
  • シェル履歴にからアクセスできる すべてのコンピュータが すべてのコンピューター

私のシェルの歴史はドキュメンテーションだと思います。それは私が失いたくない重要な物語です。ロキと私のシェルの歴史を組み合わせると、これらの問題などを解決するのに役立ちます。

ロキについて

オープンソースクラウドを探索する

  • 雲を理解する
  • 無料のオンラインコース:マイクロサービスアーキテクチャを使用したクラウドネイティブアプリケーションの開発
  • ハイブリッドクラウドとは何ですか?
  • eBook:ハイブリッドクラウド戦略の構築
  • Kubernetesとは何ですか?
  • エッジコンピューティングについて
  • ITアーキテクト向けの最新記事

Lokiは、オープンソースのPrometheusプロジェクトがメトリックに使用する直感的なラベルモデルを採用し、ログ集約の世界に拡張します。これにより、開発者とオペレーターは、同じラベルのセットを使用して、メトリックとログの間をシームレスにピボットできます。 Prometheusを使用していない場合でも、Lokiがログストレージのニーズに適している理由はたくさんあります。

  • 低いオーバーヘッド: Lokiはフルテキストログのインデックス作成を行いません。ログに付けたラベルのインデックスのみを作成します。小さなインデックスを維持することで、Lokiの運用要件が大幅に削減されます。 Lokiを使用してシェル履歴を保存するloki-shellプロジェクトを、50MB強のメモリを使用するRaspberryPiで実行しています。
  • 低コスト: ログの内容は圧縮され、Amazon S3、Google Cloud Storage、Azure Blobなどのオブジェクトストアに保存されます。さらに、ファイルシステムに直接保存されます。目標は、安価で耐久性のあるストレージを使用することです。
  • 柔軟性: Lokiは、ダウンロードして直接実行することも、Dockerイメージとして任意のコンテナ環境で実行することもできる単一のバイナリで利用できます。ヘルムチャートを使用して、Kubernetesをすばやく開始できます。ロギングツールに多くのことを要求する場合は、GrafanaLabsで実行されている本番セットアップを確認してください。オープンソースのJsonnetとTankaを使用して、個別のビルディングブロックと同じLokiイメージをデプロイし、大規模な水平スケーリング、高可用性、レプリケーション、読み取りパスと書き込みパスの個別のスケーリング、高度に並列化可能なクエリなどを実現します。

要約すると、Lokiのアプローチは、ログ(ラベル)に関するメタデータの小さなインデックスを保持し、インデックス付けされていない圧縮されたログコンテンツを安価なオブジェクトストアに保存して、操作をより簡単かつ安価にすることです。このアプリケーションは、単一のプロセスとして実行され、可用性の高い分散システムに簡単に進化するように構築されています。クエリの並列化とシャーディングにより、大規模なログワークロードで高いクエリパフォーマンスを得ることができます。これは、ログのMapReduceに少し似ています。

さらに、この機能は誰でも無料で利用できます。 Grafanaのオープンな可観測性プラットフォームと同様に、Grafana Labsは、Lokiを誰でも使用できる、完全な機能を備えた完全にオープンなログ集計ソフトウェアにすることに取り組んでいます。

はじめに

ホームネットワークのRaspberryPiでLokiを実行し、シェル履歴をオフサイトのS3バケットに保存しています。

Ctrl + Rキーを押すと、LokiのLogCLIコマンドラインインターフェイスがいくつかのバッチ要求を行い、それがfzfにストリーミングされます。次に例を示します。上部には、Pi上のLokiサーバーログが表示されます。

試してみる準備はできましたか?次のガイドは、シェル履歴と統合するためにLokiを設定して実行するのに役立ちます。このチュートリアルは物事をシンプルにすることを目的としているため、このセットアップではLokiをコンピューター上でローカルに実行し、すべてのファイルをファイルシステムに保存します。

これらすべてに加えて、より複雑なインストールをセットアップする方法に関する情報は、loki-shellGitHubリポジトリにあります。

このチュートリアルでは、履歴に関する既存の動作は変更されないため、既存のシェル履歴コマンドと履歴設定は変更されないことに注意してください。 代わりに、これは$PROMPT_COMMANDを使用してコマンド履歴をLokiに複製します Bashとprecmdで Zshで。 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-shell用に集中型のLokiを実行している場合は、nと答えることができます。;ただし、このチュートリアルでは、yと答えてください またはEnterキーを押します。

Lokiをローカルで実行するために使用できるオプションは2つあります。Dockerイメージとして、または単一のバイナリとして(systemdサービスの追加をサポート)。 Dockerが利用できる場合は、操作が少し簡単になると思うので、Dockerを使用することをお勧めしますが、どちらも問題なく機能します。

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を実行するために使用する必要のあるコマンドを吐き出し、initスクリプトまたはそれを自動起動する別の方法を自分で設定します。

必要に応じて、コマンドを直接実行し、現在のシェルから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を使用してコマンドを表示します。

複数のターミナルウィンドウを開き、1つにコマンドを入力し、もう1つに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を発行した回数を確認できます 過去30日間のコマンド(kubectlの私のエイリアス):

追加のクレジット

Grafanaをインストールして、シェルの履歴を試してみてください:

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

http://localhost:3000でWebブラウザを開きます デフォルトのadmin/ adminを使用してログインします ユーザー名とパスワード。

左側で、構成->データソースに移動します 、データソースの追加をクリックします ボタンをクリックし、ロキを選択します 。

URLには、http://localhost:4100を使用できるはずです。 (ただし、私のWSL2マシンでは、コンピューターの実際のIPアドレスを使用する必要がありました。)

保存してテストをクリックします 。 接続されたデータソースと見つかったラベルが表示されます 。

探索をクリックします 左側のアイコンで、ロキを確認してください データソースを選択し、クエリを試してください:

{job="shell"}

シェルコマンドを送信するホストがさらにある場合は、hostnameを使用して、結果を特定のホストに制限できます。 ラベル:

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

フィルタ式を使用して特定のコマンドを探すこともできます:

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

または、ログからメトリックの世界を探索して、シェルを使用している頻度を確認することもできます。

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

インシデントからタイムラインを再構築したいですか?特定のコマンドでフィルタリングして、いつ実行されたかを確認できます。

他に何ができるかを確認し、Lokiのクエリ言語について詳しく知るには、LogQLガイドをご覧ください。

最終的な考え

その他のアイデア、トラブルシューティング、更新については、GitHubリポジトリをフォローしてください。これはまだ進行中の作業なので、問題があれば報告してください。

Lokiの詳細については、ドキュメント、ブログ投稿、GitHubリポジトリを確認するか、GrafanaCloudで試してください。


このアイデアの種を蒔いてくれた同僚のジャック・バルドリーに特に感謝します。私はこれを実現するためのロキの知識を持っていましたが、彼の提案がなかったら、ここでそれを実現したことはなかったと思います。


Linux
  1. Bashでプログラミングする方法:構文とツール

  2. スクリプトとscriptreplayを使用して端末を記録します

  3. 日付と時刻を含む Linux コマンド履歴

  1. systemdでコンピューターの時刻と日付を制御する

  2. pushdとpopdを使用してBashシェルをナビゲートする

  3. Linuxターミナルとシェルをクリスマス化する方法

  1. ターミナルとシェル環境の色付け?

  2. 関数とパラメータを変数として持つシェルスクリプト?

  3. 壊れた歴史?