Skip to content

Commit e77a9d3

Browse files
committed
WIP
1 parent 143e071 commit e77a9d3

File tree

8 files changed

+68
-89
lines changed

8 files changed

+68
-89
lines changed

dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/DebuggerTransformer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,7 @@ public byte[] transform(
245245

246246
private boolean skipInstrumentation(ClassLoader loader, String classFilePath) {
247247
if (definitionMatcher.isEmpty()) {
248-
log.warn("No debugger definitions present.");
248+
log.debug("No debugger definitions present.");
249249
return true;
250250
}
251251
if (classFilePath == null) {

dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/instrumentation/MethodInfo.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,4 +58,9 @@ public String getSourceFileName() {
5858
public String getTypeName() {
5959
return Strings.getClassName(classNode.name);
6060
}
61+
62+
@Override
63+
public String toString() {
64+
return "MethodInfo{" + "classNode=" + classNode.name + ", methodNode=" + methodNode.desc + '}';
65+
}
6166
}

dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/probe/CodeOriginProbe.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,4 +89,11 @@ public void buildLocation(MethodInfo methodInfo) {
8989
}
9090
this.location = new ProbeLocation(type, method, file, lines);
9191
}
92+
93+
@Override
94+
public String toString() {
95+
return String.format(
96+
"CodeOriginProbe{probeId=%s, entrySpanProbe=%s, signature=%s, location=%s}",
97+
probeId, entrySpanProbe, signature, location);
98+
}
9299
}

dd-java-agent/instrumentation/grpc-1.5/src/test/groovy/GrpcCodeOriginTest.groovy

Lines changed: 1 addition & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import datadog.trace.bootstrap.debugger.DebuggerContext.CodeOriginRecorder
21
import com.google.common.util.concurrent.MoreExecutors
32
import datadog.trace.agent.test.naming.VersionedNamingTestBase
43
import datadog.trace.api.DDSpanTypes
@@ -13,17 +12,13 @@ import io.grpc.inprocess.InProcessChannelBuilder
1312
import io.grpc.inprocess.InProcessServerBuilder
1413
import io.grpc.stub.StreamObserver
1514

16-
import java.lang.reflect.Method
1715
import java.util.concurrent.CopyOnWriteArrayList
1816
import java.util.concurrent.Executors
1917
import java.util.concurrent.TimeUnit
2018
import java.util.concurrent.atomic.AtomicReference
2119

22-
import static datadog.trace.api.config.TraceInstrumentationConfig.*
2320

2421
abstract class GrpcCodeOriginTest extends VersionedNamingTestBase {
25-
def codeOriginRecorder
26-
2722
@Override
2823
final String service() {
2924
return null
@@ -155,8 +150,7 @@ abstract class GrpcCodeOriginTest extends VersionedNamingTestBase {
155150
}
156151
}.flatten().sort()
157152

158-
159-
assert codeOriginRecorder.invoked
153+
assert DebuggerContext.codeOriginRecorder != null
160154
assertTraces(2) {
161155
trace((hasClientMessageSpans() ? clientMessageCount * serverMessageCount : 0) + 1) {
162156
span {
@@ -247,26 +241,6 @@ abstract class GrpcCodeOriginTest extends VersionedNamingTestBase {
247241
clientRange = 1..clientMessageCount
248242
serverRange = 1..serverMessageCount
249243
}
250-
251-
252-
void codeOriginSetup() {
253-
injectSysConfig(CODE_ORIGIN_FOR_SPANS_ENABLED, "true", true)
254-
codeOriginRecorder = new CodeOriginRecorder() {
255-
def invoked = false
256-
@Override
257-
String captureCodeOrigin(boolean entry) {
258-
invoked = true
259-
return "done"
260-
}
261-
262-
@Override
263-
String captureCodeOrigin(Method method, boolean entry) {
264-
invoked = true
265-
return "done"
266-
}
267-
}
268-
DebuggerContext.initCodeOrigin(codeOriginRecorder)
269-
}
270244
}
271245

272246
class GrpcCodeOriginForkedTest extends GrpcCodeOriginTest {

dd-java-agent/instrumentation/kafka-clients-3.8/src/test/groovy/KafkaClientTestBase.groovy

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ abstract class KafkaClientTestBase extends VersionedNamingTestBase {
6666
super.configurePreAgent()
6767

6868
injectSysConfig("dd.kafka.e2e.duration.enabled", "true")
69+
codeOriginSetup()
6970
}
7071

7172
public static final LinkedHashMap<String, String> PRODUCER_PATHWAY_EDGE_TAGS
@@ -152,7 +153,7 @@ abstract class KafkaClientTestBase extends VersionedNamingTestBase {
152153
}
153154

154155
@Flaky
155-
public def "test kafka produce and consume"() {
156+
def "test kafka produce and consume"() {
156157
setup:
157158
// Create and start a Kafka container using Testcontainers
158159
KafkaContainer kafkaContainer = new KafkaContainer(DockerImageName.parse("confluentinc/cp-kafka:latest")).withEmbeddedZookeeper().withEnv("KAFKA_CREATE_TOPICS", SHARED_TOPIC)

dd-java-agent/instrumentation/kafka-clients-3.8/src/test/groovy/KafkaCodeOriginForkedTest.groovy

Lines changed: 0 additions & 44 deletions
This file was deleted.

dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/AgentTestRunner.groovy

Lines changed: 33 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,10 @@ import datadog.trace.bootstrap.ActiveSubsystems
4040
import datadog.trace.bootstrap.CallDepthThreadLocalMap
4141
import datadog.trace.bootstrap.InstrumentationErrors
4242
import datadog.trace.bootstrap.debugger.DebuggerContext
43+
import datadog.trace.bootstrap.debugger.ProbeImplementation
4344
import datadog.trace.bootstrap.instrumentation.api.AgentDataStreamsMonitoring
4445
import datadog.trace.bootstrap.instrumentation.api.AgentSpan
46+
import datadog.trace.bootstrap.instrumentation.api.AgentTracer
4547
import datadog.trace.bootstrap.instrumentation.api.AgentTracer.TracerAPI
4648
import datadog.trace.common.metrics.EventListener
4749
import datadog.trace.common.metrics.Sink
@@ -53,6 +55,7 @@ import datadog.trace.core.DDSpan
5355
import datadog.trace.core.PendingTrace
5456
import datadog.trace.core.datastreams.DefaultDataStreamsMonitoring
5557
import datadog.trace.test.util.DDSpecification
58+
import datadog.trace.util.AgentTaskScheduler
5659
import datadog.trace.util.Strings
5760
import de.thetaphi.forbiddenapis.SuppressForbidden
5861
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings
@@ -83,8 +86,11 @@ import static datadog.communication.http.OkHttpUtils.buildHttpClient
8386
import static datadog.trace.api.ConfigDefaults.DEFAULT_AGENT_HOST
8487
import static datadog.trace.api.ConfigDefaults.DEFAULT_AGENT_TIMEOUT
8588
import static datadog.trace.api.ConfigDefaults.DEFAULT_TRACE_AGENT_PORT
89+
import static datadog.trace.api.config.DebuggerConfig.DEBUGGER_ENABLED
90+
import static datadog.trace.api.config.DebuggerConfig.DEBUGGER_VERIFY_BYTECODE
8691
import static datadog.trace.api.config.TraceInstrumentationConfig.CODE_ORIGIN_FOR_SPANS_ENABLED
8792
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.closePrevious
93+
import static datadog.trace.util.AgentThreadFactory.AgentThread.TASK_SCHEDULER
8894
import static org.mockito.Mockito.mock
8995
import static org.mockito.Mockito.when
9096

@@ -303,37 +309,48 @@ abstract class AgentTestRunner extends DDSpecification implements AgentBuilder.L
303309
((Logger) LoggerFactory.getLogger("org.testcontainers")).setLevel(Level.DEBUG)
304310
}
305311

306-
void codeOriginSetup() {
312+
def codeOriginSetup() {
307313
injectSysConfig(CODE_ORIGIN_FOR_SPANS_ENABLED, "true", true)
314+
injectSysConfig(DEBUGGER_ENABLED, "false", true)
315+
injectSysConfig(DEBUGGER_VERIFY_BYTECODE, "false", true)
308316

309317
def configuration = Configuration.builder()
310-
.setService("grpc code origin test")
318+
.setService("code origin test")
311319
.build()
312320

313-
def config = mock(Config.class)
314-
when(config.isDebuggerEnabled()).thenReturn(true)
315-
when(config.isDebuggerClassFileDumpEnabled()).thenReturn(true)
316-
when(config.isDebuggerVerifyByteCode()).thenReturn(false)
317-
when(config.getFinalDebuggerSnapshotUrl())
318-
.thenReturn("http://localhost:8126/debugger/v1/input")
319-
when(config.getFinalDebuggerSymDBUrl()).thenReturn("http://localhost:8126/symdb/v1/input")
320-
when(config.getDebuggerCodeOriginMaxUserFrames()).thenReturn(8)
321+
rebuildConfig()
321322

323+
def config = Config.get()
322324
def probeStatusSink = mock(ProbeStatusSink.class)
323325

324326
def sink = new DebuggerSink(config, probeStatusSink)
325-
def configurationUpdater = new ConfigurationUpdater(INSTRUMENTATION, DebuggerTransformer::new, config, sink, new ClassesToRetransformFinder())
327+
ConfigurationUpdater configurationUpdater = new ConfigurationUpdater(INSTRUMENTATION, DebuggerTransformer::new, config, sink,
328+
new ClassesToRetransformFinder()) {
329+
@Override
330+
ProbeImplementation resolve(String encodedProbeId) {
331+
AgentSpan span = AgentTracer.activeSpan()
332+
if (span != null) {
333+
span.setTag("code origin span", true)
334+
}
326335

327-
def currentTransformer = new DebuggerTransformer(config, configuration, {
328-
ProbeDefinition definition, InstrumentationResult result ->
329-
}, sink)
330-
INSTRUMENTATION.addTransformer(currentTransformer)
336+
return super.resolve(encodedProbeId)
337+
}
338+
}
331339

340+
INSTRUMENTATION.addTransformer(new DebuggerTransformer(config, configuration, {
341+
ProbeDefinition definition, InstrumentationResult result ->
342+
}, sink))
332343
DebuggerContext.initProbeResolver(configurationUpdater)
333344
DebuggerContext.initClassFilter(new DenyListHelper(null))
334345
DebuggerContext.initValueSerializer(new JsonSnapshotSerializer())
335346

336-
DebuggerContext.initCodeOrigin(new DefaultCodeOriginRecorder(config, configurationUpdater))
347+
348+
DebuggerContext.initCodeOrigin(new DefaultCodeOriginRecorder(config, configurationUpdater, new AgentTaskScheduler(TASK_SCHEDULER) {
349+
@Override
350+
void execute(Runnable target) {
351+
target.run()
352+
}
353+
}))
337354
}
338355

339356
@SuppressForbidden

dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/asserts/TagsAssert.groovy

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ import groovy.transform.stc.SimpleType
1313

1414
import java.util.regex.Pattern
1515

16+
import static datadog.trace.api.DDTags.DD_CODE_ORIGIN_FRAME
17+
import static java.lang.String.format
18+
1619
class TagsAssert {
1720
private final long spanParentId
1821
private final Map<String, Object> tags
@@ -73,10 +76,26 @@ class TagsAssert {
7376
assertedTags.add(DDTags.DSM_ENABLED)
7477
assertedTags.add(DDTags.DJM_ENABLED)
7578
assertedTags.add(DDTags.PARENT_ID)
79+
assertedTags.add(DDTags.DD_CODE_ORIGIN_TYPE)
80+
assertedTags.add(format(DD_CODE_ORIGIN_FRAME, 0, "file"))
81+
assertedTags.add(format(DD_CODE_ORIGIN_FRAME, 0, "method"))
82+
assertedTags.add(format(DD_CODE_ORIGIN_FRAME, 0, "line"))
83+
assertedTags.add(format(DD_CODE_ORIGIN_FRAME, 0, "type"))
84+
assertedTags.add(format(DD_CODE_ORIGIN_FRAME, 0, "signature"))
85+
assertedTags.add("code origin span")
7686

7787
assert tags["thread.name"] != null
7888
assert tags["thread.id"] != null
7989

90+
if ( tags["code origin span"] != null) {
91+
assert tags[DDTags.DD_CODE_ORIGIN_TYPE] != null
92+
assert tags[format(DD_CODE_ORIGIN_FRAME, 0, "file")] != null
93+
assert tags[format(DD_CODE_ORIGIN_FRAME, 0, "method")] != null
94+
assert tags[format(DD_CODE_ORIGIN_FRAME, 0, "line")] != null
95+
assert tags[format(DD_CODE_ORIGIN_FRAME, 0, "type")] != null
96+
assert tags[format(DD_CODE_ORIGIN_FRAME, 0, "signature")] != null
97+
}
98+
8099
// FIXME: DQH - Too much conditional logic? Maybe create specialized methods for client & server cases
81100

82101
boolean isRoot = (DDSpanId.ZERO == spanParentId)

0 commit comments

Comments
 (0)