Skip to content

Commit 07f94a5

Browse files
committed
Define Feature Flagging configuration source contract
1 parent 9a4067f commit 07f94a5

9 files changed

Lines changed: 115 additions & 3 deletions

File tree

dd-smoke-tests/openfeature/src/test/groovy/datadog/smoketest/springboot/OpenFeatureProviderSmokeTest.groovy

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ class OpenFeatureProviderSmokeTest extends AbstractServerSmokeTest {
4242
command.addAll(['-jar', springBootShadowJar, "--server.port=${httpPort}".toString()])
4343
final builder = new ProcessBuilder(command).directory(new File(buildDirectory))
4444
builder.environment().put('DD_EXPERIMENTAL_FLAGGING_PROVIDER_ENABLED', 'true')
45+
builder.environment().put('DD_FEATURE_FLAGS_CONFIGURATION_SOURCE', 'remote_config')
4546
return builder
4647
}
4748

dd-trace-api/src/main/java/datadog/trace/api/ConfigDefaults.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,10 @@ public final class ConfigDefaults {
4949
static final boolean DEFAULT_INJECT_DATADOG_ATTRIBUTE = true;
5050
static final String DEFAULT_SITE = "datadoghq.com";
5151

52+
public static final String DEFAULT_FEATURE_FLAGGING_CONFIGURATION_SOURCE = "agentless";
53+
public static final int DEFAULT_FEATURE_FLAGGING_CONFIGURATION_SOURCE_POLL_INTERVAL_SECONDS = 30;
54+
public static final int DEFAULT_FEATURE_FLAGGING_CONFIGURATION_SOURCE_REQUEST_TIMEOUT_SECONDS = 2;
55+
5256
static final boolean DEFAULT_CODE_ORIGIN_FOR_SPANS_INTERFACE_SUPPORT = false;
5357
static final int DEFAULT_CODE_ORIGIN_MAX_USER_FRAMES = 8;
5458
static final boolean DEFAULT_TRACE_ENABLED = true;

dd-trace-api/src/main/java/datadog/trace/api/config/FeatureFlaggingConfig.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,15 @@
33
public class FeatureFlaggingConfig {
44

55
public static final String FLAGGING_PROVIDER_ENABLED = "experimental.flagging.provider.enabled";
6+
7+
public static final String FEATURE_FLAGS_CONFIGURATION_SOURCE =
8+
"feature.flags.configuration.source";
9+
public static final String FEATURE_FLAGS_CONFIGURATION_SOURCE_AGENTLESS_BASE_URL =
10+
"feature.flags.configuration.source.agentless.base.url";
11+
public static final String FEATURE_FLAGS_CONFIGURATION_SOURCE_AGENTLESS_POLL_INTERVAL_SECONDS =
12+
"feature.flags.configuration.source.agentless.poll.interval.seconds";
13+
public static final String FEATURE_FLAGS_CONFIGURATION_SOURCE_AGENTLESS_REQUEST_TIMEOUT_SECONDS =
14+
"feature.flags.configuration.source.agentless.request.timeout.seconds";
15+
16+
private FeatureFlaggingConfig() {}
617
}

internal-api/src/main/java/datadog/trace/api/Config.java

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,9 @@
8686
import static datadog.trace.api.ConfigDefaults.DEFAULT_ELASTICSEARCH_BODY_ENABLED;
8787
import static datadog.trace.api.ConfigDefaults.DEFAULT_ELASTICSEARCH_PARAMS_ENABLED;
8888
import static datadog.trace.api.ConfigDefaults.DEFAULT_EXPERIMENTATAL_JEE_SPLIT_BY_DEPLOYMENT;
89+
import static datadog.trace.api.ConfigDefaults.DEFAULT_FEATURE_FLAGGING_CONFIGURATION_SOURCE;
90+
import static datadog.trace.api.ConfigDefaults.DEFAULT_FEATURE_FLAGGING_CONFIGURATION_SOURCE_POLL_INTERVAL_SECONDS;
91+
import static datadog.trace.api.ConfigDefaults.DEFAULT_FEATURE_FLAGGING_CONFIGURATION_SOURCE_REQUEST_TIMEOUT_SECONDS;
8992
import static datadog.trace.api.ConfigDefaults.DEFAULT_GRPC_CLIENT_ERROR_STATUSES;
9093
import static datadog.trace.api.ConfigDefaults.DEFAULT_GRPC_SERVER_ERROR_STATUSES;
9194
import static datadog.trace.api.ConfigDefaults.DEFAULT_HEALTH_METRICS_ENABLED;
@@ -361,6 +364,10 @@
361364
import static datadog.trace.api.config.DebuggerConfig.THIRD_PARTY_EXCLUDES;
362365
import static datadog.trace.api.config.DebuggerConfig.THIRD_PARTY_INCLUDES;
363366
import static datadog.trace.api.config.DebuggerConfig.THIRD_PARTY_SHADING_IDENTIFIERS;
367+
import static datadog.trace.api.config.FeatureFlaggingConfig.FEATURE_FLAGS_CONFIGURATION_SOURCE;
368+
import static datadog.trace.api.config.FeatureFlaggingConfig.FEATURE_FLAGS_CONFIGURATION_SOURCE_AGENTLESS_BASE_URL;
369+
import static datadog.trace.api.config.FeatureFlaggingConfig.FEATURE_FLAGS_CONFIGURATION_SOURCE_AGENTLESS_POLL_INTERVAL_SECONDS;
370+
import static datadog.trace.api.config.FeatureFlaggingConfig.FEATURE_FLAGS_CONFIGURATION_SOURCE_AGENTLESS_REQUEST_TIMEOUT_SECONDS;
364371
import static datadog.trace.api.config.GeneralConfig.AGENTLESS_LOG_SUBMISSION_LEVEL;
365372
import static datadog.trace.api.config.GeneralConfig.AGENTLESS_LOG_SUBMISSION_QUEUE_SIZE;
366373
import static datadog.trace.api.config.GeneralConfig.AGENTLESS_LOG_SUBMISSION_URL;
@@ -1213,6 +1220,11 @@ public static String getHostName() {
12131220

12141221
private final int remoteConfigMaxExtraServices;
12151222

1223+
private final String featureFlaggingConfigurationSource;
1224+
private final String featureFlaggingConfigurationSourceAgentlessBaseUrl;
1225+
private final int featureFlaggingConfigurationSourcePollIntervalSeconds;
1226+
private final int featureFlaggingConfigurationSourceRequestTimeoutSeconds;
1227+
12161228
private final boolean dbmInjectSqlBaseHash;
12171229
private final String dbmPropagationMode;
12181230
private final boolean dbmTracePreparedStatements;
@@ -2835,6 +2847,22 @@ PROFILING_DATADOG_PROFILER_ENABLED, isDatadogProfilerSafeInCurrentEnvironment())
28352847
configProvider.getInteger(
28362848
REMOTE_CONFIG_MAX_EXTRA_SERVICES, DEFAULT_REMOTE_CONFIG_MAX_EXTRA_SERVICES);
28372849

2850+
featureFlaggingConfigurationSource =
2851+
normalizeFeatureFlaggingConfigurationSource(
2852+
configProvider.getString(
2853+
FEATURE_FLAGS_CONFIGURATION_SOURCE, DEFAULT_FEATURE_FLAGGING_CONFIGURATION_SOURCE));
2854+
featureFlaggingConfigurationSourceAgentlessBaseUrl =
2855+
configProvider.getStringNotEmpty(
2856+
FEATURE_FLAGS_CONFIGURATION_SOURCE_AGENTLESS_BASE_URL, null);
2857+
featureFlaggingConfigurationSourcePollIntervalSeconds =
2858+
configProvider.getInteger(
2859+
FEATURE_FLAGS_CONFIGURATION_SOURCE_AGENTLESS_POLL_INTERVAL_SECONDS,
2860+
DEFAULT_FEATURE_FLAGGING_CONFIGURATION_SOURCE_POLL_INTERVAL_SECONDS);
2861+
featureFlaggingConfigurationSourceRequestTimeoutSeconds =
2862+
configProvider.getInteger(
2863+
FEATURE_FLAGS_CONFIGURATION_SOURCE_AGENTLESS_REQUEST_TIMEOUT_SECONDS,
2864+
DEFAULT_FEATURE_FLAGGING_CONFIGURATION_SOURCE_REQUEST_TIMEOUT_SECONDS);
2865+
28382866
dynamicInstrumentationEnabled =
28392867
configProvider.getBoolean(
28402868
DYNAMIC_INSTRUMENTATION_ENABLED, DEFAULT_DYNAMIC_INSTRUMENTATION_ENABLED);
@@ -3747,6 +3775,14 @@ public boolean isInferredProxyPropagationEnabled() {
37473775
return traceInferredProxyEnabled;
37483776
}
37493777

3778+
private static String normalizeFeatureFlaggingConfigurationSource(final String source) {
3779+
if (source == null) {
3780+
return DEFAULT_FEATURE_FLAGGING_CONFIGURATION_SOURCE;
3781+
}
3782+
final String normalized = source.trim().toLowerCase(Locale.ROOT);
3783+
return normalized.isEmpty() ? DEFAULT_FEATURE_FLAGGING_CONFIGURATION_SOURCE : normalized;
3784+
}
3785+
37503786
public boolean isBaggageExtract() {
37513787
return tracePropagationStylesToExtract.contains(TracePropagationStyle.BAGGAGE);
37523788
}
@@ -4654,6 +4690,22 @@ public int getRemoteConfigMaxExtraServices() {
46544690
return remoteConfigMaxExtraServices;
46554691
}
46564692

4693+
public String getFeatureFlaggingConfigurationSource() {
4694+
return featureFlaggingConfigurationSource;
4695+
}
4696+
4697+
public String getFeatureFlaggingConfigurationSourceAgentlessBaseUrl() {
4698+
return featureFlaggingConfigurationSourceAgentlessBaseUrl;
4699+
}
4700+
4701+
public int getFeatureFlaggingConfigurationSourcePollIntervalSeconds() {
4702+
return featureFlaggingConfigurationSourcePollIntervalSeconds;
4703+
}
4704+
4705+
public int getFeatureFlaggingConfigurationSourceRequestTimeoutSeconds() {
4706+
return featureFlaggingConfigurationSourceRequestTimeoutSeconds;
4707+
}
4708+
46574709
public boolean isDynamicInstrumentationEnabled() {
46584710
return dynamicInstrumentationEnabled;
46594711
}
@@ -6486,6 +6538,14 @@ public String toString() {
64866538
+ remoteConfigMaxPayloadSize
64876539
+ ", remoteConfigIntegrityCheckEnabled="
64886540
+ remoteConfigIntegrityCheckEnabled
6541+
+ ", featureFlaggingConfigurationSource="
6542+
+ featureFlaggingConfigurationSource
6543+
+ ", featureFlaggingConfigurationSourceAgentlessBaseUrl="
6544+
+ featureFlaggingConfigurationSourceAgentlessBaseUrl
6545+
+ ", featureFlaggingConfigurationSourcePollIntervalSeconds="
6546+
+ featureFlaggingConfigurationSourcePollIntervalSeconds
6547+
+ ", featureFlaggingConfigurationSourceRequestTimeoutSeconds="
6548+
+ featureFlaggingConfigurationSourceRequestTimeoutSeconds
64896549
+ ", debuggerEnabled="
64906550
+ dynamicInstrumentationEnabled
64916551
+ ", debuggerUploadTimeout="

metadata/supported-configurations.json

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1497,6 +1497,38 @@
14971497
"aliases": []
14981498
}
14991499
],
1500+
"DD_FEATURE_FLAGS_CONFIGURATION_SOURCE": [
1501+
{
1502+
"version": "A",
1503+
"type": "string",
1504+
"default": "agentless",
1505+
"aliases": []
1506+
}
1507+
],
1508+
"DD_FEATURE_FLAGS_CONFIGURATION_SOURCE_AGENTLESS_BASE_URL": [
1509+
{
1510+
"version": "A",
1511+
"type": "string",
1512+
"default": null,
1513+
"aliases": []
1514+
}
1515+
],
1516+
"DD_FEATURE_FLAGS_CONFIGURATION_SOURCE_AGENTLESS_POLL_INTERVAL_SECONDS": [
1517+
{
1518+
"version": "A",
1519+
"type": "int",
1520+
"default": "30",
1521+
"aliases": []
1522+
}
1523+
],
1524+
"DD_FEATURE_FLAGS_CONFIGURATION_SOURCE_AGENTLESS_REQUEST_TIMEOUT_SECONDS": [
1525+
{
1526+
"version": "A",
1527+
"type": "int",
1528+
"default": "2",
1529+
"aliases": []
1530+
}
1531+
],
15001532
"DD_EXPERIMENTAL_FLAGGING_PROVIDER_ENABLED": [
15011533
{
15021534
"version": "A",

products/feature-flagging/feature-flagging-agent/src/main/java/com/datadog/featureflag/FeatureFlaggingSystem.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ public class FeatureFlaggingSystem {
99

1010
private static final Logger LOGGER = LoggerFactory.getLogger(FeatureFlaggingSystem.class);
1111

12-
private static volatile RemoteConfigService CONFIG_SERVICE;
12+
private static volatile ConfigurationSourceService CONFIG_SERVICE;
1313
private static volatile ExposureWriter EXPOSURE_WRITER;
1414

1515
private FeatureFlaggingSystem() {}

products/feature-flagging/feature-flagging-agent/src/test/java/com/datadog/featureflag/FeatureFlaggingSystemTest.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.datadog.featureflag;
22

3+
import static datadog.trace.api.config.FeatureFlaggingConfig.FEATURE_FLAGS_CONFIGURATION_SOURCE;
34
import static datadog.trace.api.config.RemoteConfigConfig.REMOTE_CONFIGURATION_ENABLED;
45
import static org.junit.jupiter.api.Assertions.assertThrows;
56
import static org.mockito.ArgumentMatchers.any;
@@ -23,6 +24,8 @@
2324
class FeatureFlaggingSystemTest {
2425

2526
@Test
27+
@WithConfig(key = FEATURE_FLAGS_CONFIGURATION_SOURCE, value = "remote_config")
28+
@WithConfig(key = REMOTE_CONFIGURATION_ENABLED, value = "true")
2629
void testFeatureFlagSystemInitialization() {
2730
ConfigurationPoller poller = mock(ConfigurationPoller.class);
2831
DDAgentFeaturesDiscovery discovery = mock(DDAgentFeaturesDiscovery.class);
@@ -48,6 +51,7 @@ void testFeatureFlagSystemInitialization() {
4851
}
4952

5053
@Test
54+
@WithConfig(key = FEATURE_FLAGS_CONFIGURATION_SOURCE, value = "remote_config")
5155
@WithConfig(key = REMOTE_CONFIGURATION_ENABLED, value = "false")
5256
void testThatRemoteConfigIsRequired() {
5357
SharedCommunicationObjects sharedCommunicationObjects = mock(SharedCommunicationObjects.class);

products/feature-flagging/feature-flagging-lib/src/main/java/com/datadog/featureflag/RemoteConfigService.java renamed to products/feature-flagging/feature-flagging-lib/src/main/java/com/datadog/featureflag/ConfigurationSourceService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import java.io.Closeable;
44

5-
public interface RemoteConfigService extends Closeable {
5+
public interface ConfigurationSourceService extends Closeable {
66

77
void init();
88

products/feature-flagging/feature-flagging-lib/src/main/java/com/datadog/featureflag/RemoteConfigServiceImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
import okio.Okio;
3333

3434
public class RemoteConfigServiceImpl
35-
implements RemoteConfigService, ConfigurationChangesTypedListener<ServerConfiguration> {
35+
implements ConfigurationSourceService, ConfigurationChangesTypedListener<ServerConfiguration> {
3636

3737
private final ConfigurationPoller configurationPoller;
3838

0 commit comments

Comments
 (0)