Как передать opentracing данные с помощью JSON - PullRequest
0 голосов
/ 07 ноября 2019

Мой API-шлюз запускает трассировщик и span для проверки электронной почты. Затем он передается user-service для проверки.

Я хочу передать эти span детали user-service как объект json и запустить еще один span как

tracer.start_span('Validate Email', child_of=API_gateway_span)

Для этого я использовал следующую структуру:

type checkEmail struct {
    GatewayTracerSpan opentracing.SpanContext `json: gatewayTracerSpan`
    Email             string                  `json: email`
    Uuid              string                  `json: uuid`
}

In function()

validateEmailSpan := apitracer.tracer.StartSpan("Validate Email")

emailJson := checkEmail{
            GatewayTracerSpan: validateEmailSpan.Context(),
            Email:             email,
            Uuid:              uuid,
        }

Но всегда GatewayTracerSpan - пустое значение. Я только начал распределенную трассировку. Здесь я решил использовать json поверх http-headers, так как его легко обновить при любом изменении протокола.

Возможно ли это? Если так, я делаю это правильно? Или какие ошибки я допустил?

1 Ответ

1 голос
/ 07 ноября 2019

Один из способов связать участки из разных служб - это использовать uber-trace-id из родительского диапазона. Если у вас LogSpans установлено значение true в вашем ReporterConfig, uber-trace-id - это то, что распечатывается ("Reporting span xxx-xxx-xxx").

Вот как это может выглядеть в коде:

//API Gateway
carrier := opentracing.TextMapCarrier{} //you can use any type of carrier or even create your own
ctx, _ := opentracing.GlobalTracer().Extract(opentracing.TextMap, carrier)
span := apitracer.tracer.StartSpan(name, ext.RPCServerOption(ctx))
_ := span.Tracer().Inject(span.Context(), opentracing.TextMap, carrier)
uberTraceID := carrier["uber-trace-id"]

Теперь вы можете передавать uberTraceID вместо validateEmailSpan.Context() другим вашим службам.

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

//Email service
func NewChildSpanThatFollows(name, uberTraceID string) opentracing.Span {
    carrier := opentracing.TextMapCarrier{}
    carrier.Set("uber-trace-id", uberTraceID)
    ctx, _ := opentracing.GlobalTracer().Extract(opentracing.TextMap, carrier)
    span := opentracing.StartSpan(name, opentracing.FollowsFrom(ctx))
    _ := span.Tracer().Inject(span.Context(), opentracing.TextMap, carrier)

    return span
}

Этоработает для меня, если мне нужно увидеть промежутки между службами, связанными вместе по принципу «родитель-ребенок». Если необходимо передать и другую информацию, я бы предложил передать ее как обычные данные в объекте JSON, а затем либо создать свой собственный Carrier, либо использовать теги, если необходимо, выполнить поиск по этим переданным данным.

span.SetTag("request_id", requestID)

РЕДАКТИРОВАТЬ:

Здесь вы можете найти отличный учебник по использованию opentracing. Он использует HTTPHeadersCarrier, имеет пошаговое пошаговое руководство, но в основном это тот же процесс, что и выше.

...