Skip to content

Commit 7c00dec

Browse files
authored
feat(trace): add SQLObfuscationMode in /info APMSP-2764 (#48857)
This config field is needed for CSS obfuscation. In fact this is the only needed obfuscation config field AFAIK. ### What does this PR do? - adds a "sql_obfuscation_mode" field to /info endpoint for using it when obfuscating stats in libraries. ### Motivation - finish [integrating obfuscation to the trace exporter](DataDog/libdatadog#1819) ### Describe how you validated your changes - [x] unit test - [x] system test ### Additional Notes Co-authored-by: oscar.ledauphin <oscar.ledauphin@datadoghq.com>
1 parent d31622e commit 7c00dec

4 files changed

Lines changed: 30 additions & 1 deletion

File tree

pkg/trace/api/info.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ type reducedObfuscationConfig struct {
4141
Mongo bool `json:"mongo"`
4242
SQLExecPlan bool `json:"sql_exec_plan"`
4343
SQLExecPlanNormalize bool `json:"sql_exec_plan_normalize"`
44+
SQLObfuscationMode obfuscate.ObfuscationMode `json:"sql_obfuscation_mode"`
4445
HTTP obfuscate.HTTPConfig `json:"http"`
4546
RemoveStackTraces bool `json:"remove_stack_traces"`
4647
Redis obfuscate.RedisConfig `json:"redis"`
@@ -87,6 +88,7 @@ func (r *HTTPReceiver) makeInfoHandler() (hash string, handler http.HandlerFunc)
8788
oconf.Mongo = o.Mongo.Enabled
8889
oconf.SQLExecPlan = o.SQLExecPlan.Enabled
8990
oconf.SQLExecPlanNormalize = o.SQLExecPlanNormalize.Enabled
91+
oconf.SQLObfuscationMode = r.conf.EffectiveSQLObfuscationMode()
9092
oconf.HTTP = o.HTTP
9193
oconf.RemoveStackTraces = o.RemoveStackTraces
9294
oconf.Redis = o.Redis

pkg/trace/api/info_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,7 @@ func TestInfoHandler(t *testing.T) {
349349
"mongo": nil,
350350
"sql_exec_plan": nil,
351351
"sql_exec_plan_normalize": nil,
352+
"sql_obfuscation_mode": nil,
352353
"http": map[string]any{
353354
"remove_query_string": nil,
354355
"remove_path_digits": nil,

pkg/trace/config/config.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,13 @@ func obfuscationMode(conf *AgentConfig, sqllexerEnabled bool) obfuscate.Obfuscat
152152
return ""
153153
}
154154

155+
// EffectiveSQLObfuscationMode returns the SQL obfuscation mode the agent
156+
// actually uses at runtime. When SQLObfuscationMode is not explicitly set,
157+
// the mode is derived from feature flags (e.g. sqllexer → obfuscate_only).
158+
func (c *AgentConfig) EffectiveSQLObfuscationMode() obfuscate.ObfuscationMode {
159+
return obfuscationMode(c, c.HasFeature("sqllexer"))
160+
}
161+
155162
// Export returns an obfuscate.Config matching o.
156163
func (o *ObfuscationConfig) Export(conf *AgentConfig) obfuscate.Config {
157164
return obfuscate.Config{
@@ -160,7 +167,7 @@ func (o *ObfuscationConfig) Export(conf *AgentConfig) obfuscate.Config {
160167
ReplaceDigits: conf.HasFeature("quantize_sql_tables") || conf.HasFeature("replace_sql_digits"),
161168
KeepSQLAlias: conf.HasFeature("keep_sql_alias"),
162169
DollarQuotedFunc: conf.HasFeature("dollar_quoted_func"),
163-
ObfuscationMode: obfuscationMode(conf, conf.HasFeature("sqllexer")),
170+
ObfuscationMode: conf.EffectiveSQLObfuscationMode(),
164171
},
165172
ES: o.ES,
166173
OpenSearch: o.OpenSearch,

pkg/trace/config/config_test.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,25 @@ func TestSQLObfuscationMode(t *testing.T) {
155155
})
156156
}
157157

158+
func TestEffectiveSQLObfuscationMode(t *testing.T) {
159+
t.Run("sqllexer_enabled_no_explicit_mode", func(t *testing.T) {
160+
cfg := New()
161+
cfg.Features = map[string]struct{}{"sqllexer": {}}
162+
// SQLObfuscationMode is empty; effective mode must be obfuscate_only
163+
assert.Equal(t, obfuscate.ObfuscateOnly, cfg.EffectiveSQLObfuscationMode())
164+
})
165+
t.Run("explicit_mode_takes_precedence", func(t *testing.T) {
166+
cfg := New()
167+
cfg.Features = map[string]struct{}{"sqllexer": {}}
168+
cfg.SQLObfuscationMode = string(obfuscate.ObfuscateAndNormalize)
169+
assert.Equal(t, obfuscate.ObfuscateAndNormalize, cfg.EffectiveSQLObfuscationMode())
170+
})
171+
t.Run("no_sqllexer_no_explicit_mode", func(t *testing.T) {
172+
cfg := New()
173+
assert.Equal(t, obfuscate.ObfuscationMode(""), cfg.EffectiveSQLObfuscationMode())
174+
})
175+
}
176+
158177
func TestInECSManagedInstancesSidecar(t *testing.T) {
159178
t.Setenv("DD_ECS_DEPLOYMENT_MODE", "sidecar")
160179
t.Setenv("AWS_EXECUTION_ENV", "AWS_ECS_MANAGED_INSTANCES")

0 commit comments

Comments
 (0)