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