Skip to content

Commit 1951761

Browse files
authored
Add an option to disable capturing graphql query document (#15384)
1 parent 7cc394c commit 1951761

File tree

11 files changed

+84
-17
lines changed

11 files changed

+84
-17
lines changed

instrumentation/graphql-java/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
|------------------------------------------------------------------------|---------|---------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
55
| `otel.instrumentation.graphql.query-sanitizer.enabled` | Boolean | `true` | Whether to remove sensitive information from query source that is added as span attribute. |
66
| `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. |
7+
| `otel.instrumentation.graphql.capture-query` | Boolean | `true` | Whether to capture the query in `graphql.document` span attribute. |
78

89
# Settings for the GraphQL 20 instrumentation
910

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@
1313

1414
public final class GraphqlSingletons {
1515

16+
private static final boolean CAPTURE_QUERY =
17+
AgentInstrumentationConfig.get()
18+
.getBoolean("otel.instrumentation.graphql.capture-query", true);
1619
private static final boolean QUERY_SANITIZATION_ENABLED =
1720
AgentInstrumentationConfig.get()
1821
.getBoolean("otel.instrumentation.graphql.query-sanitizer.enabled", true);
@@ -23,6 +26,7 @@ public final class GraphqlSingletons {
2326

2427
private static final GraphQLTelemetry TELEMETRY =
2528
GraphQLTelemetry.builder(GlobalOpenTelemetry.get())
29+
.setCaptureQuery(CAPTURE_QUERY)
2630
.setSanitizeQuery(QUERY_SANITIZATION_ENABLED)
2731
.setAddOperationNameToSpanName(ADD_OPERATION_NAME_TO_SPAN_NAME)
2832
.build();

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

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,17 @@ public static GraphQLTelemetryBuilder builder(OpenTelemetry openTelemetry) {
2828
private final OpenTelemetryInstrumentationHelper helper;
2929

3030
GraphQLTelemetry(
31-
OpenTelemetry openTelemetry, boolean sanitizeQuery, boolean addOperationNameToSpanName) {
31+
OpenTelemetry openTelemetry,
32+
boolean captureQuery,
33+
boolean sanitizeQuery,
34+
boolean addOperationNameToSpanName) {
3235
helper =
3336
OpenTelemetryInstrumentationHelper.create(
34-
openTelemetry, INSTRUMENTATION_NAME, sanitizeQuery, addOperationNameToSpanName);
37+
openTelemetry,
38+
INSTRUMENTATION_NAME,
39+
captureQuery,
40+
sanitizeQuery,
41+
addOperationNameToSpanName);
3542
}
3643

3744
/**

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

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,24 @@ public final class GraphQLTelemetryBuilder {
1414

1515
private final OpenTelemetry openTelemetry;
1616

17+
private boolean captureQuery = true;
1718
private boolean sanitizeQuery = true;
1819
private boolean addOperationNameToSpanName = false;
1920

2021
GraphQLTelemetryBuilder(OpenTelemetry openTelemetry) {
2122
this.openTelemetry = openTelemetry;
2223
}
2324

25+
/**
26+
* Sets whether query should be captured in {@code graphql.document} span attribute. Default is
27+
* {@code true}.
28+
*/
29+
@CanIgnoreReturnValue
30+
public GraphQLTelemetryBuilder setCaptureQuery(boolean captureQuery) {
31+
this.captureQuery = captureQuery;
32+
return this;
33+
}
34+
2435
/** Sets whether sensitive information should be removed from queries. Default is {@code true}. */
2536
@CanIgnoreReturnValue
2637
public GraphQLTelemetryBuilder setSanitizeQuery(boolean sanitizeQuery) {
@@ -45,6 +56,7 @@ public GraphQLTelemetryBuilder setAddOperationNameToSpanName(boolean addOperatio
4556
* GraphQLTelemetryBuilder}.
4657
*/
4758
public GraphQLTelemetry build() {
48-
return new GraphQLTelemetry(openTelemetry, sanitizeQuery, addOperationNameToSpanName);
59+
return new GraphQLTelemetry(
60+
openTelemetry, captureQuery, sanitizeQuery, addOperationNameToSpanName);
4961
}
5062
}

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@
1313

1414
public final class GraphqlSingletons {
1515

16+
private static final boolean CAPTURE_QUERY =
17+
AgentInstrumentationConfig.get()
18+
.getBoolean("otel.instrumentation.graphql.capture-query", true);
1619
private static final boolean QUERY_SANITIZATION_ENABLED =
1720
AgentInstrumentationConfig.get()
1821
.getBoolean("otel.instrumentation.graphql.query-sanitizer.enabled", true);
@@ -29,6 +32,7 @@ public final class GraphqlSingletons {
2932

3033
private static final GraphQLTelemetry TELEMETRY =
3134
GraphQLTelemetry.builder(GlobalOpenTelemetry.get())
35+
.setCaptureQuery(CAPTURE_QUERY)
3236
.setSanitizeQuery(QUERY_SANITIZATION_ENABLED)
3337
.setDataFetcherInstrumentationEnabled(DATA_FETCHER_ENABLED)
3438
.setTrivialDataFetcherInstrumentationEnabled(TRIVIAL_DATA_FETCHER_ENABLED)

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,14 @@ public static GraphQLTelemetryBuilder builder(OpenTelemetry openTelemetry) {
3232

3333
GraphQLTelemetry(
3434
OpenTelemetry openTelemetry,
35+
boolean captureQuery,
3536
boolean sanitizeQuery,
3637
Instrumenter<DataFetchingEnvironment, Object> dataFetcherInstrumenter,
3738
boolean createSpansForTrivialDataFetcher,
3839
boolean addOperationNameToSpanName) {
3940
helper =
4041
GraphqlInstrumenterFactory.createInstrumentationHelper(
41-
openTelemetry, sanitizeQuery, addOperationNameToSpanName);
42+
openTelemetry, captureQuery, sanitizeQuery, addOperationNameToSpanName);
4243
this.dataFetcherInstrumenter = dataFetcherInstrumenter;
4344
this.createSpansForTrivialDataFetcher = createSpansForTrivialDataFetcher;
4445
}

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ public final class GraphQLTelemetryBuilder {
1414

1515
private final OpenTelemetry openTelemetry;
1616

17+
private boolean captureQuery = true;
1718
private boolean sanitizeQuery = true;
1819
private boolean dataFetcherInstrumentationEnabled = false;
1920
private boolean trivialDataFetcherInstrumentationEnabled = false;
@@ -23,6 +24,16 @@ public final class GraphQLTelemetryBuilder {
2324
this.openTelemetry = openTelemetry;
2425
}
2526

27+
/**
28+
* Sets whether query should be captured in {@code graphql.document} span attribute. Default is
29+
* {@code true}.
30+
*/
31+
@CanIgnoreReturnValue
32+
public GraphQLTelemetryBuilder setCaptureQuery(boolean captureQuery) {
33+
this.captureQuery = captureQuery;
34+
return this;
35+
}
36+
2637
/** Sets whether sensitive information should be removed from queries. Default is {@code true}. */
2738
@CanIgnoreReturnValue
2839
public GraphQLTelemetryBuilder setSanitizeQuery(boolean sanitizeQuery) {
@@ -68,6 +79,7 @@ public GraphQLTelemetryBuilder setAddOperationNameToSpanName(boolean addOperatio
6879
public GraphQLTelemetry build() {
6980
return new GraphQLTelemetry(
7081
openTelemetry,
82+
captureQuery,
7183
sanitizeQuery,
7284
GraphqlInstrumenterFactory.createDataFetcherInstrumenter(
7385
openTelemetry, dataFetcherInstrumentationEnabled),

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

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,16 @@ final class GraphqlInstrumenterFactory {
1818
private static final String INSTRUMENTATION_NAME = "io.opentelemetry.graphql-java-20.0";
1919

2020
static OpenTelemetryInstrumentationHelper createInstrumentationHelper(
21-
OpenTelemetry openTelemetry, boolean sanitizeQuery, boolean addOperationNameToSpanName) {
21+
OpenTelemetry openTelemetry,
22+
boolean captureQuery,
23+
boolean sanitizeQuery,
24+
boolean addOperationNameToSpanName) {
2225
return OpenTelemetryInstrumentationHelper.create(
23-
openTelemetry, INSTRUMENTATION_NAME, sanitizeQuery, addOperationNameToSpanName);
26+
openTelemetry,
27+
INSTRUMENTATION_NAME,
28+
captureQuery,
29+
sanitizeQuery,
30+
addOperationNameToSpanName);
2431
}
2532

2633
static Instrumenter<DataFetchingEnvironment, Object> createDataFetcherInstrumenter(

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ public void onEnd(
4545
attributes.put(
4646
GRAPHQL_OPERATION_TYPE, request.getOperation().name().toLowerCase(Locale.ROOT));
4747
}
48-
attributes.put(GRAPHQL_DOCUMENT, request.getQuery());
48+
if (request.getQuery() != null) {
49+
attributes.put(GRAPHQL_DOCUMENT, request.getQuery());
50+
}
4951
}
5052
}

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

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,21 +47,25 @@ public final class OpenTelemetryInstrumentationHelper {
4747
private static final AstTransformer astTransformer = new AstTransformer();
4848

4949
private final Instrumenter<OpenTelemetryInstrumentationState, ExecutionResult> instrumenter;
50+
private final boolean captureQuery;
5051
private final boolean sanitizeQuery;
5152
private final boolean addOperationNameToSpanName;
5253

5354
private OpenTelemetryInstrumentationHelper(
5455
Instrumenter<OpenTelemetryInstrumentationState, ExecutionResult> instrumenter,
56+
boolean captureQuery,
5557
boolean sanitizeQuery,
5658
boolean addOperationNameToSpanName) {
5759
this.instrumenter = instrumenter;
60+
this.captureQuery = captureQuery;
5861
this.sanitizeQuery = sanitizeQuery;
5962
this.addOperationNameToSpanName = addOperationNameToSpanName;
6063
}
6164

6265
public static OpenTelemetryInstrumentationHelper create(
6366
OpenTelemetry openTelemetry,
6467
String instrumentationName,
68+
boolean captureQuery,
6569
boolean sanitizeQuery,
6670
boolean addOperationNameToSpanName) {
6771
InstrumenterBuilder<OpenTelemetryInstrumentationState, ExecutionResult> builder =
@@ -83,7 +87,7 @@ public static OpenTelemetryInstrumentationHelper create(
8387
builder.addAttributesExtractor(new GraphqlAttributesExtractor());
8488

8589
return new OpenTelemetryInstrumentationHelper(
86-
builder.buildInstrumenter(), sanitizeQuery, addOperationNameToSpanName);
90+
builder.buildInstrumenter(), captureQuery, sanitizeQuery, addOperationNameToSpanName);
8791
}
8892

8993
public InstrumentationContext<ExecutionResult> beginExecution(
@@ -133,11 +137,13 @@ public InstrumentationContext<ExecutionResult> beginExecuteOperation(
133137
state.setOperation(operation);
134138
state.setOperationName(operationName);
135139

136-
Node<?> node = operationDefinition;
137-
if (sanitizeQuery) {
138-
node = sanitize(node);
140+
if (captureQuery) {
141+
Node<?> node = operationDefinition;
142+
if (sanitizeQuery) {
143+
node = sanitize(node);
144+
}
145+
state.setQuery(AstPrinter.printAstCompact(node));
139146
}
140-
state.setQuery(AstPrinter.printAst(node));
141147

142148
return SimpleInstrumentationContext.noOp();
143149
}

0 commit comments

Comments
 (0)