Skip to content

Commit 116c7d8

Browse files
no queue time on graal native image - requires too much build time initialisation to support rate limiting
1 parent 58474f8 commit 116c7d8

File tree

2 files changed

+19
-14
lines changed

2 files changed

+19
-14
lines changed

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

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package datadog.trace.bootstrap.instrumentation.java.concurrent;
22

3+
import datadog.trace.api.Platform;
34
import datadog.trace.api.config.ProfilingConfig;
45
import datadog.trace.api.profiling.QueueTiming;
56
import datadog.trace.api.profiling.Timer;
@@ -13,15 +14,19 @@
1314

1415
public class QueueTimerHelper {
1516

16-
private static final PerRecordingRateLimiter RATE_LIMITER =
17-
new PerRecordingRateLimiter(
18-
Duration.of(500, ChronoUnit.MILLIS),
19-
10_000, // hard limit on queue events
20-
Duration.ofSeconds(
21-
ConfigProvider.getInstance()
22-
.getInteger(
23-
ProfilingConfig.PROFILING_UPLOAD_PERIOD,
24-
ProfilingConfig.PROFILING_UPLOAD_PERIOD_DEFAULT)));
17+
private static final class RateLimiterHolder {
18+
// indirection to prevent needing to instantiate the class and its transitive dependencies
19+
// in graal native image
20+
private static final PerRecordingRateLimiter RATE_LIMITER =
21+
new PerRecordingRateLimiter(
22+
Duration.of(500, ChronoUnit.MILLIS),
23+
10_000, // hard limit on queue events
24+
Duration.ofSeconds(
25+
ConfigProvider.getInstance()
26+
.getInteger(
27+
ProfilingConfig.PROFILING_UPLOAD_PERIOD,
28+
ProfilingConfig.PROFILING_UPLOAD_PERIOD_DEFAULT)));
29+
}
2530

2631
public static <T> void startQueuingTimer(
2732
ContextStore<T, State> taskContextStore, Class<?> schedulerClass, T task) {
@@ -30,12 +35,16 @@ public static <T> void startQueuingTimer(
3035
}
3136

3237
public static void startQueuingTimer(State state, Class<?> schedulerClass, Object task) {
38+
if (Platform.isNativeImageBuilder()) {
39+
// explicitly not supported for Graal native image
40+
return;
41+
}
3342
// avoid calling this before JFR is initialised because it will lead to reading the wrong
3443
// TSC frequency before JFR has set it up properly
3544
if (task != null
3645
&& state != null
3746
&& InstrumentationBasedProfiling.isJFRReady()
38-
&& RATE_LIMITER.permit()) {
47+
&& RateLimiterHolder.RATE_LIMITER.permit()) {
3948
QueueTiming timing =
4049
(QueueTiming) AgentTracer.get().getProfilingContext().start(Timer.TimerType.QUEUEING);
4150
timing.setTask(task);

dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/NativeImageGeneratorRunnerInstrumentation.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -98,10 +98,6 @@ public static void onEnter(@Advice.Argument(value = 0, readOnly = false) String[
9898
+ "datadog.trace.bootstrap.instrumentation.java.concurrent.ConcurrentState:build_time,"
9999
+ "datadog.trace.bootstrap.instrumentation.java.concurrent.ExcludeFilter:build_time,"
100100
+ "datadog.trace.bootstrap.instrumentation.java.concurrent.QueueTimeHelper:build_time,"
101-
+ "datadog.trace.api.sampling.AdaptiveSampler:build_time,"
102-
+ "datadog.trace.api.sampling.AdaptiveSampler$Counts:build_time,"
103-
+ "datadog.trace.api.sampling.AdaptiveSampler$RollWindowTask:build_time,"
104-
+ "datadog.trace.api.sampling.PerRecordingRateLimiter:build_time,"
105101
+ "datadog.trace.bootstrap.instrumentation.java.concurrent.TPEHelper:build_time,"
106102
+ "datadog.trace.bootstrap.instrumentation.jfr.exceptions.ExceptionCountEvent:build_time,"
107103
+ "datadog.trace.bootstrap.instrumentation.jfr.exceptions.ExceptionSampleEvent:build_time,"

0 commit comments

Comments
 (0)