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
Ручной запуск:
Просмотр логов:
2. Docker Log Rotation¶
Конфигурация: /etc/docker/daemon.json
Настройки:
Эффект: - Максимум 100MB на один лог-файл - Хранится 3 файла (итого ~300MB на контейнер) - Автоматическая ротация при превышении лимита
⚠️ Важно: Для применения настроек требуется перезапуск Docker daemon:
Это остановит все контейнеры - планируйте окно обслуживания!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: Уже настроен в определениях таблиц
Автоматическая очистка: 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 часов):
Мониторинг¶
Проверка свободного места¶
Проверка размера 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¶
Скрипт не запускается¶
- Проверить права:
chmod +x /usr/local/sbin/sentry-rotation.sh - Проверить логи:
tail -f /var/log/sentry-rotation.log - Запустить вручную для диагностики
Docker logs не ротируются¶
- Проверить
/etc/docker/daemon.json - Перезапустить Docker daemon:
systemctl restart docker - Проверить, что контейнеры перезапустились
Postgres занимает много места¶
- Проверить размер таблиц (см. команды выше)
- После расширения диска запустить
VACUUM FULL nodestore_node - Убедиться, что
sentry cleanupработает корректно
ClickHouse партиции не удаляются¶
- Проверить TTL в таблицах:
SHOW CREATE TABLE default.errors_local; - Проверить, что
retention_daysустановлен корректно - Запустить очистку вручную через скрипт
Важные замечания¶
-
Retention период: 7 дней - настроен жестко в скрипте. Для изменения отредактировать
RETENTION_DAYS=7в/usr/local/sbin/sentry-rotation.sh -
VACUUM FULL: Требует ~20GB свободного места. Запускать только после расширения диска.
-
Docker restart: Применение настроек log rotation требует перезапуска Docker, что остановит все контейнеры.
-
Kafka: Retention для Kafka не настроен автоматически (по запросу пользователя). Настраивается отдельно через переменные окружения контейнера.
-
Мониторинг: Рекомендуется настроить алерты на использование диска >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.sh→RETENTION_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_localtransactions_localoutcomes_raw_localsessions_raw_localsessions_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