You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by dm...@apache.org on 2014/11/19 20:51:30 UTC
mesos git commit: Pull Metrics struct out of Slave class.
Repository: mesos
Updated Branches:
refs/heads/master 0966e6ec4 -> 1388f6c68
Pull Metrics struct out of Slave class.
Review: https://reviews.apache.org/r/28058/
Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/1388f6c6
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/1388f6c6
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/1388f6c6
Branch: refs/heads/master
Commit: 1388f6c6860ec3946646ac0b9f8c321bcdaa1e3f
Parents: 0966e6e
Author: Dominic Hamon <dh...@twitter.com>
Authored: Fri Nov 14 14:37:04 2014 -0800
Committer: Dominic Hamon <dh...@twitter.com>
Committed: Wed Nov 19 11:50:30 2014 -0800
----------------------------------------------------------------------
src/Makefile.am | 2 +
src/master/metrics.cpp | 4 +-
src/master/metrics.hpp | 2 +-
src/slave/metrics.cpp | 183 +++++++++++++++++++++++++++++++++++++++
src/slave/metrics.hpp | 76 ++++++++++++++++
src/slave/slave.cpp | 151 --------------------------------
src/slave/slave.hpp | 43 +--------
src/tests/metrics_tests.cpp | 67 ++++++++++++++
8 files changed, 335 insertions(+), 193 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/mesos/blob/1388f6c6/src/Makefile.am
----------------------------------------------------------------------
diff --git a/src/Makefile.am b/src/Makefile.am
index 0fe7dd0..1d4ba1c 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -286,6 +286,7 @@ libmesos_no_3rdparty_la_SOURCES = \
slave/constants.cpp \
slave/gc.cpp \
slave/http.cpp \
+ slave/metrics.cpp \
slave/monitor.cpp \
slave/state.cpp \
slave/slave.cpp \
@@ -442,6 +443,7 @@ libmesos_no_3rdparty_la_SOURCES += \
slave/constants.hpp \
slave/flags.hpp \
slave/gc.hpp \
+ slave/metrics.hpp \
slave/monitor.hpp \
slave/paths.hpp \
slave/slave.hpp \
http://git-wip-us.apache.org/repos/asf/mesos/blob/1388f6c6/src/master/metrics.cpp
----------------------------------------------------------------------
diff --git a/src/master/metrics.cpp b/src/master/metrics.cpp
index a7ac96d..956fe50 100644
--- a/src/master/metrics.cpp
+++ b/src/master/metrics.cpp
@@ -16,9 +16,11 @@
* limitations under the License.
*/
-#include "master/metrics.hpp"
+#include <stout/foreach.hpp>
#include "master/master.hpp"
+#include "master/metrics.hpp"
+
namespace mesos {
namespace internal {
http://git-wip-us.apache.org/repos/asf/mesos/blob/1388f6c6/src/master/metrics.hpp
----------------------------------------------------------------------
diff --git a/src/master/metrics.hpp b/src/master/metrics.hpp
index 5e6b6d5..6a43abc 100644
--- a/src/master/metrics.hpp
+++ b/src/master/metrics.hpp
@@ -36,7 +36,7 @@ class Master;
struct Metrics
{
- Metrics(const Master& master);
+ explicit Metrics(const Master& master);
~Metrics();
http://git-wip-us.apache.org/repos/asf/mesos/blob/1388f6c6/src/slave/metrics.cpp
----------------------------------------------------------------------
diff --git a/src/slave/metrics.cpp b/src/slave/metrics.cpp
new file mode 100644
index 0000000..c32b4d8
--- /dev/null
+++ b/src/slave/metrics.cpp
@@ -0,0 +1,183 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <string>
+
+#include <process/metrics/metrics.hpp>
+
+#include <stout/foreach.hpp>
+
+#include "slave/metrics.hpp"
+#include "slave/slave.hpp"
+
+
+namespace mesos {
+namespace internal {
+namespace slave {
+
+Metrics::Metrics(const Slave& slave)
+ : uptime_secs(
+ "slave/uptime_secs",
+ defer(slave, &Slave::_uptime_secs)),
+ registered(
+ "slave/registered",
+ defer(slave, &Slave::_registered)),
+ recovery_errors(
+ "slave/recovery_errors"),
+ frameworks_active(
+ "slave/frameworks_active",
+ defer(slave, &Slave::_frameworks_active)),
+ tasks_staging(
+ "slave/tasks_staging",
+ defer(slave, &Slave::_tasks_staging)),
+ tasks_starting(
+ "slave/tasks_starting",
+ defer(slave, &Slave::_tasks_starting)),
+ tasks_running(
+ "slave/tasks_running",
+ defer(slave, &Slave::_tasks_running)),
+ tasks_finished(
+ "slave/tasks_finished"),
+ tasks_failed(
+ "slave/tasks_failed"),
+ tasks_killed(
+ "slave/tasks_killed"),
+ tasks_lost(
+ "slave/tasks_lost"),
+ executors_registering(
+ "slave/executors_registering",
+ defer(slave, &Slave::_executors_registering)),
+ executors_running(
+ "slave/executors_running",
+ defer(slave, &Slave::_executors_running)),
+ executors_terminating(
+ "slave/executors_terminating",
+ defer(slave, &Slave::_executors_terminating)),
+ executors_terminated(
+ "slave/executors_terminated"),
+ valid_status_updates(
+ "slave/valid_status_updates"),
+ invalid_status_updates(
+ "slave/invalid_status_updates"),
+ valid_framework_messages(
+ "slave/valid_framework_messages"),
+ invalid_framework_messages(
+ "slave/invalid_framework_messages")
+{
+ // TODO(dhamon): Check return values for metric registration.
+ process::metrics::add(uptime_secs);
+ process::metrics::add(registered);
+
+ process::metrics::add(recovery_errors);
+
+ process::metrics::add(frameworks_active);
+
+ process::metrics::add(tasks_staging);
+ process::metrics::add(tasks_starting);
+ process::metrics::add(tasks_running);
+ process::metrics::add(tasks_finished);
+ process::metrics::add(tasks_failed);
+ process::metrics::add(tasks_killed);
+ process::metrics::add(tasks_lost);
+
+ process::metrics::add(executors_registering);
+ process::metrics::add(executors_running);
+ process::metrics::add(executors_terminating);
+ process::metrics::add(executors_terminated);
+
+ process::metrics::add(valid_status_updates);
+ process::metrics::add(invalid_status_updates);
+
+ process::metrics::add(valid_framework_messages);
+ process::metrics::add(invalid_framework_messages);
+
+ // Create resource gauges.
+ // TODO(dhamon): Set these up dynamically when creating a slave
+ // based on the resources it exposes.
+ const std::string resources[] = {"cpus", "mem", "disk"};
+
+ foreach (const std::string& resource, resources) {
+ process::metrics::Gauge totalGauge(
+ "slave/" + resource + "_total",
+ defer(slave, &Slave::_resources_total, resource));
+ resources_total.push_back(totalGauge);
+ process::metrics::add(totalGauge);
+
+ process::metrics::Gauge usedGauge(
+ "slave/" + resource + "_used",
+ defer(slave, &Slave::_resources_used, resource));
+ resources_used.push_back(usedGauge);
+ process::metrics::add(usedGauge);
+
+ process::metrics::Gauge percentGauge(
+ "slave/" + resource + "_percent",
+ defer(slave, &Slave::_resources_percent, resource));
+ resources_percent.push_back(percentGauge);
+ process::metrics::add(percentGauge);
+ }
+}
+
+
+Metrics::~Metrics()
+{
+ // TODO(dhamon): Check return values of unregistered metrics.
+ process::metrics::remove(uptime_secs);
+ process::metrics::remove(registered);
+
+ process::metrics::remove(recovery_errors);
+
+ process::metrics::remove(frameworks_active);
+
+ process::metrics::remove(tasks_staging);
+ process::metrics::remove(tasks_starting);
+ process::metrics::remove(tasks_running);
+ process::metrics::remove(tasks_finished);
+ process::metrics::remove(tasks_failed);
+ process::metrics::remove(tasks_killed);
+ process::metrics::remove(tasks_lost);
+
+ process::metrics::remove(executors_registering);
+ process::metrics::remove(executors_running);
+ process::metrics::remove(executors_terminating);
+ process::metrics::remove(executors_terminated);
+
+ process::metrics::remove(valid_status_updates);
+ process::metrics::remove(invalid_status_updates);
+
+ process::metrics::remove(valid_framework_messages);
+ process::metrics::remove(invalid_framework_messages);
+
+ foreach (const process::metrics::Gauge& gauge, resources_total) {
+ process::metrics::remove(gauge);
+ }
+ resources_total.clear();
+
+ foreach (const process::metrics::Gauge& gauge, resources_used) {
+ process::metrics::remove(gauge);
+ }
+ resources_used.clear();
+
+ foreach (const process::metrics::Gauge& gauge, resources_percent) {
+ process::metrics::remove(gauge);
+ }
+ resources_percent.clear();
+}
+
+} // namespace slave {
+} // namespace internal {
+} // namespace mesos {
http://git-wip-us.apache.org/repos/asf/mesos/blob/1388f6c6/src/slave/metrics.hpp
----------------------------------------------------------------------
diff --git a/src/slave/metrics.hpp b/src/slave/metrics.hpp
new file mode 100644
index 0000000..0390461
--- /dev/null
+++ b/src/slave/metrics.hpp
@@ -0,0 +1,76 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __SLAVE_METRICS_HPP__
+#define __SLAVE_METRICS_HPP__
+
+#include <vector>
+
+#include <process/metrics/counter.hpp>
+#include <process/metrics/gauge.hpp>
+
+
+namespace mesos {
+namespace internal {
+namespace slave {
+
+class Slave;
+
+struct Metrics
+{
+ explicit Metrics(const Slave& slave);
+
+ ~Metrics();
+
+ process::metrics::Gauge uptime_secs;
+ process::metrics::Gauge registered;
+
+ process::metrics::Counter recovery_errors;
+
+ process::metrics::Gauge frameworks_active;
+
+ process::metrics::Gauge tasks_staging;
+ process::metrics::Gauge tasks_starting;
+ process::metrics::Gauge tasks_running;
+ process::metrics::Counter tasks_finished;
+ process::metrics::Counter tasks_failed;
+ process::metrics::Counter tasks_killed;
+ process::metrics::Counter tasks_lost;
+
+ process::metrics::Gauge executors_registering;
+ process::metrics::Gauge executors_running;
+ process::metrics::Gauge executors_terminating;
+ process::metrics::Counter executors_terminated;
+
+ process::metrics::Counter valid_status_updates;
+ process::metrics::Counter invalid_status_updates;
+
+ process::metrics::Counter valid_framework_messages;
+ process::metrics::Counter invalid_framework_messages;
+
+ // Resource metrics.
+ std::vector<process::metrics::Gauge> resources_total;
+ std::vector<process::metrics::Gauge> resources_used;
+ std::vector<process::metrics::Gauge> resources_percent;
+};
+
+} // namespace slave {
+} // namespace internal {
+} // namespace mesos {
+
+#endif // __SLAVE_METRICS_HPP__
http://git-wip-us.apache.org/repos/asf/mesos/blob/1388f6c6/src/slave/slave.cpp
----------------------------------------------------------------------
diff --git a/src/slave/slave.cpp b/src/slave/slave.cpp
index 06b2e18..373c8b4 100644
--- a/src/slave/slave.cpp
+++ b/src/slave/slave.cpp
@@ -37,8 +37,6 @@
#include <process/id.hpp>
#include <process/time.hpp>
-#include <process/metrics/metrics.hpp>
-
#include <stout/bytes.hpp>
#include <stout/check.hpp>
#include <stout/duration.hpp>
@@ -3746,155 +3744,6 @@ void Slave::sendExecutorTerminatedStatusUpdate(
}
-Slave::Metrics::Metrics(const Slave& slave)
- : uptime_secs(
- "slave/uptime_secs",
- defer(slave, &Slave::_uptime_secs)),
- registered(
- "slave/registered",
- defer(slave, &Slave::_registered)),
- recovery_errors(
- "slave/recovery_errors"),
- frameworks_active(
- "slave/frameworks_active",
- defer(slave, &Slave::_frameworks_active)),
- tasks_staging(
- "slave/tasks_staging",
- defer(slave, &Slave::_tasks_staging)),
- tasks_starting(
- "slave/tasks_starting",
- defer(slave, &Slave::_tasks_starting)),
- tasks_running(
- "slave/tasks_running",
- defer(slave, &Slave::_tasks_running)),
- tasks_finished(
- "slave/tasks_finished"),
- tasks_failed(
- "slave/tasks_failed"),
- tasks_killed(
- "slave/tasks_killed"),
- tasks_lost(
- "slave/tasks_lost"),
- executors_registering(
- "slave/executors_registering",
- defer(slave, &Slave::_executors_registering)),
- executors_running(
- "slave/executors_running",
- defer(slave, &Slave::_executors_running)),
- executors_terminating(
- "slave/executors_terminating",
- defer(slave, &Slave::_executors_terminating)),
- executors_terminated(
- "slave/executors_terminated"),
- valid_status_updates(
- "slave/valid_status_updates"),
- invalid_status_updates(
- "slave/invalid_status_updates"),
- valid_framework_messages(
- "slave/valid_framework_messages"),
- invalid_framework_messages(
- "slave/invalid_framework_messages")
-{
- // TODO(dhamon): Check return values for metric registration.
- process::metrics::add(uptime_secs);
- process::metrics::add(registered);
-
- process::metrics::add(recovery_errors);
-
- process::metrics::add(frameworks_active);
-
- process::metrics::add(tasks_staging);
- process::metrics::add(tasks_starting);
- process::metrics::add(tasks_running);
- process::metrics::add(tasks_finished);
- process::metrics::add(tasks_failed);
- process::metrics::add(tasks_killed);
- process::metrics::add(tasks_lost);
-
- process::metrics::add(executors_registering);
- process::metrics::add(executors_running);
- process::metrics::add(executors_terminating);
- process::metrics::add(executors_terminated);
-
- process::metrics::add(valid_status_updates);
- process::metrics::add(invalid_status_updates);
-
- process::metrics::add(valid_framework_messages);
- process::metrics::add(invalid_framework_messages);
-
- // Create resource gauges.
- // TODO(dhamon): Set these up dynamically when creating a slave
- // based on the resources it exposes.
- const string resources[] = {"cpus", "mem", "disk"};
-
- foreach (const string& resource, resources) {
- process::metrics::Gauge totalGauge(
- "slave/" + resource + "_total",
- defer(slave, &Slave::_resources_total, resource));
- resources_total.push_back(totalGauge);
- process::metrics::add(totalGauge);
-
- process::metrics::Gauge usedGauge(
- "slave/" + resource + "_used",
- defer(slave, &Slave::_resources_used, resource));
- resources_used.push_back(usedGauge);
- process::metrics::add(usedGauge);
-
- process::metrics::Gauge percentGauge(
- "slave/" + resource + "_percent",
- defer(slave, &Slave::_resources_percent, resource));
- resources_percent.push_back(percentGauge);
- process::metrics::add(percentGauge);
- }
-}
-
-
-Slave::Metrics::~Metrics()
-{
- // TODO(dhamon): Check return values of unregistered metrics.
- process::metrics::remove(uptime_secs);
- process::metrics::remove(registered);
-
- process::metrics::remove(recovery_errors);
-
- process::metrics::remove(frameworks_active);
-
- process::metrics::remove(tasks_staging);
- process::metrics::remove(tasks_starting);
- process::metrics::remove(tasks_running);
- process::metrics::remove(tasks_finished);
- process::metrics::remove(tasks_failed);
- process::metrics::remove(tasks_killed);
- process::metrics::remove(tasks_lost);
-
- process::metrics::remove(executors_registering);
- process::metrics::remove(executors_running);
- process::metrics::remove(executors_terminating);
- process::metrics::remove(executors_terminated);
-
- process::metrics::remove(valid_status_updates);
- process::metrics::remove(invalid_status_updates);
-
- process::metrics::remove(valid_framework_messages);
- process::metrics::remove(invalid_framework_messages);
-
- foreach (const process::metrics::Gauge& gauge, resources_total) {
- process::metrics::remove(gauge);
- }
- resources_total.clear();
-
- foreach (const process::metrics::Gauge& gauge, resources_used) {
- process::metrics::remove(gauge);
- }
- resources_used.clear();
-
- foreach (const process::metrics::Gauge& gauge, resources_percent) {
- process::metrics::remove(gauge);
- }
- resources_percent.clear();
-}
-
-
double Slave::_resources_total(const std::string& name)
{
double total = 0.0;
http://git-wip-us.apache.org/repos/asf/mesos/blob/1388f6c6/src/slave/slave.hpp
----------------------------------------------------------------------
diff --git a/src/slave/slave.hpp b/src/slave/slave.hpp
index 29bea65..c6d11ef 100644
--- a/src/slave/slave.hpp
+++ b/src/slave/slave.hpp
@@ -35,9 +35,6 @@
#include <process/process.hpp>
#include <process/protobuf.hpp>
-#include <process/metrics/counter.hpp>
-#include <process/metrics/gauge.hpp>
-
#include <stout/bytes.hpp>
#include <stout/linkedhashmap.hpp>
#include <stout/hashmap.hpp>
@@ -53,6 +50,7 @@
#include "slave/containerizer/containerizer.hpp"
#include "slave/flags.hpp"
#include "slave/gc.hpp"
+#include "slave/metrics.hpp"
#include "slave/monitor.hpp"
#include "slave/paths.hpp"
#include "slave/state.hpp"
@@ -366,6 +364,7 @@ private:
friend struct Framework;
friend struct Executor;
+ friend struct Metrics;
Slave(const Slave&); // No copying.
Slave& operator = (const Slave&); // No assigning.
@@ -426,43 +425,7 @@ private:
uint64_t invalidFrameworkMessages;
} stats;
- struct Metrics
- {
- Metrics(const Slave& slave);
-
- ~Metrics();
-
- process::metrics::Gauge uptime_secs;
- process::metrics::Gauge registered;
-
- process::metrics::Counter recovery_errors;
-
- process::metrics::Gauge frameworks_active;
-
- process::metrics::Gauge tasks_staging;
- process::metrics::Gauge tasks_starting;
- process::metrics::Gauge tasks_running;
- process::metrics::Counter tasks_finished;
- process::metrics::Counter tasks_failed;
- process::metrics::Counter tasks_killed;
- process::metrics::Counter tasks_lost;
-
- process::metrics::Gauge executors_registering;
- process::metrics::Gauge executors_running;
- process::metrics::Gauge executors_terminating;
- process::metrics::Counter executors_terminated;
-
- process::metrics::Counter valid_status_updates;
- process::metrics::Counter invalid_status_updates;
-
- process::metrics::Counter valid_framework_messages;
- process::metrics::Counter invalid_framework_messages;
-
- // Resource metrics.
- std::vector<process::metrics::Gauge> resources_total;
- std::vector<process::metrics::Gauge> resources_used;
- std::vector<process::metrics::Gauge> resources_percent;
- } metrics;
+ Metrics metrics;
double _resources_total(const std::string& name);
double _resources_used(const std::string& name);
http://git-wip-us.apache.org/repos/asf/mesos/blob/1388f6c6/src/tests/metrics_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/metrics_tests.cpp b/src/tests/metrics_tests.cpp
index 72571f2..7512b90 100644
--- a/src/tests/metrics_tests.cpp
+++ b/src/tests/metrics_tests.cpp
@@ -32,6 +32,7 @@ using namespace mesos;
using namespace mesos::internal;
using mesos::internal::master::Master;
+using mesos::internal::slave::Slave;
class MetricsTest : public mesos::internal::tests::MesosTest {};
@@ -145,3 +146,69 @@ TEST_F(MetricsTest, Master)
EXPECT_EQ(1u, stats.values.count("registrar/state_fetch_ms"));
EXPECT_EQ(1u, stats.values.count("registrar/state_store_ms"));
}
+
+
+TEST_F(MetricsTest, Slave)
+{
+ // TODO(dhamon): https://issues.apache.org/jira/browse/MESOS-2134 to allow
+ // only a Slave to be started.
+ Try<process::PID<Master>> master = StartMaster();
+ ASSERT_SOME(master);
+
+ Try<process::PID<Slave>> slave = StartSlave();
+ ASSERT_SOME(slave);
+
+ // Get the snapshot.
+ process::UPID upid("metrics", process::node());
+
+ process::Future<process::http::Response> response =
+ process::http::get(upid, "snapshot");
+ AWAIT_EXPECT_RESPONSE_STATUS_EQ(process::http::OK().status, response);
+
+ EXPECT_SOME_EQ(
+ "application/json",
+ response.get().headers.get("Content-Type"));
+
+ Try<JSON::Object> parse = JSON::parse<JSON::Object>(response.get().body);
+ ASSERT_SOME(parse);
+
+ JSON::Object stats = parse.get();
+
+ EXPECT_EQ(1u, stats.values.count("slave/uptime_secs"));
+ EXPECT_EQ(1u, stats.values.count("slave/registered"));
+
+ EXPECT_EQ(1u, stats.values.count("slave/recovery_errors"));
+
+ EXPECT_EQ(1u, stats.values.count("slave/frameworks_active"));
+
+ EXPECT_EQ(1u, stats.values.count("slave/tasks_staging"));
+ EXPECT_EQ(1u, stats.values.count("slave/tasks_starting"));
+ EXPECT_EQ(1u, stats.values.count("slave/tasks_running"));
+ EXPECT_EQ(1u, stats.values.count("slave/tasks_finished"));
+ EXPECT_EQ(1u, stats.values.count("slave/tasks_failed"));
+ EXPECT_EQ(1u, stats.values.count("slave/tasks_killed"));
+ EXPECT_EQ(1u, stats.values.count("slave/tasks_lost"));
+
+ EXPECT_EQ(1u, stats.values.count("slave/executors_registering"));
+ EXPECT_EQ(1u, stats.values.count("slave/executors_running"));
+ EXPECT_EQ(1u, stats.values.count("slave/executors_terminating"));
+ EXPECT_EQ(1u, stats.values.count("slave/executors_terminated"));
+
+ EXPECT_EQ(1u, stats.values.count("slave/valid_status_updates"));
+ EXPECT_EQ(1u, stats.values.count("slave/invalid_status_updates"));
+
+ EXPECT_EQ(1u, stats.values.count("slave/valid_framework_messages"));
+ EXPECT_EQ(1u, stats.values.count("slave/invalid_framework_messages"));
+
+ EXPECT_EQ(1u, stats.values.count("slave/cpus_total"));
+ EXPECT_EQ(1u, stats.values.count("slave/cpus_used"));
+ EXPECT_EQ(1u, stats.values.count("slave/cpus_percent"));
+
+ EXPECT_EQ(1u, stats.values.count("slave/mem_total"));
+ EXPECT_EQ(1u, stats.values.count("slave/mem_used"));
+ EXPECT_EQ(1u, stats.values.count("slave/mem_percent"));
+
+ EXPECT_EQ(1u, stats.values.count("slave/disk_total"));
+ EXPECT_EQ(1u, stats.values.count("slave/disk_used"));
+ EXPECT_EQ(1u, stats.values.count("slave/disk_percent"));
+}