You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by gi...@apache.org on 2018/04/27 23:20:49 UTC

[3/4] mesos git commit: Renamed Gauge to PullGauge and documented differences to PushGauge.

Renamed Gauge to PullGauge and documented differences to PushGauge.

Given `PushGauge`, it makes sense to explicitly distinguish the two
gauge types and document the the caveats of `PullGauge`.

Review: https://reviews.apache.org/r/66831/


Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/8fad04ef
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/8fad04ef
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/8fad04ef

Branch: refs/heads/master
Commit: 8fad04ef8e86949cba0de3a0e571dd138d581d68
Parents: 898ff1b
Author: Benjamin Mahler <bm...@apache.org>
Authored: Fri Apr 27 16:07:01 2018 -0700
Committer: Gilbert Song <so...@gmail.com>
Committed: Fri Apr 27 16:20:10 2018 -0700

----------------------------------------------------------------------
 3rdparty/libprocess/include/Makefile.am         |  2 +-
 .../include/process/metrics/gauge.hpp           | 58 ---------------
 .../include/process/metrics/metric.hpp          |  2 +-
 .../include/process/metrics/pull_gauge.hpp      | 77 ++++++++++++++++++++
 3rdparty/libprocess/include/process/system.hpp  | 14 ++--
 3rdparty/libprocess/src/tests/metrics_tests.cpp | 51 +++++++------
 3rdparty/libprocess/src/tests/system_tests.cpp  |  2 +-
 7 files changed, 116 insertions(+), 90 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/8fad04ef/3rdparty/libprocess/include/Makefile.am
----------------------------------------------------------------------
diff --git a/3rdparty/libprocess/include/Makefile.am b/3rdparty/libprocess/include/Makefile.am
index 25520c2..1ddcc2d 100644
--- a/3rdparty/libprocess/include/Makefile.am
+++ b/3rdparty/libprocess/include/Makefile.am
@@ -46,7 +46,7 @@ nobase_include_HEADERS =		\
   process/mime.hpp			\
   process/mutex.hpp			\
   process/metrics/counter.hpp		\
-  process/metrics/gauge.hpp		\
+  process/metrics/pull_gauge.hpp	\
   process/metrics/push_gauge.hpp	\
   process/metrics/metric.hpp		\
   process/metrics/metrics.hpp		\

http://git-wip-us.apache.org/repos/asf/mesos/blob/8fad04ef/3rdparty/libprocess/include/process/metrics/gauge.hpp
----------------------------------------------------------------------
diff --git a/3rdparty/libprocess/include/process/metrics/gauge.hpp b/3rdparty/libprocess/include/process/metrics/gauge.hpp
deleted file mode 100644
index 474f8e8..0000000
--- a/3rdparty/libprocess/include/process/metrics/gauge.hpp
+++ /dev/null
@@ -1,58 +0,0 @@
-// Licensed 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 __PROCESS_METRICS_GAUGE_HPP__
-#define __PROCESS_METRICS_GAUGE_HPP__
-
-#include <functional>
-#include <memory>
-#include <string>
-
-#include <process/metrics/metric.hpp>
-
-namespace process {
-namespace metrics {
-
-// A Metric that represents an instantaneous value evaluated when
-// 'value' is called.
-class Gauge : public Metric
-{
-public:
-  // 'name' is the unique name for the instance of Gauge being constructed.
-  // It will be the key exposed in the JSON endpoint.
-  //
-  // 'f' is the function that is called when the Metric value is requested.
-  // The user of `Gauge` must ensure that `f` is safe to execute up until
-  // the removal of the `Gauge` (via `process::metrics::remove(...)`) is
-  // complete.
-  Gauge(const std::string& name, const std::function<Future<double>()>& f)
-    : Metric(name, None()), data(new Data(f)) {}
-
-  virtual ~Gauge() {}
-
-  virtual Future<double> value() const { return data->f(); }
-
-private:
-  struct Data
-  {
-    explicit Data(const std::function<Future<double>()>& _f) : f(_f) {}
-
-    const std::function<Future<double>()> f;
-  };
-
-  std::shared_ptr<Data> data;
-};
-
-} // namespace metrics {
-} // namespace process {
-
-#endif // __PROCESS_METRICS_GAUGE_HPP__

http://git-wip-us.apache.org/repos/asf/mesos/blob/8fad04ef/3rdparty/libprocess/include/process/metrics/metric.hpp
----------------------------------------------------------------------
diff --git a/3rdparty/libprocess/include/process/metrics/metric.hpp b/3rdparty/libprocess/include/process/metrics/metric.hpp
index 21f162d..2c4a154 100644
--- a/3rdparty/libprocess/include/process/metrics/metric.hpp
+++ b/3rdparty/libprocess/include/process/metrics/metric.hpp
@@ -29,7 +29,7 @@
 namespace process {
 namespace metrics {
 
-// The base class for Metrics such as Counter and Gauge.
+// The base class for Metrics.
 class Metric {
 public:
   virtual ~Metric() {}

http://git-wip-us.apache.org/repos/asf/mesos/blob/8fad04ef/3rdparty/libprocess/include/process/metrics/pull_gauge.hpp
----------------------------------------------------------------------
diff --git a/3rdparty/libprocess/include/process/metrics/pull_gauge.hpp b/3rdparty/libprocess/include/process/metrics/pull_gauge.hpp
new file mode 100644
index 0000000..5c2a227
--- /dev/null
+++ b/3rdparty/libprocess/include/process/metrics/pull_gauge.hpp
@@ -0,0 +1,77 @@
+// Licensed 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 __PROCESS_METRICS_PULL_GAUGE_HPP__
+#define __PROCESS_METRICS_PULL_GAUGE_HPP__
+
+#include <functional>
+#include <memory>
+#include <string>
+
+#include <process/metrics/metric.hpp>
+
+namespace process {
+namespace metrics {
+
+// A Metric that represents an instantaneous measurement of a value
+// (e.g. number of items in a queue).
+//
+// A pull-based gauge differs from a push-based gauge in that the
+// client does not need to worry about when to compute a new gauge
+// value and instead provides the value function to invoke during
+// metrics collection. This makes the client logic simpler but comes
+// with significant performance disadvantages. If this function
+// dispatches to a `Process`, metrics collection will be exposed to
+// delays while the dispatches work their way through the event
+// queues. Also, gauges can be expensive to compute (e.g. loop over
+// all items while counting how many match a criteria) and therefore
+// can lead to a performance degradation on critial `Process`es
+// during metrics collection.
+//
+// NOTE: Due to the performance disadvantages of pull-based gauges,
+// it is recommended to use push-based gauges where possible.
+// Pull-based gauges should ideally (1) be used on `Process`es that
+// experience very light load, and (2) use functions that do not
+// perform heavyweight computation to compute the value (e.g. looping
+// over a large collection).
+class PullGauge : public Metric
+{
+public:
+  // 'name' is the unique name for the instance of Gauge being constructed.
+  // It will be the key exposed in the JSON endpoint.
+  //
+  // 'f' is the function that is called when the Metric value is requested.
+  // The user of `Gauge` must ensure that `f` is safe to execute up until
+  // the removal of the `Gauge` (via `process::metrics::remove(...)`) is
+  // complete.
+  PullGauge(const std::string& name, const std::function<Future<double>()>& f)
+    : Metric(name, None()), data(new Data(f)) {}
+
+  virtual ~PullGauge() {}
+
+  virtual Future<double> value() const { return data->f(); }
+
+private:
+  struct Data
+  {
+    explicit Data(const std::function<Future<double>()>& _f) : f(_f) {}
+
+    const std::function<Future<double>()> f;
+  };
+
+  std::shared_ptr<Data> data;
+};
+
+} // namespace metrics {
+} // namespace process {
+
+#endif // __PROCESS_METRICS_PULL_GAUGE_HPP__

http://git-wip-us.apache.org/repos/asf/mesos/blob/8fad04ef/3rdparty/libprocess/include/process/system.hpp
----------------------------------------------------------------------
diff --git a/3rdparty/libprocess/include/process/system.hpp b/3rdparty/libprocess/include/process/system.hpp
index 6bd815d..81ded8a 100644
--- a/3rdparty/libprocess/include/process/system.hpp
+++ b/3rdparty/libprocess/include/process/system.hpp
@@ -20,7 +20,7 @@
 #include <process/http.hpp>
 #include <process/process.hpp>
 
-#include <process/metrics/gauge.hpp>
+#include <process/metrics/pull_gauge.hpp>
 #include <process/metrics/metrics.hpp>
 
 #include <stout/os.hpp>
@@ -183,14 +183,14 @@ private:
     return http::OK(object, request.url.query.get("jsonp"));
   }
 
-  metrics::Gauge load_1min;
-  metrics::Gauge load_5min;
-  metrics::Gauge load_15min;
+  metrics::PullGauge load_1min;
+  metrics::PullGauge load_5min;
+  metrics::PullGauge load_15min;
 
-  metrics::Gauge cpus_total;
+  metrics::PullGauge cpus_total;
 
-  metrics::Gauge mem_total_bytes;
-  metrics::Gauge mem_free_bytes;
+  metrics::PullGauge mem_total_bytes;
+  metrics::PullGauge mem_free_bytes;
 };
 
 } // namespace process {

http://git-wip-us.apache.org/repos/asf/mesos/blob/8fad04ef/3rdparty/libprocess/src/tests/metrics_tests.cpp
----------------------------------------------------------------------
diff --git a/3rdparty/libprocess/src/tests/metrics_tests.cpp b/3rdparty/libprocess/src/tests/metrics_tests.cpp
index 3a68388..a5b41ed 100644
--- a/3rdparty/libprocess/src/tests/metrics_tests.cpp
+++ b/3rdparty/libprocess/src/tests/metrics_tests.cpp
@@ -30,8 +30,8 @@
 #include <process/time.hpp>
 
 #include <process/metrics/counter.hpp>
-#include <process/metrics/gauge.hpp>
 #include <process/metrics/metrics.hpp>
+#include <process/metrics/pull_gauge.hpp>
 #include <process/metrics/push_gauge.hpp>
 #include <process/metrics/timer.hpp>
 
@@ -48,7 +48,7 @@ using http::Response;
 using http::Unauthorized;
 
 using metrics::Counter;
-using metrics::Gauge;
+using metrics::PullGauge;
 using metrics::PushGauge;
 using metrics::Timer;
 
@@ -66,7 +66,7 @@ using std::map;
 using std::string;
 using std::vector;
 
-class GaugeProcess : public Process<GaugeProcess>
+class PullGaugeProcess : public Process<PullGaugeProcess>
 {
 public:
   double get()
@@ -145,14 +145,14 @@ TEST_F(MetricsTest, Counter)
 }
 
 
-TEST_F(MetricsTest, THREADSAFE_Gauge)
+TEST_F(MetricsTest, PullGauge)
 {
-  GaugeProcess process;
-  PID<GaugeProcess> pid = spawn(&process);
+  PullGaugeProcess process;
+  PID<PullGaugeProcess> pid = spawn(&process);
   ASSERT_TRUE(pid);
 
-  // Gauge with a value.
-  Gauge gauge("test/gauge", defer(pid, &GaugeProcess::get));
+  // PullGauge with a value.
+  PullGauge gauge("test/gauge", defer(pid, &PullGaugeProcess::get));
 
   AWAIT_READY(metrics::add(gauge));
 
@@ -161,7 +161,7 @@ TEST_F(MetricsTest, THREADSAFE_Gauge)
   AWAIT_READY(metrics::remove(gauge));
 
   // Failing gauge.
-  gauge = Gauge("test/failedgauge", defer(pid, &GaugeProcess::fail));
+  gauge = PullGauge("test/failedgauge", defer(pid, &PullGaugeProcess::fail));
 
   AWAIT_READY(metrics::add(gauge));
 
@@ -244,14 +244,14 @@ TEST_F(MetricsTest, THREADSAFE_Snapshot)
 
   Clock::pause();
 
-  // Add a gauge and a counter.
-  GaugeProcess process;
-  PID<GaugeProcess> pid = spawn(&process);
+  // Add a pull-gauge and a counter.
+  PullGaugeProcess process;
+  PID<PullGaugeProcess> pid = spawn(&process);
   ASSERT_TRUE(pid);
 
-  Gauge gauge("test/gauge", defer(pid, &GaugeProcess::get));
-  Gauge gaugeFail("test/gauge_fail", defer(pid, &GaugeProcess::fail));
-  Gauge gaugeConst("test/gauge_const", []() { return 99.0; });
+  PullGauge gauge("test/gauge", defer(pid, &PullGaugeProcess::get));
+  PullGauge gaugeFail("test/gauge_fail", defer(pid, &PullGaugeProcess::fail));
+  PullGauge gaugeConst("test/gauge_const", []() { return 99.0; });
   Counter counter("test/counter");
 
   AWAIT_READY(metrics::add(gauge));
@@ -382,15 +382,22 @@ TEST_F(MetricsTest, THREADSAFE_SnapshotTimeout)
   // Advance the clock to avoid rate limit.
   Clock::advance(Seconds(1));
 
-  // Add gauges and a counter.
-  GaugeProcess process;
-  PID<GaugeProcess> pid = spawn(&process);
+  // Add pull-gauges and a counter.
+  PullGaugeProcess process;
+  PID<PullGaugeProcess> pid = spawn(&process);
   ASSERT_TRUE(pid);
 
-  Gauge gauge("test/gauge", defer(pid, &GaugeProcess::get));
-  Gauge gaugeFail("test/gauge_fail", defer(pid, &GaugeProcess::fail));
-  Gauge gaugeTimeout("test/gauge_timeout", defer(pid, &GaugeProcess::pending));
-  Counter counter("test/counter");
+  PullGauge gauge(
+      "test/gauge",
+      defer(pid, &PullGaugeProcess::get));
+  PullGauge gaugeFail(
+      "test/gauge_fail",
+      defer(pid, &PullGaugeProcess::fail));
+  PullGauge gaugeTimeout(
+      "test/gauge_timeout",
+      defer(pid, &PullGaugeProcess::pending));
+  Counter counter(
+      "test/counter");
 
   AWAIT_READY(metrics::add(gauge));
   AWAIT_READY(metrics::add(gaugeFail));

http://git-wip-us.apache.org/repos/asf/mesos/blob/8fad04ef/3rdparty/libprocess/src/tests/system_tests.cpp
----------------------------------------------------------------------
diff --git a/3rdparty/libprocess/src/tests/system_tests.cpp b/3rdparty/libprocess/src/tests/system_tests.cpp
index 17f2881..237523f 100644
--- a/3rdparty/libprocess/src/tests/system_tests.cpp
+++ b/3rdparty/libprocess/src/tests/system_tests.cpp
@@ -30,7 +30,7 @@ namespace http = process::http;
 using process::Future;
 
 // MESOS-1433
-// This test is disabled as the Gauges that are used for these metrics
+// This test is disabled as the pull-gauges that are used for these metrics
 // may return Failures. In this case we do not put the metric into the
 // endpoint. This has been observed specifically for the memory
 // metrics. If in the future we put the error message from the Failure