Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support graphql 22 #7176

Merged
merged 1 commit into from
Jun 14, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions dd-java-agent/instrumentation/graphql-java/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
apply from: "$rootDir/gradle/java.gradle"
Original file line number Diff line number Diff line change
@@ -1,27 +1,25 @@

muzzle {
pass {
group = "com.graphql-java"
module = 'graphql-java'
versions = '[14.0,21)'
versions = '[14.0,20)'
assertInverse = true
skipVersions = ['230521-nf-execution', 'vTEST']
// earlier versions are missing some classes and will require separate instrumentation
}
fail {
group = "com.graphql-java"
module = 'graphql-java'
versions = '[1.2,14.0)'
}
}

apply from: "$rootDir/gradle/java.gradle"

addTestSuiteForDir('latestDepTest', 'test')
addTestSuiteExtendingForDir('latestDepForkedTest', 'latestDepTest', 'test')

dependencies {
compileOnly group: 'com.graphql-java', name: 'graphql-java', version: '14.0'
testImplementation group: 'com.graphql-java', name: 'graphql-java', version: '14.0'
implementation project(':dd-java-agent:instrumentation:graphql-java:graphql-java-common')

testImplementation group: 'com.graphql-java', name: 'graphql-java', version: '14.0'
testImplementation project(':dd-java-agent:instrumentation:trace-annotation')

latestDepTestImplementation group: 'com.graphql-java', name: 'graphql-java', version: '[19+,21)'
latestDepTestImplementation group: 'com.graphql-java', name: 'graphql-java', version: '19.+'
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package datadog.trace.instrumentation.graphqljava;
package datadog.trace.instrumentation.graphqljava14;

import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.startSpan;
import static datadog.trace.instrumentation.graphqljava.GraphQLDecorator.DECORATE;
Expand All @@ -7,11 +7,15 @@
import static datadog.trace.instrumentation.graphqljava.GraphQLDecorator.GRAPHQL_VALIDATION;

import datadog.trace.bootstrap.instrumentation.api.AgentSpan;
import datadog.trace.instrumentation.graphqljava.ExecutionInstrumentationContext;
import datadog.trace.instrumentation.graphqljava.InstrumentedDataFetcher;
import datadog.trace.instrumentation.graphqljava.ParsingInstrumentationContext;
import datadog.trace.instrumentation.graphqljava.State;
import datadog.trace.instrumentation.graphqljava.ValidationInstrumentationContext;
import graphql.ExecutionResult;
import graphql.execution.instrumentation.ChainedInstrumentation;
import graphql.execution.instrumentation.Instrumentation;
import graphql.execution.instrumentation.InstrumentationContext;
import graphql.execution.instrumentation.InstrumentationState;
import graphql.execution.instrumentation.SimpleInstrumentation;
import graphql.execution.instrumentation.SimpleInstrumentationContext;
import graphql.execution.instrumentation.parameters.InstrumentationExecuteOperationParameters;
Expand Down Expand Up @@ -49,27 +53,6 @@ public static Instrumentation install(Instrumentation instrumentation) {
return new ChainedInstrumentation(instrumentationList);
}

public static final class State implements InstrumentationState {
private AgentSpan requestSpan;
private String query;

public AgentSpan getRequestSpan() {
return requestSpan;
}

public void setRequestSpan(AgentSpan requestSpan) {
this.requestSpan = requestSpan;
}

public String getQuery() {
return query;
}

public void setQuery(String query) {
this.query = query;
}
}

@Override
public State createState() {
return new State();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
package datadog.trace.instrumentation.graphqljava14;

import static datadog.trace.agent.tooling.bytebuddy.matcher.ClassLoaderMatchers.hasClassNamed;
import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named;
import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.namedOneOf;
import static net.bytebuddy.matcher.ElementMatchers.isMethod;
import static net.bytebuddy.matcher.ElementMatchers.not;
import static net.bytebuddy.matcher.ElementMatchers.returns;

import com.google.auto.service.AutoService;
import datadog.trace.agent.tooling.Instrumenter;
import datadog.trace.agent.tooling.InstrumenterModule;
import graphql.execution.ValueUnboxer;
import graphql.execution.instrumentation.Instrumentation;
import net.bytebuddy.asm.Advice;
import net.bytebuddy.matcher.ElementMatcher;

@AutoService(InstrumenterModule.class)
public class GraphQLJavaInstrumentation extends InstrumenterModule.Tracing
implements Instrumenter.ForSingleType {

public GraphQLJavaInstrumentation() {
super("graphql-java");
}

@Override
public String instrumentedType() {
return "graphql.GraphQL";
}

@Override
public String[] helperClassNames() {
return new String[] {
"datadog.trace.instrumentation.graphqljava.GraphQLDecorator",
"datadog.trace.instrumentation.graphqljava.ParsingInstrumentationContext",
"datadog.trace.instrumentation.graphqljava.ExecutionInstrumentationContext",
"datadog.trace.instrumentation.graphqljava.ValidationInstrumentationContext",
"datadog.trace.instrumentation.graphqljava.State",
packageName + ".GraphQLInstrumentation",
"datadog.trace.instrumentation.graphqljava.GraphQLQuerySanitizer",
"datadog.trace.instrumentation.graphqljava.InstrumentedDataFetcher"
};
}

@Override
public ElementMatcher.Junction<ClassLoader> classLoaderMatcher() {
// introduced in 20.0
return not(hasClassNamed("graphql.execution.instrumentation.SimplePerformantInstrumentation"));
}

@Override
public void methodAdvice(MethodTransformer transformer) {
transformer.applyAdvice(
isMethod()
.and(
namedOneOf(
"checkInstrumentationDefaultState" // 9.7+
// https://github.com/graphql-java/graphql-java/commit/821241de8ee055d6d254a9d95ef5143f9e540826
// "checkInstrumentation" // <9.7
// https://github.com/graphql-java/graphql-java/commit/78a6e4eda1c13f47573adb879ae781cce794e96a
))
.and(returns(named("graphql.execution.instrumentation.Instrumentation"))),
this.getClass().getName() + "$AddInstrumentationAdvice");
}

@SuppressWarnings("unused")
public static class AddInstrumentationAdvice {
@Advice.OnMethodExit(suppress = Throwable.class)
public static void onExit(@Advice.Return(readOnly = false) Instrumentation instrumentation) {
instrumentation = GraphQLInstrumentation.install(instrumentation);
}

public static void muzzleCheck() {
// Class introduced in 15.0
ValueUnboxer value = ValueUnboxer.DEFAULT;
}
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import datadog.trace.agent.test.AgentTestRunner
import datadog.trace.instrumentation.graphqljava.GraphQLInstrumentation
import datadog.trace.instrumentation.graphqljava14.GraphQLInstrumentation
import graphql.execution.instrumentation.ChainedInstrumentation
import graphql.execution.instrumentation.SimpleInstrumentation

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -541,7 +541,7 @@ abstract class GraphQLTest extends VersionedNamingTestBase {
}

@Flaky
class GraphQLV0ForkedTest extends GraphQLTest {
class GraphQLV0Test extends GraphQLTest {

@Override
int version() {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
ext {
latestDepTestMinJavaVersionForTests = JavaVersion.VERSION_11
latestDepForkedTestMinJavaVersionForTests = JavaVersion.VERSION_11
}
// there are a lot of invalid version using dates (i.e. com.graphql-java-graphql-java-2018-06-04T04-23-07)
// so we limit by chunks
muzzle {
pass {
group = "com.graphql-java"
module = 'graphql-java'
versions = '[20.0, 21.0)'
}
}
muzzle {
pass {
group = "com.graphql-java"
module = 'graphql-java'
versions = '[21.0, 22.0)'
javaVersion = '11'
}
}
muzzle {
pass {
group = "com.graphql-java"
module = 'graphql-java'
versions = '[22.0, 23.0)'
javaVersion = '11'
}
}

apply from: "$rootDir/gradle/java.gradle"

addTestSuiteForDir('latestDepTest', 'test')
addTestSuiteExtendingForDir('latestDepForkedTest', 'latestDepTest', 'test')

dependencies {
compileOnly group: 'com.graphql-java', name: 'graphql-java', version: '20.0'
implementation project(':dd-java-agent:instrumentation:graphql-java:graphql-java-common')

testImplementation group: 'com.graphql-java', name: 'graphql-java', version: '20.0'
// to test collisions with other instrumentation
testRuntimeOnly project(':dd-java-agent:instrumentation:graphql-java:graphql-java-14.0')
testImplementation project(':dd-java-agent:instrumentation:trace-annotation')

latestDepTestImplementation group: 'com.graphql-java', name: 'graphql-java', version: '20+,23)'

[compileLatestDepTestJava, compileLatestDepForkedTestGroovy].each {
it.configure {
setJavaVersion(it, 11)
}
}
}
Loading
Loading