tracer.go 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. package middleware
  2. import (
  3. "github.com/gin-gonic/gin"
  4. "base-gin/utils/base"
  5. "net/http"
  6. "github.com/opentracing/opentracing-go"
  7. "github.com/opentracing/opentracing-go/ext"
  8. )
  9. func Tracer() gin.HandlerFunc {
  10. return func(ctx *gin.Context) {
  11. span := base.TracerStartSpan(getSpanContextFromRequest(ctx.Request), "HTTP_"+ctx.Request.URL.Path, getSpanTagsByHttpServer(ctx.Request))
  12. defer span.Finish()
  13. ctx.Set(base.TraceContextKey, span)
  14. ctx.Set("requestId", base.GetRequestIdFromTrace(ctx))
  15. ctx.Next()
  16. render, exist := ctx.Get("render")
  17. retCode := 0
  18. if exist {
  19. retCode = render.(base.TRenderJson).ReturnCode
  20. }
  21. span.SetTag("retCode", retCode)
  22. span.SetTag(string(ext.HTTPStatusCode), ctx.Writer.Status())
  23. }
  24. }
  25. func TracerBeforeRun(ctx *gin.Context) {
  26. ctx.Set("requestId", base.GetRequestIdFromTrace(ctx))
  27. }
  28. func TracerAfterRun(ctx *gin.Context) {
  29. retCode := 0
  30. if ctx.Err().Error != nil {
  31. retCode = -1
  32. }
  33. tempSpan, exist := ctx.Get(base.TraceContextKey)
  34. if exist {
  35. span := tempSpan.(opentracing.Span)
  36. span.SetTag("retCode", retCode)
  37. span.Finish()
  38. }
  39. }
  40. func getSpanContextFromRequest(req *http.Request) (spanContext opentracing.SpanContext) {
  41. if req.Header != nil {
  42. spanContext, _ = opentracing.GlobalTracer().Extract(opentracing.HTTPHeaders, opentracing.HTTPHeadersCarrier(req.Header))
  43. }
  44. return spanContext
  45. }
  46. func getSpanTagsByHttpServer(req *http.Request) map[string]interface{} {
  47. return map[string]interface{}{
  48. ext.SpanKindRPCServer.Key: ext.SpanKindRPCServer.Value,
  49. string(ext.HTTPMethod): req.Method,
  50. string(ext.HTTPUrl): req.URL.Path,
  51. }
  52. }