Проблемы с регистрацией пользовательских метрик в Micrometer & Spring Boot 2 - PullRequest
0 голосов
/ 16 мая 2018

У меня проблемы с регистрацией пользовательских метрик в 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;
}

Последняя строка, которую можно отслеживать сОтладчик - это то место, где начинается синхронизированный блок.Из отладчика я вижу, что основной поток становится ZOMBIE, и больше ничего не происходит.Блокировка не снимается.

У кого-нибудь были такие проблемы?Я что-то здесь не так делаю?

Кстати. Вот еще и конфиг:

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

Как вы можете видеть, я также пытался зарегистрировать некоторые "пользовательские" метрики до того, как Spring это сделает, и это успешно, однаконе меняет ситуацию, что позже это невозможно.

Кроме того, после включения регистратора DEBUG библиотека микрометров ничего не говорит, последние журналы перед фактическим зависанием - это журналы из методов жизненного цикла пружинных компонентов, таких как автопроводка этого конкретногоКонструктор, который регистрирует новые метрики.

Версии: spring-boot: 2.0.2, микрометр 1.0.4

Заранее спасибо за любые идеи.

...