summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--staging_vespalib/src/vespa/vespalib/metrics/CMakeLists.txt1
-rw-r--r--staging_vespalib/src/vespa/vespalib/metrics/handle.h2
-rw-r--r--staging_vespalib/src/vespa/vespalib/metrics/name_collection.cpp10
-rw-r--r--staging_vespalib/src/vespa/vespalib/metrics/name_collection.h2
-rw-r--r--staging_vespalib/src/vespa/vespalib/metrics/name_repo.cpp72
-rw-r--r--staging_vespalib/src/vespa/vespalib/metrics/name_repo.h47
-rw-r--r--staging_vespalib/src/vespa/vespalib/metrics/simple_metrics_manager.cpp61
-rw-r--r--staging_vespalib/src/vespa/vespalib/metrics/simple_metrics_manager.h15
8 files changed, 171 insertions, 39 deletions
diff --git a/staging_vespalib/src/vespa/vespalib/metrics/CMakeLists.txt b/staging_vespalib/src/vespa/vespalib/metrics/CMakeLists.txt
index 34cc5453304..4a28734b85d 100644
--- a/staging_vespalib/src/vespa/vespalib/metrics/CMakeLists.txt
+++ b/staging_vespalib/src/vespa/vespalib/metrics/CMakeLists.txt
@@ -18,6 +18,7 @@ vespa_add_library(staging_vespalib_vespalib_metrics OBJECT
metrics_manager.cpp
metric_types.cpp
name_collection.cpp
+ name_repo.cpp
point_builder.cpp
point.cpp
point_map_collection.cpp
diff --git a/staging_vespalib/src/vespa/vespalib/metrics/handle.h b/staging_vespalib/src/vespa/vespalib/metrics/handle.h
index 94a9ee33830..ddae0b1b6d2 100644
--- a/staging_vespalib/src/vespa/vespalib/metrics/handle.h
+++ b/staging_vespalib/src/vespa/vespalib/metrics/handle.h
@@ -14,7 +14,7 @@ namespace metrics {
template <typename T>
class Handle {
private:
- const size_t _id;
+ size_t _id;
public:
explicit Handle(size_t id) : _id(id) {}
size_t id() const { return _id; }
diff --git a/staging_vespalib/src/vespa/vespalib/metrics/name_collection.cpp b/staging_vespalib/src/vespa/vespalib/metrics/name_collection.cpp
index 697d41c4c6b..6683908a9cd 100644
--- a/staging_vespalib/src/vespa/vespalib/metrics/name_collection.cpp
+++ b/staging_vespalib/src/vespa/vespalib/metrics/name_collection.cpp
@@ -7,6 +7,16 @@ namespace metrics {
using Guard = std::lock_guard<std::mutex>;
+NameCollection::NameCollection()
+{
+ size_t first = resolve("");
+ assert(first == 0);
+ assert(lookup(first) == "");
+ assert(_names_by_id.size() == 1);
+ assert(_names.size() == 1);
+ (void) first; // in case of NOP asserts
+}
+
const vespalib::string &
NameCollection::lookup(size_t id) const
{
diff --git a/staging_vespalib/src/vespa/vespalib/metrics/name_collection.h b/staging_vespalib/src/vespa/vespalib/metrics/name_collection.h
index 566fd2a3997..6a91c2d4a9d 100644
--- a/staging_vespalib/src/vespa/vespalib/metrics/name_collection.h
+++ b/staging_vespalib/src/vespa/vespalib/metrics/name_collection.h
@@ -21,7 +21,7 @@ public:
size_t resolve(const vespalib::string& name);
size_t size() const;
- NameCollection() = default;
+ NameCollection();
~NameCollection() {}
};
diff --git a/staging_vespalib/src/vespa/vespalib/metrics/name_repo.cpp b/staging_vespalib/src/vespa/vespalib/metrics/name_repo.cpp
new file mode 100644
index 00000000000..f8294661c77
--- /dev/null
+++ b/staging_vespalib/src/vespa/vespalib/metrics/name_repo.cpp
@@ -0,0 +1,72 @@
+// Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include "name_repo.h"
+
+#include <vespa/log/log.h>
+LOG_SETUP(".vespalib.metrics.name_repo");
+
+namespace vespalib {
+namespace metrics {
+
+MetricName
+NameRepo::metric(const vespalib::string &name)
+{
+ size_t id = _metricNames.resolve(name);
+ LOG(debug, "metric name %s -> %zu", name.c_str(), id);
+ return MetricName(id);
+}
+
+Dimension
+NameRepo::dimension(const vespalib::string &name)
+{
+ size_t id = _dimensionNames.resolve(name);
+ LOG(debug, "dimension name %s -> %zu", name.c_str(), id);
+ return Dimension(id);
+}
+
+Label
+NameRepo::label(const vespalib::string &value)
+{
+ size_t id = _labelValues.resolve(value);
+ LOG(debug, "label value %s -> %zu", value.c_str(), id);
+ return Label(id);
+}
+
+const vespalib::string&
+NameRepo::metricName(MetricName metric)
+{
+ return _metricNames.lookup(metric.id());
+}
+
+const vespalib::string&
+NameRepo::dimensionName(Dimension dim)
+{
+ return _dimensionNames.lookup(dim.id());
+}
+
+const vespalib::string&
+NameRepo::labelValue(Label l)
+{
+ return _labelValues.lookup(l.id());
+}
+
+
+const PointMap::BackingMap&
+NameRepo::pointMap(Point from)
+{
+ const PointMap &map = _pointMaps.lookup(from.id());
+ return map.backingMap();
+}
+
+Point
+NameRepo::pointFrom(PointMap::BackingMap map)
+{
+ size_t id = _pointMaps.resolve(PointMap(std::move(map)));
+ return Point(id);
+}
+
+
+NameRepo NameRepo::instance;
+
+
+} // namespace vespalib::metrics
+} // namespace vespalib
diff --git a/staging_vespalib/src/vespa/vespalib/metrics/name_repo.h b/staging_vespalib/src/vespa/vespalib/metrics/name_repo.h
new file mode 100644
index 00000000000..f6972091ff1
--- /dev/null
+++ b/staging_vespalib/src/vespa/vespalib/metrics/name_repo.h
@@ -0,0 +1,47 @@
+// Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#pragma once
+
+#include <vespa/vespalib/stllike/string.h>
+#include "dimension.h"
+#include "label.h"
+#include "metric_name.h"
+#include "point.h"
+
+#include "name_collection.h"
+#include "point_map_collection.h"
+
+namespace vespalib {
+namespace metrics {
+
+/**
+ * Simple repo class
+ **/
+class NameRepo
+{
+private:
+ NameCollection _metricNames;
+ NameCollection _dimensionNames;
+ NameCollection _labelValues;
+ PointMapCollection _pointMaps;
+
+ NameRepo() = default;
+ ~NameRepo() = default;
+public:
+
+ MetricName metric(const vespalib::string &name);
+ Dimension dimension(const vespalib::string &name);
+ Label label(const vespalib::string &value);
+
+ const vespalib::string& metricName(MetricName metric);
+ const vespalib::string& dimensionName(Dimension dim);
+ const vespalib::string& labelValue(Label l);
+
+ const PointMap::BackingMap& pointMap(Point from);
+ Point pointFrom(PointMap::BackingMap map);
+
+ static NameRepo instance;
+};
+
+} // namespace vespalib::metrics
+} // namespace vespalib
+
diff --git a/staging_vespalib/src/vespa/vespalib/metrics/simple_metrics_manager.cpp b/staging_vespalib/src/vespa/vespalib/metrics/simple_metrics_manager.cpp
index 049be4fd328..4df44755c0b 100644
--- a/staging_vespalib/src/vespa/vespalib/metrics/simple_metrics_manager.cpp
+++ b/staging_vespalib/src/vespa/vespalib/metrics/simple_metrics_manager.cpp
@@ -12,11 +12,7 @@ using Guard = std::lock_guard<std::mutex>;
SimpleMetricsManager::SimpleMetricsManager(const SimpleManagerConfig &config,
Tick::UP tick_supplier)
- : _metricNames(),
- _dimensionNames(),
- _labelValues(),
- _pointMaps(),
- _currentSamples(),
+ : _currentSamples(),
_tickSupplier(std::move(tick_supplier)),
_startTime(_tickSupplier->first()),
_curTime(_startTime),
@@ -55,19 +51,19 @@ SimpleMetricsManager::createForTest(const SimpleManagerConfig &config,
Counter
SimpleMetricsManager::counter(const vespalib::string &name, const vespalib::string &)
{
- size_t id = _metricNames.resolve(name);
- _metricTypes.check(id, name, MetricTypes::MetricType::COUNTER);
- LOG(debug, "counter with metric name %s -> %zu", name.c_str(), id);
- return Counter(shared_from_this(), MetricName(id));
+ MetricName mn = NameRepo::instance.metric(name);
+ _metricTypes.check(mn.id(), name, MetricTypes::MetricType::COUNTER);
+ LOG(debug, "counter with metric name %s -> %zu", name.c_str(), mn.id());
+ return Counter(shared_from_this(), mn);
}
Gauge
SimpleMetricsManager::gauge(const vespalib::string &name, const vespalib::string &)
{
- size_t id = _metricNames.resolve(name);
- _metricTypes.check(id, name, MetricTypes::MetricType::GAUGE);
- LOG(debug, "gauge with metric name %s -> %zu", name.c_str(), id);
- return Gauge(shared_from_this(), MetricName(id));
+ MetricName mn = NameRepo::instance.metric(name);
+ _metricTypes.check(mn.id(), name, MetricTypes::MetricType::GAUGE);
+ LOG(debug, "gauge with metric name %s -> %zu", name.c_str(), mn.id());
+ return Gauge(shared_from_this(), mn);
}
Bucket
@@ -102,10 +98,18 @@ SimpleMetricsManager::snapshotFrom(const Bucket &bucket)
double s = bucket.startTime.count();
double e = bucket.endTime.count();
+
+ size_t max_point_id = 0;
+ for (const CounterAggregator& entry : bucket.counters) {
+ max_point_id = std::max(max_point_id, entry.idx.point().id());
+ }
+ for (const GaugeAggregator& entry : bucket.gauges) {
+ max_point_id = std::max(max_point_id, entry.idx.point().id());
+ }
Snapshot snap(s, e);
{
- for (size_t i = 0; i < _pointMaps.size(); ++i) {
- const PointMap::BackingMap &map = _pointMaps.lookup(i).backingMap();
+ for (size_t point_id = 0; point_id <= max_point_id; ++point_id) {
+ const PointMap::BackingMap &map = NameRepo::instance.pointMap(Point(point_id));
PointSnapshot point;
for (const PointMap::BackingMap::value_type &kv : map) {
point.dimensions.emplace_back(nameFor(kv.first), valueFor(kv.second));
@@ -114,16 +118,16 @@ SimpleMetricsManager::snapshotFrom(const Bucket &bucket)
}
}
for (const CounterAggregator& entry : bucket.counters) {
- size_t ni = entry.idx.name().id();
+ MetricName mn = entry.idx.name();
size_t pi = entry.idx.point().id();
- const vespalib::string &name = _metricNames.lookup(ni);
+ const vespalib::string &name = NameRepo::instance.metricName(mn);
CounterSnapshot val(name, snap.points()[pi], entry);
snap.add(val);
}
for (const GaugeAggregator& entry : bucket.gauges) {
- size_t ni = entry.idx.name().id();
+ MetricName mn = entry.idx.name();
size_t pi = entry.idx.point().id();
- const vespalib::string &name = _metricNames.lookup(ni);
+ const vespalib::string &name = NameRepo::instance.metricName(mn);
GaugeSnapshot val(name, snap.points()[pi], entry);
snap.add(val);
}
@@ -166,31 +170,30 @@ SimpleMetricsManager::collectCurrentSamples(TimeStamp prev,
Dimension
SimpleMetricsManager::dimension(const vespalib::string &name)
{
- size_t id = _dimensionNames.resolve(name);
- LOG(debug, "dimension name %s -> %zu", name.c_str(), id);
- return Dimension(id);
+ Dimension dim = NameRepo::instance.dimension(name);
+ LOG(debug, "dimension name %s -> %zu", name.c_str(), dim.id());
+ return dim;
}
Label
SimpleMetricsManager::label(const vespalib::string &value)
{
- size_t id = _labelValues.resolve(value);
- LOG(debug, "label value %s -> %zu", value.c_str(), id);
- return Label(id);
+ Label l = NameRepo::instance.label(value);
+ LOG(debug, "label value %s -> %zu", value.c_str(), l.id());
+ return l;
}
PointBuilder
SimpleMetricsManager::pointBuilder(Point from)
{
- const PointMap &map = _pointMaps.lookup(from.id());
- return PointBuilder(shared_from_this(), map.backingMap());
+ const PointMap::BackingMap &map = NameRepo::instance.pointMap(from);
+ return PointBuilder(shared_from_this(), map);
}
Point
SimpleMetricsManager::pointFrom(PointMap::BackingMap map)
{
- size_t id = _pointMaps.resolve(PointMap(std::move(map)));
- return Point(id);
+ return NameRepo::instance.pointFrom(std::move(map));
}
diff --git a/staging_vespalib/src/vespa/vespalib/metrics/simple_metrics_manager.h b/staging_vespalib/src/vespa/vespalib/metrics/simple_metrics_manager.h
index 01725bb1739..4d4b6eb87db 100644
--- a/staging_vespalib/src/vespa/vespalib/metrics/simple_metrics_manager.h
+++ b/staging_vespalib/src/vespa/vespalib/metrics/simple_metrics_manager.h
@@ -6,13 +6,12 @@
#include <memory>
#include <thread>
#include <vespa/vespalib/stllike/string.h>
-#include "name_collection.h"
+#include "name_repo.h"
#include "current_samples.h"
#include "snapshots.h"
#include "metrics_manager.h"
#include "metric_types.h"
#include "clock.h"
-#include "point_map_collection.h"
#include "bucket.h"
namespace vespalib {
@@ -35,14 +34,14 @@ struct SimpleManagerConfig {
class SimpleMetricsManager : public MetricsManager
{
private:
- NameCollection _metricNames;
MetricTypes _metricTypes;
- NameCollection _dimensionNames;
- NameCollection _labelValues;
- PointMapCollection _pointMaps;
- const vespalib::string& nameFor(Dimension dimension) { return _dimensionNames.lookup(dimension.id()); }
- const vespalib::string& valueFor(Label label) { return _labelValues.lookup(label.id()); }
+ const vespalib::string& nameFor(Dimension dimension) {
+ return NameRepo::instance.dimensionName(dimension);
+ }
+ const vespalib::string& valueFor(Label label) {
+ return NameRepo::instance.labelValue(label);
+ }
CurrentSamples _currentSamples;