Skip to content

Commit fffdb0b

Browse files
authored
Remove operation name from graphql span name (#13794)
1 parent e36be49 commit fffdb0b

File tree

13 files changed

+77
-18
lines changed

13 files changed

+77
-18
lines changed

instrumentation/graphql-java/README.md

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
# Settings for the GraphQL instrumentation
22

3-
| System property | Type | Default | Description |
4-
|--------------------------------------------------------|---------|---------|--------------------------------------------------------------------------------------------|
5-
| `otel.instrumentation.graphql.query-sanitizer.enabled` | Boolean | `true` | Whether to remove sensitive information from query source that is added as span attribute. |
3+
| System property | Type | Default | Description |
4+
|------------------------------------------------------------------------|---------|---------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
5+
| `otel.instrumentation.graphql.query-sanitizer.enabled` | Boolean | `true` | Whether to remove sensitive information from query source that is added as span attribute. |
6+
| `otel.instrumentation.graphql.add-operation-name-to-span-name.enabled` | Boolean | `false` | Whether GraphQL operation name is added to the span name. <p>**WARNING**: GraphQL operation name is provided by the client and can have high cardinality. Use only when the server is not exposed to malicious clients. |
67

78
# Settings for the GraphQL 20 instrumentation
89

instrumentation/graphql-java/graphql-java-12.0/javaagent/build.gradle.kts

+4
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,7 @@ dependencies {
2424

2525
latestDepTestLibrary("com.graphql-java:graphql-java:19.+") // see graphql-java-20.0 module
2626
}
27+
28+
tasks.withType<Test>().configureEach {
29+
jvmArgs("-Dotel.instrumentation.graphql.add-operation-name-to-span-name.enabled=true")
30+
}

instrumentation/graphql-java/graphql-java-12.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/graphql/v12_0/GraphqlSingletons.java

+5
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,15 @@ public final class GraphqlSingletons {
1616
private static final boolean QUERY_SANITIZATION_ENABLED =
1717
AgentInstrumentationConfig.get()
1818
.getBoolean("otel.instrumentation.graphql.query-sanitizer.enabled", true);
19+
private static final boolean ADD_OPERATION_NAME_TO_SPAN_NAME =
20+
AgentInstrumentationConfig.get()
21+
.getBoolean(
22+
"otel.instrumentation.graphql.add-operation-name-to-span-name.enabled", false);
1923

2024
private static final GraphQLTelemetry TELEMETRY =
2125
GraphQLTelemetry.builder(GlobalOpenTelemetry.get())
2226
.setSanitizeQuery(QUERY_SANITIZATION_ENABLED)
27+
.setAddOperationNameToSpanName(ADD_OPERATION_NAME_TO_SPAN_NAME)
2328
.build();
2429

2530
private GraphqlSingletons() {}

instrumentation/graphql-java/graphql-java-12.0/library/src/main/java/io/opentelemetry/instrumentation/graphql/v12_0/GraphQLTelemetry.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,11 @@ public static GraphQLTelemetryBuilder builder(OpenTelemetry openTelemetry) {
2727

2828
private final OpenTelemetryInstrumentationHelper helper;
2929

30-
GraphQLTelemetry(OpenTelemetry openTelemetry, boolean sanitizeQuery) {
30+
GraphQLTelemetry(
31+
OpenTelemetry openTelemetry, boolean sanitizeQuery, boolean addOperationNameToSpanName) {
3132
helper =
3233
OpenTelemetryInstrumentationHelper.create(
33-
openTelemetry, INSTRUMENTATION_NAME, sanitizeQuery);
34+
openTelemetry, INSTRUMENTATION_NAME, sanitizeQuery, addOperationNameToSpanName);
3435
}
3536

3637
/**

instrumentation/graphql-java/graphql-java-12.0/library/src/main/java/io/opentelemetry/instrumentation/graphql/v12_0/GraphQLTelemetryBuilder.java

+14-1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ public final class GraphQLTelemetryBuilder {
1515
private final OpenTelemetry openTelemetry;
1616

1717
private boolean sanitizeQuery = true;
18+
private boolean addOperationNameToSpanName = false;
1819

1920
GraphQLTelemetryBuilder(OpenTelemetry openTelemetry) {
2021
this.openTelemetry = openTelemetry;
@@ -27,11 +28,23 @@ public GraphQLTelemetryBuilder setSanitizeQuery(boolean sanitizeQuery) {
2728
return this;
2829
}
2930

31+
/**
32+
* Sets whether GraphQL operation name is added to the span name. Default is {@code false}.
33+
*
34+
* <p>WARNING: GraphQL operation name is provided by the client and can have high cardinality. Use
35+
* only when the server is not exposed to malicious clients.
36+
*/
37+
@CanIgnoreReturnValue
38+
public GraphQLTelemetryBuilder setAddOperationNameToSpanName(boolean addOperationNameToSpanName) {
39+
this.addOperationNameToSpanName = addOperationNameToSpanName;
40+
return this;
41+
}
42+
3043
/**
3144
* Returns a new {@link GraphQLTelemetry} with the settings of this {@link
3245
* GraphQLTelemetryBuilder}.
3346
*/
3447
public GraphQLTelemetry build() {
35-
return new GraphQLTelemetry(openTelemetry, sanitizeQuery);
48+
return new GraphQLTelemetry(openTelemetry, sanitizeQuery, addOperationNameToSpanName);
3649
}
3750
}

instrumentation/graphql-java/graphql-java-12.0/library/src/test/java/io/opentelemetry/instrumentation/graphql/v12_0/GraphqlTest.java

+4-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,10 @@ protected InstrumentationExtension getTesting() {
2323

2424
@Override
2525
protected void configure(GraphQL.Builder builder) {
26-
GraphQLTelemetry telemetry = GraphQLTelemetry.builder(testing.getOpenTelemetry()).build();
26+
GraphQLTelemetry telemetry =
27+
GraphQLTelemetry.builder(testing.getOpenTelemetry())
28+
.setAddOperationNameToSpanName(true)
29+
.build();
2730
builder.instrumentation(telemetry.newInstrumentation());
2831
}
2932
}

instrumentation/graphql-java/graphql-java-20.0/javaagent/build.gradle.kts

+1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ dependencies {
2525

2626
tasks.withType<Test>().configureEach {
2727
jvmArgs("-Dotel.instrumentation.graphql.data-fetcher.enabled=true")
28+
jvmArgs("-Dotel.instrumentation.graphql.add-operation-name-to-span-name.enabled=true")
2829
}
2930

3031
if (findProperty("testLatestDeps") as Boolean) {

instrumentation/graphql-java/graphql-java-20.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/graphql/v20_0/GraphqlSingletons.java

+5
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,17 @@ public final class GraphqlSingletons {
2222
private static final boolean TRIVIAL_DATA_FETCHER_ENABLED =
2323
AgentInstrumentationConfig.get()
2424
.getBoolean("otel.instrumentation.graphql.trivial-data-fetcher.enabled", false);
25+
private static final boolean ADD_OPERATION_NAME_TO_SPAN_NAME =
26+
AgentInstrumentationConfig.get()
27+
.getBoolean(
28+
"otel.instrumentation.graphql.add-operation-name-to-span-name.enabled", false);
2529

2630
private static final GraphQLTelemetry TELEMETRY =
2731
GraphQLTelemetry.builder(GlobalOpenTelemetry.get())
2832
.setSanitizeQuery(QUERY_SANITIZATION_ENABLED)
2933
.setDataFetcherInstrumentationEnabled(DATA_FETCHER_ENABLED)
3034
.setTrivialDataFetcherInstrumentationEnabled(TRIVIAL_DATA_FETCHER_ENABLED)
35+
.setAddOperationNameToSpanName(ADD_OPERATION_NAME_TO_SPAN_NAME)
3136
.build();
3237

3338
private GraphqlSingletons() {}

instrumentation/graphql-java/graphql-java-20.0/library/src/main/java/io/opentelemetry/instrumentation/graphql/v20_0/GraphQLTelemetry.java

+5-2
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,11 @@ public static GraphQLTelemetryBuilder builder(OpenTelemetry openTelemetry) {
3434
OpenTelemetry openTelemetry,
3535
boolean sanitizeQuery,
3636
Instrumenter<DataFetchingEnvironment, Void> dataFetcherInstrumenter,
37-
boolean createSpansForTrivialDataFetcher) {
38-
helper = GraphqlInstrumenterFactory.createInstrumentationHelper(openTelemetry, sanitizeQuery);
37+
boolean createSpansForTrivialDataFetcher,
38+
boolean addOperationNameToSpanName) {
39+
helper =
40+
GraphqlInstrumenterFactory.createInstrumentationHelper(
41+
openTelemetry, sanitizeQuery, addOperationNameToSpanName);
3942
this.dataFetcherInstrumenter = dataFetcherInstrumenter;
4043
this.createSpansForTrivialDataFetcher = createSpansForTrivialDataFetcher;
4144
}

instrumentation/graphql-java/graphql-java-20.0/library/src/main/java/io/opentelemetry/instrumentation/graphql/v20_0/GraphQLTelemetryBuilder.java

+15-3
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,9 @@ public final class GraphQLTelemetryBuilder {
1515
private final OpenTelemetry openTelemetry;
1616

1717
private boolean sanitizeQuery = true;
18-
1918
private boolean dataFetcherInstrumentationEnabled = false;
20-
2119
private boolean trivialDataFetcherInstrumentationEnabled = false;
20+
private boolean addOperationNameToSpanName = false;
2221

2322
GraphQLTelemetryBuilder(OpenTelemetry openTelemetry) {
2423
this.openTelemetry = openTelemetry;
@@ -50,6 +49,18 @@ public GraphQLTelemetryBuilder setTrivialDataFetcherInstrumentationEnabled(
5049
return this;
5150
}
5251

52+
/**
53+
* Sets whether GraphQL operation name is added to the span name. Default is {@code false}.
54+
*
55+
* <p>WARNING: GraphQL operation name is provided by the client and can have high cardinality. Use
56+
* only when the server is not exposed to malicious clients.
57+
*/
58+
@CanIgnoreReturnValue
59+
public GraphQLTelemetryBuilder setAddOperationNameToSpanName(boolean addOperationNameToSpanName) {
60+
this.addOperationNameToSpanName = addOperationNameToSpanName;
61+
return this;
62+
}
63+
5364
/**
5465
* Returns a new {@link GraphQLTelemetry} with the settings of this {@link
5566
* GraphQLTelemetryBuilder}.
@@ -60,6 +71,7 @@ public GraphQLTelemetry build() {
6071
sanitizeQuery,
6172
GraphqlInstrumenterFactory.createDataFetcherInstrumenter(
6273
openTelemetry, dataFetcherInstrumentationEnabled),
63-
trivialDataFetcherInstrumentationEnabled);
74+
trivialDataFetcherInstrumentationEnabled,
75+
addOperationNameToSpanName);
6476
}
6577
}

instrumentation/graphql-java/graphql-java-20.0/library/src/main/java/io/opentelemetry/instrumentation/graphql/v20_0/GraphqlInstrumenterFactory.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@ final class GraphqlInstrumenterFactory {
1515
private static final String INSTRUMENTATION_NAME = "io.opentelemetry.graphql-java-20.0";
1616

1717
static OpenTelemetryInstrumentationHelper createInstrumentationHelper(
18-
OpenTelemetry openTelemetry, boolean sanitizeQuery) {
18+
OpenTelemetry openTelemetry, boolean sanitizeQuery, boolean addOperationNameToSpanName) {
1919
return OpenTelemetryInstrumentationHelper.create(
20-
openTelemetry, INSTRUMENTATION_NAME, sanitizeQuery);
20+
openTelemetry, INSTRUMENTATION_NAME, sanitizeQuery, addOperationNameToSpanName);
2121
}
2222

2323
static Instrumenter<DataFetchingEnvironment, Void> createDataFetcherInstrumenter(

instrumentation/graphql-java/graphql-java-20.0/library/src/test/java/io/opentelemetry/instrumentation/graphql/v20_0/GraphqlTest.java

+4
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ protected void configure(GraphQL.Builder builder) {
4141
GraphQLTelemetry telemetry =
4242
GraphQLTelemetry.builder(testing.getOpenTelemetry())
4343
.setDataFetcherInstrumentationEnabled(true)
44+
.setAddOperationNameToSpanName(true)
4445
.build();
4546
builder.instrumentation(telemetry.newInstrumentation());
4647
}
@@ -56,6 +57,7 @@ void createSpansForDataFetchers() {
5657
GraphQLTelemetry telemetry =
5758
GraphQLTelemetry.builder(testing.getOpenTelemetry())
5859
.setDataFetcherInstrumentationEnabled(true)
60+
.setAddOperationNameToSpanName(true)
5961
.build();
6062

6163
GraphQL graphql =
@@ -118,6 +120,7 @@ void createSpanForTrivialDataFetchers() {
118120
GraphQLTelemetry.builder(testing.getOpenTelemetry())
119121
.setDataFetcherInstrumentationEnabled(true)
120122
.setTrivialDataFetcherInstrumentationEnabled(true)
123+
.setAddOperationNameToSpanName(true)
121124
.build();
122125

123126
GraphQL graphql =
@@ -194,6 +197,7 @@ void noDataFetcherSpansCreated() {
194197
GraphQLTelemetry.builder(testing.getOpenTelemetry())
195198
.setDataFetcherInstrumentationEnabled(false)
196199
.setTrivialDataFetcherInstrumentationEnabled(true)
200+
.setAddOperationNameToSpanName(true)
197201
.build();
198202

199203
GraphQL graphql =

instrumentation/graphql-java/graphql-java-common/library/src/main/java/io/opentelemetry/instrumentation/graphql/internal/OpenTelemetryInstrumentationHelper.java

+11-4
Original file line numberDiff line numberDiff line change
@@ -48,16 +48,22 @@ public final class OpenTelemetryInstrumentationHelper {
4848

4949
private final Instrumenter<OpenTelemetryInstrumentationState, ExecutionResult> instrumenter;
5050
private final boolean sanitizeQuery;
51+
private final boolean addOperationNameToSpanName;
5152

5253
private OpenTelemetryInstrumentationHelper(
5354
Instrumenter<OpenTelemetryInstrumentationState, ExecutionResult> instrumenter,
54-
boolean sanitizeQuery) {
55+
boolean sanitizeQuery,
56+
boolean addOperationNameToSpanName) {
5557
this.instrumenter = instrumenter;
5658
this.sanitizeQuery = sanitizeQuery;
59+
this.addOperationNameToSpanName = addOperationNameToSpanName;
5760
}
5861

5962
public static OpenTelemetryInstrumentationHelper create(
60-
OpenTelemetry openTelemetry, String instrumentationName, boolean sanitizeQuery) {
63+
OpenTelemetry openTelemetry,
64+
String instrumentationName,
65+
boolean sanitizeQuery,
66+
boolean addOperationNameToSpanName) {
6167
InstrumenterBuilder<OpenTelemetryInstrumentationState, ExecutionResult> builder =
6268
Instrumenter.<OpenTelemetryInstrumentationState, ExecutionResult>builder(
6369
openTelemetry, instrumentationName, ignored -> "GraphQL Operation")
@@ -76,7 +82,8 @@ public static OpenTelemetryInstrumentationHelper create(
7682
});
7783
builder.addAttributesExtractor(new GraphqlAttributesExtractor());
7884

79-
return new OpenTelemetryInstrumentationHelper(builder.buildInstrumenter(), sanitizeQuery);
85+
return new OpenTelemetryInstrumentationHelper(
86+
builder.buildInstrumenter(), sanitizeQuery, addOperationNameToSpanName);
8087
}
8188

8289
public InstrumentationContext<ExecutionResult> beginExecution(
@@ -118,7 +125,7 @@ public InstrumentationContext<ExecutionResult> beginExecuteOperation(
118125
String operationName = operationDefinition.getName();
119126

120127
String spanName = operationType;
121-
if (operationName != null && !operationName.isEmpty()) {
128+
if (addOperationNameToSpanName && operationName != null && !operationName.isEmpty()) {
122129
spanName += " " + operationName;
123130
}
124131
span.updateName(spanName);

0 commit comments

Comments
 (0)