Featured image of post Promtail, Loki, Grafana в docker

Promtail, Loki, Grafana в docker

Стек для логирования. Установка в docker.

Введение

Promtail + Loki + Grafana — это связка инструментов для сбора, обработки и визуализации логов. Эти 3 важных компонента работают вместе.

  • Grafana – мощный инструмент для визуализации данных. Он позволяет строить графики, панели мониторинга и работать с различными источниками данных, включая Loki.
  • Loki – система агрегации и хранения логов, разработанная Grafana Labs. Loki похож на Prometheus, но для логов. Он индексирует не весь текст логов, а только метаданные (лейблы), что делает его быстрым и эффективным.
  • Promtail – агент для сбора логов. Он читает логи из файлов, обрабатывает их (например, добавляет метки) и отправляет в Loki.

Приложение (Пишет логи в файл) -> Promtail (Читает файлы, добавляет метки) -> Loki (Хранит логи) <- Grafana (Визуализирует полученные данные)

В Telegram я сделал более глубокий разбор функционала и архитектуры Loki, который поможет тебе хорошо разобраться как же он работает на самом деле.
Если интересно — Присоединяйся Telegram

Основная цель данной заметки: Сделать общее хранилище и визуализацию логов, с других серверов.

Адрес моего сервера логирования 192.168.10.131

Шаг 1. Установка docker, docker-compose

1
2
3
4
5
6
7
8
9
sudo apt update
sudo apt install -y ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo tee /etc/apt/keyrings/docker.asc > /dev/null
sudo chmod a+r /etc/apt/keyrings/docker.asc
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] \
https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Проверяем установку

1
2
docker --version
docker compose version

Добавляем пользователя в группу docker

1
2
sudo usermod -aG docker $USER
newgrp docker

Шаг 2. Подготавливаем файлы конфига

Создаём директории:

1
2
sudo mkdir -p /opt/logging/data_loki
sudo mkdir /opt/logging/promtail

Конфигурация содержит 3 сервиса: Loki, Promtail и Grafana Создаём файл compose:

1
sudo nano /opt/logging/docker-compose.yaml

Наполняем:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
services:
  loki:
    container_name: loki
    image: grafana/loki:3.4.2
    command: "-config.file=/etc/loki/config.yaml"
    ports:
      - "3100:3100"
    volumes:
      - ./data_loki/config.yaml:/etc/loki/config.yaml:ro
    restart: unless-stopped
  promtail:
    image: grafana/promtail:3.4.2
    command: "-config.file=/mnt/config/config.yaml"
    volumes:
      - ./promtail/config.yaml:/mnt/config/config.yaml:ro
      - /var/run/docker.sock:/var/run/docker.sock
    restart: unless-stopped
  grafana:
    image: grafana/grafana-oss:11.5.2
    container_name: grafana
    ports:
      - "3000:3000"
    restart: unless-stopped

Собирать логи с контейнеров можно двумя способами:

  • Первый - это установить loki docker plugin для доставки логов до Loki.
  • Второй - это прописывать на устройствах сборку логов через docker сокет, как в нашем случае.

Создаём файл конфига promtail:

1
sudo nano /opt/promtail/config.yaml

Наполняем:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
server:
  http_listen_port: 9080
  grpc_listen_port: 0

positions:
  filename: /tmp/positions.yaml

clients:
  - url: http://192.168.10.131:3100/loki/api/v1/push  # Изменяйте на IP своего сервера с Promtail

scrape_configs:
  # Сбор логов с Docker контейнеров
  - job_name: docker-logs
    docker_sd_configs:
      - host: unix:///var/run/docker.sock
    relabel_configs:
      - source_labels: [__meta_docker_container_name]
        target_label: container
      - source_labels: [__meta_docker_container_log_stream]
        target_label: stream

  # Сбор логов из файлов (например, системные логи)
  - job_name: system-logs
    static_configs:
      - targets:
          - localhost
        labels:
          job: varlogs
          __path__: /var/log/*.log

Локи может работать как одиночный узел (Single) с локальным хранилищем (для небольших проектов), или в микросервисном (кластерном) режиме, где все его компоненты (Distributor, Ingester, Querier, Compactor, Ruler, Query Frontend) работают как отдельные сервисы, а данные сохраняются в S3, MinIO.

1
sudo nano opt/data_loki/config.yaml

Далее создаём конфиг loki.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
auth_enabled: false

server:
  http_listen_port: 3100
  grpc_listen_port: 9096

common:
  instance_addr: 127.0.0.1
  path_prefix: /loki
  storage:
    filesystem:
      chunks_directory: /loki/chunks
      rules_directory: /loki/rules
  replication_factor: 1
  ring:
    kvstore:
      store: inmemory

schema_config:
  configs:
    - from: 2020-10-24
      store: tsdb
      object_store: filesystem
      schema: v13
      index:
        prefix: index_
        period: 24h
ruler:
  alertmanager_url: http://localhost:9093

Описание конфигурации:

ПараметрОписание
auth_enabled: falseВыключает авторизацию
instance_addr: 127.0.0.1Адрес на котором работает Loki
http_listen_portПорт для прослушивания локи
path_prefix: /lokiБазовый путь, где Loki будет хранить свои файлы и данные
storage.filesystemLoki хранит логи на локальной файловой системе
replication_factor: 1Количество реплик в системе
ring.kvstore.store: inmemoryLoki хранит метаданные в памяти

Шаг 3. Запускаем

1
sudo docker-compose up -d

Открываем графану по IP-адресу сервера, порт 3000

  • По умолчанию admin:admin

Переходим на вкладку:

Connections -> Add new connection -> Loki -> URL: http://192.168.10.131:3100 -> Save and Test

Если все сделано правильно подключение активируется и графана начнёт отображать логи во вкладке Explore -> Logs

Шаг 4. Подключаем другой docker-хост

Заходим на сервер, который будет отправлять логи. Создаём директории:

1
2
3
sudo mkdir /opt/promtail
cd /opt/promtail/
sudo nano docker-compose.yaml

Наполняем:

1
2
3
4
5
6
7
8
services:
  promtail:
    image: grafana/promtail:3.4.2
    command: "-config.file=/mnt/config/config.yaml"
    volumes:
      - ./config/config.yaml:/mnt/config/config.yaml:ro
      - /var/run/docker.sock:/var/run/docker.sock
    restart: unless-stopped

И создаём конфигурацию:

1
2
sudo mkdir -p ./config/
sudo nano ./config/config.yaml

Подключаем сервер на отправку логов:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
server:
  http_listen_port: 9080
  grpc_listen_port: 0

positions:
  filename: /tmp/positions.yaml

clients:
  - url: http://192.168.10.131:3100/loki/api/v1/push  # Изменяйте на IP своего сервера с Promtail

scrape_configs:
  - job_name: docker-logs
    docker_sd_configs:
      - host: unix:///var/run/docker.sock
    relabel_configs:
      - source_labels: [__meta_docker_container_name]
        target_label: container
      - source_labels: [__meta_docker_container_log_stream]
        target_label: stream

Запускаем:

1
docker-compose up -d

Для примера на данном сервере запущу контейнер с nginx

1
docker run --name nginx -p 8080:80 -d nginx

Идем в графану Explore - Logs и смотрю логи

На этом базовая настройка завершена.

Информацию можно использовать в свободном доступе, с указанием ссылки на сайт
Telegram GitHub