From 0377e3ec5c597c628173741eec835c046af70b16 Mon Sep 17 00:00:00 2001 From: rob bygrave Date: Fri, 21 Dec 2018 02:10:16 +1300 Subject: [PATCH] #1586 - ENH: Add TimedMetric.addSinceNanos() ... as a helper when using start nanos --- .../java/io/ebean/metric/TimedMetric.java | 5 ++++ .../java/io/ebean/metric/TimedMetricMap.java | 5 ++++ .../server/profile/DTimedMetric.java | 5 ++++ .../server/profile/DTimedMetricMap.java | 5 ++++ .../ImplicitReadOnlyTransaction.java | 3 +- .../server/profile/DTimedMetricMapTest.java | 29 +++++++++++++++++++ .../server/profile/DTimedMetricTest.java | 26 +++++++++++++++++ 7 files changed, 76 insertions(+), 2 deletions(-) create mode 100644 src/test/java/io/ebeaninternal/server/profile/DTimedMetricMapTest.java create mode 100644 src/test/java/io/ebeaninternal/server/profile/DTimedMetricTest.java diff --git a/src/main/java/io/ebean/metric/TimedMetric.java b/src/main/java/io/ebean/metric/TimedMetric.java index cd943375f..6a142bfe2 100644 --- a/src/main/java/io/ebean/metric/TimedMetric.java +++ b/src/main/java/io/ebean/metric/TimedMetric.java @@ -17,6 +17,11 @@ public interface TimedMetric { */ void add(long micros, long beans); + /** + * Add a time event given the start nanos. + */ + void addSinceNanos(long startNanos); + /** * Return true if there are no metrics collected since the last collection. */ diff --git a/src/main/java/io/ebean/metric/TimedMetricMap.java b/src/main/java/io/ebean/metric/TimedMetricMap.java index 70436f21a..5b6fccdb2 100644 --- a/src/main/java/io/ebean/metric/TimedMetricMap.java +++ b/src/main/java/io/ebean/metric/TimedMetricMap.java @@ -7,6 +7,11 @@ import io.ebean.meta.MetricVisitor; */ public interface TimedMetricMap { + /** + * Add a time event given the start nanos. + */ + void addSinceNanos(String key, long startNanos); + /** * Add an execution for the given key. */ diff --git a/src/main/java/io/ebeaninternal/server/profile/DTimedMetric.java b/src/main/java/io/ebeaninternal/server/profile/DTimedMetric.java index e7eb4096d..cb1c4b4c4 100644 --- a/src/main/java/io/ebeaninternal/server/profile/DTimedMetric.java +++ b/src/main/java/io/ebeaninternal/server/profile/DTimedMetric.java @@ -35,6 +35,11 @@ class DTimedMetric implements TimedMetric { this.name = name; } + @Override + public void addSinceNanos(long startNanos) { + add((System.nanoTime() - startNanos) / 1000L); + } + /** * Add a value. Usually the value is Time or Bytes etc. */ diff --git a/src/main/java/io/ebeaninternal/server/profile/DTimedMetricMap.java b/src/main/java/io/ebeaninternal/server/profile/DTimedMetricMap.java index f9e6a8472..c5c4ffdc8 100644 --- a/src/main/java/io/ebeaninternal/server/profile/DTimedMetricMap.java +++ b/src/main/java/io/ebeaninternal/server/profile/DTimedMetricMap.java @@ -19,6 +19,11 @@ class DTimedMetricMap implements TimedMetricMap { this.name = name; } + @Override + public void addSinceNanos(String key, long startNanos) { + add(key, (System.nanoTime() - startNanos)/1000L); + } + @Override public void add(String key, long exeMicros) { map.computeIfAbsent(key, (k) -> new DTimedMetric(metricType, name + key)).add(exeMicros); diff --git a/src/main/java/io/ebeaninternal/server/transaction/ImplicitReadOnlyTransaction.java b/src/main/java/io/ebeaninternal/server/transaction/ImplicitReadOnlyTransaction.java index 5241aa90e..907db2256 100644 --- a/src/main/java/io/ebeaninternal/server/transaction/ImplicitReadOnlyTransaction.java +++ b/src/main/java/io/ebeaninternal/server/transaction/ImplicitReadOnlyTransaction.java @@ -512,8 +512,7 @@ class ImplicitReadOnlyTransaction implements SpiTransaction, TxnProfileEventCode } connection = null; active = false; - long exeMicros = (System.nanoTime() - startNanos) / 1000L; - manager.collectMetricReadOnly(exeMicros); + manager.collectMetricReadOnly((System.nanoTime() - startNanos) / 1000L); } /** diff --git a/src/test/java/io/ebeaninternal/server/profile/DTimedMetricMapTest.java b/src/test/java/io/ebeaninternal/server/profile/DTimedMetricMapTest.java new file mode 100644 index 000000000..7b1c3f713 --- /dev/null +++ b/src/test/java/io/ebeaninternal/server/profile/DTimedMetricMapTest.java @@ -0,0 +1,29 @@ +package io.ebeaninternal.server.profile; + +import io.ebean.meta.BasicMetricVisitor; +import io.ebean.meta.MetaTimedMetric; +import io.ebean.meta.MetricType; +import org.junit.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +public class DTimedMetricMapTest { + + @Test + public void addSinceNanos() throws InterruptedException { + + DTimedMetricMap metricMap = new DTimedMetricMap(MetricType.L2, "addSinceNanos"); + + long nanos = System.nanoTime(); + Thread.sleep(10); + + metricMap.addSinceNanos("some", nanos); + + BasicMetricVisitor visitor = new BasicMetricVisitor(); + metricMap.visit(visitor); + + MetaTimedMetric timedMetric = visitor.getTimedMetrics().get(0); + assertThat(timedMetric.getCount()).isEqualTo(1); + assertThat(timedMetric.getTotal()).isGreaterThan(10); + } +} diff --git a/src/test/java/io/ebeaninternal/server/profile/DTimedMetricTest.java b/src/test/java/io/ebeaninternal/server/profile/DTimedMetricTest.java new file mode 100644 index 000000000..1ec6d4f55 --- /dev/null +++ b/src/test/java/io/ebeaninternal/server/profile/DTimedMetricTest.java @@ -0,0 +1,26 @@ +package io.ebeaninternal.server.profile; + +import io.ebean.meta.MetricType; +import org.junit.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +public class DTimedMetricTest { + + @Test + public void addSinceNanos() throws InterruptedException { + + DTimedMetric metric = new DTimedMetric(MetricType.L2, "addSinceNanos"); + + long start = System.nanoTime(); + Thread.sleep(10); + + metric.addSinceNanos(start); + + DTimeMetricStats stats = metric.collect(true); + assertThat(stats.getCount()).isEqualTo(1); + assertThat(stats.getTotal()).isGreaterThan(10); + assertThat(stats.getMax()).isEqualTo(stats.getTotal()); + + } +}