Skip to content
This repository was archived by the owner on Dec 19, 2023. It is now read-only.

Commit 9c07d1f

Browse files
committed
Fix instrumentation autoconfiguration conditionals fix #392
1 parent 973cf83 commit 9c07d1f

File tree

6 files changed

+59
-89
lines changed

6 files changed

+59
-89
lines changed

example-graphql-tools/src/main/resources/application.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ server:
66
graphql:
77
servlet:
88
exception-handlers-enabled: true
9+
tracing-enabled: "metrics-only"
910
graphiql:
1011
headers:
1112
Authorization: "Bearer 05bd9a5f3fe0408f89520946b0fe1b06"

graphql-spring-boot-autoconfigure/src/main/java/graphql/kickstart/spring/web/boot/GraphQLInstrumentationAutoConfiguration.java

Lines changed: 15 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
package graphql.kickstart.spring.web.boot;
22

3+
import graphql.analysis.MaxQueryComplexityInstrumentation;
4+
import graphql.analysis.MaxQueryDepthInstrumentation;
5+
import graphql.execution.instrumentation.tracing.TracingInstrumentation;
36
import graphql.kickstart.servlet.GraphQLWebsocketServlet;
47
import graphql.kickstart.spring.web.boot.metrics.MetricsInstrumentation;
58
import graphql.kickstart.spring.web.boot.metrics.TracingNoResolversInstrumentation;
69
import graphql.kickstart.spring.web.boot.metrics.WebsocketMetrics;
7-
import graphql.analysis.MaxQueryComplexityInstrumentation;
8-
import graphql.analysis.MaxQueryDepthInstrumentation;
9-
import graphql.execution.instrumentation.tracing.TracingInstrumentation;
1010
import io.micrometer.core.instrument.MeterRegistry;
11-
import org.springframework.beans.factory.annotation.Value;
11+
import lombok.RequiredArgsConstructor;
1212
import org.springframework.boot.actuate.autoconfigure.metrics.MetricsAutoConfiguration;
1313
import org.springframework.boot.actuate.autoconfigure.metrics.export.simple.SimpleMetricsExportAutoConfiguration;
1414
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
@@ -25,34 +25,28 @@
2525
* @author Marcel Overdijk
2626
*/
2727
@Configuration
28+
@RequiredArgsConstructor
2829
@ConditionalOnClass(MetricsAutoConfiguration.class)
2930
@AutoConfigureAfter({MetricsAutoConfiguration.class, SimpleMetricsExportAutoConfiguration.class,
3031
GraphQLWebsocketAutoConfiguration.class})
3132
@ConditionalOnProperty(value = "graphql.servlet.enabled", havingValue = "true", matchIfMissing = true)
3233
@EnableConfigurationProperties({GraphQLServletProperties.class})
3334
public class GraphQLInstrumentationAutoConfiguration {
3435

35-
@Value("${graphql.servlet.maxQueryComplexity:#{null}}")
36-
private Integer maxQueryComplexity;
37-
38-
@Value("${graphql.servlet.maxQueryDepth:#{null}}")
39-
private Integer maxQueryDepth;
40-
41-
@Value("${graphql.servlet.tracing-enabled:'false'}")
42-
private String tracingEnabled;
36+
private final GraphQLServletProperties graphqlServletProperties;
4337

4438
@Bean
4539
@ConditionalOnMissingBean({TracingInstrumentation.class, MetricsInstrumentation.class})
46-
@ConditionalOnExpression("${graphql.servlet.tracing-enabled:'false'}.equals('metrics-only')"
47-
+ "|| ${graphql.servlet.tracing-enabled:'false'}.equals(true)")
40+
@ConditionalOnExpression("'${graphql.servlet.tracing-enabled}' == 'metrics-only' "
41+
+ "|| '${graphql.servlet.tracing-enabled}' == 'true'")
4842
public TracingInstrumentation tracingInstrumentation() {
4943
return new TracingInstrumentation();
5044
}
5145

5246
@Bean
5347
@ConditionalOnMissingBean
5448
@ConditionalOnExpression("${graphql.servlet.actuator-metrics:false}"
55-
+ "&& ${graphql.servlet.tracing-enabled:'false'}.toString().equals('false')")
49+
+ "&& '${graphql.servlet.tracing-enabled}' == 'false'")
5650
public TracingNoResolversInstrumentation tracingNoResolversInstrumentation() {
5751
return new TracingNoResolversInstrumentation();
5852
}
@@ -61,29 +55,31 @@ public TracingNoResolversInstrumentation tracingNoResolversInstrumentation() {
6155
@ConditionalOnMissingBean
6256
@ConditionalOnProperty(value = "graphql.servlet.max-query-complexity")
6357
public MaxQueryComplexityInstrumentation maxQueryComplexityInstrumentation() {
64-
return new MaxQueryComplexityInstrumentation(maxQueryComplexity);
58+
return new MaxQueryComplexityInstrumentation(graphqlServletProperties.getMaxQueryComplexity());
6559
}
6660

6761
@Bean
6862
@ConditionalOnMissingBean
6963
@ConditionalOnProperty(value = "graphql.servlet.max-query-depth")
7064
public MaxQueryDepthInstrumentation maxQueryDepthInstrumentation() {
71-
return new MaxQueryDepthInstrumentation(maxQueryDepth);
65+
return new MaxQueryDepthInstrumentation(graphqlServletProperties.getMaxQueryDepth());
7266
}
7367

7468
@Bean
7569
@ConditionalOnProperty(value = "graphql.servlet.actuator-metrics", havingValue = "true")
7670
@ConditionalOnBean({MeterRegistry.class, TracingInstrumentation.class})
7771
@ConditionalOnMissingBean
7872
public MetricsInstrumentation metricsInstrumentation(MeterRegistry meterRegistry) {
79-
return new MetricsInstrumentation(meterRegistry, Boolean.TRUE.toString().equals(tracingEnabled));
73+
return new MetricsInstrumentation(meterRegistry,
74+
Boolean.TRUE.toString().equals(graphqlServletProperties.getTracingEnabled()));
8075
}
8176

8277
@Bean
8378
@ConditionalOnProperty(value = "graphql.servlet.actuator-metrics", havingValue = "true")
8479
@ConditionalOnBean({MeterRegistry.class, GraphQLWebsocketServlet.class})
8580
@ConditionalOnMissingBean
86-
public WebsocketMetrics websocketMetrics(MeterRegistry meterRegistry, GraphQLWebsocketServlet websocketServlet) {
81+
public WebsocketMetrics websocketMetrics(MeterRegistry meterRegistry,
82+
GraphQLWebsocketServlet websocketServlet) {
8783
return new WebsocketMetrics(meterRegistry, websocketServlet);
8884
}
8985

graphql-spring-boot-autoconfigure/src/main/java/graphql/kickstart/spring/web/boot/GraphQLServletProperties.java

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -29,31 +29,29 @@
2929
@ConfigurationProperties(prefix = "graphql.servlet")
3030
public class GraphQLServletProperties {
3131

32+
private boolean enabled = true;
33+
private boolean corsEnabled = true;
3234
private String mapping = "/graphql";
3335
private boolean exceptionHandlersEnabled = false;
3436
private long subscriptionTimeout = 0;
3537
private ContextSetting contextSetting = ContextSetting.PER_QUERY_WITH_INSTRUMENTATION;
3638
private long asyncTimeout = 30000;
37-
38-
private boolean mappingIsServletWildcard() {
39-
return getMapping().endsWith("/*");
40-
}
41-
42-
private boolean mappingIsAntWildcard() {
43-
return getMapping().endsWith("/**");
44-
}
39+
private String tracingEnabled = "false";
40+
private boolean actuatorMetrics;
41+
private Integer maxQueryComplexity;
42+
private Integer maxQueryDepth;
4543

4644
/**
4745
* @return the servlet mapping, coercing into an appropriate wildcard for servlets (ending in /*)
4846
*/
4947
public String getServletMapping() {
50-
final String mapping = getMapping();
48+
final String originalMapping = getMapping();
5149
if (mappingIsAntWildcard()) {
52-
return mapping.replaceAll("\\*$", "");
50+
return originalMapping.replaceAll("\\*$", "");
5351
} else if (mappingIsServletWildcard()) {
54-
return mapping;
52+
return originalMapping;
5553
} else {
56-
return mapping.endsWith("/") ? mapping + "*" : mapping + "/*";
54+
return originalMapping.endsWith("/") ? originalMapping + "*" : originalMapping + "/*";
5755
}
5856
}
5957

@@ -62,14 +60,22 @@ public String getServletMapping() {
6260
* matchers (ending in /**)
6361
*/
6462
public String getCorsMapping() {
65-
final String mapping = getMapping();
63+
final String originalMapping = getMapping();
6664
if (mappingIsAntWildcard()) {
67-
return mapping;
65+
return originalMapping;
6866
} else if (mappingIsServletWildcard()) {
69-
return mapping + "*";
67+
return originalMapping + "*";
7068
} else {
71-
return mapping.endsWith("/") ? mapping + "**" : mapping + "/**";
69+
return originalMapping.endsWith("/") ? originalMapping + "**" : originalMapping + "/**";
7270
}
7371
}
7472

73+
private boolean mappingIsServletWildcard() {
74+
return getMapping().endsWith("/*");
75+
}
76+
77+
private boolean mappingIsAntWildcard() {
78+
return getMapping().endsWith("/**");
79+
}
80+
7581
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package graphql.kickstart.spring.web.boot;
2+
3+
import lombok.Data;
4+
import org.springframework.boot.context.properties.ConfigurationProperties;
5+
6+
@Data
7+
@ConfigurationProperties("graphql.servlet.subscriptions.websocket")
8+
class GraphQLSubscriptionWebsocketProperties {
9+
10+
private String path = "/subscriptions";
11+
12+
}

graphql-spring-boot-autoconfigure/src/main/java/graphql/kickstart/spring/web/boot/GraphQLWebsocketAutoConfiguration.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@
1717
import java.util.Set;
1818
import java.util.function.Supplier;
1919
import javax.websocket.server.ServerContainer;
20+
import lombok.RequiredArgsConstructor;
2021
import org.springframework.beans.factory.annotation.Autowired;
21-
import org.springframework.beans.factory.annotation.Value;
2222
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
2323
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
2424
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
@@ -33,19 +33,18 @@
3333
import org.springframework.web.socket.server.standard.ServerEndpointRegistration;
3434

3535
@Configuration
36+
@RequiredArgsConstructor
3637
@ConditionalOnWebApplication
3738
@ConditionalOnClass(DispatcherServlet.class)
3839
@Conditional(OnSchemaOrSchemaProviderBean.class)
3940
@ConditionalOnProperty(value = "graphql.servlet.websocket.enabled", havingValue = "true", matchIfMissing = true)
4041
@AutoConfigureAfter({GraphQLJavaToolsAutoConfiguration.class})
41-
@EnableConfigurationProperties(GraphQLSubscriptionApolloProperties.class)
42+
@EnableConfigurationProperties({GraphQLSubscriptionApolloProperties.class,
43+
GraphQLSubscriptionWebsocketProperties.class})
4244
public class GraphQLWebsocketAutoConfiguration {
4345

44-
@Value("${graphql.servlet.subscriptions.websocket.path:/subscriptions}")
45-
private String websocketPath;
46-
47-
@Autowired
48-
private GraphQLSubscriptionApolloProperties apolloProperties;
46+
private final GraphQLSubscriptionApolloProperties apolloProperties;
47+
private final GraphQLSubscriptionWebsocketProperties websocketProperties;
4948

5049
@Bean
5150
@ConditionalOnMissingBean
@@ -80,7 +79,8 @@ public GraphQLWebsocketServlet graphQLWebsocketServlet(
8079
listeners.addAll(connectionListeners);
8180
}
8281
keepAliveListener().ifPresent(listeners::add);
83-
return new GraphQLWebsocketServlet(graphQLInvoker, invocationInputFactory, graphQLObjectMapper, listeners);
82+
return new GraphQLWebsocketServlet(graphQLInvoker, invocationInputFactory, graphQLObjectMapper,
83+
listeners);
8484
}
8585

8686
private Optional<SubscriptionConnectionListener> keepAliveListener() {
@@ -95,7 +95,7 @@ private Optional<SubscriptionConnectionListener> keepAliveListener() {
9595
@Bean
9696
@ConditionalOnClass(ServerContainer.class)
9797
public ServerEndpointRegistration serverEndpointRegistration(GraphQLWebsocketServlet servlet) {
98-
return new GraphQLWsServerEndpointRegistration(websocketPath, servlet);
98+
return new GraphQLWsServerEndpointRegistration(websocketProperties.getPath(), servlet);
9999
}
100100

101101
@Bean

graphql-spring-boot-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json

Lines changed: 0 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -5,50 +5,5 @@
55
}
66
],
77
"properties": [
8-
{
9-
"name": "graphql.servlet.enabled",
10-
"defaultValue": true,
11-
"type": "java.lang.Boolean"
12-
},
13-
{
14-
"name": "graphql.servlet.mapping",
15-
"defaultValue": "/graphql",
16-
"type": "java.lang.String"
17-
},
18-
{
19-
"name": "graphql.servlet.corsEnabled",
20-
"defaultValue": true,
21-
"type": "java.lang.Boolean"
22-
},
23-
{
24-
"name": "graphql.servlet.asyncModeEnabled",
25-
"defaultValue": false,
26-
"type": "java.lang.Boolean"
27-
},
28-
{
29-
"name": "graphql.servlet.subscriptions.websocket.path",
30-
"defaultValue": "/subscriptions",
31-
"type": "java.lang.String"
32-
},
33-
{
34-
"name": "graphql.servlet.tracingEnabled",
35-
"defaultValue": false,
36-
"type": "java.lang.String"
37-
},
38-
{
39-
"name": "graphql.servlet.maxQueryComplexity",
40-
"defaultValue": null,
41-
"type": "java.lang.Integer"
42-
},
43-
{
44-
"name": "graphql.servlet.maxQueryDepth",
45-
"defaultValue": null,
46-
"type": "java.lang.Integer"
47-
},
48-
{
49-
"name": "graphql.servlet.actuator-metrics",
50-
"defaultValue": false,
51-
"type": "java.lang.Boolean"
52-
}
538
]
549
}

0 commit comments

Comments
 (0)