diff options
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; |