如何在发布 NewRelicMeterRegistry 时过滤 meter

How to filter meters when publishing NewRelicMeterRegistry

我正在使用自定义计时器通过千分尺检测大量字段。理想情况下,我不希望为此特定仪表报告的指标在配置的步长间隔之间的计数为零。这并不重要,但希望能够减少每 x 秒发送到 NR 的内容的噪音。

我在 NewRelicMeterRegistry 之外创建了一个扩展,它覆盖了 publish() 方法以在默认行为之前添加功能。


public class FilteringNewRelicMeterRegistry extends NewRelicMeterRegistry {

    public FilteringNewRelicMeterRegistry(NewRelicConfig config, Clock clock) {
        super(config, clock);
    }

    /**
     * Remove field metrics that have not been used since the last publish.
     */
    @Override
    protected void publish() {
        getMeters().stream()
                .filter(filterByMeterId(...)))
                .filter(meter -> ((Timer) meter).count() == 0)
                .forEach(this::remove);
        super.publish();
    }
}

但对于我来说,我无法弄清楚如何让自动配置更喜欢此实现而不是默认实现 NewRelicMeterRegistry

如何获得 spring-boot 或 micrometer 来支持我的实现并将其用作应用程序上下文中的指定 bean 以实现自动装配目的?

此外,如果有一种开箱即用的方法可以通过千分尺抽象或实用程序来覆盖此行为,那就太棒了,那就更好了!请告诉我。我试过使用 MeterRegistryCustomizer,但似乎没有我需要的东西。

我想避免通过 @Scheduled 使用 Spring 的日程安排功能,想在 "on publish" 的基础上使用。

如果你不想默认自动配置禁用默认

@SpringBootApplication(exclude = { NewRelicMetricsExportAutoConfiguration.class })

并使用 StepMeterRegistry 扩展您的 FilteringNewRelicMeterRegistry class 并根据您的职责进行配置,因为 StepMeterRegistry 是 MeterRegistry 的子class并且千分尺检测您的配置

使用此配置注册您的自定义配置后class 与 NewRelicMetricsExportAutoConfiguration 相同 StepMeterRegistry 需要 StepRegistryConfig 和 Clock 使用默认的 NewRelicConfig 和时钟并像这样注册,我阅读 NewRelicMetricsExportAutoConfiguration 并像这样简化配置

@Configuration(proxyBeanMethods = false)
@AutoConfigureBefore({ CompositeMeterRegistryAutoConfiguration.class, SimpleMetricsExportAutoConfiguration.class })
@AutoConfigureAfter(MetricsAutoConfiguration.class)
@ConditionalOnProperty(prefix = "management.metrics.export.newrelic", name = "enabled", havingValue = "true",
        matchIfMissing = true)
@EnableConfigurationProperties(NewRelicProperties.class)
public class FilteringNewRelicConfiguration {

    private final NewRelicProperties properties;

    public FilteringNewRelicConfiguration(NewRelicProperties properties) {
        this.properties = properties;
    }

    @Bean
    public NewRelicConfig newRelicConfig() {
        return new NewRelicPropertiesConfigAdapter(this.properties);
    }

    @Bean
    public FilteringNewRelicMeterRegistry filteringNewRelicMeterRegistry(NewRelicConfig newRelicConfig, Clock clock) {
        return new FilteringNewRelicMeterRegistry(newRelicConfig, clock)

    }

}