| 123456789101112131415161718192021222324252627282930313233343536373839404142 |
- package middleware
- import (
- "net/http"
- "time"
- opentracing "github.com/opentracing/opentracing-go"
- tlog "github.com/opentracing/opentracing-go/log"
- "gopkg.in/macaron.v1"
- )
- func RequestTracing() macaron.Handler {
- return func(res http.ResponseWriter, req *http.Request, c *macaron.Context) {
- rw := res.(macaron.ResponseWriter)
- var span opentracing.Span
- opName := req.URL.Path
- carrier := opentracing.HTTPHeadersCarrier(req.Header)
- wireContext, err := opentracing.GlobalTracer().Extract(
- opentracing.HTTPHeaders, carrier)
- if err != nil {
- span = opentracing.StartSpan(opName)
- } else {
- span = opentracing.StartSpan(opName, opentracing.ChildOf(wireContext))
- }
- defer span.Finish()
- ctx := opentracing.ContextWithSpan(req.Context(), span)
- req = req.WithContext(ctx)
- start := time.Now()
- c.Next()
- status := rw.Status()
- span.LogFields(
- tlog.Int("http.status_code", status),
- tlog.Float64("waited.millis", float64(time.Since(start)/time.Millisecond)))
- }
- }
|