From 5c9aa41c07d220018061a97100265cc46fb5ba70 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Tue, 17 Jan 2017 17:15:26 +0000 Subject: [PATCH] Update InMemoryRichGaugeRepository to support increments Closes gh-2902 --- .../rich/InMemoryRichGaugeRepository.java | 25 ++++++++++++++----- .../InMemoryRichGaugeRepositoryTests.java | 21 +++++++++++++++- 2 files changed, 39 insertions(+), 7 deletions(-) diff --git a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/rich/InMemoryRichGaugeRepository.java b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/rich/InMemoryRichGaugeRepository.java index d80eb5aa346..34ca47fc421 100644 --- a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/rich/InMemoryRichGaugeRepository.java +++ b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/rich/InMemoryRichGaugeRepository.java @@ -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 repository = new SimpleInMemoryRepository(); @Override - public void increment(Delta delta) { - // No-op + public void increment(final Delta delta) { + this.repository.update(delta.getName(), new Callback() { + + @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 diff --git a/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/rich/InMemoryRichGaugeRepositoryTests.java b/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/rich/InMemoryRichGaugeRepositoryTests.java index 6c156bbd9a8..5afef238c52 100644 --- a/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/rich/InMemoryRichGaugeRepositoryTests.java +++ b/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/rich/InMemoryRichGaugeRepositoryTests.java @@ -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("foo", 1d)); + this.repository.increment(new Delta("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("foo", 2d)); + assertThat(this.repository.findOne("foo").getCount()).isEqualTo(1L); + assertThat(this.repository.findOne("foo").getValue()).isEqualTo(2d, offset(0.01)); + } + }