Skip to content

Commit 86de47c

Browse files
authored
Merge branch 'master' into dougqh/interceptor-bypass
2 parents 32bbdd4 + 3b2874e commit 86de47c

File tree

17 files changed

+585
-100
lines changed

17 files changed

+585
-100
lines changed

dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/buildsystem/BuildSystemModuleImpl.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import datadog.trace.api.civisibility.domain.JavaAgent;
1313
import datadog.trace.api.civisibility.telemetry.CiVisibilityMetricCollector;
1414
import datadog.trace.api.config.CiVisibilityConfig;
15+
import datadog.trace.api.config.GeneralConfig;
1516
import datadog.trace.bootstrap.instrumentation.api.AgentSpan;
1617
import datadog.trace.bootstrap.instrumentation.api.AgentSpanContext;
1718
import datadog.trace.bootstrap.instrumentation.api.Tags;
@@ -99,6 +100,8 @@ public <T extends CoverageCalculator> BuildSystemModuleImpl(
99100
settings =
100101
new BuildModuleSettings(
101102
getPropertiesPropagatedToChildProcess(
103+
config.getServiceName(),
104+
config.isServiceNameSetByUser(),
102105
moduleName,
103106
startCommand,
104107
classpath,
@@ -125,6 +128,8 @@ public void set(Map<String, String> carrier, String key, String value) {
125128
}
126129

127130
private Map<String, String> getPropertiesPropagatedToChildProcess(
131+
String serviceName,
132+
boolean userProvidedServiceName,
128133
String moduleName,
129134
String startCommand,
130135
@Nullable Collection<Path> classpath,
@@ -190,6 +195,11 @@ private Map<String, String> getPropertiesPropagatedToChildProcess(
190195
CiVisibilityConfig.CIVISIBILITY_INJECTED_TRACER_VERSION),
191196
TracerVersion.TRACER_VERSION);
192197

198+
propagatedSystemProperties.put(
199+
Strings.propertyNameToSystemPropertyName(GeneralConfig.SERVICE_NAME), serviceName);
200+
propagatedSystemProperties.put(
201+
Strings.propertyNameToSystemPropertyName(GeneralConfig.SERVICE_NAME_SET_BY_USER),
202+
String.valueOf(userProvidedServiceName));
193203
propagatedSystemProperties.put(
194204
Strings.propertyNameToSystemPropertyName(CiVisibilityConfig.CIVISIBILITY_MODULE_NAME),
195205
moduleName);

dd-java-agent/agent-ci-visibility/src/testFixtures/groovy/datadog/trace/civisibility/CiVisibilityInstrumentationTest.groovy

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -368,7 +368,7 @@ abstract class CiVisibilityInstrumentationTest extends AgentTestRunner {
368368
}
369369
}
370370

371-
def generateTestFixtures(testcaseName, events, coverages, additionalReplacements, additionalIgnoredTags) {
371+
def generateTestFixtures(String testcaseName, List<Map> events, List<Map> coverages, Map<String, String> additionalReplacements, List<String> additionalIgnoredTags) {
372372
def clazz = this.getClass()
373373
def resourceName = "/" + clazz.name.replace('.', '/') + ".class"
374374
def classfilePath = clazz.getResource(resourceName).toURI().schemeSpecificPart
@@ -380,7 +380,7 @@ abstract class CiVisibilityInstrumentationTest extends AgentTestRunner {
380380
submoduleName = "test"
381381
}
382382
def baseTemplatesPath = modulePath + "/src/" + submoduleName + "/resources/" + testcaseName
383-
CiVisibilityTestUtils.generateTemplates(baseTemplatesPath, events, coverages, additionalReplacements, additionalIgnoredTags)
383+
CiVisibilityTestUtils.generateTemplates(baseTemplatesPath, events, coverages, additionalReplacements.keySet(), additionalIgnoredTags)
384384
return [:]
385385
}
386386

dd-java-agent/agent-ci-visibility/src/testFixtures/groovy/datadog/trace/civisibility/CiVisibilitySmokeTest.groovy

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,14 @@ import spock.lang.Specification
66
abstract class CiVisibilitySmokeTest extends Specification {
77
static final List<String> SMOKE_IGNORED_TAGS = ["content.meta.['_dd.integration']"]
88

9-
protected verifyEventsAndCoverages(String projectName, String toolchain, String toolchainVersion, List<Map<String, Object>> events, List<Map<String, Object>> coverages) {
9+
protected verifyEventsAndCoverages(String projectName, String toolchain, String toolchainVersion, List<Map<String, Object>> events, List<Map<String, Object>> coverages, List<String> additionalDynamicTags = []) {
1010
def additionalReplacements = ["content.meta.['test.toolchain']": "$toolchain:$toolchainVersion"]
1111

1212
if (System.getenv().get("GENERATE_TEST_FIXTURES") != null) {
1313
def baseTemplatesPath = CiVisibilitySmokeTest.classLoader.getResource(projectName).toURI().schemeSpecificPart.replace('build/resources/test', 'src/test/resources')
14-
CiVisibilityTestUtils.generateTemplates(baseTemplatesPath, events, coverages, additionalReplacements, SMOKE_IGNORED_TAGS)
14+
CiVisibilityTestUtils.generateTemplates(baseTemplatesPath, events, coverages, additionalReplacements.keySet() + additionalDynamicTags, SMOKE_IGNORED_TAGS)
1515
} else {
16-
CiVisibilityTestUtils.assertData(projectName, events, coverages, additionalReplacements, SMOKE_IGNORED_TAGS)
16+
CiVisibilityTestUtils.assertData(projectName, events, coverages, additionalReplacements, SMOKE_IGNORED_TAGS, additionalDynamicTags)
1717
}
1818
}
1919

dd-java-agent/agent-ci-visibility/src/testFixtures/groovy/datadog/trace/civisibility/CiVisibilityTestUtils.groovy

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -71,28 +71,28 @@ abstract class CiVisibilityTestUtils {
7171
/**
7272
* Use this method to generate expected data templates
7373
*/
74-
static void generateTemplates(String baseTemplatesPath, List<Map<?, ?>> events, List<Map<?, ?>> coverages, Map<String, String> additionalReplacements, List<String> ignoredTags = []) {
74+
static void generateTemplates(String baseTemplatesPath, List<Map<?, ?>> events, List<Map<?, ?>> coverages, Collection<String> additionalDynamicPaths, List<String> ignoredTags = []) {
7575
if (!ignoredTags.empty) {
7676
events = removeTags(events, ignoredTags)
7777
}
7878
events.sort(EVENT_RESOURCE_COMPARATOR)
7979

8080
def templateGenerator = new TemplateGenerator(new LabelGenerator())
81-
def compiledAdditionalReplacements = compile(additionalReplacements.keySet())
81+
def compiledAdditionalReplacements = compile(additionalDynamicPaths)
8282

8383
Files.createDirectories(Paths.get(baseTemplatesPath))
8484
Files.write(Paths.get(baseTemplatesPath, "events.ftl"), templateGenerator.generateTemplate(events, EVENT_DYNAMIC_PATHS + compiledAdditionalReplacements).bytes)
8585
Files.write(Paths.get(baseTemplatesPath, "coverages.ftl"), templateGenerator.generateTemplate(coverages, COVERAGE_DYNAMIC_PATHS + compiledAdditionalReplacements).bytes)
8686
}
8787

88-
static Map<String, String> assertData(String baseTemplatesPath, List<Map<?, ?>> events, List<Map<?, ?>> coverages, Map<String, String> additionalReplacements, List<String> ignoredTags) {
88+
static Map<String, String> assertData(String baseTemplatesPath, List<Map<?, ?>> events, List<Map<?, ?>> coverages, Map<String, String> additionalReplacements, List<String> ignoredTags, List<String> additionalDynamicPaths = []) {
8989
events.sort(EVENT_RESOURCE_COMPARATOR)
9090

9191
def labelGenerator = new LabelGenerator()
9292
def templateGenerator = new TemplateGenerator(labelGenerator)
9393

9494
def replacementMap
95-
replacementMap = templateGenerator.generateReplacementMap(events, EVENT_DYNAMIC_PATHS)
95+
replacementMap = templateGenerator.generateReplacementMap(events, EVENT_DYNAMIC_PATHS + compile(additionalDynamicPaths))
9696
replacementMap = templateGenerator.generateReplacementMap(coverages, COVERAGE_DYNAMIC_PATHS)
9797

9898
for (Map.Entry<String, String> e : additionalReplacements.entrySet()) {

dd-java-agent/agent-debugger/debugger-bootstrap/src/main/java/datadog/trace/bootstrap/debugger/CapturedContext.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -182,12 +182,14 @@ public ValueReferenceResolver withExtensions(Map<String, Object> extensions) {
182182
return new CapturedContext(this, extensions);
183183
}
184184

185-
public void removeExtension(String name) {
186-
extensions.remove(name);
185+
@Override
186+
public void addExtension(String name, Object value) {
187+
extensions.put(name, value);
187188
}
188189

189-
private void addExtension(String name, Object value) {
190-
extensions.put(name, value);
190+
@Override
191+
public void removeExtension(String name) {
192+
extensions.remove(name);
191193
}
192194

193195
public void addArguments(CapturedValue[] values) {

dd-java-agent/agent-debugger/debugger-bootstrap/src/main/java/datadog/trace/bootstrap/debugger/el/ValueReferenceResolver.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@ public interface ValueReferenceResolver {
88

99
Object getMember(Object target, String name);
1010

11+
default void addExtension(String name, Object value) {}
12+
13+
default void removeExtension(String name) {}
14+
1115
default ValueReferenceResolver withExtensions(Map<String, Object> extensions) {
1216
return this;
1317
}

dd-java-agent/agent-debugger/debugger-el/src/main/java/com/datadog/debugger/el/expressions/FilterCollectionExpression.java

Lines changed: 31 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
import datadog.trace.bootstrap.debugger.el.ValueReferences;
1818
import java.util.ArrayList;
1919
import java.util.Collection;
20-
import java.util.Collections;
2120
import java.util.HashMap;
2221
import java.util.HashSet;
2322
import java.util.Map;
@@ -48,41 +47,52 @@ public CollectionValue<?> evaluate(ValueReferenceResolver valueRefResolver) {
4847
checkSupportedList(materialized, this);
4948
Collection<Object> filtered = new ArrayList<>();
5049
int len = materialized.count();
51-
for (int i = 0; i < len; i++) {
52-
Object value = materialized.get(i).getValue();
53-
if (filterExpression.evaluate(
54-
valueRefResolver.withExtensions(
55-
Collections.singletonMap(ValueReferences.ITERATOR_EXTENSION_NAME, value)))) {
56-
filtered.add(value);
50+
try {
51+
for (int i = 0; i < len; i++) {
52+
Object value = materialized.get(i).getValue();
53+
valueRefResolver.addExtension(ValueReferences.ITERATOR_EXTENSION_NAME, value);
54+
if (filterExpression.evaluate(valueRefResolver)) {
55+
filtered.add(value);
56+
}
5757
}
58+
} finally {
59+
valueRefResolver.removeExtension(ValueReferences.ITERATOR_EXTENSION_NAME);
5860
}
5961
return new ListValue(filtered);
6062
} else if (collectionValue instanceof MapValue) {
6163
MapValue materialized = (MapValue) collectionValue;
6264
checkSupportedMap(materialized, this);
6365
Map<Object, Object> filtered = new HashMap<>();
64-
for (Value<?> key : materialized.getKeys()) {
65-
Value<?> value = key.isUndefined() ? Value.undefinedValue() : materialized.get(key);
66-
Map<String, Object> valueRefExtensions = new HashMap<>();
67-
valueRefExtensions.put(ValueReferences.KEY_EXTENSION_NAME, key);
68-
valueRefExtensions.put(ValueReferences.VALUE_EXTENSION_NAME, value);
69-
valueRefExtensions.put(
70-
ValueReferences.ITERATOR_EXTENSION_NAME, new MapValue.Entry(key, value));
71-
if (filterExpression.evaluate(valueRefResolver.withExtensions(valueRefExtensions))) {
72-
filtered.put(key.getValue(), value.getValue());
66+
try {
67+
for (Value<?> key : materialized.getKeys()) {
68+
Value<?> value = key.isUndefined() ? Value.undefinedValue() : materialized.get(key);
69+
valueRefResolver.addExtension(ValueReferences.KEY_EXTENSION_NAME, key);
70+
valueRefResolver.addExtension(ValueReferences.VALUE_EXTENSION_NAME, value);
71+
valueRefResolver.addExtension(
72+
ValueReferences.ITERATOR_EXTENSION_NAME, new MapValue.Entry(key, value));
73+
if (filterExpression.evaluate(valueRefResolver)) {
74+
filtered.put(key.getValue(), value.getValue());
75+
}
7376
}
77+
} finally {
78+
valueRefResolver.removeExtension(ValueReferences.KEY_EXTENSION_NAME);
79+
valueRefResolver.removeExtension(ValueReferences.VALUE_EXTENSION_NAME);
80+
valueRefResolver.removeExtension(ValueReferences.ITERATOR_EXTENSION_NAME);
7481
}
7582
return new MapValue(filtered);
7683
} else if (collectionValue instanceof SetValue) {
7784
SetValue materialized = (SetValue) collectionValue;
7885
Collection<Object> filtered = new HashSet<>();
7986
Set<?> setHolder = checkSupportedSet(materialized, this);
80-
for (Object value : setHolder) {
81-
if (filterExpression.evaluate(
82-
valueRefResolver.withExtensions(
83-
Collections.singletonMap(ValueReferences.ITERATOR_EXTENSION_NAME, value)))) {
84-
filtered.add(value);
87+
try {
88+
for (Object value : setHolder) {
89+
valueRefResolver.addExtension(ValueReferences.ITERATOR_EXTENSION_NAME, value);
90+
if (filterExpression.evaluate(valueRefResolver)) {
91+
filtered.add(value);
92+
}
8593
}
94+
} finally {
95+
valueRefResolver.removeExtension(ValueReferences.ITERATOR_EXTENSION_NAME);
8696
}
8797
return new SetValue(filtered);
8898
}

dd-java-agent/agent-debugger/debugger-el/src/main/java/com/datadog/debugger/el/expressions/HasAllExpression.java

Lines changed: 33 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,6 @@
1414
import com.datadog.debugger.el.values.SetValue;
1515
import datadog.trace.bootstrap.debugger.el.ValueReferenceResolver;
1616
import datadog.trace.bootstrap.debugger.el.ValueReferences;
17-
import java.util.Collections;
18-
import java.util.HashMap;
19-
import java.util.Map;
2017
import java.util.Set;
2118

2219
/**
@@ -42,15 +39,17 @@ public Boolean evaluate(ValueReferenceResolver valueRefResolver) {
4239
return Boolean.TRUE;
4340
}
4441
int len = collection.count();
45-
for (int i = 0; i < len; i++) {
46-
Value<?> val = collection.get(i);
47-
if (!filterPredicateExpression.evaluate(
48-
valueRefResolver.withExtensions(
49-
Collections.singletonMap(ValueReferences.ITERATOR_EXTENSION_NAME, val)))) {
50-
return Boolean.FALSE;
42+
try {
43+
for (int i = 0; i < len; i++) {
44+
valueRefResolver.addExtension(ValueReferences.ITERATOR_EXTENSION_NAME, collection.get(i));
45+
if (!filterPredicateExpression.evaluate(valueRefResolver)) {
46+
return Boolean.FALSE;
47+
}
5148
}
49+
return Boolean.TRUE;
50+
} finally {
51+
valueRefResolver.removeExtension(ValueReferences.ITERATOR_EXTENSION_NAME);
5252
}
53-
return Boolean.TRUE;
5453
}
5554
if (value instanceof MapValue) {
5655
MapValue map = (MapValue) value;
@@ -59,19 +58,23 @@ public Boolean evaluate(ValueReferenceResolver valueRefResolver) {
5958
// always return TRUE for empty values (cf vacuous truth, see also Stream::allMatch)
6059
return Boolean.TRUE;
6160
}
62-
for (Value<?> key : map.getKeys()) {
63-
Value<?> val = key.isUndefined() ? Value.undefinedValue() : map.get(key);
64-
Map<String, Object> valueRefExtensions = new HashMap<>();
65-
valueRefExtensions.put(ValueReferences.KEY_EXTENSION_NAME, key);
66-
valueRefExtensions.put(ValueReferences.VALUE_EXTENSION_NAME, val);
67-
valueRefExtensions.put(
68-
ValueReferences.ITERATOR_EXTENSION_NAME, new MapValue.Entry(key, val));
69-
if (!filterPredicateExpression.evaluate(
70-
valueRefResolver.withExtensions(valueRefExtensions))) {
71-
return Boolean.FALSE;
61+
try {
62+
for (Value<?> key : map.getKeys()) {
63+
Value<?> val = key.isUndefined() ? Value.undefinedValue() : map.get(key);
64+
valueRefResolver.addExtension(ValueReferences.KEY_EXTENSION_NAME, key);
65+
valueRefResolver.addExtension(ValueReferences.VALUE_EXTENSION_NAME, val);
66+
valueRefResolver.addExtension(
67+
ValueReferences.ITERATOR_EXTENSION_NAME, new MapValue.Entry(key, val));
68+
if (!filterPredicateExpression.evaluate(valueRefResolver)) {
69+
return Boolean.FALSE;
70+
}
7271
}
72+
return Boolean.TRUE;
73+
} finally {
74+
valueRefResolver.removeExtension(ValueReferences.ITERATOR_EXTENSION_NAME);
75+
valueRefResolver.removeExtension(ValueReferences.KEY_EXTENSION_NAME);
76+
valueRefResolver.removeExtension(ValueReferences.VALUE_EXTENSION_NAME);
7377
}
74-
return Boolean.TRUE;
7578
}
7679
if (value instanceof SetValue) {
7780
SetValue set = (SetValue) value;
@@ -80,14 +83,17 @@ public Boolean evaluate(ValueReferenceResolver valueRefResolver) {
8083
// always return TRUE for empty values (cf vacuous truth, see also Stream::allMatch)
8184
return Boolean.TRUE;
8285
}
83-
for (Object val : setHolder) {
84-
if (!filterPredicateExpression.evaluate(
85-
valueRefResolver.withExtensions(
86-
Collections.singletonMap(ValueReferences.ITERATOR_EXTENSION_NAME, val)))) {
87-
return Boolean.FALSE;
86+
try {
87+
for (Object val : setHolder) {
88+
valueRefResolver.addExtension(ValueReferences.ITERATOR_EXTENSION_NAME, val);
89+
if (!filterPredicateExpression.evaluate(valueRefResolver)) {
90+
return Boolean.FALSE;
91+
}
8892
}
93+
return Boolean.TRUE;
94+
} finally {
95+
valueRefResolver.removeExtension(ValueReferences.ITERATOR_EXTENSION_NAME);
8996
}
90-
return Boolean.TRUE;
9197
}
9298
throw new EvaluationException(
9399
"Unsupported collection class: " + value.getValue().getClass().getTypeName(), print(this));

0 commit comments

Comments
 (0)