Skip to content

Commit cee50de

Browse files
committed
Experimental support for CRaC (Coordinated Restore at Checkpoint) - not for merging
1 parent fd1f40f commit cee50de

File tree

8 files changed

+94
-5
lines changed

8 files changed

+94
-5
lines changed

dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/TracerInstaller.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public static synchronized void installGlobalTracer(
2424
.pollForTracerFlareRequests()
2525
.pollForTracingConfiguration()
2626
.build();
27-
installGlobalTracer(tracer);
27+
forceInstallGlobalTracer(tracer);
2828
} else {
2929
log.debug("GlobalTracer already registered.");
3030
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
muzzle {
2+
pass {
3+
group = "org.crac"
4+
module = "crac"
5+
versions = "[1.3,)"
6+
}
7+
}
8+
9+
apply from: "$rootDir/gradle/java.gradle"
10+
11+
dependencies {
12+
compileOnly group: 'org.crac', name: 'crac', version: '1.3.0'
13+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package trace.instrumentation.crac;
2+
3+
import static net.bytebuddy.matcher.ElementMatchers.isTypeInitializer;
4+
5+
import com.google.auto.service.AutoService;
6+
import datadog.trace.agent.tooling.Instrumenter;
7+
import datadog.trace.agent.tooling.InstrumenterModule;
8+
import datadog.trace.api.Platform;
9+
import net.bytebuddy.asm.Advice;
10+
import org.crac.Core;
11+
12+
@AutoService(InstrumenterModule.class)
13+
public final class CracRuntimeInstrumentation extends InstrumenterModule.Tracing
14+
implements Instrumenter.ForSingleType {
15+
16+
public CracRuntimeInstrumentation() {
17+
super("crac");
18+
}
19+
20+
@Override
21+
protected boolean defaultEnabled() {
22+
return !Platform.isNativeImageBuilder();
23+
}
24+
25+
@Override
26+
public String instrumentedType() {
27+
return "org.crac.Core";
28+
}
29+
30+
@Override
31+
public String[] helperClassNames() {
32+
return new String[] {packageName + ".TracerResource"};
33+
}
34+
35+
@Override
36+
public void methodAdvice(Instrumenter.MethodTransformer transformer) {
37+
transformer.applyAdvice(
38+
isTypeInitializer(), CracRuntimeInstrumentation.class.getName() + "$TracerResourceAdvice");
39+
}
40+
41+
public static class TracerResourceAdvice {
42+
@Advice.OnMethodExit(suppress = Throwable.class)
43+
public static void onExit() {
44+
Core.getGlobalContext().register(new TracerResource());
45+
}
46+
}
47+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package trace.instrumentation.crac;
2+
3+
import datadog.trace.api.GlobalTracer;
4+
import datadog.trace.bootstrap.instrumentation.api.AgentTracer;
5+
import org.crac.Context;
6+
import org.crac.Resource;
7+
8+
public final class TracerResource implements Resource {
9+
10+
@Override
11+
public void beforeCheckpoint(Context<? extends Resource> context) {
12+
((AgentTracer.TracerAPI) GlobalTracer.get()).pause();
13+
}
14+
15+
@Override
16+
public void afterRestore(Context<? extends Resource> context) {}
17+
}

dd-trace-core/src/main/java/datadog/trace/core/CoreTracer.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,8 @@ public static CoreTracerBuilder builder() {
152152
/** Nanosecond offset to counter clock drift */
153153
private volatile long counterDrift;
154154

155+
private final SharedCommunicationObjects sco;
156+
155157
private final TracerFlarePoller tracerFlarePoller;
156158

157159
private final TracingConfigPoller tracingConfigPoller;
@@ -652,6 +654,7 @@ private CoreTracer(
652654
}
653655
sharedCommunicationObjects.monitoring = monitoring;
654656
sharedCommunicationObjects.createRemaining(config);
657+
sco = sharedCommunicationObjects;
655658

656659
tracerFlarePoller = new TracerFlarePoller(dynamicConfig);
657660
if (pollForTracerFlareRequests) {
@@ -1148,6 +1151,11 @@ public void close() {
11481151
tracerFlarePoller.stop();
11491152
}
11501153

1154+
@Override
1155+
public void pause() {
1156+
sco.okHttpClient.connectionPool().evictAll();
1157+
}
1158+
11511159
@Override
11521160
public void addScopeListener(
11531161
Runnable afterScopeActivatedCallback, Runnable afterScopeClosedCallback) {

internal-api/src/main/java/datadog/trace/api/Config.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -993,7 +993,7 @@ private Config(final ConfigProvider configProvider, final InstrumenterConfig ins
993993
statsDClientSocketBuffer = configProvider.getInteger(STATSD_CLIENT_SOCKET_BUFFER);
994994
statsDClientSocketTimeout = configProvider.getInteger(STATSD_CLIENT_SOCKET_TIMEOUT);
995995

996-
runtimeMetricsEnabled = configProvider.getBoolean(RUNTIME_METRICS_ENABLED, true);
996+
runtimeMetricsEnabled = configProvider.getBoolean(RUNTIME_METRICS_ENABLED, false);
997997

998998
jmxFetchEnabled =
999999
runtimeMetricsEnabled
@@ -1231,9 +1231,7 @@ PROFILING_DATADOG_PROFILER_ENABLED, isDatadogProfilerSafeInCurrentEnvironment())
12311231
TELEMETRY_LOG_COLLECTION_ENABLED, DEFAULT_TELEMETRY_LOG_COLLECTION_ENABLED);
12321232

12331233
isTelemetryDependencyServiceEnabled =
1234-
configProvider.getBoolean(
1235-
TELEMETRY_DEPENDENCY_COLLECTION_ENABLED,
1236-
DEFAULT_TELEMETRY_DEPENDENCY_COLLECTION_ENABLED);
1234+
configProvider.getBoolean(TELEMETRY_DEPENDENCY_COLLECTION_ENABLED, false);
12371235
telemetryDependencyResolutionQueueSize =
12381236
configProvider.getInteger(
12391237
TELEMETRY_DEPENDENCY_RESOLUTION_QUEUE_SIZE,

internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentTracer.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,8 @@ default SpanBuilder buildSpan(CharSequence spanName) {
256256

257257
void close();
258258

259+
void pause();
260+
259261
/**
260262
* Attach a scope listener to the global scope manager
261263
*
@@ -412,6 +414,9 @@ public SpanBuilder buildSpan(final String instrumentationName, final CharSequenc
412414
@Override
413415
public void close() {}
414416

417+
@Override
418+
public void pause() {}
419+
415420
@Override
416421
public void addScopeListener(
417422
Runnable afterScopeActivatedCallback, Runnable afterScopeClosedCallback) {}

settings.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,7 @@ include ':dd-java-agent:instrumentation:couchbase:couchbase-2.0'
218218
include ':dd-java-agent:instrumentation:couchbase:couchbase-2.6'
219219
include ':dd-java-agent:instrumentation:couchbase:couchbase-3.1'
220220
include ':dd-java-agent:instrumentation:couchbase:couchbase-3.2'
221+
include ':dd-java-agent:instrumentation:crac'
221222
include ':dd-java-agent:instrumentation:cucumber'
222223
include ':dd-java-agent:instrumentation:cxf-2.1'
223224
include ':dd-java-agent:instrumentation:datanucleus-4'

0 commit comments

Comments
 (0)