Update InMemoryRichGaugeRepository to support increments

Closes gh-2902
This commit is contained in:
Andy Wilkinson 2017-01-17 17:15:26 +00:00
parent cb7ae2e60a
commit 5c9aa41c07
2 changed files with 39 additions and 7 deletions

View File

@ -1,5 +1,5 @@
/*
* Copyright 2012-2016 the original author or authors.
* Copyright 2012-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -24,19 +24,32 @@ import org.springframework.boot.actuate.metrics.writer.MetricWriter;
/**
* In memory implementation of {@link MetricWriter} and {@link RichGaugeReader}. When you
* set a metric value (using {@link MetricWriter#set(Metric)}) it is used to update a rich
* gauge (increment is a no-op). Gauge values can then be read out using the reader
* operations.
* {@link MetricWriter#set(Metric) set} or {@link MetricWriter#increment(Delta) increment}
* a metric value it is used to update a {@link RichGauge}. Gauge values can then be read
* out using the reader operations.
*
* @author Dave Syer
* @author Andy Wilkinson
*/
public class InMemoryRichGaugeRepository implements RichGaugeRepository {
private final SimpleInMemoryRepository<RichGauge> repository = new SimpleInMemoryRepository<RichGauge>();
@Override
public void increment(Delta<?> delta) {
// No-op
public void increment(final Delta<?> delta) {
this.repository.update(delta.getName(), new Callback<RichGauge>() {
@Override
public RichGauge modify(RichGauge current) {
double value = ((Number) delta.getValue()).doubleValue();
if (current == null) {
return new RichGauge(delta.getName(), value);
}
current.set(current.getValue() + value);
return current;
}
});
}
@Override

View File

@ -1,5 +1,5 @@
/*
* Copyright 2012-2016 the original author or authors.
* Copyright 2012-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -19,12 +19,16 @@ package org.springframework.boot.actuate.metrics.rich;
import org.junit.Test;
import org.springframework.boot.actuate.metrics.Metric;
import org.springframework.boot.actuate.metrics.writer.Delta;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.offset;
/**
* Tests for {@link InMemoryRichGaugeRepository}.
*
* @author Dave Syer
* @author Andy Wilkinson
*/
public class InMemoryRichGaugeRepositoryTests {
@ -38,4 +42,19 @@ public class InMemoryRichGaugeRepositoryTests {
assertThat(this.repository.findOne("foo").getValue()).isEqualTo(2d, offset(0.01));
}
@Test
public void incrementExisting() {
this.repository.set(new Metric<Double>("foo", 1d));
this.repository.increment(new Delta<Double>("foo", 2d));
assertThat(this.repository.findOne("foo").getCount()).isEqualTo(2L);
assertThat(this.repository.findOne("foo").getValue()).isEqualTo(3d, offset(0.01));
}
@Test
public void incrementNew() {
this.repository.increment(new Delta<Double>("foo", 2d));
assertThat(this.repository.findOne("foo").getCount()).isEqualTo(1L);
assertThat(this.repository.findOne("foo").getValue()).isEqualTo(2d, offset(0.01));
}
}