You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by gr...@apache.org on 2018/08/01 20:24:26 UTC
[09/16] mesos git commit: Added per-framework metrics for suppressed
roles.
Added per-framework metrics for suppressed roles.
Review: https://reviews.apache.org/r/66870/
Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/9f39fe38
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/9f39fe38
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/9f39fe38
Branch: refs/heads/master
Commit: 9f39fe3878b44852b570541931efd5e89098a82e
Parents: c366930
Author: Greg Mann <gr...@mesosphere.io>
Authored: Wed Aug 1 07:59:04 2018 -0700
Committer: Greg Mann <gr...@gmail.com>
Committed: Wed Aug 1 13:07:55 2018 -0700
----------------------------------------------------------------------
src/master/allocator/mesos/hierarchical.cpp | 17 ++++++
src/master/allocator/mesos/metrics.cpp | 66 +++++++++++++++++++++++-
src/master/allocator/mesos/metrics.hpp | 12 +++++
3 files changed, 93 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/mesos/blob/9f39fe38/src/master/allocator/mesos/hierarchical.cpp
----------------------------------------------------------------------
diff --git a/src/master/allocator/mesos/hierarchical.cpp b/src/master/allocator/mesos/hierarchical.cpp
index c1d1897..d7f073d 100644
--- a/src/master/allocator/mesos/hierarchical.cpp
+++ b/src/master/allocator/mesos/hierarchical.cpp
@@ -282,8 +282,10 @@ void HierarchicalAllocatorProcess::addFramework(
if (suppressedRoles.count(role)) {
frameworkSorters.at(role)->deactivate(frameworkId.value());
+ framework.metrics->suppressRole(role);
} else {
frameworkSorters.at(role)->activate(frameworkId.value());
+ framework.metrics->reviveRole(role);
}
}
@@ -451,6 +453,10 @@ void HierarchicalAllocatorProcess::updateFramework(
return result;
}();
+ foreach (const string& role, newSuppressedRoles) {
+ framework.metrics->suppressRole(role);
+ }
+
foreach (const string& role, removedRoles | newSuppressedRoles) {
CHECK(frameworkSorters.contains(role));
frameworkSorters.at(role)->deactivate(frameworkId.value());
@@ -466,6 +472,8 @@ void HierarchicalAllocatorProcess::updateFramework(
if (framework.offerFilters.contains(role)) {
framework.offerFilters.erase(role);
}
+
+ framework.metrics->removeSubscribedRole(role);
}
const set<string> addedRoles = [&]() {
@@ -484,7 +492,13 @@ void HierarchicalAllocatorProcess::updateFramework(
return result;
}();
+ foreach (const string& role, newRevivedRoles) {
+ framework.metrics->reviveRole(role);
+ }
+
foreach (const string& role, addedRoles) {
+ framework.metrics->addSubscribedRole(role);
+
// NOTE: It's possible that we're already tracking this framework
// under the role because a framework can unsubscribe from a role
// while it still has resources allocated to the role.
@@ -749,6 +763,7 @@ void HierarchicalAllocatorProcess::removeFilters(const SlaveID& slaveId)
if (erased) {
frameworkSorters.at(role)->activate(id.value());
framework.suppressedRoles.erase(role);
+ framework.metrics->reviveRole(role);
}
}
}
@@ -1328,6 +1343,7 @@ void HierarchicalAllocatorProcess::suppressOffers(
frameworkSorters.at(role)->deactivate(frameworkId.value());
framework.suppressedRoles.insert(role);
+ framework.metrics->suppressRole(role);
}
LOG(INFO) << "Suppressed offers for roles " << stringify(roles)
@@ -1356,6 +1372,7 @@ void HierarchicalAllocatorProcess::reviveOffers(
frameworkSorters.at(role)->activate(frameworkId.value());
framework.suppressedRoles.erase(role);
+ framework.metrics->reviveRole(role);
}
// We delete each actual `OfferFilter` when
http://git-wip-us.apache.org/repos/asf/mesos/blob/9f39fe38/src/master/allocator/mesos/metrics.cpp
----------------------------------------------------------------------
diff --git a/src/master/allocator/mesos/metrics.cpp b/src/master/allocator/mesos/metrics.cpp
index 84499c8..73e68eb 100644
--- a/src/master/allocator/mesos/metrics.cpp
+++ b/src/master/allocator/mesos/metrics.cpp
@@ -21,15 +21,21 @@
#include <mesos/quota/quota.hpp>
#include <process/metrics/pull_gauge.hpp>
+#include <process/metrics/push_gauge.hpp>
#include <process/metrics/metrics.hpp>
#include <stout/hashmap.hpp>
+#include "common/protobuf_utils.hpp"
+
+#include "master/metrics.hpp"
+
#include "master/allocator/mesos/hierarchical.hpp"
using std::string;
using process::metrics::PullGauge;
+using process::metrics::PushGauge;
namespace mesos {
namespace internal {
@@ -209,10 +215,66 @@ void Metrics::removeRole(const string& role)
FrameworkMetrics::FrameworkMetrics(const FrameworkInfo& _frameworkInfo)
- : frameworkInfo(_frameworkInfo) {}
+ : frameworkInfo(_frameworkInfo)
+{
+ // TODO(greggomann): Calling `getRoles` below copies the roles from the
+ // framework info, which could become expensive if the number of roles grows
+ // large. Consider optimizing this.
+ foreach (
+ const string& role,
+ protobuf::framework::getRoles(frameworkInfo)) {
+ addSubscribedRole(role);
+ }
+}
+
+
+FrameworkMetrics::~FrameworkMetrics()
+{
+ foreach (const string& role, suppressed.keys()) {
+ removeSubscribedRole(role);
+ }
+
+ CHECK(suppressed.empty());
+}
+
+
+void FrameworkMetrics::reviveRole(const string& role)
+{
+ auto iter = suppressed.find(role);
+ CHECK(iter != suppressed.end());
+ iter->second = 0;
+}
-FrameworkMetrics::~FrameworkMetrics() {}
+void FrameworkMetrics::suppressRole(const string& role)
+{
+ auto iter = suppressed.find(role);
+ CHECK(iter != suppressed.end());
+ iter->second = 1;
+}
+
+
+void FrameworkMetrics::addSubscribedRole(const string& role)
+{
+ auto result = suppressed.emplace(
+ role,
+ PushGauge(
+ getFrameworkMetricPrefix(frameworkInfo) + "roles/" +
+ role + "/suppressed"));
+
+ CHECK(result.second);
+ process::metrics::add(result.first->second);
+}
+
+
+void FrameworkMetrics::removeSubscribedRole(const string& role)
+{
+ auto iter = suppressed.find(role);
+
+ CHECK(iter != suppressed.end());
+ process::metrics::remove(iter->second);
+ suppressed.erase(iter);
+}
} // namespace internal {
} // namespace allocator {
http://git-wip-us.apache.org/repos/asf/mesos/blob/9f39fe38/src/master/allocator/mesos/metrics.hpp
----------------------------------------------------------------------
diff --git a/src/master/allocator/mesos/metrics.hpp b/src/master/allocator/mesos/metrics.hpp
index daac93f..34cc16b 100644
--- a/src/master/allocator/mesos/metrics.hpp
+++ b/src/master/allocator/mesos/metrics.hpp
@@ -24,6 +24,7 @@
#include <process/metrics/counter.hpp>
#include <process/metrics/pull_gauge.hpp>
+#include <process/metrics/push_gauge.hpp>
#include <process/metrics/timer.hpp>
#include <process/pid.hpp>
@@ -97,7 +98,18 @@ struct FrameworkMetrics
~FrameworkMetrics();
+ void reviveRole(const std::string& role);
+ void suppressRole(const std::string& role);
+
+ // Since frameworks can update their list of roles,
+ // these methods add/remove per-role metrics.
+ void addSubscribedRole(const std::string& role);
+ void removeSubscribedRole(const std::string& role);
+
const FrameworkInfo frameworkInfo;
+
+ // Suppresion state metric (boolean 0 or 1) for each role.
+ hashmap<std::string, process::metrics::PushGauge> suppressed;
};
} // namespace internal {