从请求标头中提取示踪剂的正确方法

我有克拉肯德·阿皮盖特威,它使用开放跟踪并发送req标头作为X-B3-...用于跟踪,我的服务正在使用开放遥测。
这就是我现在在耶格尔身上看到的。
在此处输入图像描述

在此处输入图像描述

我希望服务跨度在蜂巢槽下。

我已完成的解决方法:
这是使用 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,

    })

}


慕妹3242003
浏览 97回答 1
1回答

跃然一笑

好吧,我想出了如何让它工作。我添加了此中间件,它将请求上下文与标头跟踪 ID、spanID 和跟踪标志同步。在此之后,我们可以根据需要创建跟踪器和跨度。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)    })}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go