На самом деле не так много вариантов, кроме запуска диапазона в каждой функции, которую вы хотите использовать:
func something(ctx context.Context) {
ctx, span := trace.StartSpan(ctx, "something")
defer span.End()
}
Если ваши функции имеют общую сигнатуру вызова или вы можете объединить свою функцию в подпись общего вызова, вы можете написать обертку. Примеры этого можно увидеть в http «middleware» .
. Рассмотрим http.Handler. Вы можете написать декоратор для ваших функций, который обрабатывает жизненный цикл диапазона:
func WithTraced(handler http.Handler, opName string) http.Handler {
return func(w http.ResponseWriter, r *http.Request) {
ctx, span := trace.StartSpan(ctx, opName)
defer span.End()
handler.ServeHTTP(w, r.WithContext(ctx))
}
}
Аналогичный шаблон можно применить с помощью встраивания структур.