Skip to content

Commit 036d103

Browse files
Create activation origin config for telemetry (#9064)
1 parent 08f50c2 commit 036d103

File tree

3 files changed

+61
-0
lines changed

3 files changed

+61
-0
lines changed

dd-java-agent/appsec/src/main/java/com/datadog/appsec/config/AppSecConfigServiceImpl.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import static datadog.remoteconfig.Capabilities.CAPABILITY_ASM_TRUSTED_IPS;
2222
import static datadog.remoteconfig.Capabilities.CAPABILITY_ASM_USER_BLOCKING;
2323
import static datadog.remoteconfig.Capabilities.CAPABILITY_ENDPOINT_FINGERPRINT;
24+
import static datadog.trace.api.config.AppSecConfig.APPSEC_ENABLED;
2425

2526
import com.datadog.appsec.AppSecModule;
2627
import com.datadog.appsec.AppSecSystem;
@@ -45,6 +46,8 @@
4546
import datadog.remoteconfig.state.ConfigKey;
4647
import datadog.remoteconfig.state.ProductListener;
4748
import datadog.trace.api.Config;
49+
import datadog.trace.api.ConfigCollector;
50+
import datadog.trace.api.ConfigOrigin;
4851
import datadog.trace.api.ProductActivation;
4952
import datadog.trace.api.UserIdCollectionMode;
5053
import datadog.trace.api.telemetry.LogCollector;
@@ -517,6 +520,8 @@ private void setAppSecActivation(final AppSecFeatures.Asm asm) {
517520
newState = tracerConfig.getAppSecActivation() == ProductActivation.FULLY_ENABLED;
518521
} else {
519522
newState = asm.enabled;
523+
// Report AppSec activation change via telemetry when modified via remote config
524+
ConfigCollector.get().put(APPSEC_ENABLED, asm.enabled, ConfigOrigin.REMOTE);
520525
}
521526
if (AppSecSystem.isActive() != newState) {
522527
log.info("AppSec {} (runtime)", newState ? "enabled" : "disabled");
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package datadog.smoketest.dynamicconfig;
2+
3+
import java.util.concurrent.TimeUnit;
4+
5+
public class AppSecApplication {
6+
7+
public static final long TIMEOUT_IN_SECONDS = 10;
8+
9+
public static void main(String[] args) throws InterruptedException {
10+
// just wait as we want to test RC payloads
11+
Thread.sleep(TimeUnit.SECONDS.toMillis(TIMEOUT_IN_SECONDS));
12+
System.exit(0);
13+
}
14+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package datadog.smoketest
2+
3+
import datadog.smoketest.dynamicconfig.AppSecApplication
4+
5+
class AppSecActivationSmokeTest extends AbstractSmokeTest {
6+
7+
@Override
8+
ProcessBuilder createProcessBuilder() {
9+
def command = [javaPath()]
10+
command += defaultJavaProperties.toList()
11+
command += [
12+
'-Ddd.remote_config.enabled=true',
13+
"-Ddd.remote_config.url=http://localhost:${server.address.port}/v0.7/config".toString(),
14+
'-Ddd.remote_config.poll_interval.seconds=1',
15+
'-Ddd.profiling.enabled=false',
16+
'-cp',
17+
System.getProperty('datadog.smoketest.shadowJar.path'),
18+
AppSecApplication.name
19+
]
20+
21+
final processBuilder = new ProcessBuilder(command)
22+
processBuilder.directory(new File(buildDirectory))
23+
}
24+
25+
void 'test activation config change is sent via RC'() {
26+
when:
27+
setRemoteConfig('datadog/2/ASM_FEATURES/asm_features_activation/config', '{"asm":{"enabled":true}}')
28+
29+
then:
30+
waitForTelemetryFlat {
31+
if (it['request_type'] != 'app-client-configuration-change') {
32+
return false
33+
}
34+
final configurations = (List<Map<String, Object>>) it?.payload?.configuration ?: []
35+
final enabledConfig = configurations.find { it.name == 'appsec_enabled' }
36+
if (!enabledConfig) {
37+
return false
38+
}
39+
return enabledConfig.value == 'true' && enabledConfig .origin == 'remote_config'
40+
}
41+
}
42+
}

0 commit comments

Comments
 (0)