聊聊spring boot的WebFluxTagsProvider的使用


本文主要研究一下webflux的WebFluxTagsProvider

WebFluxTagsProvider

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

@FunctionalInterface
public 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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 聊聊spring boot的WebFluxTagsProvider的使用

    序 本文主要研究一下webflux的WebFluxTagsProvider WebFluxTagsProvider spring-boot-actuator-2.1.5.RELEASE-sources.jar!/org/springframework/boot/actuate/metrics/web/reactive/server/WebFluxTagsProvider.java @FunctionalInterface public interface WebFluxTagsProvider

  • 利用Spring boot如何创建简单的web交互应用

    关于页面渲染 其实在工作中,一直都是前后端分离,也就是说,我的工作从来都是提供接口,而不写 html css js 之类的,所以在这方面也没有经验. 这里为了给大家介绍下模板引擎,我将会写个非常非常简单的页面,如果不好看,请见谅~ Spring Boot 官方推荐的模板引擎是 Thymeleaf ,点击可以进入其官网了解详情. 本章目标 让 Spring Boot 应用可以访问到静态资源文件 创建用户登录表单,并对用户名.密码进行校验 校验失败,将返回登录页,并展示错误信息 校验成功,重定向到苹

  • Spring Boot(二)之web综合开发

    上篇文章介绍了Spring boot初级教程:spring boot(一):入门篇,方便大家快速入门.了解实践Spring boot特性:本篇文章接着上篇内容继续为大家介绍spring boot的其它特性(有些未必是spring boot体系桟的功能,但是是spring特别推荐的一些开源技术本文也会介绍),对了这里只是一个大概的介绍,特别详细的使用我们会在其它的文章中来展开说明. web开发 spring boot web开发非常的简单,其中包括常用的json输出.filters.propert

  • Spring Boot和Kotlin的无缝整合与完美交融

    前言 本文讲解 Spring Boot2 基础下,如何使用 Kotlin,并无缝整合与完美交融.为了让读者更加熟悉 Kotlin 的语法糖,笔者会在未来的几篇文章中,聊聊 Kotlin 的新特性及其语法糖.下面话不多说了,来一起看看详细的介绍吧 环境依赖 修改 POM 文件,添加 spring boot 依赖. <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-bo

  • Spring Boot 接口参数加密解密的实现方法

    因为有小伙伴刚好问到这个问题,松哥就抽空撸一篇文章和大家聊聊这个话题. 加密解密本身并不是难事,问题是在何时去处理?定义一个过滤器,将请求和响应分别拦截下来进行处理也是一个办法,这种方式虽然粗暴,但是灵活,因为可以拿到一手的请求参数和响应数据.不过 SpringMVC 中给我们提供了 ResponseBodyAdvice 和 RequestBodyAdvice,利用这两个工具可以对请求和响应进行预处理,非常方便. 所以今天这篇文章有两个目的: 分享参数/响应加解密的思路. 分享 Response

  • 基于Spring Boot的线程池监控问题及解决方案

    目录 前言 为什么需要对线程池进行监控 如何做线程池的监控 数据采集 数据存储以及大盘的展示 进一步扩展以及思考 如何合理配置线程池参数 如何动态调整线程池参数 如何给不同的服务之间做线程池的隔离 实现方案 前言 这篇是推动大家异步编程的思想的线程池的准备篇,要做好监控,让大家使用无后顾之忧,敬畏生产. 为什么需要对线程池进行监控 Java线程池作为最常使用到的并发工具,相信大家都不陌生,但是你真的确定使用对了吗?大名鼎鼎的阿里Java代码规范要求我们不使用 Executors来快速创建线程池,

  • spring boot的maven配置依赖详解

    本文介绍了spring boot的maven配置依赖详解,分享给大家,具体如下: 我们通过引用spring-boot-starter-parent,添加spring-boot-starter-web 可以实现web项目的功能,当然不使用spring-boot-start-web,通过自己添加的依赖包也可以实现,但是需要一个个添加,费时费力,而且可能产生版本依赖冲突.我们来看下springboot的依赖配置: 利用pom的继承,一处声明,处处使用.在最顶级的spring-boot-dependen

  • 详解Spring Boot配置排序依赖技巧

    本文主要介绍了Spring Boot配置排序依赖技巧,分享给大家,具体如下: Spring Boot - 被错误使用的注解 我自己曾经在 Spring Boot 中集成通用 Mapper 时,写过下面的代码: @Configuration @AutoConfigureAfter(MyBatisConfig.class) public class MyBatisMapperScannerConfig { //其他 } 这种用法我参考的 mybatis-spring-boot-starter. 由于

  • spring boot创建项目包依赖问题的解决

    今天捣腾了spring boot,按照官网案例,缺发现本地无论包依赖出现问题,并且无法启动,一整天在踩maven的坑,记录下这个血的教训. 1.spring-core依赖包问题 运行application,发现缺少依赖的spring-core包: 但是spring boot的包都是通过parent的starter引入的,通过mvn denpendency:tree查看项目的jar依赖信息:  发现spring-core依赖包是存在的,但是为什么运行的时候回报错找不到类. 倒腾了一个下午试过各种方

  • docker连接spring boot和mysql容器方法介绍

    在之前使用docker部署运行了Spring Boot的小例子,但是没有使用数据库.在这一篇中,介绍docker如何启动mysql容器,以及如何将Spring Boot容器与mysql容器连接起来运行. docker基本命令 首先熟悉一下在操作过程中常用的docker基本命令: docker images:列出所有docker镜像 docker ps:列出所有运行中的容器,-a参数可以列出所有容器,包括停止的 docker stop container_id:停止容器 docker start

随机推荐