Канал о разработке. Go, PHP, Postgres, тимлидство и т.д
go build -coverпосле чего, если запустить такое приложение, то будет собираться статистика, какие части приложения были выполнены, а какие нет, и складываться в папочку, указанную в переменной окружения. Это, конечно, было сделано для хитрых интеграционных тестов, когда приложение запускается целиком в каких-то сценариях (а не через go test), но возможно это можно попробовать использовать и по-другому: запустить прям на проде, подержать какое-то время и посмотреть, какие участки кода в реальности никогда не запускаются. Это бывает нужно, когда в проекте есть старый легаси-код, и никто уже не знает, что там и зачем. Часто часть этого кода - просто старое недовыпиленное говно. И наоборот - кажется, что код уже не нужен, а он нет-нет, но иногда работает. Правда, сбор статистики наверняка вносит некоторое торможение в код, насколько много - хз, я пока что не пробовал (У меня сейчас довольно простые микросервисы, там мало кода, и нет старого непонятного легаси). Так что это точно не всем подойдёт. Просто как мысль на подумать Пара деталей: Запускать надо с переменной окружения GOCOVERDIR
GOCOVERDIR=somedata ./myappПосле завершения приложения в этой папке появятся бинарники, которые можно сконвертировать в нормальный вид
go tool covdata textfmt -i=somedata -o coverage.txtи посмотреть, что там, стандартными средствами, например так:
go tool cover -html=coverage.txtКстати, если приложение было внезапно принудительно завершено, например из-за паники, то статистика не соберется
// здесь message - это "hello",
// и еще приделывается ключ-значение count=3
logger.Info("hello", "count", 3)
если использовать вместе с json-хандлером, то вывод будет такой:
{"time":"2022-11-08T15:28:26.000000000-05:00","level":"INFO","msg":"hello","count":3}
- эти ключи-значения можно группировать, и получать вложенный джейсон (slog.Group)
- можно выводить лог с контекстом
// slog.InfoCtx(ctx, "message", "key", val)
- всякие фишечки для удобства и производительности, например метод With, который возвращает sub-логгер, при создании которого можно сразу задать некоторые атрибуты. Встроенные хандлеры отформатируют их один раз.
В общем, в своих проектах я, пожалуй, выкину zerolog, потому что встроенного логгера мне вроде бы теперь хватает.
Кстати, все эти нововведения стали возможны благодаря тому, что в 1.19 сделали дженерики. Даже если они в продуктовом коде большинству не нужны, то для общих библиотек - must have