我在向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
提前感谢任何想法。