Установка, настройка и использование системы по сбору логов Grafana Loki на Linux

Мы предоставляем услуги удаленного администрирования серверов

Установка, настройка и использование системы по сбору логов 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. Для этого переходим на страницу загрузки и копируем ссылку на архив с его последней версией:

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

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:

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

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. Мы должны увидеть страницу с метриками:

Значит наш сервис запустился и нормально работает. Можно прервать его работу на сервере комбинацией клавиш 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:

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.

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

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

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

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

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

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

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

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

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

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

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

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

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

Логи 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 мы должны увидеть новые критерии для фильтра по тегам:

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

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

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

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

2. Elasticsearch + Kibana + Logstash на CentOS


   Мы принимаем