summaryrefslogtreecommitdiffstats
path: root/metrics
diff options
context:
space:
mode:
authorTor Brede Vekterli <vekterli@yahoo-inc.com>2016-11-25 16:02:12 +0100
committerTor Brede Vekterli <vekterli@yahoo-inc.com>2016-11-28 15:11:54 +0100
commite548190672bc4d23990507a81c336ed151753c13 (patch)
tree21078bf9dacdb36c52715b183a27e8f3d193c0f2 /metrics
parent76b0371e459d77ead9dd75fb7286a6a4d14a2555 (diff)
Let MetricTimer be target duration type agnostic
Will now transparently convert to the appropriate value with either truncation or floating point conversion, depending on the target type.
Diffstat (limited to 'metrics')
-rw-r--r--metrics/src/tests/CMakeLists.txt1
-rw-r--r--metrics/src/tests/metric_timer_test.cpp47
-rw-r--r--metrics/src/vespa/metrics/metrictimer.h13
3 files changed, 54 insertions, 7 deletions
diff --git a/metrics/src/tests/CMakeLists.txt b/metrics/src/tests/CMakeLists.txt
index fdc2f290be8..7e0414b1ca1 100644
--- a/metrics/src/tests/CMakeLists.txt
+++ b/metrics/src/tests/CMakeLists.txt
@@ -11,6 +11,7 @@ vespa_add_executable(metrics_testrunner_app TEST
snapshottest.cpp
stresstest.cpp
metrictest.cpp
+ metric_timer_test.cpp
DEPENDS
metrics
vdstestlib
diff --git a/metrics/src/tests/metric_timer_test.cpp b/metrics/src/tests/metric_timer_test.cpp
new file mode 100644
index 00000000000..da5ab0c3dfe
--- /dev/null
+++ b/metrics/src/tests/metric_timer_test.cpp
@@ -0,0 +1,47 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include <vespa/vdstestlib/cppunit/macros.h>
+#include <vespa/metrics/valuemetric.h>
+#include <vespa/metrics/metrictimer.h>
+#include <thread>
+
+namespace metrics {
+
+struct MetricTimerTest : public CppUnit::TestFixture {
+ CPPUNIT_TEST_SUITE(MetricTimerTest);
+ CPPUNIT_TEST(timer_duration_is_correct_for_double_value_metric);
+ CPPUNIT_TEST(timer_duration_is_correct_for_long_value_metric);
+ CPPUNIT_TEST_SUITE_END();
+
+ void timer_duration_is_correct_for_double_value_metric();
+ void timer_duration_is_correct_for_long_value_metric();
+
+ template <typename MetricType>
+ void do_test_metric_timer_for_metric_type();
+};
+
+CPPUNIT_TEST_SUITE_REGISTRATION(MetricTimerTest);
+
+using namespace std::literals::chrono_literals;
+
+template <typename MetricType>
+void MetricTimerTest::do_test_metric_timer_for_metric_type() {
+ MetricTimer timer;
+ MetricType metric("foo", "", "");
+ std::this_thread::sleep_for(5ms); // Guaranteed to be monotonic time
+ timer.stop(metric);
+ // getDoubleValue() is present for both long and double metric types
+ CPPUNIT_ASSERT(metric.getDoubleValue("last") >= 5.0);
+}
+
+void MetricTimerTest::timer_duration_is_correct_for_double_value_metric() {
+ do_test_metric_timer_for_metric_type<DoubleAverageMetric>();
+}
+
+void MetricTimerTest::timer_duration_is_correct_for_long_value_metric() {
+ do_test_metric_timer_for_metric_type<LongAverageMetric>();
+}
+
+} // metrics
+
diff --git a/metrics/src/vespa/metrics/metrictimer.h b/metrics/src/vespa/metrics/metrictimer.h
index 7228daced34..18eaf86ecae 100644
--- a/metrics/src/vespa/metrics/metrictimer.h
+++ b/metrics/src/vespa/metrics/metrictimer.h
@@ -14,8 +14,7 @@
namespace metrics {
-class MetricTimer
-{
+class MetricTimer {
public:
MetricTimer();
@@ -27,17 +26,17 @@ public:
* underflow or be affected by system clock changes.
*/
template<typename AvgVal, typename TotVal, bool SumOnAdd>
- uint64_t stop(ValueMetric<AvgVal, TotVal, SumOnAdd>& metric) {
+ AvgVal stop(ValueMetric<AvgVal, TotVal, SumOnAdd>& metric) {
const auto delta = std::chrono::steady_clock::now() - _startTime;
- const uint64_t deltaMs(
- std::chrono::duration_cast<std::chrono::milliseconds>(delta)
- .count());
+ using ToDuration = std::chrono::duration<AvgVal, std::milli>;
+ const auto deltaMs(
+ std::chrono::duration_cast<ToDuration>(delta).count());
metric.addValue(deltaMs);
return deltaMs;
}
private:
- std::chrono::time_point<std::chrono::steady_clock> _startTime;
+ std::chrono::steady_clock::time_point _startTime;
};
} // metrics