diff --git a/ddtrace/tracer/tracer.go b/ddtrace/tracer/tracer.go index db1bf7a457..dd06d845ab 100644 --- a/ddtrace/tracer/tracer.go +++ b/ddtrace/tracer/tracer.go @@ -234,6 +234,16 @@ func Start(opts ...StartOption) error { return nil } + if t.config.runtimeMetricsV2 { + l := slog.New(slogHandler{}) + opts := &runtimemetrics.Options{Logger: l} + if t.runtimeMetrics, err = runtimemetrics.NewEmitter(t.statsd, opts); err == nil { + l.Debug("Runtime metrics v2 enabled.") + } else { + l.Error("Failed to enable runtime metrics v2", "err", err.Error()) + } + } + // Start AppSec with remote configuration cfg := remoteconfig.DefaultClientConfig() cfg.AgentURL = t.config.agentURL.String() @@ -454,15 +464,6 @@ func newTracer(opts ...StartOption) (*tracer, error) { t.reportRuntimeMetrics(defaultMetricsReportInterval) }() } - if c.runtimeMetricsV2 { - l := slog.New(slogHandler{}) - opts := &runtimemetrics.Options{Logger: l} - if t.runtimeMetrics, err = runtimemetrics.NewEmitter(t.statsd, opts); err == nil { - l.Debug("Runtime metrics v2 enabled.") - } else { - l.Error("Failed to enable runtime metrics v2", "err", err.Error()) - } - } if c.debugAbandonedSpans { log.Info("Abandoned spans logs enabled.") t.abandonedSpansDebugger = newAbandonedSpansDebugger() diff --git a/ddtrace/tracer/tracer_test.go b/ddtrace/tracer/tracer_test.go index 0c7637c725..d81e994d09 100644 --- a/ddtrace/tracer/tracer_test.go +++ b/ddtrace/tracer/tracer_test.go @@ -2924,3 +2924,19 @@ func TestNewUnstartedTracerDDAgentHostNotFound(t *testing.T) { _, err := newUnstartedTracer() assert.NoError(t, err) } + +func TestTracerTwiceStartRuntimeMetrics(t *testing.T) { + // This checks that starting the tracer twice properly shuts down the + // previous tracer, specifically the runtime metrics emitter. + tp := new(log.RecordLogger) + err := Start(WithLogger(tp)) + require.NoError(t, err) + err = Start(WithLogger(tp)) + require.NoError(t, err) + Stop() + + // Check that runtime metrics emitters lifetimes did not overlap. + for _, logMsg := range tp.Logs() { + assert.NotContains(t, logMsg, "runtimemetrics has already been started") + } +}