0

我的 API 网关启动了一个跟踪器和一个用于验证电子邮件的跨度。然后将其传递给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`
}

function()

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

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

但始终GatewayTracerSpan是空值。我刚刚开始分布式跟踪。在这里,我选择使用 json 而不是 native http-headers,因为它可以轻松升级任何协议更改。

这可能吗?如果是这样,我做得对吗?或者我犯了什么错误?

4

1 回答 1

2

链接来自不同服务的跨度的一种方法是使用uber-trace-id父跨度。如果你在你的, 中LogSpans设置了,就是打印出来的 ( )。trueReporterConfiguber-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,它有一步一步的演练,但它与上面的过程基本相同。

于 2019-11-07T09:20:47.360 回答