request_tracing.go 1002 B

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. package middleware
  2. import (
  3. "net/http"
  4. "time"
  5. opentracing "github.com/opentracing/opentracing-go"
  6. tlog "github.com/opentracing/opentracing-go/log"
  7. "gopkg.in/macaron.v1"
  8. )
  9. func RequestTracing() macaron.Handler {
  10. return func(res http.ResponseWriter, req *http.Request, c *macaron.Context) {
  11. rw := res.(macaron.ResponseWriter)
  12. var span opentracing.Span
  13. opName := req.URL.Path
  14. carrier := opentracing.HTTPHeadersCarrier(req.Header)
  15. wireContext, err := opentracing.GlobalTracer().Extract(
  16. opentracing.HTTPHeaders, carrier)
  17. if err != nil {
  18. span = opentracing.StartSpan(opName)
  19. } else {
  20. span = opentracing.StartSpan(opName, opentracing.ChildOf(wireContext))
  21. }
  22. defer span.Finish()
  23. ctx := opentracing.ContextWithSpan(req.Context(), span)
  24. req = req.WithContext(ctx)
  25. start := time.Now()
  26. c.Next()
  27. status := rw.Status()
  28. span.LogFields(
  29. tlog.Int("http.status_code", status),
  30. tlog.Float64("waited.millis", float64(time.Since(start)/time.Millisecond)))
  31. }
  32. }