Repository: mesos Updated Branches: refs/heads/master ce82e81c1 -> 084b0b700
Added slave metrics for total and used resources. Review: https://reviews.apache.org/r/27759 Project: http://git-wip-us.apache.org/repos/asf/mesos/repo Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/084b0b70 Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/084b0b70 Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/084b0b70 Branch: refs/heads/master Commit: 084b0b700b62f1a786ccb8d2df2ec86784edf353 Parents: ce82e81 Author: Vinod Kone <[email protected]> Authored: Fri Nov 7 16:22:39 2014 -0800 Committer: Vinod Kone <[email protected]> Committed: Fri Nov 7 16:45:06 2014 -0800 ---------------------------------------------------------------------- src/master/master.cpp | 5 ++- src/slave/slave.cpp | 84 ++++++++++++++++++++++++++++++++++++++++++ src/slave/slave.hpp | 9 +++++ src/tests/slave_tests.cpp | 12 ++++++ 4 files changed, 108 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/mesos/blob/084b0b70/src/master/master.cpp ---------------------------------------------------------------------- diff --git a/src/master/master.cpp b/src/master/master.cpp index 5712b17..0e182a6 100644 --- a/src/master/master.cpp +++ b/src/master/master.cpp @@ -5253,8 +5253,8 @@ Master::Metrics::Metrics(const Master& master) process::metrics::add(slave_removals); // Create resource gauges. - // TODO(dhamon): Set these up dynamically when adding a slave based on the - // resources the slave exposes. + // TODO(dhamon): Set these up dynamically when adding a slave based + // on the resources the slave exposes. const string resources[] = {"cpus", "mem", "disk"}; foreach (const string& resource, resources) { @@ -5400,6 +5400,7 @@ double Master::_resources_used(const std::string& name) return used; } + double Master::_resources_percent(const std::string& name) { double total = _resources_total(name); http://git-wip-us.apache.org/repos/asf/mesos/blob/084b0b70/src/slave/slave.cpp ---------------------------------------------------------------------- diff --git a/src/slave/slave.cpp b/src/slave/slave.cpp index 81e0c4b..ba00bf5 100644 --- a/src/slave/slave.cpp +++ b/src/slave/slave.cpp @@ -3802,6 +3802,31 @@ Slave::Metrics::Metrics(const Slave& slave) 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); + } } @@ -3833,6 +3858,65 @@ Slave::Metrics::~Metrics() 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; + + foreach (const Resource& resource, info.resources()) { + if (resource.name() == name && resource.type() == Value::SCALAR) { + total += resource.scalar().value(); + } + } + + return total; +} + + +double Slave::_resources_used(const std::string& name) +{ + double used = 0.0; + + foreachvalue (Framework* framework, frameworks) { + foreachvalue (Executor* executor, framework->executors) { + foreach (const Resource& resource, executor->resources) { + if (resource.name() == name && resource.type() == Value::SCALAR) { + used += resource.scalar().value(); + } + } + } + } + + return used; +} + + +double Slave::_resources_percent(const std::string& name) +{ + double total = _resources_total(name); + + if (total == 0.0) { + return total; + } else { + return _resources_used(name) / total; + } } http://git-wip-us.apache.org/repos/asf/mesos/blob/084b0b70/src/slave/slave.hpp ---------------------------------------------------------------------- diff --git a/src/slave/slave.hpp b/src/slave/slave.hpp index 72bbec9..d9f9d2e 100644 --- a/src/slave/slave.hpp +++ b/src/slave/slave.hpp @@ -459,8 +459,17 @@ private: 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; + double _resources_total(const std::string& name); + double _resources_used(const std::string& name); + double _resources_percent(const std::string& name); + process::Time startTime; GarbageCollector* gc; http://git-wip-us.apache.org/repos/asf/mesos/blob/084b0b70/src/tests/slave_tests.cpp ---------------------------------------------------------------------- diff --git a/src/tests/slave_tests.cpp b/src/tests/slave_tests.cpp index d2cbaf8..18ff8fe 100644 --- a/src/tests/slave_tests.cpp +++ b/src/tests/slave_tests.cpp @@ -836,6 +836,18 @@ TEST_F(SlaveTest, MetricsInStatsEndpoint) 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")); + Shutdown(); }
