diff --git a/docs/drift/configuration.md b/docs/drift/configuration.md
index b8be504..9e7dc8f 100644
--- a/docs/drift/configuration.md
+++ b/docs/drift/configuration.md
@@ -335,6 +335,12 @@ For authentication in cloud mode, either use:
0.001 in adaptive mode; unset in fixed mode |
Lower bound for adaptive sampling after load shedding is applied. This is only defaulted in adaptive mode and remains unset in fixed mode. |
+
+ recording.sampling.log_transitions |
+ boolean |
+ true |
+ Whether the SDK should emit adaptive sampling transition logs. This is SDK-facing only and can be overridden by TUSK_RECORDING_SAMPLING_LOG_TRANSITIONS. |
+
recording.sampling_rate |
number |
@@ -471,6 +477,7 @@ Configuration for code coverage collection. See [`docs/drift/coverage.md`](cover
- `TUSK_API_URL` → `tusk_api.url`
- `TUSK_RESULTS_DIR` → `results.dir`
- `TUSK_RECORDING_SAMPLING_RATE` → `recording.sampling_rate`
+- `TUSK_RECORDING_SAMPLING_LOG_TRANSITIONS` → `recording.sampling.log_transitions`
## Minimal config examples
diff --git a/internal/config/config.go b/internal/config/config.go
index 99a0656..aea7cb8 100644
--- a/internal/config/config.go
+++ b/internal/config/config.go
@@ -90,9 +90,10 @@ type ComparisonConfig struct {
}
type RecordingSamplingConfig struct {
- Mode string `koanf:"mode"`
- BaseRate *float64 `koanf:"base_rate"`
- MinRate *float64 `koanf:"min_rate"`
+ Mode string `koanf:"mode"`
+ BaseRate *float64 `koanf:"base_rate"`
+ MinRate *float64 `koanf:"min_rate"`
+ LogTransitions *bool `koanf:"log_transitions"`
}
type RecordingConfig struct {
@@ -159,12 +160,13 @@ func Load(configFile string) error {
// Support environment variable overrides for specific config keys
envOverrides := map[string]string{
- "TUSK_TRACES_DIR": "traces.dir",
- "TUSK_API_URL": "tusk_api.url",
- "TUSK_AUTH0_DOMAIN": "tusk_api.auth0_domain",
- "TUSK_AUTH0_CLIENT_ID": "tusk_api.auth0_client_id",
- "TUSK_RESULTS_DIR": "results.dir",
- "TUSK_RECORDING_SAMPLING_RATE": "recording.sampling_rate",
+ "TUSK_TRACES_DIR": "traces.dir",
+ "TUSK_API_URL": "tusk_api.url",
+ "TUSK_AUTH0_DOMAIN": "tusk_api.auth0_domain",
+ "TUSK_AUTH0_CLIENT_ID": "tusk_api.auth0_client_id",
+ "TUSK_RESULTS_DIR": "results.dir",
+ "TUSK_RECORDING_SAMPLING_RATE": "recording.sampling_rate",
+ "TUSK_RECORDING_SAMPLING_LOG_TRANSITIONS": "recording.sampling.log_transitions",
}
for envKey, configKey := range envOverrides {
@@ -245,6 +247,10 @@ func parseAndValidate() (*Config, error) {
minRate := 0.001
cfg.Recording.Sampling.MinRate = &minRate
}
+ if cfg.Recording.Sampling.LogTransitions == nil {
+ defaultLogTransitions := true
+ cfg.Recording.Sampling.LogTransitions = &defaultLogTransitions
+ }
if cfg.Recording.ExportSpans == nil {
defaultExportSpans := false
cfg.Recording.ExportSpans = &defaultExportSpans
diff --git a/internal/config/config_test.go b/internal/config/config_test.go
index 3dbf9a2..d1d4d5d 100644
--- a/internal/config/config_test.go
+++ b/internal/config/config_test.go
@@ -31,6 +31,7 @@ recording:
mode: adaptive
base_rate: 0.25
min_rate: 0.05
+ log_transitions: false
`), 0o600))
require.NoError(t, Load(configPath))
@@ -42,6 +43,8 @@ recording:
assert.Equal(t, 0.25, *cfg.Recording.Sampling.BaseRate)
require.NotNil(t, cfg.Recording.Sampling.MinRate)
assert.Equal(t, 0.05, *cfg.Recording.Sampling.MinRate)
+ require.NotNil(t, cfg.Recording.Sampling.LogTransitions)
+ assert.False(t, *cfg.Recording.Sampling.LogTransitions)
assert.Equal(t, 0.25, cfg.Recording.SamplingRate)
}
@@ -69,6 +72,7 @@ recording:
func TestRecordingSamplingRateEnvOverrideBeatsNestedBaseRate(t *testing.T) {
defer Invalidate()
t.Setenv("TUSK_RECORDING_SAMPLING_RATE", "0.5")
+ t.Setenv("TUSK_RECORDING_SAMPLING_LOG_TRANSITIONS", "false")
tmpDir := t.TempDir()
configPath := filepath.Join(tmpDir, "config.yaml")
@@ -78,6 +82,7 @@ recording:
mode: adaptive
base_rate: 0.25
min_rate: 0.05
+ log_transitions: true
`), 0o600))
require.NoError(t, Load(configPath))
@@ -90,6 +95,8 @@ recording:
assert.Equal(t, "adaptive", cfg.Recording.Sampling.Mode)
require.NotNil(t, cfg.Recording.Sampling.MinRate)
assert.Equal(t, 0.05, *cfg.Recording.Sampling.MinRate)
+ require.NotNil(t, cfg.Recording.Sampling.LogTransitions)
+ assert.False(t, *cfg.Recording.Sampling.LogTransitions)
}
func TestValidateRejectsInvalidRecordingSamplingMode(t *testing.T) {