千分尺的弹簧引导在嵌套的Prometheus注册表中过滤器不是全局的,在创建度量标准时会被忽略吗?

时间:2019-12-11 11:08:47

标签: spring-boot micrometer spring-micrometer

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

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不在全局级别注册过滤器:

enter image description here

因此,当我进入getOrCreateMeter方法时,我的过滤器列表为空: enter image description here

我可以看到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) {
                   ...
                }
            });

它将起作用,但这不是Spring的方式。任何人都可以帮助使用IoC做到这一点吗?

1 个答案:

答案 0 :(得分:0)

一切正常,我不好,我正在注册一个过滤器Spring方法,但是我写的过滤器应用程序条件是检查度量标准名称,诀窍是Spring Reactor度量标准都具有相同的名称"reactor_flow..",所以我在上面的字符串中搜索类似"myCustomName"的东西。

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

除此之外,Spring似乎为反应堆流量指标提供了百分位数(因为这正是我的自定义过滤器正在执行的操作),因此不再需要过滤器。

由于我们是WebFlux和Reactor的早期发布者,所以我不确定从一开始就对Reactor&WebFlux有百分位数的支持。