This patch extends the metrics internal apis to use a specific
metrics::impl::impl object identified by its integer handle.
(cherry picked from commit 6ee4af7)
---
include/seastar/core/metrics_api.hh | 18 ++++++-----
include/seastar/core/metrics_registration.hh | 1 +
src/core/metrics.cc | 32 +++++++++++---------
3 files changed, 28 insertions(+), 23 deletions(-)
diff --git a/include/seastar/core/metrics_api.hh b/include/seastar/core/metrics_api.hh
index c1f4bf605..b9dff10ed 100644
--- a/include/seastar/core/metrics_api.hh
+++ b/include/seastar/core/metrics_api.hh
@@ -170,9 +170,10 @@ struct metric_info {
using metrics_registration = std::vector<metric_id>;
class metric_groups_impl : public metric_groups_def {
+ int _handle;
metrics_registration _registration;
public:
- metric_groups_impl() = default;
+ explicit metric_groups_impl(int handle = default_handle());
~metric_groups_impl();
metric_groups_impl(const metric_groups_impl&) = delete;
metric_groups_impl(metric_groups_impl&&) = default;
@@ -190,7 +191,7 @@ class registered_metric {
metric_function _f;
shared_ptr<impl> _impl;
public:
- registered_metric(metric_id id, metric_function f, bool enabled=true);
+ registered_metric(metric_id id, metric_function f, bool enabled=true, int handle=default_handle());
virtual ~registered_metric() {}
virtual metric_value operator()() const {
return _f();
@@ -335,7 +336,7 @@ class impl {
return _value_map;
}
- void add_registration(const metric_id& id, const metric_type& type, metric_function f, const description& d, bool enabled);
+ void add_registration(const metric_id& id, const metric_type& type, metric_function f, const description& d, bool enabled, int handle = default_handle());
void remove_registration(const metric_id& id);
future<> stop() {
return make_ready_future<>();
@@ -358,14 +359,15 @@ class impl {
}
};
-const value_map& get_value_map();
+const value_map& get_value_map(int handle = default_handle());
using values_reference = shared_ptr<values_copy>;
-foreign_ptr<values_reference> get_values();
+foreign_ptr<values_reference> get_values(int handle = default_handle());
shared_ptr<impl> get_local_impl(int handle = default_handle());
-void unregister_metric(const metric_id & id);
+
+void unregister_metric(const metric_id & id, int handle = default_handle());
/*!
* \brief initialize metric group
@@ -373,7 +375,7 @@ void unregister_metric(const metric_id & id);
* Create a metric_group_def.
* No need to use it directly.
*/
-std::unique_ptr<metric_groups_def> create_metric_groups();
+std::unique_ptr<metric_groups_def> create_metric_groups(int handle = default_handle());
}
@@ -390,7 +392,7 @@ struct options : public program_options::option_group {
/*!
* \brief set the metrics configuration
*/
-future<> configure(const options& opts);
+future<> configure(const options& opts, int handle = default_handle());
}
}
diff --git a/include/seastar/core/metrics_registration.hh b/include/seastar/core/metrics_registration.hh
index 6f57b708b..e26949475 100644
--- a/include/seastar/core/metrics_registration.hh
+++ b/include/seastar/core/metrics_registration.hh
@@ -51,6 +51,7 @@ namespace seastar {
namespace metrics {
namespace impl {
+int default_handle();
class metric_groups_def;
struct metric_definition_impl;
class metric_groups_impl;
diff --git a/src/core/metrics.cc b/src/core/metrics.cc
index 9a21d6882..793b36b9d 100644
--- a/src/core/metrics.cc
+++ b/src/core/metrics.cc
@@ -118,8 +118,8 @@ bool label_instance::operator!=(const label_instance& id2) const {
label shard_label("shard");
namespace impl {
-registered_metric::registered_metric(metric_id id, metric_function f, bool enabled) :
- _f(f), _impl(get_local_impl()) {
+registered_metric::registered_metric(metric_id id, metric_function f, bool enabled, int handle) :
+ _f(f), _impl(get_local_impl(handle)) {
_info.enabled = enabled;
_
info.id = id;
}
@@ -172,13 +172,15 @@ metric_definition_impl& metric_definition_impl::set_type(const sstring& type_nam
return *this;
}
-std::unique_ptr<metric_groups_def> create_metric_groups() {
- return std::make_unique<metric_groups_impl>();
+std::unique_ptr<metric_groups_def> create_metric_groups(int handle) {
+ return std::make_unique<metric_groups_impl>(handle);
}
+metric_groups_impl::metric_groups_impl(int handle) : _handle(handle) {}
+
metric_groups_impl::~metric_groups_impl() {
for (const auto& i : _registration) {
- unregister_metric(i);
+ unregister_metric(i, _handle);
}
}
@@ -186,7 +188,7 @@ metric_groups_impl& metric_groups_impl::add_metric(group_name_type name, const m
metric_id id(name, md._impl->name, md._impl->labels);
- get_local_impl()->add_registration(id, md._impl->type, md._impl->f, md._impl->d, md._impl->enabled);
+ get_local_impl(_handle)->add_registration(id, md._impl->type, md._impl->f, md._impl->d, md._impl->enabled, _handle);
_registration.push_back(id);
return *this;
@@ -252,20 +254,20 @@ void impl::remove_registration(const metric_id& id) {
}
}
-void unregister_metric(const metric_id & id) {
- get_local_impl()->remove_registration(id);
+void unregister_metric(const metric_id & id, int handle) {
+ get_local_impl(handle)->remove_registration(id);
}
-const value_map& get_value_map() {
- return get_local_impl()->get_value_map();
+const value_map& get_value_map(int handle) {
+ return get_local_impl(handle)->get_value_map();
}
-foreign_ptr<values_reference> get_values() {
+foreign_ptr<values_reference> get_values(int handle) {
shared_ptr<values_copy> res_ref = ::seastar::make_shared<values_copy>();
auto& res = *(res_ref.get());
auto& mv = res.values;
- res.metadata = get_local_impl()->metadata();
- auto & functions = get_local_impl()->functions();
+ res.metadata = get_local_impl(handle)->metadata();
+ auto & functions = get_local_impl(handle)->functions();
mv.reserve(functions.size());
for (auto&& i : functions) {
value_vector values;
@@ -331,8 +333,8 @@ std::vector<std::vector<metric_function>>& impl::functions() {
return _current_metrics;
}
-void impl::add_registration(const metric_id& id, const metric_type& type, metric_function f, const description& d, bool enabled) {
- auto rm = ::seastar::make_shared<registered_metric>(id, f, enabled);
+void impl::add_registration(const metric_id& id, const metric_type& type, metric_function f, const description& d, bool enabled, int handle) {
+ auto rm = ::seastar::make_shared<registered_metric>(id, f, enabled, handle);
sstring name = id.full_name();
if (_value_map.find(name) != _value_map.end()) {
auto& metric = _value_map[name];
--
2.36.1