Grafana Loki は、アプリケーションやインフラストラクチャからのログを保存およびクエリするログ集約システムです。ありふれたものではありますが、ログにはシステム動作に関する重要な情報が含まれており、デバッグやトラブルシューティングの情報の貴重な情報源となります。ログは、悪意のあるアクティビティを特定して追跡するため、または単にユーザー アクティビティを追跡してビジネス インテリジェンスを提供するためによく使用されます。
以前のブログ投稿「 Grafana Loki と MinIO を使用したログ 」では、Loki のコンポーネントとその全体的なアーキテクチャの概要を説明しました。ログの Loki はメトリクスの Prometheus に似ていると考えてください。 Loki はメタデータのインデックス作成とクエリのみを行うため、軽量でコスト効率が高くなります。 Promtail エージェントは、Loki に送信する前にログを収集、ラベル付け、変換します。次に、Loki はメタデータのインデックスを作成し、ラベルでインデックスが付けられたストリームにエントリをグループ化します。次に、Grafana を使用して、Loki からのログ情報を視覚化し、クエリを実行します。バージョン 2.0 では、Loki は MinIO などの単一のオブジェクト ストレージ バックエンドにデータを保存します。前回のブログ投稿では Loki データを MinIO に保存する利点について説明しましたが、このブログ投稿はその方法を説明するチュートリアルです。
まず、Docker コンテナを使用して Loki と MinIO をデプロイする方法を説明し、次にソースからインストールする方法を説明します。
Docker コンテナ、いくつかのスクリプト、Git リポジトリを使用してデモを構築しました。まず Grafana Loki リポジトリから始めて、MinIO 用の設定 yaml とコンテナ、および Loki データ用の MinIO バケットを作成して公開するスクリプトを追加しました。次の手順により、これらの 5 つのイメージが Docker コンテナーでローカルに実行されます。
最初の 3 つは明らかに Loki、Promtail、Grafana に必要です。これらは、 Loki リポジトリの Grafana からすでに入手可能でした (短いビデオ説明があります)。 MinIO は Loki のオブジェクト ストレージであり、最終コンテナはバケットを Loki ターゲットとして作成するスクリプトを実行します。
Loki は、 loki.yaml
を使用してログ データを MinIO に保存するように構成されています。特に重要なのは次のセクションです。
storage_config: boltdb_shipper: active_index_directory: /loki/index cache_location: /loki/index_cache resync_interval: 5s shared_store: s3 aws: s3: http://minioadmin:minioadmin@minio.:9000/loki s3forcepathstyle: true
MinIO の S3 アドレスのドットに注目してください。 AWS リージョンを指定する必要がないため、これが使用されます。
docker-compose.yaml
ファイルを使用して Docker 環境を作成します。コンテナー、ボリューム、ポート、ネットワークを構成し、起動コマンドを提供します。
loki
イメージを、ボリューム経由で Loki 構成にアクセスできるコンテナとして実行するには、次の手順を実行します。
services: loki: image: grafana/loki:latest volumes: - <your-local-path>/loki/production:/home/loki/production ports: - "3100:3100" command: -config.file=/home/loki/production/loki.yaml networks: - loki
最初に行う必要がある構成は、 production
のローカル フォルダーがコンテナーと共有されていることを確認することです。 docker-compose.yaml
のvolumes
セクションを編集して、 production
フォルダーをダウンロードしたホスト システム上のローカル フォルダーを参照してください。 loki.yaml
読み取るために、ホスト パスをコンテナ パスにマッピングしています。
docker-compose.yaml
では、ネットワークも定義し、MinIO サーバーを実行するコンテナのポートを公開します。この場合、ブラウザで MinIO サーバーにアクセスできるように、ポート 9000 と 9001 がローカル マシンに公開されます。
Console UI: minio: image: minio/minio:latest ports: - "9000:9000" - "9001:9001" networks: - loki command: server ~ --address ':9000' --console-address ':9001'
すべてのコンテナがloki
ネットワークを共有するようにネットワークを構成します。各コンテナは他のコンテナに ping を送信し、その API を使用できます。コンテナーには固定 IP アドレスを使用しないでください。簡単にするために、環境内のloki
とminio
適切なコンテナーに解決されるように構成しました。例えば:
http://minio:9000 for MinIO http://loki:3100 for Loki http://loki:3000 for Grafana
docker-compose.yaml
によって実行される次のアクションは、コンテナ内で MinIO クライアント (mc) を実行して MinIO サーバーを構成し、Loki データの宛先バケットを作成し、必要に応じてアクセス ポリシーをpublic
に設定することです。
createbuckets: image: minio/mc networks: - loki depends_on: - minio entrypoint: > /bin/sh -c " /usr/bin/mc config host add myminio http://minio:9000 minioadmin minioadmin; /usr/bin/mc rm -r --force myminio/loki; /usr/bin/mc mb myminio/loki; /usr/bin/mc policy set public myminio/loki; exit 0; "
小さな Go プログラムである Promtail は、分散ログ ファイルを追跡または収集し、Loki に配信するために使用されます。このデモでは、Promtail は /var/log ディレクトリをスクレイピングする構成ファイルを使用してコンテナにデプロイされます。このデモを実行し、その場所 (/var/log) でログ ファイルを処理するために変更を行う必要はありません。
このチュートリアルの最後では、Promtail でシステム上の他の場所のログ ファイルを収集する方法について説明します。
Loki、Promtail、および Docker 環境の構成方法を理解したので、次の手順に従ってデモ環境を構成して実行してください。次の手順では、 docker-compose.yaml
、 loki.yaml
、およびデフォルトの Promtail 構成を使用して、Loki が MinIO とどのように連携するかを示します。ファイルをダウンロードしたら、ご使用の環境に合わせて編集してください。
このリポジトリhttps://github.com/cniackz/lokiのクローンを作成します。
git clone https://github.com/cniackz/loki.git minio-loki-tutorial
ディレクトリをローカルのproduction
フォルダーに変更します。
https://github.com/cniackz/loki/tree/main/production
cd <your-local-path>/minio-loki-tutorial/production Edit docker-compose.yaml to reference your local home directory If necessary, edit promtail.yaml
ローカルの Docker 環境を構築します。
docker-compose build --no-cache
ローカルの Docker コンテナを起動します。
docker-compose up -d
Loki データが MinIO に保存されていることを確認するには、 http://localhost:9001
またはhttp://minio:9001
で MinIO コンソールにログインします。このチュートリアルでは、次の認証情報を使用します。
user: minioadmin password: minioadmin
ログイン後、「バケット」をクリックします。 Loki バケットが作成されたことがわかります。
右側で「参照」をクリックして、新しく作成したバケットの内容を表示します。 loki
の下にfake
ディレクトリが表示されるはずです。 Loki がデータを保存する場所です。
その名前をクリックしてfake
ディレクトリを開きます。 Loki は、設定された間隔でログをメモリに保持し、オブジェクト ストレージに書き込みます。デフォルトの間隔は 5 分なので、データがバケットに表示されるまで 5 分間お待ちください。
この時点で、Promtail は Loki にログを送信し、Loki はデータを MinIO に保存しています。次に、Loki ログを表示するように Grafana を設定しましょう。 Grafana 6.0 以降には、Loki のサポートが組み込まれています。 Grafana 6.3 以降には、 LogQL機能のサポートが含まれています。
http://loki:3000
で Grafana にログインします (デフォルトの資格情報は admin:admin)。
Grafana で、左側のサイドバーにある歯車アイコンをクリックして、[構成]、[データ ソース] の順に移動します。大きな [データ ソースの追加] ボタンをクリックし、[Loki] を選択します。
http URL フィールドを、Docker ポート マッピングhttp://loki:3100
使用してローカルで実行されている Loki サーバー用に編集します。
次に、「保存してテスト」をクリックします。
ログをすぐに表示するには、「探索」をクリックします。左側のサイドバーの「探索」をクリックしてログを表示することもできます。どのような方法で探索しても、左上のドロップダウンで Loki データソースを選択し、[ログ ラベル] ボタンを使用してログ ストリームを選択します。
LogQL クエリを入力し、[クエリの実行] をクリックします。ただし、LogQL についてまだ知らない場合は、GUI を使用してログとクエリ パラメーターを選択できます。
Loki にあるログをすばやく確認するには、[ログ ブラウザー] をクリックし、 1. Select labels to search in
job
] を選択し、 2. Find values for the selected labels
] でジョブの名前をクリックします ( promtail-local-config.yaml
から) promtail-local-config.yaml
)。この場合は、 varlogs
をクリックしました。次に、「ログの表示」ボタンをクリックします。
ブラウザ ウィンドウの右上で、時間範囲を選択し、クエリの更新間隔を設定できます。
ログの詳細を表示するには、下にスクロールしてログ エントリの 1 つをクリックすると、ログ エントリに関連する追加情報が表示されます。
非常に強力な機能は、アイコンをクリックしてログの詳細からlabels
やfields
に関する統計を直接フィルタリングしたり表示したりできることです。これにより、繰り返し発生するエラーを探したり、検索用語を切り替えたりすることが容易になるため、トラブルシューティングが簡素化されます。
デモが実行されたら、次のステップは、Promtail に、ユースケースにとってより興味深いと思われる別のファイルのセットをスクレイピングさせることです。これを行うには、編集可能な構成ファイルを使用して Promtail を実行する必要があります。これを実現する 1 つの方法は、Docker でボリュームを使用することです。
docker-compose.yaml
ファイルを編集して、Promtail コンテナーからアクセスできる 2 つの新しいボリュームを作成します。 1 つ目は、新しい構成ファイルが作成されるホスト システム上のディレクトリへのアクセスを提供します。 2 つ目は、対象のログ ファイルが含まれるディレクトリへのアクセスを提供します。さらに、 Promtail はpromtail-local-config.yaml
と呼ばれる新しい構成ファイルを参照して起動されます。
version: "3" networks: loki: services: loki: image: grafana/loki:latest volumes: - <your-local-path>/loki/minio-loki-tutorial/production:/home/loki/production ports: - "3100:3100" command: -config.file=/home/loki/production/loki.yaml networks: - loki promtail: image: grafana/promtail:2.4.2 volumes: - /var/log:/var/log -- <your-local-path>/loki/minio-loki-tutorial/production:/home/loki/production -- <your-local-path>/access_logs:/home/loki/access_logs command: -config.file=/home/loki/production/promtail-local-config.yaml networks: - loki grafana: image: grafana/grafana:latest ports: - "3000:3000" networks: - loki minio: image: minio/minio:latest ports: - "9000:9000" - "9001:9001" networks: - loki command: server ~ --address ':9000' --console-address ':9001' createbuckets: image: minio/mc networks: - loki depends_on: - minio entrypoint: > /bin/sh -c " /usr/bin/mc config host add myminio http://minio:9000 minioadmin minioadmin; /usr/bin/mc rm -r --force myminio/loki; /usr/bin/mc mb myminio/loki; /usr/bin/mc policy set public myminio/loki; exit 0; "
Grafana のログ データを使用してできることは他にもたくさんあります。まず、promtail をより多くの場所にインストールして、より多くのログを Loki に追跡できます。実行可能ファイルとpromtail-local-config.yaml
他のマシン/インスタンス/コンテナーにコピーし、 「Promtail 構成」の説明に従って構成を編集して実行します。
次に、ローカル システム ログを Loki に送信するために、Promtail 構成ファイルpromtail-local-config.yaml
を作成する必要があります。 Grafana からサンプル構成ファイルをダウンロードして編集します。注目すべきセクションはscrape_configs
です。これは、promtailがどのログを取得するか、どのようにフォーマットするか、どこに送信するかを指示する場所であるためです。 promtail の設定の詳細については、 「Loki へのログの取得」を参照してください。
scrape_configs
セクションには次のものが含まれます。
static_configs
のオプション。ただし、古いバージョンの Promtail ではオプションではなかったため、定義されることがよくあります。これは、このエントリを必要とする Prometheus サービス検出コードを直接使用したことによるアーティファクトです。
server: http_listen_port: 9080 grpc_listen_port: 0 positions: filename: /tmp/positions.yaml clients: - url: http://loki:3100/loki/api/v1/push scrape_configs: - job_name: apache static_configs: - targets: - localhost labels: job: access_logs __path__: /home/loki/access_logs/*log
Promtail でスクレイピングするためのさまざまな構成オプションを理解することが重要です。Grafana には詳細がたくさんあります。
アプリケーションの全機能を確認するには、完全なpromtail 構成リファレンスを参照すると役立つ場合があります。
最後に、ホスト システム上のdocker-compose.yaml
ファイルで指定されたディレクトリに Apache Web サーバーのアクセス ログをいくつか配置します。これらは、Promtail が取り込んで処理のために Loki に送信するログです。
-- <your-local-path>/access_logs:/home/loki/access_logs
編集が行われ、サンプル Apache アクセス ログが配置されたら、コンテナを停止し、docker compose を使用してバックアップします。
docker-compose down docker-compose up -d
Promtail はその後、新しい Apache アクセス ログ ファイルをロードし、Loki で使用できるようにします。
このチュートリアルで作成した環境は、Loki を使い始めるのに役立ちますが、運用環境に対応したものではありません。次のステップは、Docker を Kubernetes に残し、単一インスタンスの代わりに分散 MinIO を使用することです。最終的に、Loki データは十分に大きくなり、迅速なインデックス検索のために外部データベースの恩恵を受けるようになります。詳細については、「スケーラビリティ - Grafana Loki によるスケーリング」を参照してください。
Grafana、Prometheus、および AlertManager の可観測性スタックは、Loki によって強力に追加されました (ところで、 MinIO には Grafana、Prometheus、および AlertManagerのチュートリアルもあります)。分散システム、特に Kubernetes によってコンテナ化およびオーケストレーションされている場合、アプリケーションとマイクロサービスのログが多数存在します。 Loki と MinIO を組み合わせると、ログを収集、保存、クエリするためのコスト効率の高い方法になります。
ご質問がある場合は、 [email protected]に電子メールを送信するか、 MinIO Slack チャネルに参加して質問してください。
ここでも公開されています。