使用 Spring WebClient 的动态指标标记

Dynamic metric tagging with Spring WebClient

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

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

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

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

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

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

创建 WebClient 后,没有一种机制可以 post 每个请求的自定义标签。但是,可以做这样的模式

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

然后创建自定义指标class

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
    }
}