- заведён internal/clock: Now даёт метку в UTC, Start — начало измерения длительности с монотонными часами; девять мест рабочего кода и запрос захвата переведены на него, долг «время time.Now() по месту» закрыт - клиент SpeechKit узнавал конец потока сравнением err.Error() == "EOF": отказ с тем же текстом вернул бы усечённую расшифровку как готовую, теперь errors.Is(err, io.EOF) - починены находки новых линтеров: две опечатки, два slog.DiscardHandler, четыре неэкранированные подстановки в docker/entrypoint.sh
33 lines
1.9 KiB
Go
33 lines
1.9 KiB
Go
// Package clock — единая точка чтения времени.
|
|
//
|
|
// Прежде время брали `time.Now()` по месту вызова, и конвенция
|
|
// [docs/conventions/database.md] числила это долгом: метка времени в локальной
|
|
// зоне, а хранилище сравнивает времена **строками** побайтово. Долг закрыт
|
|
// заведением этого пакета; правило держит `forbidigo` в `.golangci.yml` —
|
|
// `time.Now` вне этого пакета запрещён.
|
|
//
|
|
// Метка времени и измерение длительности читаются по-разному, и потому здесь две
|
|
// функции, а не одна.
|
|
package clock
|
|
|
|
import "time"
|
|
|
|
// Now — метка времени: UTC, как её пишет и сравнивает хранилище.
|
|
//
|
|
// Приведение к UTC снимает монотонные часы, и для метки это верно: её кладут в
|
|
// колонку и сравнивают с чужими значениями, а не с собственным прошлым
|
|
// показанием.
|
|
func Now() time.Time {
|
|
return time.Now().UTC()
|
|
}
|
|
|
|
// Start — начало измерения длительности: время **с монотонными часами**.
|
|
//
|
|
// Зоны у него нет намеренно: значение не выходит наружу и годится только на
|
|
// вход `time.Since`. Монотонные часы здесь и нужны — иначе перевод стрелок или
|
|
// поправка ntp посреди конвертации дала бы отрицательную или скачущую
|
|
// длительность в журнале и в метрике.
|
|
func Start() time.Time {
|
|
return time.Now()
|
|
}
|