小編給大家分享一下GoLang實(shí)現(xiàn)基于gin+jaeger的opentracing中間件的示例,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
站在用戶的角度思考問題,與客戶深入溝通,找到蘭考網(wǎng)站設(shè)計(jì)與蘭考網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:做網(wǎng)站、成都網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、空間域名、虛擬空間、企業(yè)郵箱。業(yè)務(wù)覆蓋蘭考地區(qū)。
完整源碼:https://github.com/why444216978/gin-api jaeger下載地址:https://www.jaegertracing.io/download/
運(yùn)行jaeger:
./jaeger-all-in-one
gin注冊(cè)中間件:
server := gin.New() server.Use(trace.OpenTracing("gin-api"))
中間件定義:
package trace import ( "github.com/gin-gonic/gin" opentracing "github.com/opentracing/opentracing-go" "github.com/opentracing/opentracing-go/ext" ) const defaultComponentName = "net/http" const JaegerOpen = 1 const 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.Span tracer, 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請(qǐng)求實(shí)現(xiàn):
package http import ( "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 error ret = make(map[string]interface{}) req *http.Request ) client := &http.Client{} //請(qǐng)求數(shù)據(jù) byteDates, err := json.Marshal(data) util.Must(err) reader := bytes.NewReader(byteDates) //url url = url + "?logid=" + logId //構(gòu)建req req, err = http.NewRequest(method, url, reader) util.Must(err) //設(shè)置請(qǐng)求header req.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())) } //發(fā)送請(qǐng)求 resp, err := client.Do(req) util.Must(err) defer resp.Body.Close() b, err := ioutil.ReadAll(resp.Body) util.Must(err) ret["code"] = resp.StatusCode ret["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 }
調(diào)用代碼:
package test import ( "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() }
查看調(diào)用鏈路:
以上是“GoLang實(shí)現(xiàn)基于gin+jaeger的opentracing中間件的示例”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
本文名稱:GoLang實(shí)現(xiàn)基于gin+jaeger的opentracing中間件的示例
文章分享:http://aaarwkj.com/article48/ijpiep.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、網(wǎng)頁設(shè)計(jì)公司、網(wǎng)站營銷、網(wǎng)站改版、動(dòng)態(tài)網(wǎng)站、電子商務(wù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)