@@ -1440,12 +1440,9 @@ type Config struct {
14401440 // Enabled controls whether telemetry is active
14411441 Enabled bool
14421442
1443- // ForceEnableTelemetry bypasses server-side feature flag checks
1444- // When true, telemetry is always enabled regardless of server flags
1445- ForceEnableTelemetry bool
1446-
1447- // EnableTelemetry indicates user wants telemetry enabled if server allows
1448- // Respects server-side feature flags and rollout percentage
1443+ // EnableTelemetry indicates user wants telemetry enabled.
1444+ // Follows client > server > default priority: if set by the client it takes
1445+ // precedence; otherwise the server feature flag and defaults are consulted.
14491446 EnableTelemetry bool
14501447
14511448 // BatchSize is the number of metrics to batch before flushing
@@ -1474,9 +1471,8 @@ type Config struct {
14741471// Note: Telemetry is disabled by default and requires explicit opt-in.
14751472func DefaultConfig () *Config {
14761473 return &Config{
1477- Enabled: false , // Disabled by default, requires explicit opt-in
1478- ForceEnableTelemetry: false ,
1479- EnableTelemetry: false ,
1474+ Enabled: false , // Disabled by default, requires explicit opt-in
1475+ EnableTelemetry: false ,
14801476 BatchSize: 100 ,
14811477 FlushInterval: 5 * time.Second ,
14821478 MaxRetries: 3 ,
@@ -1495,14 +1491,7 @@ func DefaultConfig() *Config {
14951491func ParseTelemetryConfig (params map [string ]string ) *Config {
14961492 cfg := DefaultConfig ()
14971493
1498- // Check for forceEnableTelemetry flag (bypasses server feature flags)
1499- if v , ok := params[" forceEnableTelemetry" ]; ok {
1500- if v == " true" || v == " 1" {
1501- cfg.ForceEnableTelemetry = true
1502- }
1503- }
1504-
1505- // Check for enableTelemetry flag (respects server feature flags)
1494+ // Check for enableTelemetry flag (follows client > server > default priority)
15061495 if v , ok := params[" enableTelemetry" ]; ok {
15071496 if v == " true" || v == " 1" {
15081497 cfg.EnableTelemetry = true
@@ -2108,17 +2097,15 @@ func BenchmarkInterceptor_Disabled(b *testing.B) {
21082097
21092098### Phase 5: Opt-In Configuration Integration ✅ COMPLETED
21102099- [x] Implement ` isTelemetryEnabled() ` with priority-based logic in config.go
2111- - [x] Priority 1: ForceEnableTelemetry=true bypasses all checks → return true
2112- - [x] Priority 2: EnableTelemetry=false explicit opt-out → return false
2113- - [x] Priority 3: EnableTelemetry=true + check server feature flag
2114- - [x] Priority 4: Server-side feature flag only (default behavior)
2115- - [x] Priority 5: Default disabled if no flags set and server check fails
2100+ - [x] Priority 1 (client): EnableTelemetry=true → enable regardless of server flag
2101+ - [x] Priority 2 (client): EnableTelemetry=false → disable regardless of server flag
2102+ - [x] Priority 3 (server): Server feature flag controls when client preference unset
2103+ - [x] Priority 4 (default): Disabled if no flags set and server check fails
21162104- [x] Integrate feature flag cache with opt-in logic
21172105 - [x] Wire up isTelemetryEnabled() to call featureFlagCache.isTelemetryEnabled()
21182106 - [x] Implement fallback behavior on errors (return cached value or false)
21192107 - [x] Add proper error handling
21202108- [x] Add unit tests for opt-in priority logic
2121- - [x] Test forceEnableTelemetry=true (always enabled, bypasses server)
21222109 - [x] Test enableTelemetry=false (always disabled, explicit opt-out)
21232110 - [x] Test enableTelemetry=true with server flag enabled
21242111 - [x] Test enableTelemetry=true with server flag disabled
@@ -2165,7 +2152,7 @@ func BenchmarkInterceptor_Disabled(b *testing.B) {
21652152 - [x] Increment feature flag cache reference count
21662153 - [x] Store telemetry interceptor in connection
21672154- [x] Add telemetry configuration to UserConfig
2168- - [x] EnableTelemetry and ForceEnableTelemetry fields
2155+ - [x] EnableTelemetry field (client > server > default priority)
21692156 - [x] DSN parameter parsing
21702157 - [x] DeepCopy support
21712158- [x] Add cleanup in ` Close() ` methods
0 commit comments