httpapi: точки метрики за период отдаются одним запросом
- `GET /api/v1/metrics/{name}?from&to&layer` — ряд точек за период; конверт
объявляет слой, измеренный род, его применимость к отданному ряду и границу
окна измерения, а сам ряд собирается из одного слоя, выбранного по охвату
точек внутри периода
- use-case вынесен в `internal/points`, чтение — одним входом `store.ReadSeries`
под одной транзакцией; правило выбора слоя остаётся в домене и приходит в
хранилище колбэком
- `writeJSON` перестал экранировать HTML-символы и перестал глушить отказ
записи: дословность содержимого точки иначе не удерживается, а оборванное
тело уходило под видом успешного `200`
This commit is contained in:
@@ -80,3 +80,31 @@
|
||||
перестаёт молча. Проверено на закреплённом драйвере: одна испорченная строка
|
||||
`delivery.uncovered_sections` обесценивала и сверку новизны (вечное «сверка не
|
||||
состоялась» на каждой доставке), и перечень целиком.
|
||||
|
||||
## Предикат выбора источника и предикат отбора данных — одна граница
|
||||
|
||||
Объекты витрины адресуются часом, а точки отбираются точной меткой. Выборка
|
||||
объектов поэтому обязана быть **шире** запроса (точка `10:59` живёт в объекте
|
||||
`10:00`) — и ровно здесь появляется разрыв: множество «слои, у которых есть
|
||||
объекты в периоде» не совпадает с множеством «слои, у которых есть точки в
|
||||
периоде».
|
||||
|
||||
Правило: **решение о том, откуда брать данные, принимается по той же границе, по
|
||||
которой данные потом отбираются.** Иначе узел выбирает источник, в котором после
|
||||
точного отбора не остаётся ничего, и отдаёт пустоту при непустых данных
|
||||
соседнего источника — молча, потому что и выбор, и отбор по отдельности верны.
|
||||
|
||||
Прецедент: правило выбора слоя в Read API мерило охват часами объектов, а ряд
|
||||
отбирало метками точек; на периоде короче часа ответ уходил пустым при непустых
|
||||
минутных данных (ADR-2026-08-04-sloy-vybiraetsya-po-ohvatu-tochek).
|
||||
|
||||
## Значение из чужого тела имеет предел длины у КАЖДОГО адресата
|
||||
|
||||
Правило `docs/security.md` про предел длины читается как «в ключ, в лог, в
|
||||
отчёт» — и адресаты кончаются не там. Имя метрики уезжает ещё и в заголовок
|
||||
ответа: без предела `ETag` растёт вместе с именем, а кавычка внутри имени по
|
||||
RFC 9110 кончает метку, и условный запрос по такой метрике не сработает никогда.
|
||||
|
||||
Когда предел неудобен (значение нужно целиком), его заменяет **форма**: в метку
|
||||
уезжает хеш канонизированной строки, а не строка. Хеш здесь не секрет — он
|
||||
ограничитель длины и экранирование разом.
|
||||
|
||||
Reference in New Issue
Block a user