tracecut

package
v1.10.0-rc.5 Latest Latest
Warning

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

Go to latest
Published: Sep 28, 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