【问题标题】:Proper way of extracting tracer from request Headers for opentelemetry从opentelemetry的请求标头中提取跟踪器的正确方法
【发布时间】:2021-10-23 03:53:41
【问题描述】:

我有 krakend apigateway,它使用 opentracing 并将 req 标头作为 X-B3-... 发送以进行跟踪,而我的服务正在使用 opentelemetry。
这就是我现在在 jaeger 上的内容。
enter image description here

enter image description here

我希望服务跨度位于 apigateways 之下。

我已经完成的解决方法:
这是使用 chi 路由器的请求的确切处理程序。

func (env *Env) getCommentForBlogRouter(w http.ResponseWriter, r *http.Request) {
    ctx := r.Context()

    keys := []string{"X-B3-Traceid", "X-B3-Spanid", "X-B3-Sampled"}
    var carrier propagation.HeaderCarrier = propagation.HeaderCarrier{}
    for _, k := range keys {
        carrier.Set(strings.ToLower(k), r.Header[k][0])
    }

    var propagator propagation.TextMapPropagator = otel.GetTextMapPropagator()
    ctx = propagator.Extract(ctx, carrier)

    // fmt.Println(ctx)
    tr := otel.Tracer("Handler: blog-comments")
    ctx, span := tr.Start(ctx, "handler span")
    defer span.End()

    blogId := r.URL.Query().Get("blog-id")
    span.SetAttributes(attribute.Key("blog-id").String(fmt.Sprint(blogId)))

    var spanDB trace.Span
    ctx, spanDB = tr.Start(ctx, "Select row")

    comments, err := env.comments.GetForBlog(blogId)
    spanDB.End()

    var spanRes trace.Span
    _, spanRes = tr.Start(ctx, "Sending Response")
    defer spanRes.End()

    if err != nil {
        fmt.Println(err)
        SendError(w, http.StatusInternalServerError, "Something went wrong")
        return
    }

    if comments == nil {
        comments = []models.Comment{}
    }
    SendResponse(w, http.StatusOK, map[string]interface{}{
        "data": comments,
    })
}

【问题讨论】:

  • 不要发布图片。
  • 好的,会记住的。只是想直观地分享痕迹。

标签: go opentracing open-telemetry distributed-tracing krakend


【解决方案1】:

好的,我想出了如何让它工作。 我添加了这个中间件,它会将请求上下文与标头 traceID、spanID 和 traceFlags 同步。 在此之后,我们可以根据需要创建跟踪器和跨度。

func Tracing(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        traceID, _ := trace.TraceIDFromHex(r.Header["X-B3-Traceid"][0])
        spanID, _ := trace.SpanIDFromHex(r.Header["X-B3-Spanid"][0])
        var traceFlags trace.TraceFlags
        if r.Header["X-B3-Sampled"][0] == "1" {
            traceFlags = trace.FlagsSampled
        }

        spanContext := trace.NewSpanContext(trace.SpanContextConfig{
            TraceID:    traceID,
            SpanID:     spanID,
            TraceFlags: traceFlags,
        })

        ctx := trace.ContextWithSpanContext(r.Context(), spanContext)

        r = r.WithContext(ctx)
        next.ServeHTTP(w, r)
    })
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多