From e76ad1815fe7610799e25312154fd0cb25b926e7 Mon Sep 17 00:00:00 2001 From: Arthur Gavlyukovskiy Date: Wed, 30 Aug 2017 01:39:37 +0300 Subject: [PATCH] Added increment/decrement by delta to CounterService and implementations --- .../boot/actuate/metrics/CounterService.java | 26 +++++++++++++++++++ .../metrics/buffer/BufferCounterService.java | 13 ++++++++++ .../dropwizard/DropwizardMetricServices.java | 12 +++++++++ .../metrics/writer/DefaultCounterService.java | 13 ++++++++++ .../DropwizardMetricServicesTests.java | 6 +++++ .../writer/DefaultCounterServiceTests.java | 16 ++++++++++++ 6 files changed, 86 insertions(+) diff --git a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/CounterService.java b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/CounterService.java index aae0921f912c..ced587ebdbea 100644 --- a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/CounterService.java +++ b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/CounterService.java @@ -16,6 +16,8 @@ package org.springframework.boot.actuate.metrics; +import org.springframework.util.Assert; + /** * A service that can be used to increment, decrement and reset a named counter value. * @@ -29,12 +31,36 @@ public interface CounterService { */ void increment(String metricName); + /** + * Increment the specified counter by delta. + * @param metricName the name of the counter + * @param delta the amount to increment by + */ + default void increment(String metricName, long delta) { + Assert.state(delta > 0, "Delta should be greater than 0"); + for (int i = 0; i < delta; i++) { + increment(metricName); + } + } + /** * Decrement the specified counter by 1. * @param metricName the name of the counter */ void decrement(String metricName); + /** + * Decrement the specified counter by delta. + * @param metricName the name of the counter + * @param delta the amount to decrement by + */ + default void decrement(String metricName, long delta) { + Assert.state(delta > 0, "Delta should be greater than 0"); + for (int i = 0; i < delta; i++) { + decrement(metricName); + } + } + /** * Reset the specified counter. * @param metricName the name of the counter diff --git a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/buffer/BufferCounterService.java b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/buffer/BufferCounterService.java index 0ffa20dc85ab..9889b553d737 100644 --- a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/buffer/BufferCounterService.java +++ b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/buffer/BufferCounterService.java @@ -19,6 +19,7 @@ import java.util.concurrent.ConcurrentHashMap; import org.springframework.boot.actuate.metrics.CounterService; +import org.springframework.util.Assert; /** * Fast implementation of {@link CounterService} using {@link CounterBuffers}. @@ -45,11 +46,23 @@ public void increment(String metricName) { this.buffers.increment(wrap(metricName), 1L); } + @Override + public void increment(String metricName, long delta) { + Assert.state(delta > 0, "Delta should be greater than 0"); + this.buffers.increment(wrap(metricName), delta); + } + @Override public void decrement(String metricName) { this.buffers.increment(wrap(metricName), -1L); } + @Override + public void decrement(String metricName, long delta) { + Assert.state(delta > 0, "Delta should be greater than 0"); + this.buffers.increment(wrap(metricName), -delta); + } + @Override public void reset(String metricName) { this.buffers.reset(wrap(metricName)); diff --git a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/dropwizard/DropwizardMetricServices.java b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/dropwizard/DropwizardMetricServices.java index 64d11a5605f8..ba31020959cc 100644 --- a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/dropwizard/DropwizardMetricServices.java +++ b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/dropwizard/DropwizardMetricServices.java @@ -89,11 +89,23 @@ public void increment(String name) { incrementInternal(name, 1L); } + @Override + public void increment(String name, long delta) { + Assert.state(delta > 0, "Delta should be greater than 0"); + incrementInternal(name, delta); + } + @Override public void decrement(String name) { incrementInternal(name, -1L); } + @Override + public void decrement(String name, long delta) { + Assert.state(delta > 0, "Delta should be greater than 0"); + incrementInternal(name, -delta); + } + private void incrementInternal(String name, long value) { if (name.startsWith("meter")) { Meter meter = this.registry.meter(name); diff --git a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/writer/DefaultCounterService.java b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/writer/DefaultCounterService.java index 2151705f76c8..c1c4f3056ad1 100644 --- a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/writer/DefaultCounterService.java +++ b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/metrics/writer/DefaultCounterService.java @@ -19,6 +19,7 @@ import java.util.concurrent.ConcurrentHashMap; import org.springframework.boot.actuate.metrics.CounterService; +import org.springframework.util.Assert; /** * Default implementation of {@link CounterService}. @@ -44,11 +45,23 @@ public void increment(String metricName) { this.writer.increment(new Delta<>(wrap(metricName), 1L)); } + @Override + public void increment(String metricName, long delta) { + Assert.state(delta > 0, "Delta should be greater than 0"); + this.writer.increment(new Delta<>(wrap(metricName), delta)); + } + @Override public void decrement(String metricName) { this.writer.increment(new Delta<>(wrap(metricName), -1L)); } + @Override + public void decrement(String metricName, long delta) { + Assert.state(delta > 0, "Delta should be greater than 0"); + this.writer.increment(new Delta<>(wrap(metricName), -delta)); + } + @Override public void reset(String metricName) { this.writer.reset(wrap(metricName)); diff --git a/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/dropwizard/DropwizardMetricServicesTests.java b/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/dropwizard/DropwizardMetricServicesTests.java index 83485f2aa3b7..9752f7651c91 100644 --- a/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/dropwizard/DropwizardMetricServicesTests.java +++ b/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/dropwizard/DropwizardMetricServicesTests.java @@ -64,6 +64,12 @@ public void incrementCounter() { assertThat(this.registry.counter("counter.foo").getCount()).isEqualTo(3); } + @Test + public void incrementCounterWithDelta() { + this.writer.increment("foo", 3L); + assertThat(this.registry.counter("counter.foo").getCount()).isEqualTo(3); + } + @Test public void updatePredefinedMeter() { this.writer.increment("meter.foo"); diff --git a/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/writer/DefaultCounterServiceTests.java b/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/writer/DefaultCounterServiceTests.java index 0aa4ada20216..ea7e3e2195c3 100644 --- a/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/writer/DefaultCounterServiceTests.java +++ b/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/metrics/writer/DefaultCounterServiceTests.java @@ -78,6 +78,22 @@ public void decrementPrependsCounter() { assertThat(this.captor.getValue().getValue()).isEqualTo(-1L); } + @Test + public void incrementCounterWithDelta() { + this.service.increment("foo", 42L); + verify(this.repository).increment(this.captor.capture()); + assertThat(this.captor.getValue().getName()).isEqualTo("counter.foo"); + assertThat(this.captor.getValue().getValue()).isEqualTo(42L); + } + + @Test + public void decrementCounterWithDelta() { + this.service.decrement("foo", 42L); + verify(this.repository).increment(this.captor.capture()); + assertThat(this.captor.getValue().getName()).isEqualTo("counter.foo"); + assertThat(this.captor.getValue().getValue()).isEqualTo(-42L); + } + @Test public void resetResetsCounter() throws Exception { this.service.reset("foo");