Каталог разрезов и измеренный род агрегации
- род метрики выводится сверкой минутного слоя с часовым: часовое значение сходится с суммой минутных — накопительная, со средним — мгновенная, иначе `unknown` и свёртка не предлагается вовсе. На живом архиве (123 доставки, 31 метрика) 7 накопительных, 9 мгновенных, противоречащих часов ноль - `GET /api/v1/metrics` под токеном чтения отдаёт единицы, слои с границами и род вместе с основанием измерения; род нигде не хранится — он функция витрины, а витрина функция журнала, устаревать в нём нечему - миграция 00009: покрывающий индекс, чтобы каталог отвечал по учётным колонкам, не разжимая содержимое объектов
This commit is contained in:
@@ -0,0 +1,34 @@
|
||||
package httpapi
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
|
||||
"git.vakhrushev.me/av/healthlog/internal/catalog"
|
||||
)
|
||||
|
||||
// catalogResponse — оболочка ответа каталога.
|
||||
//
|
||||
// Объект, а не голый массив: список метрик — не единственное, что каталогу
|
||||
// когда-нибудь придётся отдать, а массив верхнего уровня расширить нечем.
|
||||
type catalogResponse struct {
|
||||
Metrics []catalog.Metric `json:"metrics"`
|
||||
}
|
||||
|
||||
// handleMetrics отдаёт каталог разрезов с измеренным родом агрегации.
|
||||
//
|
||||
// Список приходит из домена уже непустым срезом: nil сериализуется в `null`, и
|
||||
// пустая витрина отдавала бы клиенту `"metrics": null` вместо `[]`. Тест,
|
||||
// сравнивающий разобранные структуры, этого не увидел бы — потому приёмочная
|
||||
// проверка сравнивает байты ответа. Второй страховки здесь нет намеренно:
|
||||
// подстраховка поверх подстраховки прячет отказ первой.
|
||||
func (a *api) handleMetrics(w http.ResponseWriter, r *http.Request) {
|
||||
metrics, err := a.catalog.Metrics(r.Context())
|
||||
if err != nil {
|
||||
// Исход операции логирует доменный слой, транспорт только переводит его
|
||||
// в ответ. Наружу уходит человекочитаемое сообщение, а не текст ошибки:
|
||||
// в нём имена колонок и форма запроса.
|
||||
writeError(w, http.StatusInternalServerError, "каталог не собрался")
|
||||
return
|
||||
}
|
||||
writeJSON(w, http.StatusOK, catalogResponse{Metrics: metrics})
|
||||
}
|
||||
Reference in New Issue
Block a user