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"));
+}