НейроАгент

Настройка авто-удаления логов в Grafana/Loki: Полное руководство

Как правильно настроить авто-удаление логов в Loki с filesystem хранилищем. Пошаговая инструкция с примерами конфигурации и решением типичных проблем.

Вопрос

Как правильно настроить авто-удаление логов в Grafana/Loki?

Я пытаюсь включить авто-удаление в Grafana/Loki, но опции, указанные в официальной документации (retention., delete..), не работают. Моя система развернута с использованием Docker, и хранилище настроено как filesystem.

Вот моя текущая конфигурация:

loki-config.yaml:

auth_enabled: false

server:
  http_listen_port: 3100
  grpc_listen_port: 9096
  log_level: debug
  grpc_server_max_concurrent_streams: 1000

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

query_range:
  parallelise_shardable_queries: true
  align_queries_with_step: true
  results_cache:
    cache:
      embedded_cache:
        enabled: true
        max_size_mb: 100

limits_config:
  metric_aggregation_enabled: true
  reject_old_samples: true
  reject_old_samples_max_age: 10s
  retention_period: 10s

compactor:
  working_directory: /loki/compactor
  compaction_interval: 10s
  retention_enabled: true
  retention_delete_delay: 0s
  delete_request_store: filesystem
  delete_request_cancel_period: 10s
  delete_max_interval: 10s

table_manager:
  retention_deletes_enabled: true

schema_config:
  configs:
    - from: 2020-10-24
      store: tsdb
      object_store: filesystem
      schema: v13
      index:
        prefix: index_
        period: 24h

pattern_ingester:
  enabled: true
  metric_aggregation:
    loki_address: localhost:3100
  flush_check_period: 1m

ruler:
  alertmanager_url: http://localhost:9093

frontend:
  encoding: protobuf

docker-compose.yaml:

services:
  loki:
    image: grafana/loki
    container_name: loki
    command: -config.file=/etc/loki/config/loki-config.yaml
    volumes:
      - ./loki-config.yaml:/etc/loki/config/loki-config.yaml
      - ./loki-data:/tmp/loki
    ports:
      - "3100:3100"

  grafana:
    image: grafana/grafana
    container_name: grafana
    ports:
      - "3000:3000"
    volumes:
      - ./grafana-data:/var/lib/grafana
    depends_on:
      - loki

Как правильно настроить параметры авто-удаления, чтобы старые логи автоматически удалялись? Какие настройки в конфигурации необходимо изменить или добавить?

НейроАгент

Ваша конфигурация содержит несколько ключевых ошибок, которые предотвращают работу авто-удаления логов в Loki с filesystem хранилищем. Основные проблемы связаны с неправильным использованием table_manager (устаревший компонент), недостаточными настройками retention и некорректной конфигурацией compactor.

Содержание

Основные проблемы в текущей конфигурации

Ваша текущая конфигурация содержит несколько критических ошибок:

  1. Использование table_manager - этот компонент устарел и больше не рекомендуется для управления retention. Согласно документации Loki, table_manager был заменен на compactor.

  2. Слишком короткие интервалы - вы установили retention_period: 10s и compaction_interval: 10s, что не дает системе достаточно времени для обработки данных.

  3. Неправильная структура schema_config - для работы с retention необходимо использовать tsdb или boltdb-shipper storage engine.

Правильная конфигурация для filesystem хранения

Для правильной работы авто-удаления с filesystem хранилищем необходимо следующее:

yaml
schema_config:
  configs:
    - from: 2020-10-24
      store: tsdb
      object_store: filesystem
      schema: v13
      index:
        prefix: index_
        period: 24h

limits_config:
  retention_period: 168h  # 7 дней, должно быть в часах
  # ... другие настройки

compactor:
  working_directory: /tmp/loki/compactor
  compaction_interval: 1h
  retention_enabled: true
  retention_delete_delay: 2h
  delete_request_store: filesystem
  retention_delete_worker_count: 150

Обязательные параметры для авто-удаления

Для включения авто-удаления в Loki с filesystem хранилищем необходимы следующие параметры:

В секции limits_config:

  • retention_period: период хранения в часах (например, 168h для 7 дней)
  • Этот параметр определяет, как долго логи должны храниться перед удалением

В секции compactor:

  • retention_enabled: true - включает функцию удаления старых логов
  • delete_request_store: filesystem - указывает, где хранить запросы на удаление
  • working_directory - рабочий каталог для компактора
  • compaction_interval - интервал компакции (должен быть больше retention_period)
  • retention_delete_delay - задержка перед удалением (рекомендуется 2 часа)

В секции schema_config:

  • store: tsdb или store: boltdb-shipper - обязательные storage engines для работы retention
  • object_store: filesystem - указывает на использование файловой системы

Пошаговая настройка

1. Удалите table_manager

Удалите полностью секцию table_manager, так как этот компонент устарел:

yaml
# УДАЛИТЕ ЭТУ СЕКЦИЮ
table_manager:
  retention_deletes_enabled: true
  retention_period: 740h

2. Настройте limits_config

Измените retention_period на разумное значение в часах:

yaml
limits_config:
  retention_period: 168h  # 7 дней
  # ... другие настройки

3. Корректно настройте compactor

Добавьте все необходимые параметры для compactor:

yaml
compactor:
  working_directory: /tmp/loki/compactor
  compaction_interval: 1h
  retention_enabled: true
  retention_delete_delay: 2h
  delete_request_store: filesystem
  retention_delete_worker_count: 150

4. Проверьте schema_config

Убедитесь, что используется правильный storage engine:

yaml
schema_config:
  configs:
    - from: 2020-10-24
      store: tsdb  # или boltdb-shipper
      object_store: filesystem
      schema: v13
      index:
        prefix: index_
        period: 24h

5. Обновите docker-compose

Убедитесь, что все необходимые директории смонтированы:

yaml
services:
  loki:
    image: grafana/loki
    container_name: loki
    command: -config.file=/etc/loki/config/loki-config.yaml
    volumes:
      - ./loki-config.yaml:/etc/loki/config/loki-config.yaml
      - ./loki-data:/tmp/loki
      - ./loki-compactor:/tmp/loki/compactor  # Добавьте эту строку
    ports:
      - "3100:3100"

Проверка работы авто-удаления

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

  1. Проверьте логи компактора:

    bash
    docker logs loki | grep -i "compactor\|retention\|delete"
    
  2. Проверьте директорию компактора:

    bash
    ls -la /tmp/loki/compactor/
    
  3. Проверьте директорию чанков:

    bash
    ls -la /tmp/loki/chunks/
    
  4. Используйте Loki API для проверки:

    bash
    curl "http://localhost:3100/loki/api/v1/status/buildinfo"
    

Типичные ошибки и решения

Ошибка 1: Компактор не запускается

Проблема: Компактор не запускается из-за отсутствия необходимых директорий.
Решение: Убедитесь, что директория для working_directory существует и имеет правильные права:

bash
mkdir -p /tmp/loki/compactor
chmod 755 /tmp/loki/compactor

Ошибка 2: Данные не удаляются

Проблема: Логи не удаляются несмотря на правильную конфигурацию.
Причина: Как указано в ответе на StackOverflow, Loki не будет удалять старые чанки хранилища. Вместо этого настройте TTLs в хранилище chunk store (для S3/GCS) или используйте lifecycle policies.

Ошибка 3: Слишком короткие интервалы

Проблема: compaction_interval слишком короткий.
Решение: Увеличьте compaction_interval до разумного значения (1-24 часа) и убедитесь, что он больше retention_period.

Ошибка 4: Неправильный storage engine

Проблема: Использование неподдерживаемого storage engine.
Решение: Убедитесь, что в schema_config используется store: tsdb или store: boltdb-shipper.

Источники

  1. Log retention | Grafana Loki documentation
  2. Log entry deletion | Grafana Loki documentation
  3. Why my Loki log retention is not working? - Stack Overflow
  4. Enabling Log Retention in Loki with Compactor
  5. Managing Grafana Loki Log Retention and Deletion Delay in Docker

Заключение

Для правильной настройки авто-удаления логов в Loki с filesystem хранилищем необходимо:

  1. Использовать tsdb или boltdb-shipper storage engine в schema_config
  2. Настроить compactor с параметрами retention_enabled: true и правильными путями
  3. Удалить устаревший table_manager
  4. Установить разумные значения retention_period в часах
  5. Настроить compaction_interval больше, чем retention_period
  6. Обеспечить доступ к рабочим директориям с правильными правами

После внесения этих изменений система начнет автоматически удалять старые логи в соответствии с указанным retention period.