下面由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

更多相关文章

  1. 一文学会Vue中间件管道[每日前端夜话0x8C]
  2. 作业调度中间件 Elastic-Job-Cloud 源码分析 —— 高可用
  3. 消息中间件 RocketMQ 源码解析 —— 调试环境搭建
  4. 数据库中间件 MyCAT 源码分析 —— 调试环境搭建
  5. 数据库中间件 MyCAT 源码分析 —— 【单库单表】查询
  6. 数据库中间件 MyCAT源码分析:【单库单表】插入
  7. 数据库中间件 Sharding-JDBC 源码分析 —— 事务(一)之BED
  8. 数据库中间件 Sharding-JDBC 源码分析 —— JDBC实现与读写分离
  9. 数据库分库分表中间件 Sharding-JDBC 源码分析 —— SQL 改写

随机推荐

  1. 【eoeAndroid社区索引】android 条形码的
  2. android 之 install Location
  3. java解析json字符串的两种方法详解(Andro
  4. Android 输入限制
  5. 非一般的原因:Unable instantiate applica
  6. 实现Android简单动画旋转案例
  7. Android用户界面 UI组件--自动提示输入框
  8. OpenCV4Android开发之旅(一)----OpenCV2.
  9. android设定手机的显示模式,横竖屏,是否全
  10. [转载]系统内置的一些工具类