1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- package middleware
- import (
- "github.com/gin-gonic/gin"
- "github.com/product-definition/utils/base"
- "net/http"
- "github.com/opentracing/opentracing-go"
- "github.com/opentracing/opentracing-go/ext"
- )
- func Tracer() gin.HandlerFunc {
- return func(ctx *gin.Context) {
- span := base.TracerStartSpan(getSpanContextFromRequest(ctx.Request), "HTTP_"+ctx.Request.URL.Path, getSpanTagsByHttpServer(ctx.Request))
- defer span.Finish()
- ctx.Set(base.TraceContextKey, span)
- ctx.Set("requestId", base.GetRequestIdFromTrace(ctx))
- ctx.Next()
- render, exist := ctx.Get("render")
- retCode := 0
- if exist {
- retCode = render.(base.TRenderJson).ReturnCode
- }
- span.SetTag("retCode", retCode)
- span.SetTag(string(ext.HTTPStatusCode), ctx.Writer.Status())
- }
- }
- func TracerBeforeRun(ctx *gin.Context) {
- ctx.Set("requestId", base.GetRequestIdFromTrace(ctx))
- }
- func TracerAfterRun(ctx *gin.Context) {
- retCode := 0
- if ctx.Err().Error != nil {
- retCode = -1
- }
- tempSpan, exist := ctx.Get(base.TraceContextKey)
- if exist {
- span := tempSpan.(opentracing.Span)
- span.SetTag("retCode", retCode)
- span.Finish()
- }
- }
- func getSpanContextFromRequest(req *http.Request) (spanContext opentracing.SpanContext) {
- if req.Header != nil {
- spanContext, _ = opentracing.GlobalTracer().Extract(opentracing.HTTPHeaders, opentracing.HTTPHeadersCarrier(req.Header))
- }
- return spanContext
- }
- func getSpanTagsByHttpServer(req *http.Request) map[string]interface{} {
- return map[string]interface{}{
- ext.SpanKindRPCServer.Key: ext.SpanKindRPCServer.Value,
- string(ext.HTTPMethod): req.Method,
- string(ext.HTTPUrl): req.URL.Path,
- }
- }
|