mirror of
https://github.com/Sheldan/abstracto.git
synced 2026-01-27 06:04:54 +00:00
[AB-353] reducing chance of concurrent modification exception when registering a new metric on the fly
This commit is contained in:
@@ -33,9 +33,9 @@ public class JDAMetrics extends ListenerAdapter {
|
|||||||
.tagList(Arrays.asList(MetricTag.getTag(EVENT_CLASS, eventName)))
|
.tagList(Arrays.asList(MetricTag.getTag(EVENT_CLASS, eventName)))
|
||||||
.name(JDA_EVENT_METRIC)
|
.name(JDA_EVENT_METRIC)
|
||||||
.build();
|
.build();
|
||||||
log.info("Registering new metric for event {}. There are now {} metrics.", eventName, coveredEvents.size());
|
|
||||||
metricService.registerCounter(metric, "Events of type " + eventName);
|
metricService.registerCounter(metric, "Events of type " + eventName);
|
||||||
coveredEvents.put(event.getClass(), metric);
|
coveredEvents.put(event.getClass(), metric);
|
||||||
|
log.info("Registering new metric for event {}. There are now {} metrics.", eventName, coveredEvents.size());
|
||||||
}
|
}
|
||||||
metricService.incrementCounter(coveredEvents.get(event.getClass()));
|
metricService.incrementCounter(coveredEvents.get(event.getClass()));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import org.springframework.beans.factory.annotation.Autowired;
|
|||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
@@ -15,26 +16,28 @@ import java.util.function.ToDoubleFunction;
|
|||||||
@Slf4j
|
@Slf4j
|
||||||
public class PrometheusMetricServiceBean implements MetricService {
|
public class PrometheusMetricServiceBean implements MetricService {
|
||||||
|
|
||||||
private final List<Counter> counters = new ArrayList<>();
|
private final List<Counter> counters = Collections.synchronizedList(new ArrayList<>());
|
||||||
private final List<Gauge> gauges = new ArrayList<>();
|
private final List<Gauge> gauges = Collections.synchronizedList(new ArrayList<>());
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private MeterRegistry registry;
|
private MeterRegistry registry;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void registerCounter(CounterMetric metric, String description) {
|
public void registerCounter(CounterMetric metric, String description) {
|
||||||
if(doesCounterExist(metric)) {
|
synchronized (counters) {
|
||||||
throw new IllegalArgumentException("Counter metric already exists.");
|
if(doesCounterExist(metric)) {
|
||||||
|
throw new IllegalArgumentException("Counter metric already exists.");
|
||||||
|
}
|
||||||
|
List<Tag> micrometerTags = new ArrayList<>();
|
||||||
|
metric.getTagList().forEach(metricTag ->
|
||||||
|
micrometerTags.add(Tag.of(metricTag.getKey(), metricTag.getValue()))
|
||||||
|
);
|
||||||
|
Counter counter = Counter.builder(metric.getName())
|
||||||
|
.tags(micrometerTags)
|
||||||
|
.description(description)
|
||||||
|
.register(registry);
|
||||||
|
counters.add(counter);
|
||||||
}
|
}
|
||||||
List<Tag> micrometerTags = new ArrayList<>();
|
|
||||||
metric.getTagList().forEach(metricTag ->
|
|
||||||
micrometerTags.add(Tag.of(metricTag.getKey(), metricTag.getValue()))
|
|
||||||
);
|
|
||||||
Counter counter = Counter.builder(metric.getName())
|
|
||||||
.tags(micrometerTags)
|
|
||||||
.description(description)
|
|
||||||
.register(registry);
|
|
||||||
counters.add(counter);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -44,18 +47,20 @@ public class PrometheusMetricServiceBean implements MetricService {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void registerGauge(CounterMetric counterMetric, Supplier<Number> f, String help, String baseUnit) {
|
public void registerGauge(CounterMetric counterMetric, Supplier<Number> f, String help, String baseUnit) {
|
||||||
List<Tag> micrometerTags = new ArrayList<>();
|
synchronized (gauges) {
|
||||||
counterMetric.getTagList().forEach(metricTag ->
|
List<Tag> micrometerTags = new ArrayList<>();
|
||||||
micrometerTags.add(Tag.of(metricTag.getKey(), metricTag.getValue()))
|
counterMetric.getTagList().forEach(metricTag ->
|
||||||
);
|
micrometerTags.add(Tag.of(metricTag.getKey(), metricTag.getValue()))
|
||||||
|
);
|
||||||
|
Gauge gauge = Gauge
|
||||||
|
.builder(counterMetric.getName(), f)
|
||||||
|
.tags(micrometerTags)
|
||||||
|
.baseUnit(baseUnit)
|
||||||
|
.description(help)
|
||||||
|
.register(registry);
|
||||||
|
gauges.add(gauge);
|
||||||
|
}
|
||||||
|
|
||||||
Gauge gauge = Gauge
|
|
||||||
.builder(counterMetric.getName(), f)
|
|
||||||
.tags(micrometerTags)
|
|
||||||
.baseUnit(baseUnit)
|
|
||||||
.description(help)
|
|
||||||
.register(registry);
|
|
||||||
gauges.add(gauge);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -65,18 +70,19 @@ public class PrometheusMetricServiceBean implements MetricService {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public <T> void registerGauge(CounterMetric counterMetric, T obj, ToDoubleFunction<T> f, String help, String baseUnit) {
|
public <T> void registerGauge(CounterMetric counterMetric, T obj, ToDoubleFunction<T> f, String help, String baseUnit) {
|
||||||
List<Tag> micrometerTags = new ArrayList<>();
|
synchronized (gauges) {
|
||||||
counterMetric.getTagList().forEach(metricTag ->
|
List<Tag> micrometerTags = new ArrayList<>();
|
||||||
micrometerTags.add(Tag.of(metricTag.getKey(), metricTag.getValue()))
|
counterMetric.getTagList().forEach(metricTag ->
|
||||||
);
|
micrometerTags.add(Tag.of(metricTag.getKey(), metricTag.getValue()))
|
||||||
|
);
|
||||||
Gauge gauge = Gauge
|
Gauge gauge = Gauge
|
||||||
.builder(counterMetric.getName(), obj, f)
|
.builder(counterMetric.getName(), obj, f)
|
||||||
.tags(micrometerTags)
|
.tags(micrometerTags)
|
||||||
.baseUnit(baseUnit)
|
.baseUnit(baseUnit)
|
||||||
.description(help)
|
.description(help)
|
||||||
.register(registry);
|
.register(registry);
|
||||||
gauges.add(gauge);
|
gauges.add(gauge);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -86,10 +92,12 @@ public class PrometheusMetricServiceBean implements MetricService {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void incrementCounter(CounterMetric counterMetric, Long amount) {
|
public void incrementCounter(CounterMetric counterMetric, Long amount) {
|
||||||
Optional<Counter> counterOptional = counters.stream().filter(counter -> compareCounterIdAndCounterMetric(counter.getId(), counterMetric)).findFirst();
|
synchronized (counters) {
|
||||||
counterOptional.ifPresent(counter -> counter.increment(amount));
|
Optional<Counter> counterOptional = counters.stream().filter(counter -> compareCounterIdAndCounterMetric(counter.getId(), counterMetric)).findFirst();
|
||||||
if(!counterOptional.isPresent()) {
|
counterOptional.ifPresent(counter -> counter.increment(amount));
|
||||||
log.warn("Trying to increment counter {} with tags {}, which was not available (yet).", counterMetric.getName(), String.join(counterMetric.getTagList().toString()));
|
if(!counterOptional.isPresent()) {
|
||||||
|
log.warn("Trying to increment counter {} with tags {}, which was not available (yet).", counterMetric.getName(), String.join(counterMetric.getTagList().toString()));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user