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 {