Установка и использование Grafana Loki на Linux

Используемые термины: Grafana , Grafana Loki , Golang , NGINX .

В нашей инструкции мы рассмотрим процесс установки и настройки Grafana Loki в качестве сервера сбора логов. Есть несколько способов ее установки — Helm chart, в качестве контейнера Docker, скачать готовый бинарник или собрать его из исходника. Мы выполним установку из последнего на систему Linux. Также, в качестве примера, мы прочитаем лог веб-сервера nginx и сделаем его вывод в Grafana.

Подготовка

Прежде чем устанавливать Loki, подготовим наш сервер для работы.

Установка пакетов

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

а) на системах Red Hat:

yum install git wget

б) для систем на основе Debian:

apt install git wget

Установка Go

Для компиляции исходника, нам необходимо установить Golang. Для этого переходим на страницу загрузки и копируем ссылку на архив с его последней версией для Linux:

Копируем ссылку на golang

* по умолчанию, страница предлагает загрузить Go для нашей операционной системы, поэтому, если мы открыли сайт на компьютере Windows, ниже под кнопкой загрузки выбираем Linux .

Воспользовавшись ссылкой, скачиваем архив на наш сервер:

wget https://go.dev/dl/go1.22.1.linux-amd64.tar.gz

* на момент обновления инструкции, последняя версия была 1.22.1 .

Распаковываем архив в каталог /usr/local :

tar -C /usr/local -xzf go*.tar.gz

Открываем файл:

vi /etc/profile

Добавляем в самый низ строку:

export PATH=$PATH:/usr/local/go/bin

Один раз выполняем данную команду:

export PATH=$PATH:/usr/local/go/bin

Проверяем, что go установлен и готов выполнять команды:

go version

Мы должны увидеть версию скачанного пакета.

Настройка безопасности

1. Брандмауэр

В зависимости от используемого брандмауэра, необходимо выполнить следующие настройки.

а) если используем iptables (по умолчанию, в системах на базе Debian):

iptables -I INPUT 1 -p tcp —dport 3100 -j ACCEPT

* данная команда добавит правило на разрешение порта 3100 (на котором, по умолчанию, запускается Grafana Loki).

Для сохранения правил устанавливаем пакет:

apt install iptables-persistent

Сохранение правил теперь можно выполнить командой:

netfilter-persistent save

б) если используем firewalld (по умолчанию, в системах на базе Red Hat):

firewall-cmd —permanent —add-port=3100/tcp

firewall-cmd —reload

* данная команда добавит правило на разрешение порта 3100 (на котором, по умолчанию, запускается Grafana Loki).

2. SELinux

Как правило, в системах на базе Red Hat активирована дополнительная система безопасности. В нашей инструкции мы ее отключаем командами:

setenforce 0

sed -i ‘s/^SELINUX=.*/SELINUX=disabled/g’ /etc/selinux/config

* первая команда вводится до разового отключения SELinux. Вторая не дает ему запуститься после перезагрузки.

Установка

Установка Grafana Loki сводится к загрузке готового бинарника или исходника с последующей компиляцией. Также мы настроим юнит в systemd для работы приложения в качестве сервиса.

Копирование бинарника и конфигурационного файла

Переходим в каталог:

cd /usr/src/

Загружаем исходные файлы проекта:

git clone https://github.com/grafana/loki

Переходим в каталог loki:

cd loki/

Запускаем компиляцию бинарника:

go build ./cmd/loki

В текущем каталоге появится файл loki — перенесем его в каталог /usr/local/bin:

mv loki /usr/local/bin/

Создадим каталог:

mkdir /etc/loki

… и перенесем в него конфигурационный файл:

mv cmd/loki/loki-local-config.yaml /etc/loki/

В конфиге, который идет в исходнике в качестве рабочего каталога для Grafana Loki используется /tmp — мы это исправим двумя командами:

sed -i ‘s//tmp/wal//opt/loki/wal/g’ /etc/loki/loki-local-config.yaml

* первой командой мы меняем настройку dir для wal (журнала предзаписи).

sed -i ‘s//tmp/loki//opt/loki/g’ /etc/loki/loki-local-config.yaml

* в данном примере мы заменили путь для storage_config , working_directory и ruler storage на /opt/loki .

Создаем каталог:

mkdir /opt/loki

Выполним первый тестовый запуск сервиса:

/usr/local/bin/loki -config.file=/etc/loki/loki-local-config.yaml

Открываем браузер и переходим по адресу http://192.168.0.15:3100/metrics , где 192.168.0.15 — IP-адрес нашего сервера Grafana Loki. Мы должны увидеть страницу с метриками:

Страница с метриками Grafana Loki

Значит наш сервис запустился и нормально работает. Можно прервать его работу на сервере комбинацией клавиш Ctrl + С и продолжать настройку.

Автозапуск

Чтобы сервис мог автоматически запускаться при старте системы, добавим его в systemd.

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

useradd —no-create-home —shell /bin/false loki

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

Делаем владельцем loki бинарник для запуска сервиса:

chown loki:loki /usr/local/bin/loki

Задаем владельца для рабочих каталогов Loki:

chown -R loki:loki /etc/loki

chown -R loki:loki /opt/loki

Создаем юнит в systemd:

vi /etc/systemd/system/loki.service

[Unit]
Description=Grafana Loki Service
After=network.target

[Service]
User=loki
Group=loki
Type=simple
ExecStart=/usr/local/bin/loki -config.file=/etc/loki/loki-local-config.yaml
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure

[Install]
WantedBy=multi-user.target

Перечитываем конфигурацию systemd:

systemctl daemon-reload

Теперь можно разрешить и стартовать наш сервис:

systemctl enable loki —now

Проверить, что он запустился и работает можно командой:

systemctl status loki

Установка серверной части завершена.

Отправка логов на сервер

В нашем примере мы передадим логи веб-сервера NGINX в нашу Grafana Loki. Для этого переходим на сервер с NGINX и выполним следующие действия.

Установка Promtail

Promtail — агент, который читает и отправляет логи на сервер. Его установка во многом напоминает установку сервера — получаем бинарник и добавляем его в автозагрузку. В нашем примере мы загрузим уже скомпилированный файл для запуска.

Для начала, установим следующие пакеты:

  • unzip — для распаковки архива с бинарником;
  • wget — для скачивания архива.

В зависимости от Linux, команды будут немного отличаться.

а) RPM (Rocky / CentOS / РЕД ОС):

yum install unzip wget

б) DEB (Debian / Ubuntu / Astra):

apt update

apt install unzip wget

После можно переходить к загрузке бинарника promtail.

Загружаем последнюю версию promtail для Linux:

wget https://github.com/grafana/loki/releases/latest/download/promtail-linux-amd64.zip

* в нашем примере загружается бинарник на систему 64-бит. На странице https://github.com/grafana/loki/releases можно скачать файлы для установки под Linux и Windows.

Распаковываем скачанный архив:

unzip promtail-linux-amd64.zip

Переносим бинарник в каталог /usr/local/bin:

mv promtail-linux-amd64 /usr/local/bin/promtail

* обратите внимание, что мы его сразу переименовали в promtail .

Создаем каталог для конфигурационных файлов promtail:

mkdir /etc/promtail

Создаем конфигурационный файл:

vi /etc/promtail/promtail.yaml

server:
http_listen_port: 9080
grpc_listen_port: 0

positions:
filename: /tmp/positions.yaml

clients:
— url: http://192.168.0.15:3100/loki/api/v1/push

* где 9080 — номер порта, на котором будет слушать promtail; 192.168.0.15 — IP-адрес нашего сервера Loki, куда нужно отправлять данные.

Создаем юнит в systemd для promtail:

vi /etc/systemd/system/promtail.service

[Unit]
Description=Promtail Service
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/promtail -config.file=/etc/promtail/promtail.yaml
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure

[Install]
WantedBy=multi-user.target

Перечитываем конфигурацию systemd:

systemctl daemon-reload

Разрешаем запуск сервиса promtail и стартуем его:

systemctl enable promtail —now

Проверяем статус:

systemctl status promtail

На клиенте в настройки брандмауэра добавляем правило на разрешение порта 9080.

а) если используем iptables (Debian, Ubuntu):

iptables -I INPUT 1 -p tcp —dport 9080 -j ACCEPT

apt install iptables-persistent

netfilter-persistent save

б) если используем firewalld (CentOS, Red Hat):

firewall-cmd —permanent —add-port=9080/tcp

firewall-cmd —reload

После установки promtail открываем браузер и переходим на страницу http://192.168.0.25:9080/targets , где 192.168.0.25 — IP-адрес клиентского компьютера с NGINX. Мы должны увидеть страницу:

Веб-страница сервиса Promtail

Promtail работает. Можно приступать к сбору логов.

Настройка сбора логов

Открываем конфигурационный файл promtail:

vi /etc/promtail/promtail.yaml

… и добавляем:

scrape_configs:
— job_name: nginx
static_configs:
— targets:
— localhost
labels:
job: nginxlogs
__path__: /var/log/nginx/*log

* где:

  • job_name — имя задания для чтения лога.
  • targets — компьютер, на котором читаем лог.
  • job — метка для имени задания. Важный параметр для выборки данных.
  • __path__ — путь до файлов с логами.

Перезапускаем сервис promtail:

systemctl restart promtail

Снова заходим по адресу http://192.168.0.25:9080/targets — мы должны увидеть настроенное нами задание:

В списке таргетов мы должны увидеть наше задание

Сбор логов настроен.

Настройка Grafana

Переходим к серверу с Grafana. Он может быть установлен на отдельном сервере или на том же сервере с Loki.

Заходим в веб-интерфейс и переходим в Configuration Data Sources :

В Grafana переходим в Configuration - Data Sources

Добавляем новый источник, кликая по Add data source :

Нажимаем по Add data source для добавления нового источника данных

Среди списка возможных источников выбираем Loki:

Среди списка находим Loki и выбираем его

В настройках задаем имя и указываем IP-адрес сервера Loki:

Настройка подключения к серверу Loki

* в нашем примере задается имя Loki и подключение к серверу 192.168.0.15 .

Нажимаем на Save & Test :

Для сохранения настроек нажимаем Save & Test

Если мы увидели сообщение «Data source connected and labels found.»:

Data source connected and labels found

… значит подключение выполнено и можно двигаться дальше.

Переходим в раздел Create Dashboard :

Переходим к созданию дашборда

Кликаем по кнопке Add new panel :

Кликаем по Add new panel для создания новой панели в Grafana

В открывшемся окне выбираем в качестве источника данных Loki , затем кликаем по Log labels — выбираем job и nginxlogs :

Настройка источника данных и фильтрация данных для отображения

Мы увидим Unable to graph data (так как логи представляют из себя данные, на основе которых нельзя постоить график) — кликаем по Switch to table view :

Нажимаем на Switch to table view для переключения на представление данных в табличном виде

Мы должны увидеть строки из логов:

В Grafana появятся строки из логов

Логи NGINX отображаются в Grafana.

Парсинг лога

Мы увидели логи в графане, но они представленны в неудобном для отбора и фильрации виде. Попробуем это исправить с помощью парсинга логов на стороне promtail.

Открываем файл для редактирования:

vi /etc/promtail/promtail.yaml

Дополним нашу задачу для сбора логов NGINX:

scrape_configs:
— job_name: nginx
static_configs:
— targets:
— localhost
labels:
job: nginxlogs
__path__: /var/log/nginx/*log
pipeline_stages:
— match:
selector: ‘{job=»nginxlogs»}’
stages:
— regex:
expression: ‘^(?P<remote_addr>[w.]+) — (?P<remote_user>[^ ]*) [(?P<time_local>.*)] «(?P<method>[^ ]*) (?P<request>[^ ]*) (?P<protocol>[^ ]*)» (?P<status>[d]+) (?P<body_bytes_sent>[d]+) «(?P<http_referer>[^»]*)» «(?P<http_user_agent>[^»]*)»?’
— labels:
remote_addr:
remote_user:
time_local:
method:
request:
protocol:
status:
body_bytes_sent:
http_referer:
http_user_agent:

* обратите внимание, что к имеющейся настройки мы добавили pipeline_stages :

  • selector — тег для отбора логов, которые нужно парсить.
  • expression — регулярное выражение для парсинга логов.
  • labels — список тегов, которые мы будем передавать в loki. Обратите внимание, что названия данных тегов соответствую названиям, которые мы задали в expression.

Перезапускаем сервис для promtail:

systemctl restart promtail

Идем в Grafana — в Log labels мы должны увидеть новые критерии для фильтра по тегам:

В Log labels мы должны увидеть новые критерии для отбора данных

Пробуем добавить, например, фильтр по статусу ответа веб-сервера:

Добавляем в фильтр статус ответа веб-сервера

Читайте также

Инструкции, которые также могут оказаться интересными:

1. Установка Prometheus + Alertmanager + node_exporter на Linux

2. Elasticsearch + Kibana + Logstash на CentOS

EnglishRussianUkrainian