Один из способов связать участки из разных служб - это использовать 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
, имеет пошаговое пошаговое руководство, но в основном это тот же процесс, что и выше.