使用 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
}
}
正在尝试将一些代码从 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
}
}