【问题标题】:How to pass opentracing data using json如何使用 json 传递 opentracing 数据
【发布时间】:2019-11-07 01:16:27
【问题描述】:

我的 API 网关启动了一个跟踪器和一个用于验证电子邮件的跨度。然后将其传递给user-service 进行验证。

我想将这个 span 详细信息作为 json 对象传递给 user-service 并启动另一个 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 而不是原生 http-headers,因为它可以轻松升级任何协议更改。

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

【问题讨论】:

  • 您需要validateEmailSpan.Context() 提供什么?您只是想查看在不同服务中创建、链接在一起的跨度,还是需要来自validateEmailSpan.Context() 的一些特定信息?
  • @eminlala 我只想将跨度数据传递给我的下一个服务并启动一个新跨度,因为将 API 网关跨度保持为父级。

标签: go microservices opentracing distributed-tracing


【解决方案1】:

链接来自不同服务的跨度的一种方法是使用父跨度中的uber-trace-id。如果您在ReporterConfig 中将LogSpans 设置为true,则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)

编辑:

Here 你可以找到一个关于使用 opentracing 的很棒的教程。它使用HTTPHeadersCarrier,它有一个逐步的演练,但它与上面的过程基本相同。

【讨论】:

  • 我按照您的建议更改了代码,但 TraceID 仍然为空。
  • @Sachith 我在上面的答案中添加了一个有用的链接。除此之外,如果不看看您实现的代码,我真的无法提供更多帮助。
猜你喜欢
  • 2015-08-30
  • 1970-01-01
  • 2019-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-26
相关资源
最近更新 更多