Могу ли я отследить суб-функцию с помощью OpenCensus?

Я хочу отслеживать весь проект с помощью Opencensus и Jaeger. Я добавил HTTP-трассировку в службы ввода и добавил stratspan в промежуточное ПО, окружающее все мои службы, и этот двухполосный вызов и показ на Jaeger. Моя проблема в том, что каждая служба содержит много функций, и я хочу видеть трассировку всех моих функций, но таким образом не показывать общую службу, не отображаемую для каждой функции. Мне не нравится добавлять по одной функции по одному stratspan. Я использую ctx context.Context запись для всех своих функций, но не иначе!


person Mahmoud Masih Tehrani    schedule 25.03.2020    source источник


Ответы (1)


На самом деле не так много вариантов, кроме запуска диапазона в каждой функции, которую вы хотите инструментировать:

func something(ctx context.Context) {
  ctx, span := trace.StartSpan(ctx, "something")
  defer span.End()
}

Если ваши функции имеют общую сигнатуру вызова или вы можете объединить свою функцию в общую сигнатуру вызова, вы можете написать оболочку. Примеры этого можно увидеть в http "промежуточном программном обеспечении".

Рассмотрим http.Handler, вы могли бы написать декоратор для ваших функций, который обрабатывает жизненный цикл span:

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))

    }

}

Аналогичный шаблон можно применить с помощью встраивания структур.

person dm03514    schedule 26.03.2020
comment
Я использовал Gokit с тем же промежуточным программным обеспечением opencensus.TraceEndpoint('service_name') пакета github.com/go-kit/kit/tracing/opencensus yo, это используется так же, как и по-вашему, используйте промежуточное программное обеспечение, окружающее все функции служб, но просто добавьте один промежуток, а не один промежуток для каждой функции! - person Mahmoud Masih Tehrani; 28.03.2020