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

Обновлено и опубликовано Опубликовано:

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

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

Подготовка

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

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

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

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

yum install git wget

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

apt-get install git wget

Установка Go

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

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

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

wget https://golang.org/dl/go1.15.6.linux-amd64.tar.gz

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

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

tar -v -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-get 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_configworking_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 — агент, который читает и отправляет логи на сервер. Его установка во многом напоминает установку сервера — получаем бинарник и добавляем его в автозагрузку. В нашем примере мы загрузим уже скомпилированный файл для запуска.

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

yum install unzip wget

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

Загружаем последнюю версию 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-get 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

# Linux # Серверы # Мониторинг # DevOps
Дмитрий Моск — частный мастер
Была ли полезна вам эта инструкция?

Да            Нет