为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕妹3242003 2022-09-26 15:42:15
我有克拉肯德·阿皮盖特威,它使用开放跟踪并发送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,    })}
查看完整描述

1 回答

?
跃然一笑

TA贡献1826条经验 获得超6个赞

好吧,我想出了如何让它工作。我添加了此中间件,它将请求上下文与标头跟踪 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)

    })

}


查看完整回答
反对 回复 2022-09-26
  • 1 回答
  • 0 关注
  • 68 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信