【问题标题】:Dynamic metric tagging with Spring WebClient使用 Spring WebClient 进行动态度量标记
【发布时间】:2021-10-20 19:36:20
【问题描述】:

试图将一些代码从 RestTemplate 迁移到 Webclient。旧代码在 RestTemplate 调用周围包装了一个用于度量收集的计时器,并添加了两个基于请求输入的额外自定义标签。

我们正在创建一个 WebClient 并将 MetricsWebCLientFilterFunction 添加到构建器作为过滤器。我还看到了 DefaultWebClientExchangeTagsProvider。问题是我见过的唯一应用标签的机制是在那个构建器上。我们不想在构建器的每个请求上创建一个新的 WebClient,而且我没有看到将标签添加到单个 webclient get/options/post 的方法。

是否有一种机制可以在实际 Web 客户端获取的单个指标上添加标记,或者我们是否仅限于每次都创建一个构建器?

对于上下文,我们正在尝试记录客户端 ID 和另一个不属于调用 URL 模式的自定义标识符。

到目前为止,我唯一的想法是添加一个 HTTP 标头,然后创建一个自定义 WebClientExchangeTagsProvider,它会在请求进入时添加标签。问题是我们不希望这些标头传到外部我们正在调用的供应商服务。

我们使用的是 Spring Boot 2.5.4,它是一个 Spring MVC 应用程序,我们希望最终迁移到 webflux。

【问题讨论】:

    标签: spring spring-webclient


    【解决方案1】:

    一旦创建了 WebClient,就没有机制可以为每个请求发布自定义标签。但是,可以做这样的模式

    val metricFilter = MetricWebClientFilterFunction(meterRegistry), CustomTagProvider(customValString), "metric-name", AutoTimer.ENABLED)
    webClient.mutate().filter(metricFilter).build().get() ...
    

    然后创建一个自定义指标类

    class CustomTagProvider(private val customValString: String) : DefaultWebClientExchangeTagProvider() {
        override fun tags(request: ClientRequest, response: ClientRespose, throwable: Throwable): Iterable<Tag> {
            val custom: Tag.of("custom", customValString)
            val tags: MutableList<Tag> = mutableListOf(custom)
            tags.addAll(super.tags(request, response, throwable))
            return tags
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-23
      • 1970-01-01
      • 1970-01-01
      • 2018-09-16
      • 2019-09-24
      • 1970-01-01
      • 2019-05-30
      • 2019-08-02
      相关资源
      最近更新 更多