Кэширование
SLOzy реализует двухуровневое кэширование результатов Prometheus-запросов. Это снижает нагрузку на Prometheus и базу данных, ускоряя загрузку дашбордов и страниц SLO.
Архитектура
Приложение → Memory Cache (sync.Map) → PostgreSQL (query_cache / Redis)Сервис сначала проверяет in-memory кэш. При непападании в кэш выполняется запрос к PostgreSQL (или Redis). «Горячие» записи (с частыми обращениями) продвигаются обратно в память при повторных чтениях.
Структура кэша
Таблица query_cache (миграция 000018):
| Колонка | Тип | Назначение |
|---|---|---|
cache_key | VARCHAR(500) UNIQUE | query:{slo_id}:{time_window}:{sha256} |
query_hash | VARCHAR(64) | SHA256 от запроса + параметров |
result | JSONB | Закэшированный результат Prometheus |
expires_at | TIMESTAMPTZ | TTL-истечение |
hit_count | INTEGER | Частота обращений |
is_fresh | BOOLEAN | Свежие или устаревшие данные |
UI-страница (localhost:3000/cache)
Страница Cache Management в боковом меню показывает:
- Cache Performance — карточки со статистикой: всего записей, Hit Rate (доля попаданий), Memory Usage (MB), свежие записи
- Cache Operations — кнопки «Invalidate Expired» и «Invalidate All» для сброса кэша
- Cache Entries — таблица закэшированных запросов: SLO ID, query, время создания/истечения, hit count
- Cache Configuration — текущие настройки (TTL, лимит записей, интервал очистки, сжатие)
Как работает в compose-стеке
По умолчанию (без Redis) кэш хранится в PostgreSQL. Сервис инициализируется при старте slozy-web. Настройки по умолчанию:
- Default TTL: 5 минут
- Max Entries: 10 000
- Cleanup Interval: 1 минута
- Сжатие: gzip для результатов > 1 KB
API-эндпоинты
Все под /api/v1/cache/ (не /admin/cache/):
| Endpoint | Описание |
|---|---|
GET /statistics | Метрики производительности кэша |
GET /config | Текущая конфигурация (только чтение) |
PUT /config | Обновление конфигурации (TTL, maxEntries, сжатие) |
GET /entries | Пагинированный список записей |
GET /entry/:key | Одна запись по ключу |
POST /entry | Создать запись вручную |
DELETE /entry/:key | Удалить запись |
POST /invalidate | Инвалидация (type: expired, all, key, slo, pattern) |
POST /warmup | Предзагрузка кэша |
Инвалидация
Кэш автоматически инвалидируется при изменении SLO (обновление метрики, цели, временного окна). На странице Cache Management accessible ручная инвалидация:
curl -X POST http://localhost:8080/api/v1/cache/invalidate \
-H "Content-Type: application/json" \
-d '{"type": "expired"}'Когда наполнится кэш
Кэш пуст после старта. Первые запросы к Dashboard и страницам SLO будут промахами (misses). После 2–3 открытий страниц в течение 5 минут hit rate начнёт расти.