0

我正在尝试为反应流添加一个过滤器:

metrics()

成功向 IoC 注册:

public class FluxMetricsFilter implements MeterFilter {
    private FluxMetricsConfigurationProperties fluxMetricsConfigurationProperties;

    public FluxMetricsFilter(FluxMetricsConfigurationProperties fluxMetricsConfigurationProperties) {
        this.fluxMetricsConfigurationProperties = fluxMetricsConfigurationProperties;
    }

    public DistributionStatisticConfig configure(Id id, DistributionStatisticConfig config) {
       ....
    }
}

过滤器在 Prometheus 注册表中注册,但是当使用它时命中指标时,metrics()它不使用 Prometheus 注册表而是使用全局注册表,Spring Boot 不会在全局级别注册过滤器:

在此处输入图像描述

因此,当我使用getOrCreateMeter方法时,我的过滤器列表为空: 在此处输入图像描述

我可以看到metrics()调用:

FluxMetrics(Flux<? extends T> flux) {
    this(flux, null);
}

/**
 * For testing purposes.
 *
 * @param registry the registry to use, or null for global one
 */
FluxMetrics(Flux<? extends T> flux, @Nullable MeterRegistry registry) {
    super(flux);

    this.name = resolveName(flux);
    this.tags = resolveTags(flux, DEFAULT_TAGS_FLUX, this.name);

    if (registry == null) {
        this.registryCandidate = Metrics.globalRegistry;
    }
    else {
        this.registryCandidate = registry;
    }
}

所以指标注册表总是全球性的?因为我没有找到对第二个构造函数的任何调用。所以我不能指定要使用的注册表?

我知道如果这样做:

  Metrics.globalRegistry.config().meterFilter(
            new MeterFilter() {
                @Override
                public DistributionStatisticConfig configure(Meter.Id id, DistributionStatisticConfig config) {
                   ...
                }
            });

它会起作用,但这不是春天的方式。任何人都可以帮助用 IoC 做正确的事吗?

4

1 回答 1

0

一切都按预期工作,我的错,我正在注册一个过滤器 Spring 方式,但我编写的过滤器应用程序条件是检查指标名称,诀窍是 Spring Reactor Metrics 具有相同的"reactor_flow.."名称,所以我正在寻找类似的"myCustomName"东西上面的那个字符串。

要区分流量指标,您需要改为检查标签。

除此之外,Spring 似乎为反应器流量指标提供了百分位数(因为这正是我的自定义过滤器所做的),因此对过滤器的需求可能不再合理。

由于我们是 WebFlux 和 Reactor 的早期 RELEASE 采用者,我不确定 Reactor 和 WebFlux 从一开始就支持百分位数。

于 2019-12-27T17:48:48.400 回答