Skip to content

Commit 7eded3f

Browse files
authored
Merge pull request #8 from grails-plugins/more-feedback
Use auto-configuration and config properties
2 parents bcf7fbe + cb13c15 commit 7eded3f

10 files changed

Lines changed: 137 additions & 79 deletions

File tree

docs/src/docs/configuration.adoc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ This ensures that performance timing information is available during development
99

1010
=== Configuration Options
1111

12-
All configuration options are specified in your `application.yml` or `application.groovy` file under the `grails.plugins.servertiming` namespace.
12+
All configuration options are specified in your `application.yml` or `application.groovy` file under the `grails.plugins.serverTiming` namespace.
1313

1414
==== Enabling/Disabling the Plugin
1515

plugin/grails-app/controllers/org/grails/plugins/servertiming/ServerTimingInterceptor.groovy

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
11
package org.grails.plugins.servertiming
22

33
import groovy.transform.CompileStatic
4+
import groovy.util.logging.Slf4j
5+
6+
import org.springframework.beans.factory.annotation.Autowired
7+
import org.springframework.core.env.Environment
48

59
import grails.artefact.Interceptor
6-
import groovy.util.logging.Slf4j
10+
import org.grails.plugins.servertiming.config.EnabledCondition
11+
import org.grails.plugins.servertiming.config.ServerTimingConfig
712
import org.grails.plugins.servertiming.core.TimingMetric
813

914
/**
@@ -14,15 +19,18 @@ import org.grails.plugins.servertiming.core.TimingMetric
1419
@CompileStatic
1520
class ServerTimingInterceptor implements Interceptor {
1621

17-
String metricKey = ServerTimingUtils.instance.metricKey
22+
private String metricKey
1823

19-
ServerTimingInterceptor() {
20-
if (ServerTimingUtils.instance.enabled) {
24+
@Autowired
25+
ServerTimingInterceptor(Environment env, ServerTimingConfig config) {
26+
if (EnabledCondition.matches(env)) {
2127
log.debug("Server Timing metrics are enabled. Set 'grails.plugins.serverTiming.enabled' to false to disable them.")
2228
matchAll()
2329
} else {
2430
log.debug("Server Timing metrics are disabled. Set 'grails.plugins.serverTiming.enabled' to true to enable them.")
2531
}
32+
33+
metricKey = config.metricKey
2634
}
2735

2836
@Override
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package org.grails.plugins.servertiming
2+
3+
import groovy.transform.CompileStatic
4+
import groovy.util.logging.Slf4j
5+
6+
import org.springframework.boot.autoconfigure.AutoConfiguration
7+
import org.springframework.boot.context.event.ApplicationReadyEvent
8+
import org.springframework.boot.context.properties.EnableConfigurationProperties
9+
import org.springframework.boot.web.servlet.FilterRegistrationBean
10+
import org.springframework.context.ApplicationListener
11+
import org.springframework.context.ConfigurableApplicationContext
12+
import org.springframework.context.annotation.Bean
13+
import org.springframework.context.annotation.Conditional
14+
import org.springframework.context.annotation.Configuration
15+
import org.springframework.core.Ordered
16+
17+
import org.grails.plugins.servertiming.config.EnabledCondition
18+
import org.grails.plugins.servertiming.config.ServerTimingConfig
19+
20+
@Slf4j
21+
@CompileStatic
22+
@AutoConfiguration
23+
@Configuration(proxyBeanMethods = false)
24+
@EnableConfigurationProperties(ServerTimingConfig)
25+
class ServerTimingAutoConfiguration {
26+
27+
@Bean
28+
@Conditional(EnabledCondition)
29+
ServerTimingFilter serverTimingFilter() {
30+
new ServerTimingFilter()
31+
}
32+
33+
@Bean
34+
@Conditional(EnabledCondition)
35+
FilterRegistrationBean<ServerTimingFilter> serverTimingFilterRegistration(ServerTimingFilter serverTimingFilter) {
36+
new FilterRegistrationBean<ServerTimingFilter>().tap {
37+
filter = serverTimingFilter
38+
urlPatterns = ['/*']
39+
order = Ordered.HIGHEST_PRECEDENCE + 100
40+
name = 'serverTimingFilter'
41+
}
42+
}
43+
44+
@Bean
45+
ApplicationListener<ApplicationReadyEvent> serverTimingAutoConfigLogger(ConfigurableApplicationContext context) {
46+
{ event ->
47+
def applied = !context.getBeanProvider(ServerTimingFilter).stream().findAny().empty
48+
def message = applied ?
49+
'Applying {} plugin' :
50+
'{} plugin is disabled. Set \'grails.plugins.serverTiming.enabled\' to true to enable it.'
51+
log.debug(message, ServerTimingGrailsPlugin.pluginName)
52+
} as ApplicationListener
53+
}
54+
}

plugin/src/main/groovy/org/grails/plugins/servertiming/ServerTimingFilter.groovy

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package org.grails.plugins.servertiming
22

33
import groovy.transform.CompileStatic
44
import groovy.util.logging.Slf4j
5+
56
import jakarta.servlet.Filter
67
import jakarta.servlet.FilterChain
78
import jakarta.servlet.FilterConfig
@@ -10,9 +11,13 @@ import jakarta.servlet.ServletRequest
1011
import jakarta.servlet.ServletResponse
1112
import jakarta.servlet.http.HttpServletRequest
1213
import jakarta.servlet.http.HttpServletResponse
13-
import org.grails.plugins.servertiming.core.TimingMetric
14+
15+
import org.springframework.beans.factory.annotation.Autowired
1416
import org.springframework.core.Ordered
1517

18+
import org.grails.plugins.servertiming.config.ServerTimingConfig
19+
import org.grails.plugins.servertiming.core.TimingMetric
20+
1621
/**
1722
* A Servlet Filter that wraps responses to ensure Server Timing headers are added to HTTP responses.
1823
*
@@ -25,11 +30,14 @@ import org.springframework.core.Ordered
2530
@CompileStatic
2631
class ServerTimingFilter implements Filter, Ordered {
2732

33+
@Autowired
34+
ServerTimingConfig config
35+
2836
private String metricKey
2937

3038
@Override
3139
void init(FilterConfig filterConfig) throws ServletException {
32-
metricKey = ServerTimingUtils.instance.metricKey
40+
metricKey = config.metricKey
3341
}
3442

3543
@Override
Lines changed: 5 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
package org.grails.plugins.servertiming
22

3-
import grails.plugins.Plugin
43
import groovy.util.logging.Slf4j
5-
import org.springframework.boot.web.servlet.FilterRegistrationBean
6-
import org.springframework.core.Ordered
4+
5+
import grails.plugins.Plugin
76

87
/**
98
* Grails plugin that provides Server Timing header support for HTTP responses.
@@ -26,16 +25,17 @@ import org.springframework.core.Ordered
2625
* </ul>
2726
*
2827
* @see ServerTimingFilter
29-
* @see ServerTimingUtils
3028
*/
3129
@Slf4j
3230
class ServerTimingGrailsPlugin extends Plugin {
3331

32+
static final pluginName = 'Server Timing'
33+
3434
/** Minimum Grails version required for this plugin */
3535
def grailsVersion = '7.0.0 > *'
3636

3737
/** Plugin title */
38-
def title = 'Server Timing'
38+
def title = pluginName
3939

4040
/** Plugin author */
4141
def author = 'James Daugherty'
@@ -51,45 +51,4 @@ class ServerTimingGrailsPlugin extends Plugin {
5151

5252
/** Source control management information */
5353
def scm = [url: 'https://github.com/grails-plugins/grails-server-timing']
54-
55-
/**
56-
* Registers Spring beans for the Server Timing functionality.
57-
*
58-
* <p>When the plugin is enabled, this method registers:</p>
59-
* <ul>
60-
* <li><strong>serverTimingFilter</strong> - The {@link ServerTimingFilter} bean</li>
61-
* <li><strong>serverTimingFilterRegistration</strong> - A {@link FilterRegistrationBean}
62-
* that configures the filter to intercept all requests</li>
63-
* </ul>
64-
*
65-
* @return a closure that defines the Spring bean configuration
66-
*/
67-
Closure doWithSpring() {
68-
{ ->
69-
if (ServerTimingUtils.instance.enabled) {
70-
serverTimingFilter(ServerTimingFilter)
71-
72-
serverTimingFilterRegistration(FilterRegistrationBean) {
73-
filter = ref('serverTimingFilter')
74-
urlPatterns = ['/*']
75-
order = Ordered.HIGHEST_PRECEDENCE + 100
76-
name = 'serverTimingFilter'
77-
}
78-
}
79-
}
80-
}
81-
82-
/**
83-
* Performs initialization tasks after the Spring application context is available.
84-
*
85-
* <p>Logs whether the plugin is enabled or disabled based on the configuration.</p>
86-
*/
87-
@Override
88-
void doWithApplicationContext() {
89-
if (ServerTimingUtils.instance.enabled) {
90-
log.debug('Applying {} plugin', title)
91-
} else {
92-
log.debug('{} plugin is disabled. Set \'grails.plugins.serverTiming.enabled\' to true to enable it.', title)
93-
}
94-
}
9554
}

plugin/src/main/groovy/org/grails/plugins/servertiming/ServerTimingUtils.groovy

Lines changed: 0 additions & 26 deletions
This file was deleted.
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package org.grails.plugins.servertiming.config
2+
3+
import groovy.transform.CompileStatic
4+
5+
import org.springframework.context.annotation.Condition
6+
import org.springframework.context.annotation.ConditionContext
7+
import org.springframework.core.env.Environment
8+
import org.springframework.core.type.AnnotatedTypeMetadata
9+
10+
@CompileStatic
11+
class EnabledCondition implements Condition {
12+
13+
@Override
14+
boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
15+
matches(context.environment)
16+
}
17+
18+
static boolean matches(Environment env) {
19+
def explicitConfigValue = env.getProperty('grails.plugins.server-timing.enabled', Boolean, null)
20+
if (explicitConfigValue != null && explicitConfigValue == false) {
21+
return false
22+
}
23+
explicitConfigValue || env.matchesProfiles('development', 'test')
24+
}
25+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package org.grails.plugins.servertiming.config
2+
3+
import groovy.transform.CompileStatic
4+
5+
import org.springframework.boot.context.properties.ConfigurationProperties
6+
7+
@CompileStatic
8+
@ConfigurationProperties('grails.plugins.server-timing')
9+
class ServerTimingConfig {
10+
11+
Boolean enabled = null
12+
String metricKey = 'GrailsServerTiming'
13+
14+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
org.grails.plugins.servertiming.ServerTimingAutoConfiguration
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
{
2+
"properties": [
3+
{
4+
"name": "grails.plugins.server-timing.enabled",
5+
"type": "java.lang.Boolean",
6+
"description": "Whether Server Timing is enabled. If not set, resolves to true in development and test, false in production"
7+
},
8+
{
9+
"name": "grails.plugins.server-timing.metric-key",
10+
"type": "java.lang.String",
11+
"description": "Request attribute key for storing metrics. Change only if you have a naming conflict.",
12+
"defaultValue": "GrailsServerTiming"
13+
}
14+
]
15+
}

0 commit comments

Comments
 (0)