Как настроить задержку в отображении данных за предыдущий день в grafana/postgreSQL?

Как можно реализовать механизм "замораживания данных" в конце каждого дня для базы данных postgreSQL, содержащей информацию о учениках, их оценках и проведенных часах, чтобы избежать изменений данных задним числом и обеспечить вывод актуальной информации в Grafana?
  • 6 февраля 2024 г. 9:08
Ответы на вопрос 4
Чтобы настроить задержку в отображении данных за предыдущий день в Grafana с использованием данных из PostgreSQL, вы можете использовать возможности SQL-запросов для фильтрации данных по времени. Например, если вы хотите, чтобы данные отображались с задержкой в один день, то ваш SQL-запрос должен иметь условие, которое исключает данные за последние 24 часа.

Пример SQL-запроса для Grafana, который исключает данные последних 24 часов:

```sql
SELECT
  time_column,
  data_column
FROM
  your_table
WHERE
  time_column < NOW() - INTERVAL '1 day'
```

"Замораживание" данных — это более сложная задача. Одним из вариантов реализации механизма "замораживания данных" в PostgreSQL может быть создание бэкапа таблицы с данными на конец каждого дня. Это можно сделать, например, с помощью запланированных задач (cron jobs на Linux или Scheduled Tasks на Windows).

Для создания бэкапа конкретной таблицы каждый день можно использовать команду `pg_dump` для PostgreSQL:

```shell
pg_dump -h hostname -U username -W -t table_name dbname > backup_filename.sql
```

Затем, чтобы "заморозить" данные, можно скопировать содержимое оригинальной таблицы в архивную таблицу в конце каждого дня. Это можно сделать, выполняя SQL-запросы в написанном скрипте запланированных задач:

```sql
CREATE TABLE your_table_archive AS 
SELECT * FROM your_table;
```

После этого можно настроить Grafana на использование архивной таблицы или создать вьюху, которая будет отражать только "замороженные" данные.

Важно заметить, что в PostgreSQL также есть функциональность, которая позволяет создавать таблицы только для чтения, но она может быть не столь эффективной для "замораживания" данных по каждому дню, так как вам потребуется изменять права доступа к таблице каждый раз.

Если вы хотите ограничить возможность изменения данных задним числом, вы можете также использовать систему контроля версий данных или триггеры в PostgreSQL для регистрации попыток изменений данных и отката таких изменений, если они были совершены недопустимым образом.
Тригер Вам в помощь
Перекладывать в начале новых суток данные за прошедший день в другую таблицу, по которой и строить графики в Графане.
Такую задачу лучше всего решать на прикладном уровне . Тоесть создать таблицу аудита учеников и оценок . 
Любое изменение основных таблиц - аудируется и потом только пишется в основные таблицы.
Потом по аудиту легко восстановить состояние таблицы в прошлом.

Некоторые DBMS (Oracle) содержат поддержку ретроспективных запросов которые позволяют
взглянуть на таблицу в прошлом (SELECT .... AS OF ....).

Некоторые средста Bigdata (Delta Tables) называют эту фичу time travel. . Синтаксис аналогичен
Оракловому. Глубина хранения истории обычно задается в настройках таблицы ( retention ).

Насчет Postgresql - не знаю. Надо читать документацию.
Похожие вопросы