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 <[email protected]> Authored: Fri Nov 14 14:37:04 2014 -0800 Committer: Dominic Hamon <[email protected]> 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")); +}
