Help us shape the future of Go! Take the 2026 Go Developer Survey

tracecut

package
v1.16.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 30, 2026 License: Apache-2.0 Imports: 9 Imported by: 0

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

View Source
var (
	// ErrEmptyWalk — суду не подали ни одного файла.
	ErrEmptyWalk = errors.New("tracecut: обход поддерева не прочитал ни одного файла")

	// ErrNoOpenings — файлы прочитаны, а открытий спанов в них нет: вырез снят
	// целиком либо разбор перестал видеть свой предмет.
	ErrNoOpenings = errors.New("tracecut: в поддереве не найдено ни одного открытия спана")
)

Functions

This section is empty.

Types

type Census

type Census struct {
	Files    int
	Lines    int
	Openings int
}

Census — объём осмотренного: без него «ноль находок» неотличимо от «ноль прочитанного».

func (Census) String

func (c Census) String() string

type Closer

type Closer struct {
	// Import — путь импорта пакета, чья функция End отложена. Пусто, если End —
	// метод значения (`defer span.End()`), а не функция пакета.
	Import string

	// Receiver — выражение слева от `.End`: местное имя пакета либо значение.
	Receiver string

	// Line — строка отложенного вызова.
	Line int
}

Closer — один отложенный вызов End в области открытия.

type Finding

type Finding struct {
	Opening Opening
	Reason  string
}

Finding — открытие спана, которого вырез не держит.

func (Finding) String

func (f Finding) String() string

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

func ScanSpanOpenings(path string, src []byte) ([]Opening, error)

ScanSpanOpenings возвращает все открытия спанов в одном файле Go.

Разбор идёт по ТЕКСТУ, без сборки и без разрешения типов: проверке состава нужен ответ и о файле, который не собирается, — иначе «сборка сломалась» становилось бы неотличимо от «открытий нет».

Ошибка возвращается только на неразобравшемся файле. Файл без открытий — законный ПУСТОЙ ответ.

func (Opening) Closed

func (o Opening) Closed() bool

Closed сообщает, закрывается ли спан вообще.

type Report

type Report struct {
	Census   Census
	Openings []Opening
	Findings []Finding
}

Report — исход суда над поддеревом.

func Judge

func Judge(sources []Source, wrapper string) (Report, error)

Judge судит поддерево: каждое открытие спана обязано закрываться ровно одним отложенным вызовом End пакета wrapper.

Пустой обход и поддерево без открытий — ОТКАЗ, а не пустой успех; отказ несёт объём осмотренного. Неразобравшийся файл роняет суд целиком: открытие в нём выпало бы из переписи молча.

type Source

type Source struct {
	Path string
	Src  []byte
}

Source — один файл поддерева с содержимым.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL