本文主要研究一下webflux的WebFluxTagsProvider

WebFluxTagsProvider

spring-boot-actuator-2.1.5.RELEASE-sources.jar!/org/springframework/boot/actuate/metrics/web/reactive/server/WebFluxTagsProvider.java

@FunctionalInterfacepublic interface WebFluxTagsProvider {    /**     * Provides tags to be associated with metrics for the given {@code exchange}.     * @param exchange the exchange     * @param ex the current exception (may be {@code null})     * @return tags to associate with metrics for the request and response exchange     */    Iterable<Tag> httpRequestTags(ServerWebExchange exchange, Throwable ex);}
  • WebFluxTagsProvider接口定义了httpRequestTags方法

DefaultWebFluxTagsProvider

spring-boot-actuator-2.1.5.RELEASE-sources.jar!/org/springframework/boot/actuate/metrics/web/reactive/server/DefaultWebFluxTagsProvider.java

public class DefaultWebFluxTagsProvider implements WebFluxTagsProvider {    @Override    public Iterable<Tag> httpRequestTags(ServerWebExchange exchange,            Throwable exception) {        return Arrays.asList(WebFluxTags.method(exchange), WebFluxTags.uri(exchange),                WebFluxTags.exception(exception), WebFluxTags.status(exchange),                WebFluxTags.outcome(exchange));    }}
  • DefaultWebFluxTagsProvider实现了WebFluxTagsProvider接口,它返回了method、uri、exception、status、outcome这几个tag

WebFluxTags

spring-boot-actuator-2.1.5.RELEASE-sources.jar!/org/springframework/boot/actuate/metrics/web/reactive/server/WebFluxTags.java

public final class WebFluxTags {    private static final Tag URI_NOT_FOUND = Tag.of("uri", "NOT_FOUND");    private static final Tag URI_REDIRECTION = Tag.of("uri", "REDIRECTION");    private static final Tag URI_ROOT = Tag.of("uri", "root");    private static final Tag URI_UNKNOWN = Tag.of("uri", "UNKNOWN");    private static final Tag EXCEPTION_NONE = Tag.of("exception", "None");    private static final Tag OUTCOME_UNKNOWN = Tag.of("outcome", "UNKNOWN");    private static final Tag OUTCOME_INFORMATIONAL = Tag.of("outcome", "INFORMATIONAL");    private static final Tag OUTCOME_SUCCESS = Tag.of("outcome", "SUCCESS");    private static final Tag OUTCOME_REDIRECTION = Tag.of("outcome", "REDIRECTION");    private static final Tag OUTCOME_CLIENT_ERROR = Tag.of("outcome", "CLIENT_ERROR");    private static final Tag OUTCOME_SERVER_ERROR = Tag.of("outcome", "SERVER_ERROR");    private WebFluxTags() {    }    public static Tag method(ServerWebExchange exchange) {        return Tag.of("method", exchange.getRequest().getMethodValue());    }    public static Tag status(ServerWebExchange exchange) {        HttpStatus status = exchange.getResponse().getStatusCode();        if (status == null) {            status = HttpStatus.OK;        }        return Tag.of("status", String.valueOf(status.value()));    }    public static Tag uri(ServerWebExchange exchange) {        PathPattern pathPattern = exchange                .getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE);        if (pathPattern != null) {            return Tag.of("uri", pathPattern.getPatternString());        }        HttpStatus status = exchange.getResponse().getStatusCode();        if (status != null) {            if (status.is3xxRedirection()) {                return URI_REDIRECTION;            }            if (status == HttpStatus.NOT_FOUND) {                return URI_NOT_FOUND;            }        }        String path = getPathInfo(exchange);        if (path.isEmpty()) {            return URI_ROOT;        }        return URI_UNKNOWN;    }    private static String getPathInfo(ServerWebExchange exchange) {        String path = exchange.getRequest().getPath().value();        String uri = StringUtils.hasText(path) ? path : "/";        return uri.replaceAll("//+", "/").replaceAll("/$", "");    }    public static Tag exception(Throwable exception) {        if (exception != null) {            String simpleName = exception.getClass().getSimpleName();            return Tag.of("exception", StringUtils.hasText(simpleName) ? simpleName                    : exception.getClass().getName());        }        return EXCEPTION_NONE;    }    public static Tag outcome(ServerWebExchange exchange) {        HttpStatus status = exchange.getResponse().getStatusCode();        if (status != null) {            if (status.is1xxInformational()) {                return OUTCOME_INFORMATIONAL;            }            if (status.is2xxSuccessful()) {                return OUTCOME_SUCCESS;            }            if (status.is3xxRedirection()) {                return OUTCOME_REDIRECTION;            }            if (status.is4xxClientError()) {                return OUTCOME_CLIENT_ERROR;            }            return OUTCOME_SERVER_ERROR;        }        return OUTCOME_UNKNOWN;    }}
  • WebFluxTags定义了URI_NOT_FOUND、URI_REDIRECTION、URI_ROOT、URI_UNKNOWN、EXCEPTION_NONE、OUTCOME_UNKNOWN、OUTCOME_INFORMATIONAL、OUTCOME_SUCCESS、OUTCOME_REDIRECTION、OUTCOME_CLIENT_ERROR、OUTCOME_SERVER_ERROR这些Tag常量

小结

WebFluxTagsProvider接口定义了httpRequestTags方法;DefaultWebFluxTagsProvider实现了WebFluxTagsProvider接口,它返回了method、uri、exception、status、outcome这几个tag;WebFluxTags定义了URI_NOT_FOUND、URI_REDIRECTION、URI_ROOT、URI_UNKNOWN、EXCEPTION_NONE、OUTCOME_UNKNOWN、OUTCOME_INFORMATIONAL、OUTCOME_SUCCESS、OUTCOME_REDIRECTION、OUTCOME_CLIENT_ERROR、OUTCOME_SERVER_ERROR这些Tag常量

doc

  • WebFluxTagsProvider