From 7fc23239d173989317f953262132afcc0d0fc60b Mon Sep 17 00:00:00 2001 From: Zarir Hamza Date: Mon, 12 Dec 2022 17:21:02 -0500 Subject: [PATCH 1/4] contrib: Fixes memory leak for potential integrations that were calling spankind and component tag extraneously --- contrib/gin-gonic/gin/gintrace.go | 4 ++-- contrib/go-chi/chi.v5/chi.go | 4 ++-- contrib/gorilla/mux/mux.go | 4 ++-- contrib/julienschmidt/httprouter/httprouter.go | 7 ++++--- contrib/net/http/http.go | 10 +++------- contrib/urfave/negroni/negroni.go | 4 ++-- 6 files changed, 15 insertions(+), 18 deletions(-) diff --git a/contrib/gin-gonic/gin/gintrace.go b/contrib/gin-gonic/gin/gintrace.go index 7c9a3aa9ed..86470b476f 100644 --- a/contrib/gin-gonic/gin/gintrace.go +++ b/contrib/gin-gonic/gin/gintrace.go @@ -30,6 +30,8 @@ func Middleware(service string, opts ...Option) gin.HandlerFunc { log.Debug("contrib/gin-gonic/gin: Configuring Middleware: Service: %s, %#v", cfg.serviceName, cfg) spanOpts := []tracer.StartSpanOption{ tracer.ServiceName(cfg.serviceName), + tracer.Tag(ext.Component, "gin-gonic/gin"), + tracer.Tag(ext.SpanKind, ext.SpanKindServer), } return func(c *gin.Context) { if cfg.ignoreRequest(c) { @@ -40,8 +42,6 @@ func Middleware(service string, opts ...Option) gin.HandlerFunc { opts = append(opts, tracer.Tag(ext.EventSampleRate, cfg.analyticsRate)) } opts = append(opts, tracer.Tag(ext.HTTPRoute, c.FullPath())) - opts = append(opts, tracer.Tag(ext.Component, "gin-gonic/gin")) - opts = append(opts, tracer.Tag(ext.SpanKind, ext.SpanKindServer)) span, ctx := httptrace.StartRequestSpan(c.Request, opts...) defer func() { diff --git a/contrib/go-chi/chi.v5/chi.go b/contrib/go-chi/chi.v5/chi.go index 8488ea3902..03c15dd866 100644 --- a/contrib/go-chi/chi.v5/chi.go +++ b/contrib/go-chi/chi.v5/chi.go @@ -30,6 +30,8 @@ func Middleware(opts ...Option) func(next http.Handler) http.Handler { } log.Debug("contrib/go-chi/chi.v5: Configuring Middleware: %#v", cfg) spanOpts := append(cfg.spanOpts, tracer.ServiceName(cfg.serviceName)) + spanOpts = append(cfg.spanOpts, tracer.Tag(ext.Component, "go-chi/chi.v5")) + spanOpts = append(cfg.spanOpts, tracer.Tag(ext.SpanKind, ext.SpanKindServer)) return func(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if cfg.ignoreRequest(r) { @@ -37,8 +39,6 @@ func Middleware(opts ...Option) func(next http.Handler) http.Handler { return } opts := spanOpts - opts = append(opts, tracer.Tag(ext.Component, "go-chi/chi.v5")) - opts = append(opts, tracer.Tag(ext.SpanKind, ext.SpanKindServer)) if !math.IsNaN(cfg.analyticsRate) { opts = append(opts, tracer.Tag(ext.EventSampleRate, cfg.analyticsRate)) } diff --git a/contrib/gorilla/mux/mux.go b/contrib/gorilla/mux/mux.go index fc5f90a427..5bef71c2ac 100644 --- a/contrib/gorilla/mux/mux.go +++ b/contrib/gorilla/mux/mux.go @@ -100,8 +100,6 @@ func (r *Router) ServeHTTP(w http.ResponseWriter, req *http.Request) { route, _ = match.Route.GetPathTemplate() } spanopts = append(spanopts, r.config.spanOpts...) - spanopts = append(spanopts, tracer.Tag(ext.Component, "gorilla/mux")) - spanopts = append(spanopts, tracer.Tag(ext.SpanKind, ext.SpanKindServer)) if r.config.headerTags { spanopts = append(spanopts, headerTagsFromRequest(req)) @@ -122,6 +120,8 @@ func (r *Router) ServeHTTP(w http.ResponseWriter, req *http.Request) { // requests and responses served by the router. func WrapRouter(router *mux.Router, opts ...RouterOption) *Router { cfg := newConfig(opts) + cfg.spanOpts = append(cfg.spanOpts, tracer.Tag(ext.Component, "gorilla/mux")) + cfg.spanOpts = append(cfg.spanOpts, tracer.Tag(ext.SpanKind, ext.SpanKindServer)) log.Debug("contrib/gorilla/mux: Configuring Router: %#v", cfg) return &Router{ Router: router, diff --git a/contrib/julienschmidt/httprouter/httprouter.go b/contrib/julienschmidt/httprouter/httprouter.go index f45382ad0d..f536a83acc 100644 --- a/contrib/julienschmidt/httprouter/httprouter.go +++ b/contrib/julienschmidt/httprouter/httprouter.go @@ -35,6 +35,10 @@ func New(opts ...RouterOption) *Router { if !math.IsNaN(cfg.analyticsRate) { cfg.spanOpts = append(cfg.spanOpts, tracer.Tag(ext.EventSampleRate, cfg.analyticsRate)) } + + cfg.spanOpts = append(cfg.spanOpts, tracer.Tag(ext.SpanKind, ext.SpanKindServer)) + cfg.spanOpts = append(cfg.spanOpts, tracer.Tag(ext.Component, "julienschmidt/httprouter")) + log.Debug("contrib/julienschmidt/httprouter: Configuring Router: %#v", cfg) return &Router{httprouter.New(), cfg} } @@ -49,9 +53,6 @@ func (r *Router) ServeHTTP(w http.ResponseWriter, req *http.Request) { } resource := req.Method + " " + route - r.config.spanOpts = append(r.config.spanOpts, tracer.Tag(ext.SpanKind, ext.SpanKindServer)) - r.config.spanOpts = append(r.config.spanOpts, tracer.Tag(ext.Component, "julienschmidt/httprouter")) - httptrace.TraceAndServe(r.Router, w, req, &httptrace.ServeConfig{ Service: r.config.serviceName, Resource: resource, diff --git a/contrib/net/http/http.go b/contrib/net/http/http.go index b4f339a8bf..769597ce94 100644 --- a/contrib/net/http/http.go +++ b/contrib/net/http/http.go @@ -10,8 +10,8 @@ import ( "net/http" "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + "gopkg.in/DataDog/dd-trace-go.v1/internal/log" ) @@ -29,6 +29,8 @@ func NewServeMux(opts ...Option) *ServeMux { for _, fn := range opts { fn(cfg) } + cfg.spanOpts = append(cfg.spanOpts, tracer.Tag(ext.SpanKind, ext.SpanKindServer)) + cfg.spanOpts = append(cfg.spanOpts, tracer.Tag(ext.Component, "net/http")) log.Debug("contrib/net/http: Configuring ServeMux: %#v", cfg) return &ServeMux{ ServeMux: http.NewServeMux(), @@ -52,9 +54,6 @@ func (mux *ServeMux) ServeHTTP(w http.ResponseWriter, r *http.Request) { resource = r.Method + " " + route } - mux.cfg.spanOpts = append(mux.cfg.spanOpts, tracer.Tag(ext.SpanKind, ext.SpanKindServer)) - mux.cfg.spanOpts = append(mux.cfg.spanOpts, tracer.Tag(ext.Component, "net/http")) - TraceAndServe(mux.ServeMux, w, r, &ServeConfig{ Service: mux.cfg.serviceName, Resource: resource, @@ -81,9 +80,6 @@ func WrapHandler(h http.Handler, service, resource string, opts ...Option) http. resource = r } - cfg.spanOpts = append(cfg.spanOpts, tracer.Tag(ext.SpanKind, ext.SpanKindServer)) - cfg.spanOpts = append(cfg.spanOpts, tracer.Tag(ext.Component, "net/http")) - TraceAndServe(h, w, req, &ServeConfig{ Service: service, Resource: resource, diff --git a/contrib/urfave/negroni/negroni.go b/contrib/urfave/negroni/negroni.go index 22ff8ca618..4579ed88fb 100644 --- a/contrib/urfave/negroni/negroni.go +++ b/contrib/urfave/negroni/negroni.go @@ -29,8 +29,6 @@ func (m *DatadogMiddleware) ServeHTTP(w http.ResponseWriter, r *http.Request, ne if !math.IsNaN(m.cfg.analyticsRate) { opts = append(opts, tracer.Tag(ext.EventSampleRate, m.cfg.analyticsRate)) } - opts = append(opts, tracer.Tag(ext.Component, "urfave/negroni")) - opts = append(opts, tracer.Tag(ext.SpanKind, ext.SpanKindServer)) span, ctx := httptrace.StartRequestSpan(r, opts...) defer func() { @@ -59,6 +57,8 @@ func Middleware(opts ...Option) *DatadogMiddleware { for _, fn := range opts { fn(cfg) } + cfg.spanOpts = append(cfg.spanOpts, tracer.Tag(ext.Component, "urfave/negroni")) + cfg.spanOpts = append(cfg.spanOpts, tracer.Tag(ext.SpanKind, ext.SpanKindServer)) log.Debug("contrib/urgave/negroni: Configuring Middleware: %#v", cfg) m := DatadogMiddleware{ From 5f28620c7864b8f20af44bd513f594403fa2f9a9 Mon Sep 17 00:00:00 2001 From: Zarir Hamza Date: Mon, 12 Dec 2022 18:01:58 -0500 Subject: [PATCH 2/4] contrib/net/http: Added spankind and component to WrapHandler spans --- contrib/net/http/http.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/contrib/net/http/http.go b/contrib/net/http/http.go index 769597ce94..99278d89cd 100644 --- a/contrib/net/http/http.go +++ b/contrib/net/http/http.go @@ -70,6 +70,8 @@ func WrapHandler(h http.Handler, service, resource string, opts ...Option) http. for _, fn := range opts { fn(cfg) } + cfg.spanOpts = append(cfg.spanOpts, tracer.Tag(ext.SpanKind, ext.SpanKindServer)) + cfg.spanOpts = append(cfg.spanOpts, tracer.Tag(ext.Component, "net/http")) log.Debug("contrib/net/http: Wrapping Handler: Service: %s, Resource: %s, %#v", service, resource, cfg) return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { if cfg.ignoreRequest(req) { From dbcc08e0748ebb16569599ef23ccb0e07439a079 Mon Sep 17 00:00:00 2001 From: Zarir Hamza Date: Mon, 12 Dec 2022 18:05:59 -0500 Subject: [PATCH 3/4] contrib/go-chi: Appends spankind and component to existing opts which fixes tests --- contrib/go-chi/chi.v5/chi.go | 6 +++--- contrib/go-chi/chi/chi.go | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/contrib/go-chi/chi.v5/chi.go b/contrib/go-chi/chi.v5/chi.go index 03c15dd866..35f7913bf4 100644 --- a/contrib/go-chi/chi.v5/chi.go +++ b/contrib/go-chi/chi.v5/chi.go @@ -29,9 +29,9 @@ func Middleware(opts ...Option) func(next http.Handler) http.Handler { fn(cfg) } log.Debug("contrib/go-chi/chi.v5: Configuring Middleware: %#v", cfg) - spanOpts := append(cfg.spanOpts, tracer.ServiceName(cfg.serviceName)) - spanOpts = append(cfg.spanOpts, tracer.Tag(ext.Component, "go-chi/chi.v5")) - spanOpts = append(cfg.spanOpts, tracer.Tag(ext.SpanKind, ext.SpanKindServer)) + spanOpts := append(cfg.spanOpts, tracer.ServiceName(cfg.serviceName), + tracer.Tag(ext.Component, "go-chi/chi.v5"), + tracer.Tag(ext.SpanKind, ext.SpanKindServer)) return func(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if cfg.ignoreRequest(r) { diff --git a/contrib/go-chi/chi/chi.go b/contrib/go-chi/chi/chi.go index c4b31c8680..982b780304 100644 --- a/contrib/go-chi/chi/chi.go +++ b/contrib/go-chi/chi/chi.go @@ -29,7 +29,9 @@ func Middleware(opts ...Option) func(next http.Handler) http.Handler { fn(cfg) } log.Debug("contrib/go-chi/chi: Configuring Middleware: %#v", cfg) - spanOpts := append(cfg.spanOpts, tracer.ServiceName(cfg.serviceName)) + spanOpts := append(cfg.spanOpts, tracer.ServiceName(cfg.serviceName), + tracer.Tag(ext.Component, "go-chi/chi"), + tracer.Tag(ext.SpanKind, ext.SpanKindServer)) return func(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if cfg.ignoreRequest(r) { @@ -37,8 +39,6 @@ func Middleware(opts ...Option) func(next http.Handler) http.Handler { return } opts := spanOpts - opts = append(opts, tracer.Tag(ext.Component, "go-chi/chi")) - opts = append(opts, tracer.Tag(ext.SpanKind, ext.SpanKindServer)) if !math.IsNaN(cfg.analyticsRate) { opts = append(opts, tracer.Tag(ext.EventSampleRate, cfg.analyticsRate)) } From b4a5e4a690615f43e4c3334be93cfff40819bd1a Mon Sep 17 00:00:00 2001 From: Zarir Hamza Date: Tue, 13 Dec 2022 11:39:18 -0500 Subject: [PATCH 4/4] contrib/net/http: fix import grouping --- contrib/net/http/http.go | 1 - 1 file changed, 1 deletion(-) diff --git a/contrib/net/http/http.go b/contrib/net/http/http.go index 99278d89cd..b28acc6b08 100644 --- a/contrib/net/http/http.go +++ b/contrib/net/http/http.go @@ -11,7 +11,6 @@ import ( "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" )