aboutsummaryrefslogtreecommitdiffstats
path: root/metrics
diff options
context:
space:
mode:
authorTor Egge <Tor.Egge@online.no>2021-06-11 13:09:09 +0200
committerTor Egge <Tor.Egge@online.no>2021-06-11 13:09:09 +0200
commit9b9be6defb78e8814a93f7833e1afdcff05f43dc (patch)
treedf0fd5ab24ea37503eb634ea3e0d55a76285ab61 /metrics
parentf511cfe7463eb65373e3e234567bd1da4a717774 (diff)
Detect argument to addToPart being a sum metric.
Diffstat (limited to 'metrics')
-rw-r--r--metrics/src/tests/summetrictest.cpp41
-rw-r--r--metrics/src/vespa/metrics/metric.cpp7
-rw-r--r--metrics/src/vespa/metrics/metric.h2
-rw-r--r--metrics/src/vespa/metrics/summetric.h1
-rw-r--r--metrics/src/vespa/metrics/summetric.hpp13
5 files changed, 62 insertions, 2 deletions
diff --git a/metrics/src/tests/summetrictest.cpp b/metrics/src/tests/summetrictest.cpp
index e3d58659daf..d0380a630f1 100644
--- a/metrics/src/tests/summetrictest.cpp
+++ b/metrics/src/tests/summetrictest.cpp
@@ -125,4 +125,45 @@ TEST(SumMetricTest, test_start_value)
EXPECT_EQ(int64_t(60), sum.getLongValue("value"));
}
+namespace {
+
+struct MetricSetWithSum : public MetricSet
+{
+ LongValueMetric _v1;
+ LongValueMetric _v2;
+ SumMetric<LongValueMetric> _sum;
+ MetricSetWithSum();
+ ~MetricSetWithSum() override;
+};
+
+MetricSetWithSum::MetricSetWithSum()
+ : MetricSet("MetricSetWithSum", {}, ""),
+ _v1("v1", {}, "", this),
+ _v2("v2", {}, "", this),
+ _sum("sum", {}, "", this)
+{
+ _sum.addMetricToSum(_v1);
+ _sum.addMetricToSum(_v2);
+}
+
+MetricSetWithSum::~MetricSetWithSum() = default;
+
+}
+
+TEST(SumMetricTest, test_nested_sum)
+{
+ MetricSetWithSum w1;
+ MetricSetWithSum w2;
+ MetricSetWithSum sum;
+ w1._v1.addValue(10);
+ w1._v2.addValue(13);
+ w2._v1.addValue(27);
+ w2._v2.addValue(29);
+ w1.addToPart(sum);
+ w2.addToPart(sum);
+ EXPECT_EQ(int64_t(37), sum._v1.getLongValue("value"));
+ EXPECT_EQ(int64_t(42), sum._v2.getLongValue("value"));
+ EXPECT_EQ(int64_t(79), sum._sum.getLongValue("value"));
+}
+
}
diff --git a/metrics/src/vespa/metrics/metric.cpp b/metrics/src/vespa/metrics/metric.cpp
index a8d8194b26d..50fc36c62cb 100644
--- a/metrics/src/vespa/metrics/metric.cpp
+++ b/metrics/src/vespa/metrics/metric.cpp
@@ -232,4 +232,11 @@ Metric::assignValues(const Metric& m) {
assert(ownerList.empty());
return this;
}
+
+bool
+Metric::is_sum_metric() const
+{
+ return false;
+}
+
} // metrics
diff --git a/metrics/src/vespa/metrics/metric.h b/metrics/src/vespa/metrics/metric.h
index 10b74a2da22..c8fb3031278 100644
--- a/metrics/src/vespa/metrics/metric.h
+++ b/metrics/src/vespa/metrics/metric.h
@@ -247,6 +247,8 @@ public:
virtual bool isMetricSet() const { return false; }
+ virtual bool is_sum_metric() const;
+
private:
/**
diff --git a/metrics/src/vespa/metrics/summetric.h b/metrics/src/vespa/metrics/summetric.h
index f04c1696638..7b60c968e5b 100644
--- a/metrics/src/vespa/metrics/summetric.h
+++ b/metrics/src/vespa/metrics/summetric.h
@@ -69,6 +69,7 @@ public:
void printDebug(std::ostream&, const std::string& indent="") const override;
void addToPart(Metric&) const override;
void addToSnapshot(Metric&, std::vector<Metric::UP> &) const override;
+ bool is_sum_metric() const override;
private:
friend struct MetricManagerTest;
diff --git a/metrics/src/vespa/metrics/summetric.hpp b/metrics/src/vespa/metrics/summetric.hpp
index 9520456a974..e067b9643c2 100644
--- a/metrics/src/vespa/metrics/summetric.hpp
+++ b/metrics/src/vespa/metrics/summetric.hpp
@@ -142,8 +142,17 @@ template<typename AddendMetric>
void
SumMetric<AddendMetric>::addToPart(Metric& m) const
{
- std::pair<std::vector<Metric::UP>, Metric::UP> sum(generateSum());
- sum.second->addToPart(m);
+ if (!m.is_sum_metric()) {
+ std::pair<std::vector<Metric::UP>, Metric::UP> sum(generateSum());
+ sum.second->addToPart(m);
+ }
+}
+
+template<typename AddendMetric>
+bool
+SumMetric<AddendMetric>::is_sum_metric() const
+{
+ return true;
}
template<typename AddendMetric>