Skip to content

Commit b4b235e

Browse files
authored
Merge branch 'master' into kr-igor/dsm-service-name-override
2 parents 2df9920 + d46416d commit b4b235e

File tree

137 files changed

+2432
-1239
lines changed

Some content is hidden

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

137 files changed

+2432
-1239
lines changed

.gitlab-ci.yml

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -216,10 +216,8 @@ package-oci:
216216
onboarding_tests_installer:
217217
parallel:
218218
matrix:
219-
- ONBOARDING_FILTER_WEBLOG: [test-app-java, test-app-java-container, test-app-java-container-jdk15, test-app-java-alpine]
219+
- ONBOARDING_FILTER_WEBLOG: [test-app-java, test-app-java-container, test-app-java-alpine]
220220
SCENARIO: [ SIMPLE_INSTALLER_AUTO_INJECTION, SIMPLE_AUTO_INJECTION_PROFILING ]
221-
- ONBOARDING_FILTER_WEBLOG: [test-app-java-buildpack]
222-
SCENARIO: [ SIMPLE_INSTALLER_AUTO_INJECTION ]
223221

224222
onboarding_tests_k8s_injection:
225223
variables:

dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/decorator/HttpClientDecorator.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@
66

77
import datadog.trace.api.Config;
88
import datadog.trace.api.DDTags;
9+
import datadog.trace.api.InstrumenterConfig;
10+
import datadog.trace.api.ProductActivation;
11+
import datadog.trace.api.iast.InstrumentationBridge;
12+
import datadog.trace.api.iast.sink.SsrfModule;
913
import datadog.trace.api.naming.SpanNaming;
1014
import datadog.trace.bootstrap.instrumentation.api.AgentSpan;
1115
import datadog.trace.bootstrap.instrumentation.api.InternalSpanTypes;
@@ -89,6 +93,8 @@ public AgentSpan onRequest(final AgentSpan span, final REQUEST request) {
8993
log.debug("Error tagging url", e);
9094
}
9195

96+
ssrfIastCheck(request);
97+
9298
if (CLIENT_TAG_HEADERS) {
9399
for (Map.Entry<String, String> headerTag :
94100
traceConfig(span).getRequestHeaderTags().entrySet()) {
@@ -168,4 +174,23 @@ public long getResponseContentLength(final RESPONSE response) {
168174

169175
return 0;
170176
}
177+
178+
/* This method must be overriden after making the proper propagations to the client before **/
179+
protected Object sourceUrl(REQUEST request) {
180+
return null;
181+
}
182+
183+
private void ssrfIastCheck(final REQUEST request) {
184+
final Object sourceUrl = sourceUrl(request);
185+
if (sourceUrl == null) {
186+
return;
187+
}
188+
if (InstrumenterConfig.get().getIastActivation() != ProductActivation.FULLY_ENABLED) {
189+
return;
190+
}
191+
final SsrfModule ssrfModule = InstrumentationBridge.SSRF;
192+
if (ssrfModule != null) {
193+
ssrfModule.onURLConnection(sourceUrl);
194+
}
195+
}
171196
}

dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/java/concurrent/QueueTimerHelper.java

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,45 @@
11
package datadog.trace.bootstrap.instrumentation.java.concurrent;
22

3+
import datadog.trace.api.Platform;
4+
import datadog.trace.api.config.ProfilingConfig;
35
import datadog.trace.api.profiling.QueueTiming;
46
import datadog.trace.api.profiling.Timer;
7+
import datadog.trace.api.profiling.Timing;
8+
import datadog.trace.api.sampling.PerRecordingRateLimiter;
59
import datadog.trace.bootstrap.ContextStore;
10+
import datadog.trace.bootstrap.config.provider.ConfigProvider;
611
import datadog.trace.bootstrap.instrumentation.api.AgentTracer;
712
import datadog.trace.bootstrap.instrumentation.jfr.InstrumentationBasedProfiling;
13+
import java.time.Duration;
14+
import java.time.temporal.ChronoUnit;
815

916
public class QueueTimerHelper {
1017

18+
private static final class RateLimiterHolder {
19+
// indirection to prevent needing to instantiate the class and its transitive dependencies
20+
// in graal native image
21+
private static final PerRecordingRateLimiter RATE_LIMITER =
22+
new PerRecordingRateLimiter(
23+
Duration.of(500, ChronoUnit.MILLIS),
24+
10_000, // hard limit on queue events
25+
Duration.ofSeconds(
26+
ConfigProvider.getInstance()
27+
.getInteger(
28+
ProfilingConfig.PROFILING_UPLOAD_PERIOD,
29+
ProfilingConfig.PROFILING_UPLOAD_PERIOD_DEFAULT)));
30+
}
31+
1132
public static <T> void startQueuingTimer(
1233
ContextStore<T, State> taskContextStore, Class<?> schedulerClass, T task) {
1334
State state = taskContextStore.get(task);
1435
startQueuingTimer(state, schedulerClass, task);
1536
}
1637

1738
public static void startQueuingTimer(State state, Class<?> schedulerClass, Object task) {
39+
if (Platform.isNativeImage()) {
40+
// explicitly not supported for Graal native image
41+
return;
42+
}
1843
// avoid calling this before JFR is initialised because it will lead to reading the wrong
1944
// TSC frequency before JFR has set it up properly
2045
if (task != null && state != null && InstrumentationBasedProfiling.isJFRReady()) {
@@ -25,4 +50,14 @@ public static void startQueuingTimer(State state, Class<?> schedulerClass, Objec
2550
state.setTiming(timing);
2651
}
2752
}
53+
54+
public static void stopQueuingTimer(Timing timing) {
55+
if (Platform.isNativeImage()) {
56+
// explicitly not supported for Graal native image
57+
return;
58+
}
59+
if (timing != null && timing.sample() && RateLimiterHolder.RATE_LIMITER.permit()) {
60+
timing.report();
61+
}
62+
}
2863
}

dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/java/concurrent/State.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ public boolean isTimed() {
8585
public void stopTiming() {
8686
Timing timing = TIMING.getAndSet(this, null);
8787
if (timing != null) {
88-
timing.close();
88+
QueueTimerHelper.stopQueuingTimer(timing);
8989
}
9090
}
9191
}

dd-java-agent/agent-bootstrap/src/main/java11/datadog/trace/bootstrap/instrumentation/jfr/WindowSampler.java

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import datadog.trace.api.sampling.AdaptiveSampler;
44
import java.time.Duration;
5-
import java.time.temporal.ChronoUnit;
65
import jdk.jfr.Event;
76
import jdk.jfr.EventType;
87

@@ -24,18 +23,4 @@ public void start() {
2423
public boolean sample() {
2524
return sampleType.isEnabled() && sampler.sample();
2625
}
27-
28-
protected static int samplingWindowsPerRecording(
29-
long uploadPeriodSeconds, Duration samplingWindow) {
30-
/*
31-
* Java8 doesn't have dividedBy#Duration so we have to implement poor man's version.
32-
* None of these durations should be big enough to warrant dealing with bigints.
33-
* We also do not care about nanoseconds here.
34-
*/
35-
return (int)
36-
Math.min(
37-
Duration.of(uploadPeriodSeconds, ChronoUnit.SECONDS).toMillis()
38-
/ samplingWindow.toMillis(),
39-
Integer.MAX_VALUE);
40-
}
4126
}

dd-java-agent/agent-bootstrap/src/main/java11/datadog/trace/bootstrap/instrumentation/jfr/backpressure/BackpressureSampler.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package datadog.trace.bootstrap.instrumentation.jfr.backpressure;
22

3+
import static datadog.trace.api.sampling.PerRecordingRateLimiter.samplingWindowsPerRecording;
4+
35
import datadog.trace.api.Config;
46
import datadog.trace.bootstrap.instrumentation.jfr.WindowSampler;
57
import java.time.Duration;

dd-java-agent/agent-bootstrap/src/main/java11/datadog/trace/bootstrap/instrumentation/jfr/directallocation/DirectAllocationSampler.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package datadog.trace.bootstrap.instrumentation.jfr.directallocation;
22

3+
import static datadog.trace.api.sampling.PerRecordingRateLimiter.samplingWindowsPerRecording;
4+
35
import datadog.trace.api.Config;
46
import datadog.trace.bootstrap.instrumentation.jfr.WindowSampler;
57
import java.time.Duration;

dd-java-agent/agent-bootstrap/src/main/java11/datadog/trace/bootstrap/instrumentation/jfr/exceptions/ExceptionSampler.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package datadog.trace.bootstrap.instrumentation.jfr.exceptions;
22

3+
import static datadog.trace.api.sampling.PerRecordingRateLimiter.samplingWindowsPerRecording;
4+
35
import datadog.trace.api.Config;
46
import datadog.trace.bootstrap.instrumentation.jfr.WindowSampler;
57
import java.time.Duration;

dd-java-agent/agent-bootstrap/src/test/groovy/datadog/trace/bootstrap/instrumentation/decorator/HttpClientDecoratorTest.groovy

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package datadog.trace.bootstrap.instrumentation.decorator
22

33
import datadog.trace.api.DDTags
4+
import datadog.trace.api.iast.InstrumentationBridge
5+
import datadog.trace.api.iast.sink.SsrfModule
46
import datadog.trace.bootstrap.instrumentation.api.AgentSpan
57
import datadog.trace.bootstrap.instrumentation.api.AgentTracer
68
import datadog.trace.bootstrap.instrumentation.api.ResourceNamePriorities
@@ -29,6 +31,8 @@ class HttpClientDecoratorTest extends ClientDecoratorTest {
2931
if (req) {
3032
1 * span.setTag(Tags.HTTP_METHOD, req.method)
3133
1 * span.setTag(Tags.HTTP_URL, {it.toString() == "$req.url"})
34+
1 * span.setTag(DDTags.HTTP_QUERY, null)
35+
1 * span.setTag(DDTags.HTTP_FRAGMENT, null)
3236
1 * span.setTag(Tags.PEER_HOSTNAME, req.url.host)
3337
1 * span.setTag(Tags.PEER_PORT, req.url.port)
3438
1 * span.setResourceName({ it as String == req.method.toUpperCase() + " " + req.path }, ResourceNamePriorities.HTTP_PATH_NORMALIZER)
@@ -169,6 +173,32 @@ class HttpClientDecoratorTest extends ClientDecoratorTest {
169173
null | null | false
170174
}
171175

176+
def "test ssrfIastCheck is called"() {
177+
setup:
178+
injectSysConfig('dd.iast.enabled', input)
179+
def decorator = newDecorator()
180+
final module = Mock(SsrfModule)
181+
InstrumentationBridge.registerIastModule(module)
182+
183+
when:
184+
decorator.onRequest(span, req)
185+
186+
then:
187+
if (input == 'true') {
188+
1 * module.onURLConnection(_)
189+
} else {
190+
0 * module.onURLConnection(_)
191+
}
192+
if (req) {
193+
1 * span.traceConfig() >> AgentTracer.traceConfig()
194+
}
195+
196+
where:
197+
input | req
198+
'true' | [method: "test-method", url: testUrl, path: '/somepath']
199+
'false' | [method: "test-method", url: testUrl, path: '/somepath']
200+
}
201+
172202
@Override
173203
def newDecorator(String serviceName = "test-service") {
174204
return new HttpClientDecorator<Map, Map>() {
@@ -197,6 +227,11 @@ class HttpClientDecoratorTest extends ClientDecoratorTest {
197227
return m.url
198228
}
199229

230+
@Override
231+
protected String sourceUrl(Map m) {
232+
return m.url
233+
}
234+
200235
@Override
201236
protected int status(Map m) {
202237
null == m.status ? 0 : m.status.intValue()

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -160,11 +160,13 @@ public SkippableTests getSkippableTests(TracerEnvironment tracerEnvironment) thr
160160
telemetryListener,
161161
false);
162162

163+
Configurations requestConf = tracerEnvironment.getConfigurations();
164+
163165
Map<String, Map<TestIdentifier, TestMetadata>> testIdentifiersByModule = new HashMap<>();
164166
for (DataDto<TestIdentifierJson> dataDto : response.data) {
165167
TestIdentifierJson testIdentifierJson = dataDto.getAttributes();
166-
Configurations configurations = testIdentifierJson.getConfigurations();
167-
String moduleName = configurations.getTestBundle();
168+
Configurations conf = testIdentifierJson.getConfigurations();
169+
String moduleName = (conf != null ? conf : requestConf).getTestBundle();
168170
testIdentifiersByModule
169171
.computeIfAbsent(moduleName, k -> new HashMap<>())
170172
.put(testIdentifierJson.toTestIdentifier(), testIdentifierJson.toTestMetadata());

0 commit comments

Comments
 (0)