Merge pull request #10906 from jkschneider/micrometer-rc3
* gh-10906: Polish Micrometer 1.0.0-rc.3 upgrade Upgrade to Micrometer 1.0.0-rc.3pull/10921/merge
commit
144625022c
@ -1,39 +0,0 @@
|
||||
/*
|
||||
* Copyright 2012-2017 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.boot.actuate.autoconfigure.metrics.export;
|
||||
|
||||
import java.time.Duration;
|
||||
|
||||
import org.springframework.boot.context.properties.ConfigurationPropertiesBinding;
|
||||
import org.springframework.core.convert.converter.Converter;
|
||||
|
||||
/**
|
||||
* A {@link Converter} to create a {@link Duration} from a {@link String}.
|
||||
*
|
||||
* @author Jon Schneider
|
||||
* @author Andy Wilkinson
|
||||
* @since 2.0.0
|
||||
*/
|
||||
@ConfigurationPropertiesBinding
|
||||
public class StringToDurationConverter implements Converter<String, Duration> {
|
||||
|
||||
@Override
|
||||
public Duration convert(String source) {
|
||||
return Duration.parse(source);
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,53 @@
|
||||
/*
|
||||
* Copyright 2012-2017 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.boot.actuate.autoconfigure.metrics.export.simple;
|
||||
|
||||
import java.time.Duration;
|
||||
|
||||
import io.micrometer.core.instrument.simple.SimpleConfig;
|
||||
|
||||
import org.springframework.boot.actuate.autoconfigure.metrics.export.PropertiesConfigAdapter;
|
||||
|
||||
/**
|
||||
* Adapter to convert {@link SimpleProperties} to a {@link SimpleConfig}.
|
||||
*
|
||||
* @author Jon Schneider
|
||||
* @since 2.0.0
|
||||
*/
|
||||
public class SimplePropertiesConfigAdapter extends
|
||||
PropertiesConfigAdapter<SimpleProperties, SimpleConfig> implements SimpleConfig {
|
||||
private static final SimpleConfig DEFAULTS = (key) -> null;
|
||||
|
||||
public SimplePropertiesConfigAdapter(SimpleProperties properties) {
|
||||
super(properties, DEFAULTS);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String get(String k) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean enabled() {
|
||||
return get(SimpleProperties::getEnabled, SimpleConfig::enabled);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Duration step() {
|
||||
return get(SimpleProperties::getStep, SimpleConfig::step);
|
||||
}
|
||||
}
|
@ -1,52 +0,0 @@
|
||||
/*
|
||||
* Copyright 2012-2017 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.boot.actuate.metrics.web.servlet;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
|
||||
|
||||
/**
|
||||
* Intercepts incoming HTTP requests and records metrics about execution time and results.
|
||||
*
|
||||
* @author Jon Schneider
|
||||
* @since 2.0.0
|
||||
*/
|
||||
public class MetricsHandlerInterceptor extends HandlerInterceptorAdapter {
|
||||
|
||||
private final WebMvcMetrics webMvcMetrics;
|
||||
|
||||
public MetricsHandlerInterceptor(WebMvcMetrics webMvcMetrics) {
|
||||
this.webMvcMetrics = webMvcMetrics;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
|
||||
Object handler) throws Exception {
|
||||
this.webMvcMetrics.preHandle(request, handler);
|
||||
return super.preHandle(request, response, handler);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
|
||||
Object handler, Exception ex) throws Exception {
|
||||
this.webMvcMetrics.record(request, response, ex);
|
||||
super.afterCompletion(request, response, handler, ex);
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,108 @@
|
||||
/*
|
||||
* Copyright 2012-2017 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.boot.actuate.metrics.web.servlet;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import javax.servlet.FilterChain;
|
||||
import javax.servlet.ServletException;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import org.springframework.core.Ordered;
|
||||
import org.springframework.core.annotation.Order;
|
||||
import org.springframework.web.filter.OncePerRequestFilter;
|
||||
import org.springframework.web.servlet.HandlerExecutionChain;
|
||||
import org.springframework.web.servlet.handler.HandlerMappingIntrospector;
|
||||
import org.springframework.web.servlet.handler.MatchableHandlerMapping;
|
||||
import org.springframework.web.util.NestedServletException;
|
||||
|
||||
/**
|
||||
* Intercepts incoming HTTP requests and records metrics about Spring MVC execution time
|
||||
* and results.
|
||||
*
|
||||
* @author Jon Schneider
|
||||
* @since 2.0.0
|
||||
*/
|
||||
@Order(Ordered.HIGHEST_PRECEDENCE)
|
||||
public class WebMvcMetricsFilter extends OncePerRequestFilter {
|
||||
|
||||
private static final Logger logger = LoggerFactory
|
||||
.getLogger(WebMvcMetricsFilter.class);
|
||||
|
||||
private final WebMvcMetrics webMvcMetrics;
|
||||
|
||||
private final HandlerMappingIntrospector mappingIntrospector;
|
||||
|
||||
public WebMvcMetricsFilter(WebMvcMetrics webMvcMetrics,
|
||||
HandlerMappingIntrospector mappingIntrospector) {
|
||||
this.webMvcMetrics = webMvcMetrics;
|
||||
this.mappingIntrospector = mappingIntrospector;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean shouldNotFilterAsyncDispatch() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doFilterInternal(HttpServletRequest request,
|
||||
HttpServletResponse response, FilterChain filterChain)
|
||||
throws ServletException, IOException {
|
||||
HandlerExecutionChain handlerExecutionChain = getHandlerExecutionChain(request);
|
||||
Object handler = (handlerExecutionChain == null ? null
|
||||
: handlerExecutionChain.getHandler());
|
||||
filterWithMetrics(request, response, filterChain, handler);
|
||||
}
|
||||
|
||||
private HandlerExecutionChain getHandlerExecutionChain(HttpServletRequest request) {
|
||||
try {
|
||||
MatchableHandlerMapping matchableHandlerMapping = this.mappingIntrospector
|
||||
.getMatchableHandlerMapping(request);
|
||||
return (matchableHandlerMapping == null ? null
|
||||
: matchableHandlerMapping.getHandler(request));
|
||||
}
|
||||
catch (Exception ex) {
|
||||
if (logger.isDebugEnabled()) {
|
||||
logger.debug("Unable to time request", ex);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private void filterWithMetrics(HttpServletRequest request,
|
||||
HttpServletResponse response, FilterChain filterChain, Object handler)
|
||||
throws IOException, ServletException, NestedServletException {
|
||||
this.webMvcMetrics.preHandle(request, handler);
|
||||
try {
|
||||
filterChain.doFilter(request, response);
|
||||
// When an async operation is complete, the whole filter gets called again
|
||||
// with isAsyncStarted = false
|
||||
if (!request.isAsyncStarted()) {
|
||||
this.webMvcMetrics.record(request, response, null);
|
||||
}
|
||||
}
|
||||
catch (NestedServletException ex) {
|
||||
this.webMvcMetrics.record(request, response, ex.getCause());
|
||||
throw ex;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
55
spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/web/servlet/MetricsHandlerInterceptorAutoTimedTests.java → spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/web/servlet/WebMvcMetricsFilterAutoTimedTests.java
55
spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/web/servlet/MetricsHandlerInterceptorAutoTimedTests.java → spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/web/servlet/WebMvcMetricsFilterAutoTimedTests.java
Loading…
Reference in New Issue