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

Lines changed: 4 additions & 3 deletions
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

Lines changed: 4 additions & 0 deletions
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

Lines changed: 5 additions & 0 deletions
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

Lines changed: 3 additions & 2 deletions
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

Lines changed: 14 additions & 1 deletion
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

Lines changed: 4 additions & 1 deletion
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

Lines changed: 1 addition & 0 deletions
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

Lines changed: 5 additions & 0 deletions
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

Lines changed: 5 additions & 2 deletions
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

Lines changed: 15 additions & 3 deletions
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
}

0 commit comments

Comments
 (0)