Как добавить идентификатор трассировки для каждого входа в Go Micro Service - PullRequest
0 голосов
/ 28 мая 2019

Я хотел добавить идентификатор трассировки в журнал, выполняемый для каждого запроса к микро-сервису. Я хочу, чтобы это было так же, как для приложения Springboot, мы можем установить идентификатор трассировки в MDC и получить его и использовать при регистрации.

Я провел некоторое исследование и обнаружил, что MDC-эквивалент в go lang - это контекст. Итак, я установил идентификатор трассировки в моем контексте. Теперь проблема в том, что когда бы мне ни приходилось регистрироваться с помощью идентификатора трассировки, мне нужно передать контекст этой функции, что очень уродливо. Я ищу лучшее решение этой проблемы.

func HandlerFunction(f gin.HandlerFunc) gin.HandlerFunc{
    return func(cxt *gin.Context) {
        reqraceId := cxt.Request.Header.Get("trace-id")
        requid , _ := uuid.NewRandom()

        if reqTraceId == "" {
            c.Request.Header.Set("trace-id", requid.String())
        }

        f(c)
    }
}

1 Ответ

0 голосов
/ 29 мая 2019

Возможно, стоит прочитать context.Context, в частности эту статью , в которой есть раздел, который гласит:

В Google мы требуем, чтобы программисты Go передавали параметр Contextв качестве первого аргумента каждой функции на пути вызова между входящими и исходящими запросами.

TL; DR - нормально передавать контекст, но как лучше?

Есть два основных шаблона

  1. Попросить контекст датьвы логгер
  2. Дайте логгеру контекст

Контекст может использоваться для хранения значений:

context.WithValue(ctx, someKey, someValue)

Это означает, что мы можем сделать:

somepackage.Log(ctx).Info("hello world")
// or
sompackage.Info(ctx, "hello world")

Реализация этих двух примеров API может взаимодействовать с контекстом для получения необходимых значений без необходимости беспокоиться о дополнительной информации, которая была бы в MDC на любом из сайтов вызовов журналирования.

...