mirror of
https://github.com/weaveworks/scope.git
synced 2026-07-19 13:29:35 +00:00
49 lines
1.2 KiB
Go
49 lines
1.2 KiB
Go
package middleware
|
|
|
|
import (
|
|
"fmt"
|
|
"net/http"
|
|
|
|
"github.com/opentracing-contrib/go-stdlib/nethttp"
|
|
"github.com/opentracing/opentracing-go"
|
|
jaeger "github.com/uber/jaeger-client-go"
|
|
"golang.org/x/net/context"
|
|
)
|
|
|
|
// Dummy dependency to enforce that we have a nethttp version newer
|
|
// than the one which implements Websockets. (No semver on nethttp)
|
|
var _ = nethttp.MWURLTagFunc
|
|
|
|
// Tracer is a middleware which traces incoming requests.
|
|
type Tracer struct {
|
|
RouteMatcher RouteMatcher
|
|
}
|
|
|
|
// Wrap implements Interface
|
|
func (t Tracer) Wrap(next http.Handler) http.Handler {
|
|
opMatcher := nethttp.OperationNameFunc(func(r *http.Request) string {
|
|
op := getRouteName(t.RouteMatcher, r)
|
|
if op == "" {
|
|
return "HTTP " + r.Method
|
|
}
|
|
|
|
return fmt.Sprintf("HTTP %s - %s", r.Method, op)
|
|
})
|
|
|
|
return nethttp.Middleware(opentracing.GlobalTracer(), next, opMatcher)
|
|
}
|
|
|
|
// ExtractTraceID extracts the trace id, if any from the context.
|
|
func ExtractTraceID(ctx context.Context) (string, bool) {
|
|
sp := opentracing.SpanFromContext(ctx)
|
|
if sp == nil {
|
|
return "", false
|
|
}
|
|
sctx, ok := sp.Context().(jaeger.SpanContext)
|
|
if !ok {
|
|
return "", false
|
|
}
|
|
|
|
return sctx.TraceID().String(), true
|
|
}
|