Documentation
¶
Overview ¶
Package tracecut держит ВЫРЕЗ ТЕЛЕМЕТРИИ во внесённом поддереве движка.
Предмет ¶
Апстрим `github.com/ory/fosite` открывает спаны сам и закрывает их через `github.com/ory/x/otelx`. При внесении поддерева эта обвязка заменена своей — `github.com/PRO-Robotech/corelib/internal/otelx` (зачем именно — там же в документации пакета). Замена создаёт класс отказа, которого у апстрима нет: обёртка оказывается пустышкой либо путь закрывает спан мимо неё — трассировка исчезает, а поведение движка не меняется НИ В ЧЁМ.
Пробы апстрима этот отказ не видят ПО ПОСТРОЕНИЮ: они судят, какой ответ движок отдал на какой запрос, а не открылся ли при этом спан.
Чем предмет держится ¶
Двумя половинами, и ни одна не заменяет другую.
ПОВЕДЕНИЕ enginespan_test.go — подставляет живой провайдер трассировки,
гоняет КАЖДЫЙ путь движка, на котором апстрим открывал спан, и
требует, чтобы спан был создан, закрыт ровно однажды и отмечен
исходом так, как отмечает его текущая обёртка.
СОСТАВ coverage_test.go — судит этим разбором ФАКТИЧЕСКИЙ состав
открытий спанов в поддереве: каждое закрыто обёрткой
фундамента, и перечень поведенческой половины равен составу.
Без неё поведенческая половина судила бы перечень, а не класс.
Что именно считает разбор ¶
ОТКРЫТИЕ — вызов `….Start(ctx, имя, …)`, то есть селектор Start не меньше чем с двумя доводами; имя-литерал разбор достаёт, иное открытие не отбрасывает, а отдаёт с пустым именем. ЗАКРЫТИЕ — отложенный вызов `….End(…)` в той же области: функции либо функционального литерала, потому что отложенный вызов исполняется при выходе из СВОЕЙ функции. Закрытие через функцию пакета разбор отдаёт с ДОСЛОВНЫМ путём импорта, закрытие методом значения — с пустым путём.
Имя пакета к делу не относится: наша обёртка зовётся `otelx` ровно так же, как заменённая, — благодаря этому места вызова в поддереве остаются побайтово апстримными. Различить их можно ТОЛЬКО по пути импорта.
Обёртка законна только ОТЛОЖЕННОЙ НАПРЯМУЮ (`defer otelx.End(span, &err)`): её recover работает лишь тогда, когда отложенная функция — она сама. Форма `defer func() { otelx.End(span, &err) }()` поэтому законной не считается — закрытие во вложенном литерале принадлежит литералу.
Index ¶
Constants ¶
This section is empty.
Variables ¶
var ( // ErrEmptyWalk — суду не подали ни одного файла. ErrEmptyWalk = errors.New("tracecut: обход поддерева не прочитал ни одного файла") // ErrNoOpenings — файлы прочитаны, а открытий спанов в них нет: вырез снят // целиком либо разбор перестал видеть свой предмет. ErrNoOpenings = errors.New("tracecut: в поддереве не найдено ни одного открытия спана") )
Functions ¶
This section is empty.
Types ¶
type Census ¶
Census — объём осмотренного: без него «ноль находок» неотличимо от «ноль прочитанного».
type Closer ¶
type Closer struct {
// Import — путь импорта пакета, чья функция End отложена. Пусто, если End —
// метод значения (`defer span.End()`), а не функция пакета.
Import string
// Receiver — выражение слева от `.End`: местное имя пакета либо значение.
Receiver string
// Line — строка отложенного вызова.
Line int
}
Closer — один отложенный вызов End в области открытия.
type Opening ¶
type Opening struct {
// File и Line — координата открытия, как её дал разбор.
File string
Line int
// Func — область открытия: «Функция», «Тип.Метод», для литерала —
// «<объемлющая>.funcN», вне функций — «<пакет>».
Func string
// Name — имя спана из строкового литерала; пусто, если второй довод не
// литерал.
Name string
// Closers — отложенные вызовы End в той же области. Пусто означает, что
// спан открыт и брошен.
Closers []Closer
}
Opening — одно открытие спана вместе с тем, чем оно закрывается.
func ScanSpanOpenings ¶
ScanSpanOpenings возвращает все открытия спанов в одном файле Go.
Разбор идёт по ТЕКСТУ, без сборки и без разрешения типов: проверке состава нужен ответ и о файле, который не собирается, — иначе «сборка сломалась» становилось бы неотличимо от «открытий нет».
Ошибка возвращается только на неразобравшемся файле. Файл без открытий — законный ПУСТОЙ ответ.
type Report ¶
Report — исход суда над поддеревом.
func Judge ¶
Judge судит поддерево: каждое открытие спана обязано закрываться ровно одним отложенным вызовом End пакета wrapper.
Пустой обход и поддерево без открытий — ОТКАЗ, а не пустой успех; отказ несёт объём осмотренного. Неразобравшийся файл роняет суд целиком: открытие в нём выпало бы из переписи молча.