详解GoLang实现基于gin+jaeger的opentracing中间件
16lz
2021-01-22
下面由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
更多相关文章
- 一文学会Vue中间件管道[每日前端夜话0x8C]
- 作业调度中间件 Elastic-Job-Cloud 源码分析 —— 高可用
- 消息中间件 RocketMQ 源码解析 —— 调试环境搭建
- 数据库中间件 MyCAT 源码分析 —— 调试环境搭建
- 数据库中间件 MyCAT 源码分析 —— 【单库单表】查询
- 数据库中间件 MyCAT源码分析:【单库单表】插入
- 数据库中间件 Sharding-JDBC 源码分析 —— 事务(一)之BED
- 数据库中间件 Sharding-JDBC 源码分析 —— JDBC实现与读写分离
- 数据库分库分表中间件 Sharding-JDBC 源码分析 —— SQL 改写