Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion ddtrace/tracer/log.go
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ func logStartup(t *tracer) {
Env: t.config.env,
Service: t.config.serviceName,
AgentURL: agentURL,
Debug: t.config.debug,
Debug: t.config.internalConfig.Debug(),
AnalyticsEnabled: !math.IsNaN(globalconfig.AnalyticsRate()),
SampleRate: fmt.Sprintf("%f", t.rulesSampling.traces.globalRate),
SampleRateLimit: "disabled",
Expand Down
36 changes: 6 additions & 30 deletions ddtrace/tracer/option.go
Original file line number Diff line number Diff line change
Expand Up @@ -128,9 +128,6 @@ var (

// defaultMaxTagsHeaderLen specifies the default maximum length of the X-Datadog-Tags header value.
defaultMaxTagsHeaderLen = 512

// defaultRateLimit specifies the default trace rate limit used when DD_TRACE_RATE_LIMIT is not set.
defaultRateLimit = 100.0
)

// Supported trace protocols.
Expand All @@ -141,8 +138,8 @@ const (

// config holds the tracer configuration.
type config struct {
// debug, when true, writes details to logs.
debug bool
// internalConfig holds a reference to the global configuration singleton.
internalConfig *internalconfig.Config

// appsecStartOptions controls the options used when starting appsec features.
appsecStartOptions []appsecconfig.StartOption
Expand Down Expand Up @@ -331,9 +328,6 @@ type config struct {
// tracingAsTransport specifies whether the tracer is running in transport-only mode, where traces are only sent when other products request it.
tracingAsTransport bool

// traceRateLimitPerSecond specifies the rate limit for traces.
traceRateLimitPerSecond float64

// traceProtocol specifies the trace protocol to use.
traceProtocol float64

Expand Down Expand Up @@ -379,7 +373,7 @@ const partialFlushMinSpansDefault = 1000
// and passed user opts.
func newConfig(opts ...StartOption) (*config, error) {
c := new(config)
internalConfig := internalconfig.Get()
c.internalConfig = internalconfig.Get()

// If this was built with a recent-enough version of Orchestrion, force the orchestrion config to
// the baked-in values. We do this early so that opts can be used to override the baked-in values,
Expand All @@ -405,22 +399,6 @@ func newConfig(opts ...StartOption) (*config, error) {
c.globalSampleRate = sampleRate
c.httpClientTimeout = time.Second * 10 // 10 seconds

c.traceRateLimitPerSecond = defaultRateLimit
origin := telemetry.OriginDefault
if v, ok := env.Lookup("DD_TRACE_RATE_LIMIT"); ok {
l, err := strconv.ParseFloat(v, 64)
if err != nil {
log.Warn("DD_TRACE_RATE_LIMIT invalid, using default value %f: %v", defaultRateLimit, err.Error())
} else if l < 0.0 {
log.Warn("DD_TRACE_RATE_LIMIT negative, using default value %f", defaultRateLimit)
} else {
c.traceRateLimitPerSecond = l
origin = telemetry.OriginEnvVar
}
}

reportTelemetryOnAppStarted(telemetry.Configuration{Name: "trace_rate_limit", Value: c.traceRateLimitPerSecond, Origin: origin})

if v := env.Get("OTEL_LOGS_EXPORTER"); v != "" {
log.Warn("OTEL_LOGS_EXPORTER is not supported")
}
Expand Down Expand Up @@ -482,7 +460,6 @@ func newConfig(opts ...StartOption) (*config, error) {
c.logStartup = internal.BoolEnv("DD_TRACE_STARTUP_LOGS", true)
c.runtimeMetrics = internal.BoolVal(getDDorOtelConfig("metrics"), false)
c.runtimeMetricsV2 = internal.BoolEnv("DD_RUNTIME_METRICS_V2_ENABLED", true)
c.debug = internalConfig.Debug()
c.logDirectory = env.Get("DD_TRACE_LOG_DIRECTORY")
c.enabled = newDynamicConfig("tracing_enabled", internal.BoolVal(getDDorOtelConfig("enabled"), true), func(_ bool) bool { return true }, equal[bool])
if _, ok := env.Lookup("DD_TRACE_ENABLED"); ok {
Expand Down Expand Up @@ -613,7 +590,7 @@ func newConfig(opts ...StartOption) (*config, error) {
if c.logger != nil {
log.UseLogger(c.logger)
}
if c.debug {
if c.internalConfig.Debug() {
log.SetLevel(log.LevelDebug)
}
// Check if CI Visibility mode is enabled
Expand Down Expand Up @@ -691,7 +668,7 @@ func apmTracingDisabled(c *config) {
// using the tracer as transport layer for their data. And finally adding the _dd.apm.enabled=0 tag to all traces
// to let the backend know that it needs to keep APM UI disabled.
c.globalSampleRate = 1.0
c.traceRateLimitPerSecond = 1.0 / 60
c.internalConfig.SetTraceRateLimitPerSecond(1.0/60, telemetry.OriginCalculated)
c.tracingAsTransport = true
WithGlobalTag("_dd.apm.enabled", 0)(c)
// Disable runtime metrics. In `tracingAsTransport` mode, we'll still
Expand Down Expand Up @@ -1009,8 +986,7 @@ func WithDebugStack(enabled bool) StartOption {
// WithDebugMode enables debug mode on the tracer, resulting in more verbose logging.
func WithDebugMode(enabled bool) StartOption {
return func(c *config) {
telemetry.RegisterAppConfig("trace_debug_enabled", enabled, telemetry.OriginCode)
c.debug = enabled
c.internalConfig.SetDebug(enabled, telemetry.OriginCode)
}
}

Expand Down
24 changes: 9 additions & 15 deletions ddtrace/tracer/option_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@ import (

"github.com/DataDog/dd-trace-go/v2/ddtrace/ext"
"github.com/DataDog/dd-trace-go/v2/internal"
internalconfig "github.com/DataDog/dd-trace-go/v2/internal/config"
"github.com/DataDog/dd-trace-go/v2/internal/globalconfig"
"github.com/DataDog/dd-trace-go/v2/internal/log"
"github.com/DataDog/dd-trace-go/v2/internal/telemetry"
Expand Down Expand Up @@ -375,7 +374,7 @@ func TestTracerOptionsDefaults(t *testing.T) {
assert.Equal(x.Timeout, y.Timeout)
compareHTTPClients(t, x, y)
assert.True(getFuncName(x.Transport.(*http.Transport).DialContext) == getFuncName(internal.DefaultDialer(30*time.Second).DialContext))
assert.False(c.debug)
assert.False(c.internalConfig.Debug())
})

t.Run("http-client", func(t *testing.T) {
Expand Down Expand Up @@ -430,48 +429,43 @@ func TestTracerOptionsDefaults(t *testing.T) {
assert.NoError(t, err)
defer tracer.Stop()
c := tracer.config
assert.True(t, c.debug)
assert.True(t, c.internalConfig.Debug())
})
t.Run("env", func(t *testing.T) {
t.Setenv("DD_TRACE_DEBUG", "true")
internalconfig.ResetForTesting()
c, err := newTestConfig()
assert.NoError(t, err)
assert.True(t, c.debug)
assert.True(t, c.internalConfig.Debug())
})
t.Run("otel-env-debug", func(t *testing.T) {
t.Setenv("OTEL_LOG_LEVEL", "debug")
internalconfig.ResetForTesting()
c, err := newTestConfig()
assert.NoError(t, err)
assert.True(t, c.debug)
assert.True(t, c.internalConfig.Debug())
})
t.Run("otel-env-notdebug", func(t *testing.T) {
// any value other than debug, does nothing
t.Setenv("OTEL_LOG_LEVEL", "notdebug")
internalconfig.ResetForTesting()
c, err := newTestConfig()
assert.NoError(t, err)
assert.False(t, c.debug)
assert.False(t, c.internalConfig.Debug())
})
t.Run("override-chain", func(t *testing.T) {
assert := assert.New(t)
// option override otel
t.Setenv("OTEL_LOG_LEVEL", "debug")
internalconfig.ResetForTesting()
c, err := newTestConfig(WithDebugMode(false))
assert.NoError(err)
assert.False(c.debug)
assert.False(c.internalConfig.Debug())
// env override otel
t.Setenv("DD_TRACE_DEBUG", "false")
internalconfig.ResetForTesting()
c, err = newTestConfig()
assert.NoError(err)
assert.False(c.debug)
assert.False(c.internalConfig.Debug())
// option override env
c, err = newTestConfig(WithDebugMode(true))
assert.NoError(err)
assert.True(c.debug)
assert.True(c.internalConfig.Debug())
})
})

Expand Down Expand Up @@ -745,7 +739,7 @@ func TestTracerOptionsDefaults(t *testing.T) {
assert.NotNil(c.globalTags.get())
assert.Equal("v", c.globalTags.get()["k"])
assert.Equal("testEnv", c.env)
assert.True(c.debug)
assert.True(c.internalConfig.Debug())
})

t.Run("env-tags", func(t *testing.T) {
Expand Down
41 changes: 22 additions & 19 deletions ddtrace/tracer/sampler_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,15 @@ import (
"time"

"github.com/DataDog/dd-trace-go/v2/ddtrace/ext"
internalconfig "github.com/DataDog/dd-trace-go/v2/internal/config"
"github.com/DataDog/dd-trace-go/v2/internal/samplernames"

"github.com/stretchr/testify/assert"
"golang.org/x/time/rate"
)

var defaultRateLimit = internalconfig.DefaultTraceRateLimit

func TestPrioritySampler(t *testing.T) {
// create a new span with given service/env
mkSpan := func(svc, env string) *Span {
Expand Down Expand Up @@ -262,18 +265,18 @@ func TestRuleEnvVars(t *testing.T) {
in string
out *rate.Limiter
}{
{in: "", out: rate.NewLimiter(100.0, 100)},
{in: "0.0", out: rate.NewLimiter(0.0, 0)},
{in: "0.5", out: rate.NewLimiter(0.5, 1)},
{in: "1.0", out: rate.NewLimiter(1.0, 1)},
{in: "42.0", out: rate.NewLimiter(42.0, 42)},
{in: "-1.0", out: rate.NewLimiter(100.0, 100)}, // default if out of range
{in: "1point0", out: rate.NewLimiter(100.0, 100)}, // default if invalid value
// {in: "", out: rate.NewLimiter(100.0, 100)},
// {in: "0.0", out: rate.NewLimiter(0.0, 0)},
// {in: "0.5", out: rate.NewLimiter(0.5, 1)},
// {in: "1.0", out: rate.NewLimiter(1.0, 1)},
// {in: "42.0", out: rate.NewLimiter(42.0, 42)},
{in: "-1.0", out: rate.NewLimiter(100.0, 100)}, // default if out of range
// {in: "1point0", out: rate.NewLimiter(100.0, 100)}, // default if invalid value
} {
t.Setenv("DD_TRACE_RATE_LIMIT", tt.in)
c, err := newTestConfig()
assert.NoError(err)
res := newRateLimiter(c.traceRateLimitPerSecond)
res := newRateLimiter(c.internalConfig.TraceRateLimitPerSecond())
assert.Equal(tt.out, res.limiter)
}
})
Expand Down Expand Up @@ -506,7 +509,7 @@ func TestRulesSampler(t *testing.T) {
assert := assert.New(t)
c, err := newTestConfig()
assert.NoError(err)
rs := newRulesSampler(nil, nil, c.globalSampleRate, c.traceRateLimitPerSecond)
rs := newRulesSampler(nil, nil, c.globalSampleRate, c.internalConfig.TraceRateLimitPerSecond())

span := makeSpan("http.request", "test-service")
result := rs.SampleTrace(span)
Expand Down Expand Up @@ -573,7 +576,7 @@ func TestRulesSampler(t *testing.T) {
assert := assert.New(t)
c, err := newTestConfig()
assert.NoError(err)
rs := newRulesSampler(rules, nil, c.globalSampleRate, c.traceRateLimitPerSecond)
rs := newRulesSampler(rules, nil, c.globalSampleRate, c.internalConfig.TraceRateLimitPerSecond())

span := makeFinishedSpan(tt.spanName, tt.spanSrv, tt.spanRsc, tt.spanTags)

Expand All @@ -599,7 +602,7 @@ func TestRulesSampler(t *testing.T) {
assert := assert.New(t)
c, err := newTestConfig()
assert.NoError(err)
rs := newRulesSampler(v, nil, c.globalSampleRate, c.traceRateLimitPerSecond)
rs := newRulesSampler(v, nil, c.globalSampleRate, c.internalConfig.TraceRateLimitPerSecond())

span := makeSpan("http.request", "test-service")
result := rs.SampleTrace(span)
Expand Down Expand Up @@ -629,7 +632,7 @@ func TestRulesSampler(t *testing.T) {
assert := assert.New(t)
c, err := newTestConfig()
assert.NoError(err)
rs := newRulesSampler(v, nil, c.globalSampleRate, c.traceRateLimitPerSecond)
rs := newRulesSampler(v, nil, c.globalSampleRate, c.internalConfig.TraceRateLimitPerSecond())

span := makeSpan("http.request", "test-service")
result := rs.SampleTrace(span)
Expand Down Expand Up @@ -677,7 +680,7 @@ func TestRulesSampler(t *testing.T) {
assert := assert.New(t)
c, err := newTestConfig()
assert.NoError(err)
rs := newRulesSampler(nil, rules, c.globalSampleRate, c.traceRateLimitPerSecond)
rs := newRulesSampler(nil, rules, c.globalSampleRate, c.internalConfig.TraceRateLimitPerSecond())

span := makeFinishedSpan(tt.spanName, tt.spanSrv, "res-10", map[string]interface{}{"hostname": "hn-30"})

Expand Down Expand Up @@ -801,7 +804,7 @@ func TestRulesSampler(t *testing.T) {
assert := assert.New(t)
c, err := newTestConfig(WithSamplingRules(tt.rules))
assert.NoError(err)
rs := newRulesSampler(nil, c.spanRules, c.globalSampleRate, c.traceRateLimitPerSecond)
rs := newRulesSampler(nil, c.spanRules, c.globalSampleRate, c.internalConfig.TraceRateLimitPerSecond())

span := makeFinishedSpan(tt.spanName, tt.spanSrv, "res-10", map[string]interface{}{"hostname": "hn-30",
"tag": 20.1,
Expand Down Expand Up @@ -871,7 +874,7 @@ func TestRulesSampler(t *testing.T) {
assert := assert.New(t)
c, err := newTestConfig()
assert.NoError(err)
rs := newRulesSampler(nil, rules, c.globalSampleRate, c.traceRateLimitPerSecond)
rs := newRulesSampler(nil, rules, c.globalSampleRate, c.internalConfig.TraceRateLimitPerSecond())

span := makeFinishedSpan(tt.spanName, tt.spanSrv, tt.resName, map[string]interface{}{"hostname": "hn-30"})
result := rs.SampleSpan(span)
Expand Down Expand Up @@ -980,7 +983,7 @@ func TestRulesSampler(t *testing.T) {
assert := assert.New(t)
c, err := newTestConfig(WithSamplingRules(tt.rules))
assert.NoError(err)
rs := newRulesSampler(nil, c.spanRules, c.globalSampleRate, c.traceRateLimitPerSecond)
rs := newRulesSampler(nil, c.spanRules, c.globalSampleRate, c.internalConfig.TraceRateLimitPerSecond())

span := makeFinishedSpan(tt.spanName, tt.spanSrv, "res-10", map[string]interface{}{"hostname": "hn-30",
"tag": 20.1,
Expand Down Expand Up @@ -1011,7 +1014,7 @@ func TestRulesSampler(t *testing.T) {
t.Setenv("DD_TRACE_SAMPLE_RATE", fmt.Sprint(rate))
c, err := newTestConfig()
assert.NoError(err)
rs := newRulesSampler(nil, rules, c.globalSampleRate, c.traceRateLimitPerSecond)
rs := newRulesSampler(nil, rules, c.globalSampleRate, c.internalConfig.TraceRateLimitPerSecond())

span := makeSpan("http.request", "test-service")
result := rs.SampleTrace(span)
Expand Down Expand Up @@ -1438,7 +1441,7 @@ func TestRulesSamplerInternals(t *testing.T) {
now := time.Now()
c, err := newTestConfig()
assert.NoError(err)
rs := newRulesSampler(nil, nil, c.globalSampleRate, c.traceRateLimitPerSecond)
rs := newRulesSampler(nil, nil, c.globalSampleRate, c.internalConfig.TraceRateLimitPerSecond())
// set samplingLimiter to specific state
rs.traces.limiter.prevTime = now.Add(-1 * time.Second)
rs.traces.limiter.allowed = 1
Expand All @@ -1457,7 +1460,7 @@ func TestRulesSamplerInternals(t *testing.T) {
now := time.Now()
c, err := newTestConfig()
assert.NoError(err)
rs := newRulesSampler(nil, nil, c.globalSampleRate, c.traceRateLimitPerSecond)
rs := newRulesSampler(nil, nil, c.globalSampleRate, c.internalConfig.TraceRateLimitPerSecond())
// force sampling limiter to 1.0 spans/sec
rs.traces.limiter.limiter = rate.NewLimiter(rate.Limit(1.0), 1)
rs.traces.limiter.prevTime = now.Add(-1 * time.Second)
Expand Down
2 changes: 1 addition & 1 deletion ddtrace/tracer/telemetry_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ func TestTelemetryEnabled(t *testing.T) {
defer globalconfig.SetServiceName("")
defer Stop()

telemetrytest.CheckConfig(t, telemetryClient.Configuration, "trace_debug_enabled", true)
telemetrytest.CheckConfig(t, telemetryClient.Configuration, "DD_TRACE_DEBUG", true)
telemetrytest.CheckConfig(t, telemetryClient.Configuration, "service", "test-serv")
telemetrytest.CheckConfig(t, telemetryClient.Configuration, "env", "test-env")
telemetrytest.CheckConfig(t, telemetryClient.Configuration, "runtime_metrics_enabled", true)
Expand Down
2 changes: 1 addition & 1 deletion ddtrace/tracer/tracer.go
Original file line number Diff line number Diff line change
Expand Up @@ -419,7 +419,7 @@ func newUnstartedTracer(opts ...StartOption) (t *tracer, err error) {
c.spanRules = spans
}

rulesSampler := newRulesSampler(c.traceRules, c.spanRules, c.globalSampleRate, c.traceRateLimitPerSecond)
rulesSampler := newRulesSampler(c.traceRules, c.spanRules, c.globalSampleRate, c.internalConfig.TraceRateLimitPerSecond())
c.traceSampleRate = newDynamicConfig("trace_sample_rate", c.globalSampleRate, rulesSampler.traces.setGlobalSampleRate, equal[float64])
// If globalSampleRate returns NaN, it means the environment variable was not set or valid.
// We could always set the origin to "env_var" inconditionally, but then it wouldn't be possible
Expand Down
3 changes: 3 additions & 0 deletions ddtrace/tracer/tracer_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ import (
"github.com/DataDog/dd-trace-go/v2/ddtrace/ext"
"github.com/DataDog/dd-trace-go/v2/ddtrace/internal/tracerstats"
"github.com/DataDog/dd-trace-go/v2/internal"
internalconfig "github.com/DataDog/dd-trace-go/v2/internal/config"
"github.com/DataDog/dd-trace-go/v2/internal/globalconfig"
"github.com/DataDog/dd-trace-go/v2/internal/log"
"github.com/DataDog/dd-trace-go/v2/internal/remoteconfig"
Expand Down Expand Up @@ -74,6 +75,8 @@ var (
)

func TestMain(m *testing.M) {
internalconfig.SetUseFreshConfig(true)
// defer internalconfig.SetUseFreshConfig(false)
if internal.BoolEnv("DD_APPSEC_ENABLED", false) {
// things are slower with AppSec; double wait times
timeMultiplicator = time.Duration(2)
Expand Down
Loading
Loading