将自定义指标注册到Micrometer&春季启动2

时间:2018-05-16 07:39:54

标签: metrics spring-boot-actuator micrometer

我在向MeterRegistery注册自定义指标时遇到问题。

它看起来是Spring管理所有指标(70个东西),然后当控制权回到我身边时,我也试图注册我自己:

    public MetricsAwareActiveTasksRepository(ActiveTasksRepository activeTasksRepository, MeterRegistry meterRegistry) {
    this.activeTasksRepository = activeTasksRepository;

    this.createdTaskIdsCounter = meterRegistry.counter(CustomBusinessMetrics.CREATED_TASK_IDS_COUNTER);
    this.autoStoppedTasksCounter = meterRegistry.counter(CustomBusinessMetrics.AUTO_STOPPED_TASKS_COUNTER);
}

不幸的是,在我的第一个指标被注册时,流程以微米为单位挂起:

    private Meter getOrCreateMeter(@Nullable DistributionStatisticConfig config,
                               BiFunction<Id, /*Nullable Generic*/ DistributionStatisticConfig, Meter> builder,
                               Id originalId, Id mappedId, Function<Meter.Id, ? extends Meter> noopBuilder) {
    Meter m = meterMap.get(mappedId);

    if (m == null) {
        if (isClosed()) {
            return noopBuilder.apply(mappedId);
        }

        synchronized (meterMapLock) {
            m = meterMap.get(mappedId);

            if (m == null) {
                if (!accept(originalId)) {
                    //noinspection unchecked
                    return noopBuilder.apply(mappedId);
                }

                if (config != null) {
                    for (MeterFilter filter : filters) {
                        DistributionStatisticConfig filteredConfig = filter.configure(mappedId, config);
                        if (filteredConfig != null) {
                            config = filteredConfig;
                        }
                    }
                }

                m = builder.apply(mappedId, config);
                meterMap = meterMap.plus(mappedId, m);
                for (Consumer<Meter> onAdd : meterAddedListeners) {
                    onAdd.accept(m);
                }
            }
        }
    }

    return m;
}

可以从调试器跟踪的最后一行是synchronized块启动的位置。从调试器我看到主线程变成ZOMBIE,没有更多的事情发生。锁定未被释放。

有没有人有这种问题?我在这里做错了吗?

BTW这里的配置也是:

    @Bean
CloudWatchMeterRegistry cloudWatchMeterRegistry(CloudWatchConfigProperties config, AmazonCloudWatchAsync amazonCloudWatch) {
    CloudWatchMeterRegistry meterRegistry = new CloudWatchMeterRegistry(config, Clock.SYSTEM, amazonCloudWatch);
    meterRegistry.config().commonTags(commonTags());
    return meterRegistry;
}

正如你所看到的,我也尝试注册一些&#34; custom&#34;在Spring之前的指标并且它成功了,但它并没有改变以后这是不可能的情况。

在启用DEBUG记录器之后,千分尺库什么也没说,实际上永久挂起的最后日志是来自spring bean生命周期方法的日志,比如自动装配这个注册新指标的特定构造函数。

版本是:spring-boot:2.0.2,千分尺1.0.4

提前感谢任何想法。

0 个答案:

没有答案