diff options
author | Tor Brede Vekterli <vekterli@yahoo-inc.com> | 2016-11-25 16:02:12 +0100 |
---|---|---|
committer | Tor Brede Vekterli <vekterli@yahoo-inc.com> | 2016-11-28 15:11:54 +0100 |
commit | e548190672bc4d23990507a81c336ed151753c13 (patch) | |
tree | 21078bf9dacdb36c52715b183a27e8f3d193c0f2 /metrics/src | |
parent | 76b0371e459d77ead9dd75fb7286a6a4d14a2555 (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/src')
-rw-r--r-- | metrics/src/tests/CMakeLists.txt | 1 | ||||
-rw-r--r-- | metrics/src/tests/metric_timer_test.cpp | 47 | ||||
-rw-r--r-- | metrics/src/vespa/metrics/metrictimer.h | 13 |
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 |