Перейти к содержанию

Sentry Rotation Policy - Документация

Обзор

На сервере 10.99.87.55 (km-tst01) настроена автоматическая ротация данных для всех компонентов Sentry с retention периодом 7 дней.

📋 Сводка всех политик

Компонент Retention Политика
Основной скрипт ротации 7 дней RETENTION_DAYS=7 в /usr/local/sbin/sentry-rotation.sh
Sentry Cleanup 7 дней Выполняется через скрипт: sentry cleanup --days 7
Sentry Env Variable 30 дней SENTRY_EVENT_RETENTION_DAYS=30 (не используется скриптом)
Docker Logs ~300MB/контейнер max-size: 100m, max-file: 3
ClickHouse TTL Динамический TTL timestamp + toIntervalDay(retention_days)
Systemd Journal 7 дней journalctl --vacuum-time=7d
Docker Images 7 дней docker image prune --filter "until=168h"
Redis Temp Files 1 день Удаление temp-*.rdb старше 1 дня
Расписание Ежедневно /etc/cron.daily/sentry-rotation (~6:25 AM)

Основные компоненты

1. Главный скрипт ротации

Путь: /usr/local/sbin/sentry-rotation.sh

Что делает: - Очищает данные Sentry старше 7 дней - Ротирует логи Docker контейнеров - Очищает ClickHouse партиции - Выполняет VACUUM для Postgres - Удаляет временные файлы Redis - Очищает systemd journal

Автозапуск: Ежедневно через cron (/etc/cron.daily/sentry-rotation)

Логи: /var/log/sentry-rotation.log

Ручной запуск:

/usr/local/sbin/sentry-rotation.sh

Просмотр логов:

tail -f /var/log/sentry-rotation.log


2. Docker Log Rotation

Конфигурация: /etc/docker/daemon.json

Настройки:

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m",
    "max-file": "3"
  }
}

Эффект: - Максимум 100MB на один лог-файл - Хранится 3 файла (итого ~300MB на контейнер) - Автоматическая ротация при превышении лимита

⚠️ Важно: Для применения настроек требуется перезапуск Docker daemon:

systemctl restart docker
Это остановит все контейнеры - планируйте окно обслуживания!


3. Sentry Cleanup

Команда: docker exec sentry-default-web-1 sentry cleanup --days 7

⚠️ Важно: В переменных окружения контейнера установлено SENTRY_EVENT_RETENTION_DAYS=30, но скрипт ротации игнорирует эту переменную и использует --days 7 напрямую. Фактический retention = 7 дней.

Что очищает: - События (events) старше 7 дней из Postgres - Группы (groups) старше 7 дней - Attachments и файлы старше 7 дней - User reports, monitor check-ins и другие связанные данные - NodeStore значения - FileBlob ссылки

Filestore: /var/lib/docker/volumes/sentry-data/_data/files - Автоматически очищаются файлы старше 7 дней через find -mtime +7


4. ClickHouse Partition Cleanup

Таблицы с автоматической очисткой: - errors_local - transactions_local - outcomes_raw_local - sessions_raw_local - sessions_hourly_local

TTL: Уже настроен в определениях таблиц

TTL timestamp + toIntervalDay(retention_days)

Автоматическая очистка: ClickHouse сам удаляет партиции по TTL

Ручная очистка: Скрипт ротации дополнительно удаляет партиции старше 7 дней


5. Postgres VACUUM

Команда: VACUUM ANALYZE (без FULL)

Почему не FULL: - VACUUM FULL требует ~20GB свободного места - Требует эксклюзивной блокировки таблицы - Создает временную копию всей таблицы

Текущий размер таблиц (после VACUUM FULL): - nodestore_node: 3.7GB (было 17GB, освобождено ~13GB) - sentry_eventuser: 365MB - Остальные таблицы: <10MB каждая

VACUUM FULL выполнен: После расширения диска до 146GB был выполнен VACUUM FULL для всех таблиц, что освободило ~17GB места.


6. Redis Temp Files Cleanup

Путь: /var/lib/docker/volumes/sentry-redis/_data/

Что удаляется: - Файлы temp-*.rdb старше 1 дня - Эти файлы создаются при ошибках записи основного dump.rdb


7. Systemd Journal Rotation

Команда: journalctl --vacuum-time=7d

Эффект: Оставляет только последние 7 дней логов

Размер до очистки: ~2GB Размер после: Зависит от активности системы


8. Docker Images Pruning

Команда: docker image prune -a -f --filter "until=168h"

Что удаляет: - Неиспользуемые образы старше 7 дней - Не трогает: volumes и контейнеры


Расположение файлов

Скрипты

  • /usr/local/sbin/sentry-rotation.sh - главный скрипт ротации
  • /etc/cron.daily/sentry-rotation - cron job для ежедневного запуска

Конфигурация

  • /etc/docker/daemon.json - настройки Docker log rotation
  • /root/sentry-rotation-info.txt - краткая справка (на сервере)

Логи

  • /var/log/sentry-rotation.log - логи выполнения скрипта ротации

Docker Volumes (данные)

  • /var/lib/docker/volumes/sentry-postgres/_data/ - Postgres данные (~42GB, реальные данные ~40GB)
  • /var/lib/docker/volumes/sentry-clickhouse/_data/ - ClickHouse данные (~6.8GB, активные данные ~826MB)
  • /var/lib/docker/volumes/sentry-kafka/_data/ - Kafka данные (~4.7GB)
  • /var/lib/docker/volumes/sentry-redis/_data/ - Redis данные (~114MB)
  • /var/lib/docker/volumes/sentry-data/_data/ - Sentry filestore (~38MB)

Docker Logs

  • /var/lib/docker/containers/*/ - логи контейнеров (ротируются автоматически)

Расписание

Автоматический запуск: Ежедневно в 6:25 AM (время cron.daily)

Можно изменить: Отредактировать /etc/cron.daily/sentry-rotation или создать custom cron job

Пример custom cron (каждые 12 часов):

0 */12 * * * /usr/local/sbin/sentry-rotation.sh


Мониторинг

Проверка свободного места

df -h /

Проверка размера Docker volumes

docker system df
du -sh /var/lib/docker/volumes/*

Проверка размера Postgres таблиц

docker exec -i sentry-default-postgres-1 psql -U postgres -d postgres -c "
SELECT relname, 
       pg_size_pretty(pg_total_relation_size(relid)) AS size 
FROM pg_catalog.pg_statio_user_tables 
ORDER BY pg_total_relation_size(relid) DESC 
LIMIT 10;"

Проверка ClickHouse партиций

docker exec sentry-default-clickhouse-1 clickhouse-client --query "
SELECT table, partition, formatReadableSize(sum(bytes_on_disk)) AS size 
FROM system.parts 
WHERE database='default' 
GROUP BY table, partition 
ORDER BY size DESC 
LIMIT 20;"

Troubleshooting

Скрипт не запускается

  1. Проверить права: chmod +x /usr/local/sbin/sentry-rotation.sh
  2. Проверить логи: tail -f /var/log/sentry-rotation.log
  3. Запустить вручную для диагностики

Docker logs не ротируются

  1. Проверить /etc/docker/daemon.json
  2. Перезапустить Docker daemon: systemctl restart docker
  3. Проверить, что контейнеры перезапустились

Postgres занимает много места

  1. Проверить размер таблиц (см. команды выше)
  2. После расширения диска запустить VACUUM FULL nodestore_node
  3. Убедиться, что sentry cleanup работает корректно

ClickHouse партиции не удаляются

  1. Проверить TTL в таблицах: SHOW CREATE TABLE default.errors_local;
  2. Проверить, что retention_days установлен корректно
  3. Запустить очистку вручную через скрипт

Важные замечания

  1. Retention период: 7 дней - настроен жестко в скрипте. Для изменения отредактировать RETENTION_DAYS=7 в /usr/local/sbin/sentry-rotation.sh

  2. VACUUM FULL: Требует ~20GB свободного места. Запускать только после расширения диска.

  3. Docker restart: Применение настроек log rotation требует перезапуска Docker, что остановит все контейнеры.

  4. Kafka: Retention для Kafka не настроен автоматически (по запросу пользователя). Настраивается отдельно через переменные окружения контейнера.

  5. Мониторинг: Рекомендуется настроить алерты на использование диска >80% для раннего предупреждения.


Контакты и поддержка

Сервер: 10.99.87.55 (km-tst01)
Доступ: ssh -i ~/.ssh/id_ed25519_shivavpn -J root@212.70.189.60:2255 root@10.99.87.55

Последнее обновление: 2025-11-20


📊 Полный список всех политик

1. Основная политика Retention

  • Значение: 7 дней
  • Где настроено: /usr/local/sbin/sentry-rotation.shRETENTION_DAYS=7
  • Применяется к: Sentry cleanup, filestore, ClickHouse, systemd journal

2. Sentry Cleanup Policy

  • Команда: sentry cleanup --days 7
  • Выполняется: Ежедневно через скрипт ротации
  • Очищает:
  • Events старше 7 дней
  • Groups старше 7 дней
  • Attachments старше 7 дней
  • User reports, monitor check-ins
  • NodeStore значения
  • FileBlob ссылки
  • ⚠️ Примечание: SENTRY_EVENT_RETENTION_DAYS=30 в env переменных не используется скриптом

3. Docker Log Rotation Policy

  • Конфигурация: /etc/docker/daemon.json
  • Параметры:
  • max-size: 100m - максимальный размер одного лог-файла
  • max-file: 3 - количество ротируемых файлов
  • Результат: Максимум ~300MB логов на контейнер
  • Дополнительно: Скрипт ротации обрезает логи >100MB

4. ClickHouse TTL Policy

  • Механизм: Динамический TTL через retention_days
  • Формула: TTL timestamp + toIntervalDay(retention_days)
  • Таблицы:
  • errors_local
  • transactions_local
  • outcomes_raw_local
  • sessions_raw_local
  • sessions_hourly_local
  • Дополнительно: Скрипт ротации удаляет партиции старше 7 дней вручную

5. Systemd Journal Policy

  • Retention: 7 дней
  • Команда: journalctl --vacuum-time=7d
  • Выполняется: Ежедневно через скрипт ротации

6. Docker Images Pruning Policy

  • Retention: 7 дней (168 часов)
  • Команда: docker image prune -a -f --filter "until=168h"
  • Что удаляет: Неиспользуемые образы старше 7 дней
  • ⚠️ Не трогает: Volumes и контейнеры

7. Redis Temp Files Policy

  • Retention: 1 день
  • Что удаляется: Файлы temp-*.rdb старше 1 дня
  • Путь: /var/lib/docker/volumes/sentry-redis/_data/

8. Postgres VACUUM Policy

  • Тип: VACUUM ANALYZE (без FULL)
  • Выполняется: Ежедневно через скрипт ротации
  • Почему не FULL: Требует много места и блокирует таблицы
  • VACUUM FULL: Выполнен вручную после расширения диска (освобождено ~17GB)

9. Расписание выполнения

  • Тип: Cron daily job
  • Файл: /etc/cron.daily/sentry-rotation
  • Время: ~6:25 AM (стандартное время cron.daily)
  • Скрипт: /usr/local/sbin/sentry-rotation.sh
  • Логи: /var/log/sentry-rotation.log

10. Kafka Retention Policy

  • Статус: Не настроен автоматически
  • Причина: По запросу пользователя
  • Настройка: Вручную через переменные окружения контейнера Kafka