From 7b083723c8aef35496ae4a5018ea982ee3834908 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dario=20Casta=C3=B1=C3=A9?= Date: Thu, 8 Aug 2024 17:00:53 +0200 Subject: [PATCH 1/3] migrate valyala/fasthttp --- contrib/valyala/fasthttp/fasthttp.go | 16 ++++++++-------- contrib/valyala/fasthttp/fasthttp_test.go | 2 +- contrib/valyala/fasthttp/option.go | 8 +++----- .../fasthttptrace/fasthttpheaderscarrier.go | 0 .../fasthttptrace/fasthttpheaderscarrier_test.go | 0 .../fasthttptrace/fasthttptrace.go | 0 .../fasthttptrace/fasthttptrace_test.go | 0 instrumentation/packages.go | 14 ++++++++++++++ 8 files changed, 26 insertions(+), 14 deletions(-) rename {internal/contrib => instrumentation}/fasthttptrace/fasthttpheaderscarrier.go (100%) rename {internal/contrib => instrumentation}/fasthttptrace/fasthttpheaderscarrier_test.go (100%) rename {internal/contrib => instrumentation}/fasthttptrace/fasthttptrace.go (100%) rename {internal/contrib => instrumentation}/fasthttptrace/fasthttptrace_test.go (100%) diff --git a/contrib/valyala/fasthttp/fasthttp.go b/contrib/valyala/fasthttp/fasthttp.go index 468d4ce672..43bfa14a49 100644 --- a/contrib/valyala/fasthttp/fasthttp.go +++ b/contrib/valyala/fasthttp/fasthttp.go @@ -14,16 +14,16 @@ import ( "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" - "github.com/DataDog/dd-trace-go/v2/internal/contrib/fasthttptrace" - "github.com/DataDog/dd-trace-go/v2/internal/log" - "github.com/DataDog/dd-trace-go/v2/internal/telemetry" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/DataDog/dd-trace-go/v2/instrumentation/fasthttptrace" ) -const componentName = "valyala/fasthttp.v1" +const component = instrumentation.PackageValyalaFastHTTP + +var instr *instrumentation.Instrumentation func init() { - telemetry.LoadIntegration(componentName) - tracer.MarkIntegrationImported(componentName) + instr = instrumentation.Load(instrumentation.PackageValyalaFastHTTP) } // WrapHandler wraps a fasthttp.RequestHandler with tracing middleware @@ -32,7 +32,7 @@ func WrapHandler(h fasthttp.RequestHandler, opts ...Option) fasthttp.RequestHand for _, fn := range opts { fn.apply(cfg) } - log.Debug("contrib/valyala/fasthttp.v1: Configuring Middleware: cfg: %#v", cfg) + instr.Logger().Debug("contrib/valyala/fasthttp.v1: Configuring Middleware: cfg: %#v", cfg) spanOpts := []tracer.StartSpanOption{ tracer.ServiceName(cfg.serviceName), } @@ -62,7 +62,7 @@ func WrapHandler(h fasthttp.RequestHandler, opts ...Option) fasthttp.RequestHand func defaultSpanOptions(fctx *fasthttp.RequestCtx) []tracer.StartSpanOption { opts := []tracer.StartSpanOption{ - tracer.Tag(ext.Component, componentName), + tracer.Tag(ext.Component, component), tracer.Tag(ext.SpanKind, ext.SpanKindServer), tracer.SpanType(ext.SpanTypeWeb), tracer.Tag(ext.HTTPMethod, string(fctx.Method())), diff --git a/contrib/valyala/fasthttp/fasthttp_test.go b/contrib/valyala/fasthttp/fasthttp_test.go index 1d948180b3..7651c95b68 100644 --- a/contrib/valyala/fasthttp/fasthttp_test.go +++ b/contrib/valyala/fasthttp/fasthttp_test.go @@ -121,7 +121,7 @@ func TestTrace200(t *testing.T) { assert.Equal("200", span.Tag(ext.HTTPCode)) assert.Equal("GET", span.Tag(ext.HTTPMethod)) assert.Equal(addr+"/any", span.Tag(ext.HTTPURL)) - assert.Equal(componentName, span.Tag(ext.Component)) + assert.Equal(string(component), span.Tag(ext.Component)) assert.Equal(ext.SpanKindServer, span.Tag(ext.SpanKind)) } diff --git a/contrib/valyala/fasthttp/option.go b/contrib/valyala/fasthttp/option.go index fb1e65f8f9..57c2f0a1f5 100644 --- a/contrib/valyala/fasthttp/option.go +++ b/contrib/valyala/fasthttp/option.go @@ -9,11 +9,9 @@ import ( "github.com/valyala/fasthttp" "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" - "github.com/DataDog/dd-trace-go/v2/internal/namingschema" + "github.com/DataDog/dd-trace-go/v2/instrumentation" ) -const defaultServiceName = "fasthttp" - type config struct { serviceName string spanName string @@ -37,8 +35,8 @@ func (fn OptionFn) apply(cfg *config) { func newConfig() *config { return &config{ - serviceName: namingschema.ServiceName(defaultServiceName), - spanName: namingschema.OpName(namingschema.HTTPServer), + serviceName: instr.ServiceName(instrumentation.ComponentServer, nil), + spanName: instr.OperationName(instrumentation.ComponentServer, nil), isStatusError: defaultIsServerError, resourceNamer: defaultResourceNamer, ignoreRequest: defaultIgnoreRequest, diff --git a/internal/contrib/fasthttptrace/fasthttpheaderscarrier.go b/instrumentation/fasthttptrace/fasthttpheaderscarrier.go similarity index 100% rename from internal/contrib/fasthttptrace/fasthttpheaderscarrier.go rename to instrumentation/fasthttptrace/fasthttpheaderscarrier.go diff --git a/internal/contrib/fasthttptrace/fasthttpheaderscarrier_test.go b/instrumentation/fasthttptrace/fasthttpheaderscarrier_test.go similarity index 100% rename from internal/contrib/fasthttptrace/fasthttpheaderscarrier_test.go rename to instrumentation/fasthttptrace/fasthttpheaderscarrier_test.go diff --git a/internal/contrib/fasthttptrace/fasthttptrace.go b/instrumentation/fasthttptrace/fasthttptrace.go similarity index 100% rename from internal/contrib/fasthttptrace/fasthttptrace.go rename to instrumentation/fasthttptrace/fasthttptrace.go diff --git a/internal/contrib/fasthttptrace/fasthttptrace_test.go b/instrumentation/fasthttptrace/fasthttptrace_test.go similarity index 100% rename from internal/contrib/fasthttptrace/fasthttptrace_test.go rename to instrumentation/fasthttptrace/fasthttptrace_test.go diff --git a/instrumentation/packages.go b/instrumentation/packages.go index ba339b651b..e1b0eebcb0 100644 --- a/instrumentation/packages.go +++ b/instrumentation/packages.go @@ -22,6 +22,8 @@ const ( PackageNetHTTP Package = "net/http" PackageIBMSarama Package = "IBM/sarama" + + PackageValyalaFastHTTP Package = "valyala/fasthttp" ) type Component int @@ -150,6 +152,18 @@ var packages = map[Package]PackageInfo{ }, }, }, + PackageValyalaFastHTTP: { + TracedPackage: "github.com/valyala/fasthttp", + EnvVarPrefix: "FASTHTTP", + naming: map[Component]componentNames{ + ComponentServer: { + useDDServiceV0: false, + buildServiceNameV0: staticName("fasthttp"), + buildOpNameV0: staticName("http.request"), + buildOpNameV1: staticName("http.server.request"), + }, + }, + }, } func staticName(name string) func(OperationContext) string { From ec1207a66e518d347b35c4676b68e6fe942d6cb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dario=20Casta=C3=B1=C3=A9?= Date: Fri, 9 Aug 2024 14:31:06 +0200 Subject: [PATCH 2/3] instrumentation/options: move options package to instrumentation/ --- contrib/database/sql/conn.go | 2 +- contrib/gin-gonic/gin/gintrace.go | 2 +- contrib/go-chi/chi.v5/chi.go | 2 +- contrib/go-chi/chi/chi.go | 2 +- contrib/gorilla/mux/mux.go | 2 +- contrib/julienschmidt/httprouter/httprouter.go | 2 +- contrib/labstack/echo.v4/echotrace.go | 2 +- contrib/net/http/trace.go | 2 +- ddtrace/tracer/context.go | 2 +- {ddtrace => instrumentation}/options/options.go | 0 {ddtrace => instrumentation}/options/options_test.go | 0 11 files changed, 9 insertions(+), 9 deletions(-) rename {ddtrace => instrumentation}/options/options.go (100%) rename {ddtrace => instrumentation}/options/options_test.go (100%) diff --git a/contrib/database/sql/conn.go b/contrib/database/sql/conn.go index 5831987dda..07d6fbef62 100644 --- a/contrib/database/sql/conn.go +++ b/contrib/database/sql/conn.go @@ -13,7 +13,7 @@ import ( "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" - "github.com/DataDog/dd-trace-go/v2/internal/contrib/options" + "github.com/DataDog/dd-trace-go/v2/instrumentation/options" "github.com/DataDog/dd-trace-go/v2/internal/log" ) diff --git a/contrib/gin-gonic/gin/gintrace.go b/contrib/gin-gonic/gin/gintrace.go index b24e7780d5..9151181dd5 100644 --- a/contrib/gin-gonic/gin/gintrace.go +++ b/contrib/gin-gonic/gin/gintrace.go @@ -12,9 +12,9 @@ import ( "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation/options" "github.com/DataDog/dd-trace-go/v2/internal/appsec" "github.com/DataDog/dd-trace-go/v2/internal/contrib/httptrace" - "github.com/DataDog/dd-trace-go/v2/internal/contrib/options" "github.com/DataDog/dd-trace-go/v2/internal/log" "github.com/DataDog/dd-trace-go/v2/internal/telemetry" diff --git a/contrib/go-chi/chi.v5/chi.go b/contrib/go-chi/chi.v5/chi.go index 0a0aeebcc2..25e221e966 100644 --- a/contrib/go-chi/chi.v5/chi.go +++ b/contrib/go-chi/chi.v5/chi.go @@ -13,9 +13,9 @@ import ( "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation/options" "github.com/DataDog/dd-trace-go/v2/internal/appsec" "github.com/DataDog/dd-trace-go/v2/internal/contrib/httptrace" - "github.com/DataDog/dd-trace-go/v2/internal/contrib/options" "github.com/DataDog/dd-trace-go/v2/internal/log" "github.com/DataDog/dd-trace-go/v2/internal/telemetry" diff --git a/contrib/go-chi/chi/chi.go b/contrib/go-chi/chi/chi.go index 69b609260d..2f87f09e26 100644 --- a/contrib/go-chi/chi/chi.go +++ b/contrib/go-chi/chi/chi.go @@ -13,9 +13,9 @@ import ( "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation/options" "github.com/DataDog/dd-trace-go/v2/internal/appsec" "github.com/DataDog/dd-trace-go/v2/internal/contrib/httptrace" - "github.com/DataDog/dd-trace-go/v2/internal/contrib/options" "github.com/DataDog/dd-trace-go/v2/internal/log" "github.com/DataDog/dd-trace-go/v2/internal/telemetry" diff --git a/contrib/gorilla/mux/mux.go b/contrib/gorilla/mux/mux.go index 0cd5e739bd..ce3811a2c3 100644 --- a/contrib/gorilla/mux/mux.go +++ b/contrib/gorilla/mux/mux.go @@ -12,8 +12,8 @@ import ( httptrace "github.com/DataDog/dd-trace-go/contrib/net/http/v2" "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation/options" httptraceinternal "github.com/DataDog/dd-trace-go/v2/internal/contrib/httptrace" - "github.com/DataDog/dd-trace-go/v2/internal/contrib/options" "github.com/DataDog/dd-trace-go/v2/internal/log" "github.com/DataDog/dd-trace-go/v2/internal/telemetry" diff --git a/contrib/julienschmidt/httprouter/httprouter.go b/contrib/julienschmidt/httprouter/httprouter.go index 44fc486dd5..e737ce6dc7 100644 --- a/contrib/julienschmidt/httprouter/httprouter.go +++ b/contrib/julienschmidt/httprouter/httprouter.go @@ -14,8 +14,8 @@ import ( httptrace "github.com/DataDog/dd-trace-go/contrib/net/http/v2" "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation/options" httptraceinternal "github.com/DataDog/dd-trace-go/v2/internal/contrib/httptrace" - "github.com/DataDog/dd-trace-go/v2/internal/contrib/options" "github.com/DataDog/dd-trace-go/v2/internal/log" "github.com/DataDog/dd-trace-go/v2/internal/telemetry" diff --git a/contrib/labstack/echo.v4/echotrace.go b/contrib/labstack/echo.v4/echotrace.go index 90005f1ed9..1c5d223ef4 100644 --- a/contrib/labstack/echo.v4/echotrace.go +++ b/contrib/labstack/echo.v4/echotrace.go @@ -18,8 +18,8 @@ import ( "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation/options" "github.com/DataDog/dd-trace-go/v2/internal/contrib/httptrace" - "github.com/DataDog/dd-trace-go/v2/internal/contrib/options" "github.com/DataDog/dd-trace-go/v2/internal/log" "github.com/DataDog/dd-trace-go/v2/internal/telemetry" diff --git a/contrib/net/http/trace.go b/contrib/net/http/trace.go index 1f663539e2..3624057301 100644 --- a/contrib/net/http/trace.go +++ b/contrib/net/http/trace.go @@ -11,11 +11,11 @@ import ( "net/http" "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" - "github.com/DataDog/dd-trace-go/v2/ddtrace/options" "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" "github.com/DataDog/dd-trace-go/v2/instrumentation" "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/emitter/httpsec" "github.com/DataDog/dd-trace-go/v2/instrumentation/httptrace" + "github.com/DataDog/dd-trace-go/v2/instrumentation/options" ) const componentName = "net/http" diff --git a/ddtrace/tracer/context.go b/ddtrace/tracer/context.go index ab644f4da0..3753465382 100644 --- a/ddtrace/tracer/context.go +++ b/ddtrace/tracer/context.go @@ -8,7 +8,7 @@ package tracer import ( "context" - "github.com/DataDog/dd-trace-go/v2/ddtrace/options" + "github.com/DataDog/dd-trace-go/v2/instrumentation/options" "github.com/DataDog/dd-trace-go/v2/internal" ) diff --git a/ddtrace/options/options.go b/instrumentation/options/options.go similarity index 100% rename from ddtrace/options/options.go rename to instrumentation/options/options.go diff --git a/ddtrace/options/options_test.go b/instrumentation/options/options_test.go similarity index 100% rename from ddtrace/options/options_test.go rename to instrumentation/options/options_test.go From 09a5ebe77b7977fe9c6828858c5fa93afc7a8794 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dario=20Casta=C3=B1=C3=A9?= Date: Fri, 9 Aug 2024 17:15:53 +0200 Subject: [PATCH 3/3] migrate urfave/negroni --- contrib/urfave/negroni/negroni.go | 18 ++--- contrib/urfave/negroni/negroni_test.go | 80 ++++++------------- contrib/urfave/negroni/option.go | 23 ++---- .../internal/namingschematest/main_test.go | 1 + .../internal/namingschematest/negroni_test.go | 58 ++++++++++++++ instrumentation/packages.go | 13 +++ 6 files changed, 113 insertions(+), 80 deletions(-) create mode 100644 instrumentation/internal/namingschematest/negroni_test.go diff --git a/contrib/urfave/negroni/negroni.go b/contrib/urfave/negroni/negroni.go index 3de5e216d9..65461bd8d0 100644 --- a/contrib/urfave/negroni/negroni.go +++ b/contrib/urfave/negroni/negroni.go @@ -13,19 +13,19 @@ import ( "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" - "github.com/DataDog/dd-trace-go/v2/internal/contrib/httptrace" - "github.com/DataDog/dd-trace-go/v2/internal/contrib/options" - "github.com/DataDog/dd-trace-go/v2/internal/log" - "github.com/DataDog/dd-trace-go/v2/internal/telemetry" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/DataDog/dd-trace-go/v2/instrumentation/httptrace" + "github.com/DataDog/dd-trace-go/v2/instrumentation/options" "github.com/urfave/negroni" ) -const componentName = "urfave/negroni" +const component = instrumentation.PackageUrfaveNegroni + +var instr *instrumentation.Instrumentation func init() { - telemetry.LoadIntegration(componentName) - tracer.MarkIntegrationImported("github.com/urfave/negroni") + instr = instrumentation.Load(instrumentation.PackageUrfaveNegroni) } // DatadogMiddleware returns middleware that will trace incoming requests. @@ -69,9 +69,9 @@ func Middleware(opts ...Option) *DatadogMiddleware { for _, fn := range opts { fn.apply(cfg) } - cfg.spanOpts = append(cfg.spanOpts, tracer.Tag(ext.Component, componentName)) + cfg.spanOpts = append(cfg.spanOpts, tracer.Tag(ext.Component, component)) cfg.spanOpts = append(cfg.spanOpts, tracer.Tag(ext.SpanKind, ext.SpanKindServer)) - log.Debug("contrib/urgave/negroni: Configuring Middleware: %#v", cfg) + instr.Logger().Debug("contrib/urgave/negroni: Configuring Middleware: %#v", cfg) m := DatadogMiddleware{ cfg: cfg, diff --git a/contrib/urfave/negroni/negroni_test.go b/contrib/urfave/negroni/negroni_test.go index 53267f6753..f3c56a4d1e 100644 --- a/contrib/urfave/negroni/negroni_test.go +++ b/contrib/urfave/negroni/negroni_test.go @@ -17,12 +17,10 @@ import ( "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" - "github.com/DataDog/dd-trace-go/v2/internal/contrib/namingschematest" - "github.com/DataDog/dd-trace-go/v2/internal/globalconfig" - "github.com/DataDog/dd-trace-go/v2/internal/normalizer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils" "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" "github.com/urfave/negroni" ) @@ -68,32 +66,32 @@ func TestWithHeaderTags(t *testing.T) { t.Run("default-off", func(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - htArgs := []string{"h!e@a-d.e*r", "2header", "3header", "x-datadog-header"} + headerTags := instrumentation.NewHeaderTags([]string{"h!e@a-d.e*r", "2header", "3header", "x-datadog-header"}) setupReq() spans := mt.FinishedSpans() assert := assert.New(t) assert.Equal(len(spans), 1) s := spans[0] - for _, arg := range htArgs { - _, tag := normalizer.HeaderTag(arg) + headerTags.Iter(func(header string, tag string) { assert.NotContains(s.Tags(), tag) - } + }) }) t.Run("integration", func(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() htArgs := []string{"h!e@a-d.e*r", "2header:tag"} + headerTags := instrumentation.NewHeaderTags(htArgs) + r := setupReq(WithHeaderTags(htArgs)) spans := mt.FinishedSpans() assert := assert.New(t) assert.Equal(len(spans), 1) s := spans[0] - for _, arg := range htArgs { - header, tag := normalizer.HeaderTag(arg) + headerTags.Iter(func(header string, tag string) { assert.Equal(strings.Join(r.Header.Values(header), ","), s.Tags()[tag]) - } + }) assert.NotContains(s.Tags(), "http.headers.x-datadog-header") }) @@ -101,8 +99,9 @@ func TestWithHeaderTags(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - header, tag := normalizer.HeaderTag("3header") - globalconfig.SetHeaderTag(header, tag) + htArgs := []string{"3header"} + testutils.SetGlobalHeaderTags(t, htArgs...) + headerTags := instrumentation.NewHeaderTags(htArgs) r := setupReq() spans := mt.FinishedSpans() @@ -110,7 +109,9 @@ func TestWithHeaderTags(t *testing.T) { assert.Equal(len(spans), 1) s := spans[0] - assert.Equal(strings.Join(r.Header.Values(header), ","), s.Tags()[tag]) + headerTags.Iter(func(header string, tag string) { + assert.Equal(strings.Join(r.Header.Values(header), ","), s.Tags()[tag]) + }) assert.NotContains(s.Tags(), "http.headers.x-datadog-header") }) @@ -118,22 +119,21 @@ func TestWithHeaderTags(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - globalH, globalT := normalizer.HeaderTag("3header") - globalconfig.SetHeaderTag(globalH, globalT) - + testutils.SetGlobalHeaderTags(t, "3header") htArgs := []string{"h!e@a-d.e*r", "2header:tag"} + headerTags := instrumentation.NewHeaderTags(htArgs) + r := setupReq(WithHeaderTags(htArgs)) spans := mt.FinishedSpans() assert := assert.New(t) assert.Equal(len(spans), 1) s := spans[0] - for _, arg := range htArgs { - header, tag := normalizer.HeaderTag(arg) + headerTags.Iter(func(header string, tag string) { assert.Equal(strings.Join(r.Header.Values(header), ","), s.Tags()[tag]) - } + }) assert.NotContains(s.Tags(), "http.headers.x-datadog-header") - assert.NotContains(s.Tags(), globalT) + assert.NotContains(s.Tags(), "3header") }) } @@ -371,10 +371,7 @@ func TestAnalyticsSettings(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) - + testutils.SetGlobalAnalyticsRate(t, 0.4) assertRate(t, mt, 0.4) }) @@ -394,9 +391,7 @@ func TestAnalyticsSettings(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) + testutils.SetGlobalAnalyticsRate(t, 0.4) assertRate(t, mt, 0.23, WithAnalyticsRate(0.23)) }) } @@ -440,8 +435,7 @@ func TestServiceName(t *testing.T) { }) t.Run("global", func(t *testing.T) { - globalconfig.SetServiceName("global-service") - defer globalconfig.SetServiceName("") + testutils.SetGlobalServiceName(t, "global-service") mt := mocktracer.Start() defer mt.Stop() @@ -460,29 +454,3 @@ func TestServiceName(t *testing.T) { assertServiceName(t, mt, router, "my-service") }) } - -func TestNamingSchema(t *testing.T) { - genSpans := namingschematest.GenSpansFn(func(t *testing.T, serviceOverride string) []*mocktracer.Span { - var opts []Option - if serviceOverride != "" { - opts = append(opts, WithService(serviceOverride)) - } - mt := mocktracer.Start() - defer mt.Stop() - - mux := http.NewServeMux() - mux.HandleFunc("/user", func(w http.ResponseWriter, r *http.Request) { - _, err := w.Write([]byte("ok")) - require.NoError(t, err) - }) - router := negroni.New() - router.Use(Middleware(opts...)) - router.UseHandler(mux) - r := httptest.NewRequest("GET", "/200", nil) - w := httptest.NewRecorder() - router.ServeHTTP(w, r) - - return mt.FinishedSpans() - }) - namingschematest.NewHTTPServerTest(genSpans, "negroni.router")(t) -} diff --git a/contrib/urfave/negroni/option.go b/contrib/urfave/negroni/option.go index 48c143d95a..02e9f33cf9 100644 --- a/contrib/urfave/negroni/option.go +++ b/contrib/urfave/negroni/option.go @@ -11,21 +11,16 @@ import ( "net/http" "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" - "github.com/DataDog/dd-trace-go/v2/internal" - "github.com/DataDog/dd-trace-go/v2/internal/globalconfig" - "github.com/DataDog/dd-trace-go/v2/internal/namingschema" - "github.com/DataDog/dd-trace-go/v2/internal/normalizer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" ) -const defaultServiceName = "negroni.router" - type config struct { serviceName string spanOpts []tracer.StartSpanOption // additional span options to be applied analyticsRate float64 isStatusError func(statusCode int) bool resourceNamer func(r *http.Request) string - headerTags *internal.LockMap + headerTags instrumentation.HeaderTags } // Option describes options for the Negroni integration. @@ -41,13 +36,12 @@ func (fn OptionFn) apply(cfg *config) { } func defaults(cfg *config) { - cfg.serviceName = namingschema.ServiceName(defaultServiceName) - if internal.BoolEnv("DD_TRACE_NEGRONI_ANALYTICS_ENABLED", false) { - cfg.analyticsRate = 1.0 - } else { - cfg.analyticsRate = globalconfig.AnalyticsRate() + cfg.serviceName = instr.ServiceName(instrumentation.ComponentServer, nil) + cfg.analyticsRate = instr.AnalyticsRate() + if math.IsNaN(cfg.analyticsRate) { + cfg.analyticsRate = instr.GlobalAnalyticsRate() } - cfg.headerTags = globalconfig.HeaderTagMap() + cfg.headerTags = instr.HTTPHeadersAsTags() cfg.isStatusError = isServerError cfg.resourceNamer = defaultResourceNamer } @@ -119,8 +113,7 @@ func defaultResourceNamer(_ *http.Request) string { // Using this feature can risk exposing sensitive data such as authorization tokens to Datadog. // Special headers can not be sub-selected. E.g., an entire Cookie header would be transmitted, without the ability to choose specific Cookies. func WithHeaderTags(headers []string) OptionFn { - headerTagsMap := normalizer.HeaderTagSlice(headers) return func(cfg *config) { - cfg.headerTags = internal.NewLockMap(headerTagsMap) + cfg.headerTags = instrumentation.NewHeaderTags(headers) } } diff --git a/instrumentation/internal/namingschematest/main_test.go b/instrumentation/internal/namingschematest/main_test.go index 8c3290daf2..2b3d6bb0f5 100644 --- a/instrumentation/internal/namingschematest/main_test.go +++ b/instrumentation/internal/namingschematest/main_test.go @@ -50,6 +50,7 @@ func TestNamingSchema(t *testing.T) { netHTTPClient, gomemcache, gcpPubsub, + urfaveNegroni, } for _, tc := range testCases { t.Run(strings.ReplaceAll(string(tc.name), "/", "_"), func(t *testing.T) { diff --git a/instrumentation/internal/namingschematest/negroni_test.go b/instrumentation/internal/namingschematest/negroni_test.go new file mode 100644 index 0000000000..bb196e6da6 --- /dev/null +++ b/instrumentation/internal/namingschematest/negroni_test.go @@ -0,0 +1,58 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package namingschematest + +import ( + "net/http" + "net/http/httptest" + "testing" + + negronitrace "github.com/DataDog/dd-trace-go/contrib/urfave/negroni/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "github.com/urfave/negroni" +) + +var urfaveNegroni = testCase{ + name: instrumentation.PackageUrfaveNegroni, + genSpans: func(t *testing.T, serviceOverride string) []*mocktracer.Span { + var opts []negronitrace.Option + if serviceOverride != "" { + opts = append(opts, negronitrace.WithService(serviceOverride)) + } + mt := mocktracer.Start() + defer mt.Stop() + + mux := http.NewServeMux() + mux.HandleFunc("/user", func(w http.ResponseWriter, r *http.Request) { + _, err := w.Write([]byte("ok")) + require.NoError(t, err) + }) + router := negroni.New() + router.Use(negronitrace.Middleware(opts...)) + router.UseHandler(mux) + r := httptest.NewRequest("GET", "/200", nil) + w := httptest.NewRecorder() + router.ServeHTTP(w, r) + + return mt.FinishedSpans() + }, + wantServiceNameV0: serviceNameAssertions{ + defaults: []string{"negroni.router"}, + ddService: []string{testDDService}, + serviceOverride: []string{testServiceOverride}, + }, + assertOpV0: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + assert.Equal(t, "http.request", spans[0].OperationName()) + }, + assertOpV1: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + assert.Equal(t, "http.server.request", spans[0].OperationName()) + }, +} diff --git a/instrumentation/packages.go b/instrumentation/packages.go index e1b0eebcb0..1e27ab03b8 100644 --- a/instrumentation/packages.go +++ b/instrumentation/packages.go @@ -24,6 +24,7 @@ const ( PackageIBMSarama Package = "IBM/sarama" PackageValyalaFastHTTP Package = "valyala/fasthttp" + PackageUrfaveNegroni Package = "urfave/negroni" ) type Component int @@ -164,6 +165,18 @@ var packages = map[Package]PackageInfo{ }, }, }, + PackageUrfaveNegroni: { + TracedPackage: "github.com/urfave/negroni", + EnvVarPrefix: "NEGRONI", + naming: map[Component]componentNames{ + ComponentServer: { + useDDServiceV0: true, + buildServiceNameV0: staticName("negroni.router"), + buildOpNameV0: staticName("http.request"), + buildOpNameV1: staticName("http.server.request"), + }, + }, + }, } func staticName(name string) func(OperationContext) string {