Analytics: prevent metrics duplication if multiple meter registries and the compositemeterregistry are present

This commit is contained in:
Christian Tzolov
2020-12-09 12:52:09 +01:00
parent 3bd516cb4e
commit 0d6c21b405

View File

@@ -27,11 +27,13 @@ import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicLong;
import java.util.function.Consumer;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import io.micrometer.core.instrument.Meter;
import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.Tag;
import io.micrometer.core.instrument.Tags;
import io.micrometer.core.instrument.composite.CompositeMeterRegistry;
import io.micrometer.core.instrument.simple.SimpleMeterRegistry;
import org.springframework.beans.factory.annotation.Qualifier;
@@ -63,6 +65,14 @@ public class AnalyticsConsumerConfiguration {
public Consumer<Message<?>> analyticsConsumer(AnalyticsConsumerProperties properties, MeterRegistry[] meterRegistries,
@Lazy @Qualifier(SpelExpressionConverterConfiguration.INTEGRATION_EVALUATION_CONTEXT) EvaluationContext context) {
// If the CompositeMeterRegistry is present the it already contains all non-composite registries.
// In this case we override the input meterRegistries to use the CompositeMeterRegistry only.
final MeterRegistry[] finalMeterRegistries = Stream.of(meterRegistries)
.filter(CompositeMeterRegistry.class::isInstance)
.findFirst()
.map(meterRegistry -> new MeterRegistry[] { meterRegistry })
.orElse(meterRegistries);
return message -> {
CharSequence meterNameRaw = properties.getComputedNameExpression().getValue(context, message, CharSequence.class);
@@ -87,7 +97,7 @@ public class AnalyticsConsumerConfiguration {
allGroupedTags.putAll(groupedTags);
}
this.recordMetrics(meterRegistries, meterName, fixedTags, allGroupedTags, amount, properties.getMeterType());
this.recordMetrics(finalMeterRegistries, meterName, fixedTags, allGroupedTags, amount, properties.getMeterType());
};
}
@@ -136,8 +146,8 @@ public class AnalyticsConsumerConfiguration {
}
}
private void recordMetrics(MeterRegistry[] meterRegistries, String meterName, Tags fixedTags, Map<String,
List<Tag>> groupedTags, double amount, AnalyticsConsumerProperties.MeterType meterType) {
private void recordMetrics(MeterRegistry[] meterRegistries, String meterName, Tags fixedTags,
Map<String, List<Tag>> groupedTags, double amount, AnalyticsConsumerProperties.MeterType meterType) {
if (!CollectionUtils.isEmpty(groupedTags)) {
groupedTags.values().stream().map(List::size).max(Integer::compareTo).ifPresent(
max -> {