栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Go语言

详解GoLang实现基于gin+jaeger的opentracing中间件

Go语言 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

详解GoLang实现基于gin+jaeger的opentracing中间件

下面由golang教程栏目给大家介绍GoLang实现基于gin+jaeger的opentracing中间件的方法,希望对需要的朋友有所帮助!

完整源码:https://github.com/why444216978/gin-apijaeger下载地址:https://www.jaegertracing.io/download/

运行jaeger:

./jaeger-all-in-one

gin注册中间件:

server := gin.New()server.Use(trace.OpenTracing("gin-api"))

中间件定义:

package traceimport ("github.com/gin-gonic/gin"opentracing "github.com/opentracing/opentracing-go""github.com/opentracing/opentracing-go/ext")const defaultComponentName = "net/http"const JaegerOpen = 1const AppName = "gin-api"const JaegerHostPort = "127.0.0.1:6831"func OpenTracing(serviceName string) gin.HandlerFunc {return func(c *gin.Context) {if JaegerOpen == 1 {var parentSpan opentracing.Spantracer, closer := NewJaegerTracer(AppName, JaegerHostPort)defer closer.Close()spCtx, err := opentracing.GlobalTracer().Extract(opentracing.HTTPHeaders, opentracing.HTTPHeadersCarrier(c.Request.Header))if err != nil {parentSpan = tracer.StartSpan(c.Request.URL.Path)defer parentSpan.Finish()} else {parentSpan = opentracing.StartSpan(c.Request.URL.Path,opentracing.ChildOf(spCtx),opentracing.Tag{Key: string(ext.Component), Value: "HTTP"},ext.SpanKindRPCServer,)defer parentSpan.Finish()}c.Set("Tracer", tracer)c.Set("ParentSpanContext", parentSpan.Context())}c.Next()}}

http请求实现:

package httpimport ("bytes""encoding/json""io/ioutil""net/http""strconv""gin-frame/libraries/util"simplejson "github.com/bitly/go-simplejson""github.com/gin-gonic/gin""github.com/opentracing/opentracing-go""github.com/opentracing/opentracing-go/ext"opentracingLog "github.com/opentracing/opentracing-go/log")func HttpSend(c *gin.Context, method, url, logId string, data map[string]interface{}) map[string]interface{} {var (err errorret = make(map[string]interface{})req *http.Request)client := &http.Client{}//请求数据byteDates, err := json.Marshal(data)util.Must(err)reader := bytes.NewReader(byteDates)//urlurl = url + "?logid=" + logId//构建reqreq, err = http.NewRequest(method, url, reader)    util.Must(err)//设置请求headerreq.Header.Add("content-type", "application/json")tracer, _ := c.Get("Tracer")parentSpanContext, _ := c.Get("ParentSpanContext")span := opentracing.StartSpan("httpDo",opentracing.ChildOf(parentSpanContext.(opentracing.SpanContext)),opentracing.Tag{Key: string(ext.Component), Value: "HTTP"},ext.SpanKindRPCClient,)defer span.Finish()injectErr := tracer.(opentracing.Tracer).Inject(span.Context(), opentracing.HTTPHeaders, opentracing.HTTPHeadersCarrier(req.Header))if injectErr != nil {span.LogFields(opentracingLog.String("inject-error", err.Error()))}//发送请求resp, err := client.Do(req)util.Must(err)defer resp.Body.Close()b, err := ioutil.ReadAll(resp.Body)util.Must(err)ret["code"] = resp.StatusCoderet["msg"] = "success"ret["data"] = make(map[string]interface{})if resp.StatusCode != http.StatusOK {ret["msg"] = "http code:" + strconv.Itoa(resp.StatusCode)return ret}if b != nil {res, err := simplejson.NewJson(b)util.Must(err)ret["data"] = res}return ret}

调用代码:

package testimport ("net/http""github.com/gin-gonic/gin""gin-frame/libraries/config"rpc_http "gin-frame/libraries/http")func Rpc(c *gin.Context) {postdata:= make(map[string]interface{})logId := c.Writer.Header().Get(config.GetHeaderLogIdField())sendUrl := "https://www.baidu.com"//urlMap := strings.Split(sendUrl, "?")//urlQueryMap := url.ParseUriQueryToMap(sendUrl)ret := rpc_http.HttpSend(c, "POST", sendUrl, logId, postData)c.JSON(http.StatusOK, gin.H{"errno":  0,"errmsg": "success","data":   ret,})c.Done()}

查看调用链路:

更多相关技术文章,请访问go语言栏目!

附原文地址:https://success.blog.csdn.net/article/details/104100597?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2.control

以上就是详解GoLang实现基于gin+jaeger的opentracing中间件的详细内容,更多请关注考高分网其它相关文章!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/793881.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号