- род метрики выводится сверкой минутного слоя с часовым: часовое значение сходится с суммой минутных — накопительная, со средним — мгновенная, иначе `unknown` и свёртка не предлагается вовсе. На живом архиве (123 доставки, 31 метрика) 7 накопительных, 9 мгновенных, противоречащих часов ноль - `GET /api/v1/metrics` под токеном чтения отдаёт единицы, слои с границами и род вместе с основанием измерения; род нигде не хранится — он функция витрины, а витрина функция журнала, устаревать в нём нечему - миграция 00009: покрывающий индекс, чтобы каталог отвечал по учётным колонкам, не разжимая содержимое объектов
35 lines
1.9 KiB
Go
35 lines
1.9 KiB
Go
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})
|
|
}
|