Skip to content

Commit c842fac

Browse files
authored
Merge branch 'master' into vzakharov/api_sec_sampling_new
2 parents 66cba26 + b046b86 commit c842fac

File tree

57 files changed

+835
-117
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

57 files changed

+835
-117
lines changed

buildSrc/call-site-instrumentation-plugin/src/main/java/datadog/trace/plugin/csi/impl/AdviceGeneratorImpl.java

+9
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import static com.github.javaparser.ast.Modifier.Keyword.PUBLIC;
44
import static datadog.trace.plugin.csi.impl.CallSiteFactory.typeResolver;
5+
import static datadog.trace.plugin.csi.util.CallSiteConstants.ADVICE_TYPE_CLASS;
56
import static datadog.trace.plugin.csi.util.CallSiteConstants.AUTO_SERVICE_FQDN;
67
import static datadog.trace.plugin.csi.util.CallSiteConstants.CALL_SITES_CLASS;
78
import static datadog.trace.plugin.csi.util.CallSiteConstants.CALL_SITES_FQCN;
@@ -185,20 +186,24 @@ private void addAdviceLambda(
185186
final MethodType pointCut = spec.getPointcut();
186187
final BlockStmt adviceBody = new BlockStmt();
187188
final Expression advice;
189+
final String type;
188190
if (spec.isInvokeDynamic()) {
189191
advice = invokeDynamicAdviceSignature(adviceBody);
190192
} else {
191193
advice = invokeAdviceSignature(adviceBody);
192194
}
193195
if (spec instanceof BeforeSpecification) {
196+
type = "BEFORE";
194197
writeStackOperations(spec, adviceBody);
195198
writeAdviceMethodCall(spec, adviceBody);
196199
writeOriginalMethodCall(spec, adviceBody);
197200
} else if (spec instanceof AfterSpecification) {
201+
type = "AFTER";
198202
writeStackOperations(spec, adviceBody);
199203
writeOriginalMethodCall(spec, adviceBody);
200204
writeAdviceMethodCall(spec, adviceBody);
201205
} else {
206+
type = "AROUND";
202207
writeAdviceMethodCall(spec, adviceBody);
203208
}
204209
body.addStatement(
@@ -207,6 +212,10 @@ private void addAdviceLambda(
207212
.setName("addAdvice")
208213
.setArguments(
209214
new NodeList<>(
215+
new FieldAccessExpr()
216+
.setScope(
217+
new TypeExpr(new ClassOrInterfaceType().setName(ADVICE_TYPE_CLASS)))
218+
.setName(type),
210219
new StringLiteralExpr(pointCut.getOwner().getInternalName()),
211220
new StringLiteralExpr(pointCut.getMethodName()),
212221
new StringLiteralExpr(pointCut.getMethodType().getDescriptor()),

buildSrc/call-site-instrumentation-plugin/src/main/java/datadog/trace/plugin/csi/impl/ext/IastExtension.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -364,19 +364,19 @@ private static LambdaExpr findAdviceLambda(
364364
final MethodType pointcut = spec.getPointcut();
365365
for (final MethodCallExpr add : addAdvices) {
366366
final NodeList<Expression> arguments = add.getArguments();
367-
final String owner = arguments.get(0).asStringLiteralExpr().asString();
367+
final String owner = arguments.get(1).asStringLiteralExpr().asString();
368368
if (!owner.equals(pointcut.getOwner().getInternalName())) {
369369
continue;
370370
}
371-
final String method = arguments.get(1).asStringLiteralExpr().asString();
371+
final String method = arguments.get(2).asStringLiteralExpr().asString();
372372
if (!method.equals(pointcut.getMethodName())) {
373373
continue;
374374
}
375-
final String description = arguments.get(2).asStringLiteralExpr().asString();
375+
final String description = arguments.get(3).asStringLiteralExpr().asString();
376376
if (!description.equals(pointcut.getMethodType().getDescriptor())) {
377377
continue;
378378
}
379-
return arguments.get(3).asLambdaExpr();
379+
return arguments.get(4).asLambdaExpr();
380380
}
381381
throw new IllegalArgumentException("Cannot find lambda expression for pointcut " + pointcut);
382382
}

buildSrc/call-site-instrumentation-plugin/src/main/java/datadog/trace/plugin/csi/util/CallSiteConstants.java

+2
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ private CallSiteConstants() {}
3030

3131
public static final String HAS_ENABLED_PROPERTY_CLASS = CALL_SITES_CLASS + ".HasEnabledProperty";
3232

33+
public static final String ADVICE_TYPE_CLASS = "AdviceType";
34+
3335
public static final String STACK_DUP_MODE_CLASS = "StackDupMode";
3436

3537
public static final String METHOD_HANDLER_CLASS = "MethodHandler";

buildSrc/call-site-instrumentation-plugin/src/test/groovy/datadog/trace/plugin/csi/impl/AdviceGeneratorTest.groovy

+3
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ final class AdviceGeneratorTest extends BaseCsiPluginTest {
4444
interfaces(CallSites)
4545
helpers(BeforeAdvice)
4646
advices(0) {
47+
type("BEFORE")
4748
pointcut('java/security/MessageDigest', 'getInstance', '(Ljava/lang/String;)Ljava/security/MessageDigest;')
4849
statements(
4950
'handler.dupParameters(descriptor, StackDupMode.COPY);',
@@ -76,6 +77,7 @@ final class AdviceGeneratorTest extends BaseCsiPluginTest {
7677
interfaces(CallSites)
7778
helpers(AroundAdvice)
7879
advices(0) {
80+
type("AROUND")
7981
pointcut('java/lang/String', 'replaceAll', '(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;')
8082
statements(
8183
'handler.advice("datadog/trace/plugin/csi/impl/AdviceGeneratorTest$AroundAdvice", "around", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;");'
@@ -106,6 +108,7 @@ final class AdviceGeneratorTest extends BaseCsiPluginTest {
106108
interfaces(CallSites)
107109
helpers(AfterAdvice)
108110
advices(0) {
111+
type("AFTER")
109112
pointcut('java/lang/String', 'concat', '(Ljava/lang/String;)Ljava/lang/String;')
110113
statements(
111114
'handler.dupInvoke(owner, descriptor, StackDupMode.COPY);',

buildSrc/call-site-instrumentation-plugin/src/test/groovy/datadog/trace/plugin/csi/impl/assertion/AdviceAssert.groovy

+5
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
11
package datadog.trace.plugin.csi.impl.assertion
22

33
class AdviceAssert {
4+
protected String type
45
protected String owner
56
protected String method
67
protected String descriptor
78
protected Collection<String> statements
89

10+
void type(String type) {
11+
assert type == this.type
12+
}
13+
914
void pointcut(String owner, String method, String descriptor) {
1015
assert owner == this.owner
1116
assert method == this.method

buildSrc/call-site-instrumentation-plugin/src/test/groovy/datadog/trace/plugin/csi/impl/assertion/AssertBuilder.groovy

+4-2
Original file line numberDiff line numberDiff line change
@@ -83,10 +83,12 @@ class AssertBuilder<C extends CallSiteAssert> {
8383
return getMethodCalls(acceptMethod).findAll {
8484
it.nameAsString == 'addAdvice'
8585
}.collect {
86-
def (owner, method, descriptor) = it.arguments.subList(0, 3)*.asStringLiteralExpr()*.asString()
87-
final handlerLambda = it.arguments[3].asLambdaExpr()
86+
final adviceType = it.arguments.get(0).asFieldAccessExpr().getName()
87+
def (owner, method, descriptor) = it.arguments.subList(1, 4)*.asStringLiteralExpr()*.asString()
88+
final handlerLambda = it.arguments[4].asLambdaExpr()
8889
final advice = handlerLambda.body.asBlockStmt().statements*.toString()
8990
return new AdviceAssert([
91+
type : adviceType,
9092
owner : owner,
9193
method : method,
9294
descriptor: descriptor,

buildSrc/call-site-instrumentation-plugin/src/test/groovy/datadog/trace/plugin/csi/impl/ext/IastExtensionTest.groovy

+2-2
Original file line numberDiff line numberDiff line change
@@ -217,8 +217,8 @@ class IastExtensionTest extends BaseCsiPluginTest {
217217
return getMethodCalls(acceptMethod).findAll {
218218
it.nameAsString == 'addAdvice'
219219
}.collect {
220-
def (owner, method, descriptor) = it.arguments.subList(0, 3)*.asStringLiteralExpr()*.asString()
221-
final handlerLambda = it.arguments[3].asLambdaExpr()
220+
def (owner, method, descriptor) = it.arguments.subList(1, 4)*.asStringLiteralExpr()*.asString()
221+
final handlerLambda = it.arguments[4].asLambdaExpr()
222222
final statements = handlerLambda.body.asBlockStmt().statements
223223
final instrumentedStmt = statements.get(0).asIfStmt()
224224
final executedStmt = statements.get(1).asIfStmt()

components/context/src/main/java/datadog/context/Context.java

+9
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,15 @@
3636
* @see ContextKey
3737
*/
3838
public interface Context {
39+
/**
40+
* Returns the empty context.
41+
*
42+
* @return the context containing no values at all.
43+
*/
44+
static Context empty() {
45+
return EmptyContext.INSTANCE;
46+
}
47+
3948
/**
4049
* Returns the root context.
4150
*

components/context/src/test/java/datadog/context/ContextTest.java

+12
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package datadog.context;
22

3+
import static datadog.context.Context.empty;
34
import static datadog.context.Context.root;
45
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
56
import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -21,6 +22,17 @@ class ContextTest {
2122
static final ContextKey<Float> FLOAT_KEY = ContextKey.named("float-key");
2223
static final ContextKey<Long> LONG_KEY = ContextKey.named("long-key");
2324

25+
@Test
26+
void testEmpty() {
27+
// Test empty is always the same
28+
Context empty = empty();
29+
assertEquals(empty, empty(), "Empty context should be consistent");
30+
// Test empty is not mutated
31+
String stringValue = "value";
32+
empty.with(STRING_KEY, stringValue);
33+
assertEquals(empty, empty(), "Empty context should be immutable");
34+
}
35+
2436
@Test
2537
void testRoot() {
2638
// Test root is always the same

dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/CiVisibilityRepoServices.java

+19-1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import datadog.trace.civisibility.ci.CIProviderInfo;
1010
import datadog.trace.civisibility.ci.CITagsProvider;
1111
import datadog.trace.civisibility.ci.PullRequestInfo;
12+
import datadog.trace.civisibility.ci.env.CiEnvironment;
1213
import datadog.trace.civisibility.codeowners.Codeowners;
1314
import datadog.trace.civisibility.codeowners.CodeownersProvider;
1415
import datadog.trace.civisibility.codeowners.NoCodeowners;
@@ -39,6 +40,7 @@
3940
import java.nio.file.Paths;
4041
import java.util.Map;
4142
import java.util.concurrent.CompletableFuture;
43+
import javax.annotation.Nonnull;
4244
import javax.annotation.Nullable;
4345
import org.slf4j.Logger;
4446
import org.slf4j.LoggerFactory;
@@ -64,7 +66,7 @@ public class CiVisibilityRepoServices {
6466
ciProvider = ciProviderInfo.getProvider();
6567

6668
CIInfo ciInfo = ciProviderInfo.buildCIInfo();
67-
PullRequestInfo pullRequestInfo = ciProviderInfo.buildPullRequestInfo();
69+
PullRequestInfo pullRequestInfo = buildPullRequestInfo(services.environment, ciProviderInfo);
6870

6971
if (pullRequestInfo.isNotEmpty()) {
7072
LOGGER.info("PR detected: {}", pullRequestInfo);
@@ -107,6 +109,22 @@ public class CiVisibilityRepoServices {
107109
}
108110
}
109111

112+
@Nonnull
113+
private static PullRequestInfo buildPullRequestInfo(
114+
CiEnvironment environment, CIProviderInfo ciProviderInfo) {
115+
PullRequestInfo ciProviderPrInfo = ciProviderInfo.buildPullRequestInfo();
116+
if (ciProviderPrInfo.isNotEmpty()) {
117+
return ciProviderPrInfo;
118+
}
119+
120+
// could not get PR info from CI provider,
121+
// check if it was set manually
122+
return new PullRequestInfo(
123+
null,
124+
environment.get(Constants.DDCI_PULL_REQUEST_TARGET_SHA),
125+
environment.get(Constants.DDCI_PULL_REQUEST_SOURCE_SHA));
126+
}
127+
110128
private static String getRepoRoot(CIInfo ciInfo, GitClient.Factory gitClientFactory) {
111129
String ciWorkspace = ciInfo.getNormalizedCiWorkspace();
112130
if (Strings.isNotBlank(ciWorkspace)) {

dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/CiVisibilityServices.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ public class CiVisibilityServices {
6767
final CiVisibilityMetricCollector metricCollector;
6868
final BackendApi backendApi;
6969
final JvmInfoFactory jvmInfoFactory;
70+
final CiEnvironment environment;
7071
final CIProviderInfoFactory ciProviderInfoFactory;
7172
final GitClient.Factory gitClientFactory;
7273
final GitInfoProvider gitInfoProvider;
@@ -87,7 +88,7 @@ public class CiVisibilityServices {
8788
this.jvmInfoFactory = new CachingJvmInfoFactory(config, new JvmInfoFactoryImpl());
8889
this.gitClientFactory = buildGitClientFactory(config, metricCollector);
8990

90-
CiEnvironment environment = buildCiEnvironment(config, sco);
91+
this.environment = buildCiEnvironment(config, sco);
9192
this.ciProviderInfoFactory = new CIProviderInfoFactory(config, environment);
9293
this.linesResolver =
9394
new BestEffortLinesResolver(new CompilerAidedLinesResolver(), new ByteCodeLinesResolver());
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package datadog.trace.civisibility;
2+
3+
/** Constants that are not part of the internal (or external) API. */
4+
public interface Constants {
5+
6+
/**
7+
* Indicates that early flakiness detection feature was aborted in a test session because too many
8+
* test cases were considered new.
9+
*/
10+
String EFD_ABORT_REASON_FAULTY = "faulty";
11+
12+
String CI_VISIBILITY_INSTRUMENTATION_NAME = "civisibility";
13+
14+
/**
15+
* Env var containing SHA of the feature branch HEAD commit when running in a PR. Set manually if
16+
* the necessary data is not exposed by the CI provider
17+
*/
18+
String DDCI_PULL_REQUEST_SOURCE_SHA = "DDCI_PULL_REQUEST_SOURCE_SHA";
19+
20+
/**
21+
* Env var containing SHA of the target branch HEAD commit when running in a PR. Set manually if
22+
* the necessary data is not exposed by the CI provider
23+
*/
24+
String DDCI_PULL_REQUEST_TARGET_SHA = "DDCI_PULL_REQUEST_TARGET_SHA";
25+
}

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package datadog.trace.civisibility.domain;
22

3-
import static datadog.trace.api.civisibility.CIConstants.CI_VISIBILITY_INSTRUMENTATION_NAME;
3+
import static datadog.trace.civisibility.Constants.CI_VISIBILITY_INSTRUMENTATION_NAME;
44

55
import datadog.trace.api.Config;
66
import datadog.trace.api.civisibility.telemetry.CiVisibilityCountMetric;

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package datadog.trace.civisibility.domain;
22

33
import static datadog.trace.api.TracePropagationStyle.NONE;
4-
import static datadog.trace.api.civisibility.CIConstants.CI_VISIBILITY_INSTRUMENTATION_NAME;
4+
import static datadog.trace.civisibility.Constants.CI_VISIBILITY_INSTRUMENTATION_NAME;
55

66
import datadog.trace.api.Config;
77
import datadog.trace.api.DDTraceId;

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package datadog.trace.civisibility.domain;
22

33
import static datadog.json.JsonMapper.toJson;
4-
import static datadog.trace.api.civisibility.CIConstants.CI_VISIBILITY_INSTRUMENTATION_NAME;
54
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan;
5+
import static datadog.trace.civisibility.Constants.CI_VISIBILITY_INSTRUMENTATION_NAME;
66

77
import datadog.trace.api.Config;
88
import datadog.trace.api.DDTraceId;

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package datadog.trace.civisibility.domain;
22

33
import static datadog.json.JsonMapper.toJson;
4-
import static datadog.trace.api.civisibility.CIConstants.CI_VISIBILITY_INSTRUMENTATION_NAME;
54
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan;
5+
import static datadog.trace.civisibility.Constants.CI_VISIBILITY_INSTRUMENTATION_NAME;
66

77
import datadog.trace.api.Config;
88
import datadog.trace.api.civisibility.DDTestSuite;

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import datadog.context.propagation.CarrierSetter;
77
import datadog.trace.api.Config;
88
import datadog.trace.api.DDTags;
9-
import datadog.trace.api.civisibility.CIConstants;
109
import datadog.trace.api.civisibility.domain.BuildModuleLayout;
1110
import datadog.trace.api.civisibility.domain.BuildModuleSettings;
1211
import datadog.trace.api.civisibility.domain.BuildSessionSettings;
@@ -16,6 +15,7 @@
1615
import datadog.trace.bootstrap.instrumentation.api.AgentSpan;
1716
import datadog.trace.bootstrap.instrumentation.api.AgentSpanContext;
1817
import datadog.trace.bootstrap.instrumentation.api.Tags;
18+
import datadog.trace.civisibility.Constants;
1919
import datadog.trace.civisibility.codeowners.Codeowners;
2020
import datadog.trace.civisibility.config.ExecutionSettings;
2121
import datadog.trace.civisibility.coverage.percentage.CoverageCalculator;
@@ -269,7 +269,7 @@ private SignalResponse onModuleExecutionResultReceived(ModuleExecutionResult res
269269
if (result.isEarlyFlakeDetectionEnabled()) {
270270
setTag(Tags.TEST_EARLY_FLAKE_ENABLED, true);
271271
if (result.isEarlyFlakeDetectionFaulty()) {
272-
setTag(Tags.TEST_EARLY_FLAKE_ABORT_REASON, CIConstants.EFD_ABORT_REASON_FAULTY);
272+
setTag(Tags.TEST_EARLY_FLAKE_ABORT_REASON, Constants.EFD_ABORT_REASON_FAULTY);
273273
}
274274
}
275275

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

+2-3
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
import datadog.trace.api.Config;
66
import datadog.trace.api.DDTags;
7-
import datadog.trace.api.civisibility.CIConstants;
87
import datadog.trace.api.civisibility.domain.BuildModuleLayout;
98
import datadog.trace.api.civisibility.domain.BuildSessionSettings;
109
import datadog.trace.api.civisibility.domain.JavaAgent;
@@ -14,6 +13,7 @@
1413
import datadog.trace.api.civisibility.telemetry.tag.Provider;
1514
import datadog.trace.bootstrap.instrumentation.api.AgentSpan;
1615
import datadog.trace.bootstrap.instrumentation.api.Tags;
16+
import datadog.trace.civisibility.Constants;
1717
import datadog.trace.civisibility.codeowners.Codeowners;
1818
import datadog.trace.civisibility.config.ExecutionSettings;
1919
import datadog.trace.civisibility.config.ExecutionSettingsFactory;
@@ -208,8 +208,7 @@ public BuildSessionSettings getSettings() {
208208

209209
@Override
210210
protected Collection<TagValue> additionalTelemetryTags() {
211-
if (CIConstants.EFD_ABORT_REASON_FAULTY.equals(
212-
span.getTag(Tags.TEST_EARLY_FLAKE_ABORT_REASON))) {
211+
if (Constants.EFD_ABORT_REASON_FAULTY.equals(span.getTag(Tags.TEST_EARLY_FLAKE_ABORT_REASON))) {
213212
return Collections.singleton(EarlyFlakeDetectionAbortReason.FAULTY);
214213
}
215214
return Collections.emptySet();

dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/headless/HeadlessTestModule.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import datadog.trace.api.Config;
44
import datadog.trace.api.DDTags;
5-
import datadog.trace.api.civisibility.CIConstants;
65
import datadog.trace.api.civisibility.config.LibraryCapability;
76
import datadog.trace.api.civisibility.config.TestIdentifier;
87
import datadog.trace.api.civisibility.config.TestSourceData;
@@ -14,6 +13,7 @@
1413
import datadog.trace.bootstrap.instrumentation.api.AgentSpan;
1514
import datadog.trace.bootstrap.instrumentation.api.AgentSpanContext;
1615
import datadog.trace.bootstrap.instrumentation.api.Tags;
16+
import datadog.trace.civisibility.Constants;
1717
import datadog.trace.civisibility.codeowners.Codeowners;
1818
import datadog.trace.civisibility.config.EarlyFlakeDetectionSettings;
1919
import datadog.trace.civisibility.config.ExecutionSettings;
@@ -150,7 +150,7 @@ public void end(@Nullable Long endTime) {
150150
if (earlyFlakeDetectionSettings.isEnabled()) {
151151
setTag(Tags.TEST_EARLY_FLAKE_ENABLED, true);
152152
if (executionStrategy.isEFDLimitReached()) {
153-
setTag(Tags.TEST_EARLY_FLAKE_ABORT_REASON, CIConstants.EFD_ABORT_REASON_FAULTY);
153+
setTag(Tags.TEST_EARLY_FLAKE_ABORT_REASON, Constants.EFD_ABORT_REASON_FAULTY);
154154
}
155155
}
156156

0 commit comments

Comments
 (0)