You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by dm...@apache.org on 2015/03/03 21:26:59 UTC

mesos git commit: Deprecate /stats.json endpoint and supporting code.

Repository: mesos
Updated Branches:
  refs/heads/master 11c357bf0 -> d9ba9199a


Deprecate /stats.json endpoint and supporting code.

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


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

Branch: refs/heads/master
Commit: d9ba9199a8c8357ab13a1b14f8ee63409c5ac310
Parents: 11c357b
Author: Dominic Hamon <dh...@twitter.com>
Authored: Mon Jan 26 15:48:01 2015 -0800
Committer: Dominic Hamon <dh...@twitter.com>
Committed: Tue Mar 3 12:26:31 2015 -0800

----------------------------------------------------------------------
 src/master/http.cpp        | 123 ---------------------------------
 src/master/master.cpp      |  34 ----------
 src/master/master.hpp      |  19 +-----
 src/slave/http.cpp         |  88 ------------------------
 src/slave/slave.cpp        |  35 ----------
 src/slave/slave.hpp        |  14 ----
 src/tests/master_tests.cpp | 146 ++++++++++++++++++----------------------
 src/tests/slave_tests.cpp  |  79 +++++++++-------------
 8 files changed, 98 insertions(+), 440 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/d9ba9199/src/master/http.cpp
----------------------------------------------------------------------
diff --git a/src/master/http.cpp b/src/master/http.cpp
index 117c0ee..b8eef69 100644
--- a/src/master/http.cpp
+++ b/src/master/http.cpp
@@ -394,123 +394,6 @@ Future<Response> Master::Http::slaves(const Request& request) {
 }
 
 
-// Declaration of 'stats' continuation.
-static Future<Response> _stats(
-    const Request& request,
-    JSON::Object object,
-    const Response& response);
-
-
-// TODO(alexandra.sava): Add stats for registered and removed slaves.
-Future<Response> Master::Http::stats(const Request& request)
-{
-  LOG(INFO) << "HTTP request for '" << request.path << "'";
-
-  JSON::Object object;
-  object.values["uptime"] = (Clock::now() - master->startTime).secs();
-  object.values["elected"] = master->elected() ? 1 : 0;
-  object.values["total_schedulers"] = master->frameworks.registered.size();
-  object.values["active_schedulers"] = master->_frameworks_active();
-  object.values["activated_slaves"] = master->_slaves_active();
-  object.values["deactivated_slaves"] = master->_slaves_inactive();
-  object.values["outstanding_offers"] = master->offers.size();
-
-  // NOTE: These are monotonically increasing counters.
-  object.values["staged_tasks"] = master->stats.tasks[TASK_STAGING];
-  object.values["started_tasks"] = master->stats.tasks[TASK_STARTING];
-  object.values["finished_tasks"] = master->stats.tasks[TASK_FINISHED];
-  object.values["killed_tasks"] = master->stats.tasks[TASK_KILLED];
-  object.values["failed_tasks"] = master->stats.tasks[TASK_FAILED];
-  object.values["lost_tasks"] = master->stats.tasks[TASK_LOST];
-  object.values["valid_status_updates"] = master->stats.validStatusUpdates;
-  object.values["invalid_status_updates"] = master->stats.invalidStatusUpdates;
-
-  // Get a count of all active tasks in the cluster i.e., the tasks
-  // that are launched (TASK_STAGING, TASK_STARTING, TASK_RUNNING) but
-  // haven't reached terminal state yet.
-  // NOTE: This is a gauge representing an instantaneous value.
-  int active_tasks = 0;
-  foreachvalue (Framework* framework, master->frameworks.registered) {
-    active_tasks += framework->tasks.size();
-  }
-  object.values["active_tasks_gauge"] = active_tasks;
-
-  // Get total and used (note, not offered) resources in order to
-  // compute capacity of scalar resources.
-  Resources totalResources;
-  Resources usedResources;
-  foreachvalue (Slave* slave, master->slaves.registered) {
-    // Instead of accumulating all types of resources (which is
-    // not necessary), we only accumulate scalar resources. This
-    // helps us bypass a performance problem caused by range
-    // additions (e.g. ports).
-    foreach (const Resource& resource, slave->info.resources()) {
-      if (resource.type() == Value::SCALAR) {
-        totalResources += resource;
-      }
-    }
-    foreachvalue (const Resources& resources, slave->usedResources) {
-      foreach (const Resource& resource, resources) {
-        if (resource.type() == Value::SCALAR) {
-          usedResources += resource;
-        }
-      }
-    }
-  }
-
-  foreach (const Resource& resource, totalResources) {
-    CHECK(resource.has_scalar());
-
-    double total = resource.scalar().value();
-    object.values[resource.name() + "_total"] = total;
-
-    Option<Value::Scalar> _used =
-      usedResources.get<Value::Scalar>(resource.name());
-
-    double used = _used.isSome() ? _used.get().value() : 0.0;
-    object.values[resource.name() + "_used"] = used;
-
-    double percent = used / total;
-    object.values[resource.name() + "_percent"] = percent;
-  }
-
-  // Include metrics from libprocess metrics while we sunset this
-  // endpoint in favor of libprocess metrics.
-  // TODO(benh): Remove this after transitioning to libprocess metrics.
-  return process::http::get(MetricsProcess::instance()->self(), "snapshot")
-    .then(lambda::bind(&_stats, request, object, lambda::_1));
-}
-
-
-static Future<Response> _stats(
-    const Request& request,
-    JSON::Object object,
-    const Response& response)
-{
-  if (response.status != process::http::statuses[200]) {
-    return InternalServerError("Failed to get metrics: " + response.status);
-  }
-
-  Option<string> type = response.headers.get("Content-Type");
-
-  if (type.isNone() || type.get() != "application/json") {
-    return InternalServerError("Failed to get metrics: expecting JSON");
-  }
-
-  Try<JSON::Object> parse = JSON::parse<JSON::Object>(response.body);
-
-  if (parse.isError()) {
-    return InternalServerError("Failed to parse metrics: " + parse.error());
-  }
-
-  // Now add all the values from metrics.
-  // TODO(benh): Make sure we're not overwriting any values.
-  object.values.insert(parse.get().values.begin(), parse.get().values.end());
-
-  return OK(object, request.query.get("jsonp"));
-}
-
-
 Future<Response> Master::Http::state(const Request& request)
 {
   LOG(INFO) << "HTTP request for '" << request.path << "'";
@@ -544,12 +427,6 @@ Future<Response> Master::Http::state(const Request& request)
   object.values["hostname"] = master->info().hostname();
   object.values["activated_slaves"] = master->_slaves_active();
   object.values["deactivated_slaves"] = master->_slaves_inactive();
-  object.values["staged_tasks"] = master->stats.tasks[TASK_STAGING];
-  object.values["started_tasks"] = master->stats.tasks[TASK_STARTING];
-  object.values["finished_tasks"] = master->stats.tasks[TASK_FINISHED];
-  object.values["killed_tasks"] = master->stats.tasks[TASK_KILLED];
-  object.values["failed_tasks"] = master->stats.tasks[TASK_FAILED];
-  object.values["lost_tasks"] = master->stats.tasks[TASK_LOST];
 
   if (master->flags.cluster.isSome()) {
     object.values["cluster"] = master->flags.cluster.get();

http://git-wip-us.apache.org/repos/asf/mesos/blob/d9ba9199/src/master/master.cpp
----------------------------------------------------------------------
diff --git a/src/master/master.cpp b/src/master/master.cpp
index dae0955..68ca19a 100644
--- a/src/master/master.cpp
+++ b/src/master/master.cpp
@@ -574,19 +574,6 @@ void Master::initialize()
   nextSlaveId = 0;
   nextOfferId = 0;
 
-  // Start all the statistics at 0.
-  stats.tasks[TASK_STAGING] = 0;
-  stats.tasks[TASK_STARTING] = 0;
-  stats.tasks[TASK_RUNNING] = 0;
-  stats.tasks[TASK_FINISHED] = 0;
-  stats.tasks[TASK_FAILED] = 0;
-  stats.tasks[TASK_KILLED] = 0;
-  stats.tasks[TASK_LOST] = 0;
-  stats.validStatusUpdates = 0;
-  stats.invalidStatusUpdates = 0;
-  stats.validFrameworkMessages = 0;
-  stats.invalidFrameworkMessages = 0;
-
   startTime = Clock::now();
 
   install<scheduler::Call>(&Master::receive);
@@ -710,9 +697,6 @@ void Master::initialize()
   route("/state.json",
         None(),
         lambda::bind(&Http::state, http, lambda::_1));
-  route("/stats.json",
-        None(),
-        lambda::bind(&Http::stats, http, lambda::_1));
   route("/tasks.json",
         Http::TASKS_HELP,
         lambda::bind(&Http::tasks, http, lambda::_1));
@@ -2275,7 +2259,6 @@ void Master::accept(
             TaskStatus::REASON_INVALID_OFFERS);
 
         metrics->tasks_lost++;
-        stats.tasks[TASK_LOST]++;
 
         metrics->incrementTasksStates(
             TASK_LOST,
@@ -2320,8 +2303,6 @@ void Master::accept(
       if (!framework->pendingTasks.contains(task.task_id())) {
         framework->pendingTasks[task.task_id()] = task;
       }
-
-      stats.tasks[TASK_STAGING]++;
     }
   }
 
@@ -2385,7 +2366,6 @@ void Master::_accept(
             reason);
 
         metrics->tasks_lost++;
-        stats.tasks[TASK_LOST]++;
 
         metrics->incrementTasksStates(
             TASK_LOST,
@@ -2521,7 +2501,6 @@ void Master::_accept(
                 TaskStatus::REASON_TASK_UNAUTHORIZED);
 
             metrics->tasks_error++;
-            stats.tasks[TASK_ERROR]++;
 
             metrics->incrementTasksStates(
                 TASK_ERROR,
@@ -2551,7 +2530,6 @@ void Master::_accept(
                 TaskStatus::REASON_TASK_INVALID);
 
             metrics->tasks_error++;
-            stats.tasks[TASK_ERROR]++;
 
             metrics->incrementTasksStates(
                 TASK_ERROR,
@@ -2838,7 +2816,6 @@ void Master::schedulerMessage(
       << "Ignoring framework message for executor " << executorId
       << " of framework " << frameworkId
       << " because the framework cannot be found";
-    stats.invalidFrameworkMessages++;
     metrics->invalid_framework_to_executor_messages++;
     return;
   }
@@ -2848,7 +2825,6 @@ void Master::schedulerMessage(
       << "Ignoring framework message for executor " << executorId
       << " of framework " << *framework
       << " because it is not expected from " << from;
-    stats.invalidFrameworkMessages++;
     metrics->invalid_framework_to_executor_messages++;
     return;
   }
@@ -2858,7 +2834,6 @@ void Master::schedulerMessage(
     LOG(WARNING) << "Cannot send framework message for framework "
                  << *framework << " to slave " << slaveId
                  << " because slave is not registered";
-    stats.invalidFrameworkMessages++;
     metrics->invalid_framework_to_executor_messages++;
     return;
   }
@@ -2867,7 +2842,6 @@ void Master::schedulerMessage(
     LOG(WARNING) << "Cannot send framework message for framework "
                  << *framework << " to slave " << *slave
                  << " because slave is disconnected";
-    stats.invalidFrameworkMessages++;
     metrics->invalid_framework_to_executor_messages++;
     return;
   }
@@ -2882,7 +2856,6 @@ void Master::schedulerMessage(
   message.set_data(data);
   send(slave->pid, message);
 
-  stats.validFrameworkMessages++;
   metrics->valid_framework_to_executor_messages++;
 }
 
@@ -3292,7 +3265,6 @@ void Master::statusUpdate(const StatusUpdate& update, const UPID& pid)
     message.set_message("Status update from unknown slave");
     send(pid, message);
 
-    stats.invalidStatusUpdates++;
     metrics->invalid_status_updates++;
     return;
   }
@@ -3303,7 +3275,6 @@ void Master::statusUpdate(const StatusUpdate& update, const UPID& pid)
     LOG(WARNING) << "Ignoring status update " << update
                  << " from unknown slave " << pid
                  << " with id " << update.slave_id();
-    stats.invalidStatusUpdates++;
     metrics->invalid_status_updates++;
     return;
   }
@@ -3314,7 +3285,6 @@ void Master::statusUpdate(const StatusUpdate& update, const UPID& pid)
     LOG(WARNING) << "Ignoring status update " << update
                  << " from slave " << *slave
                  << " because the framework is unknown";
-    stats.invalidStatusUpdates++;
     metrics->invalid_status_updates++;
     return;
   }
@@ -3329,7 +3299,6 @@ void Master::statusUpdate(const StatusUpdate& update, const UPID& pid)
   if (task == NULL) {
     LOG(WARNING) << "Could not lookup task for status update " << update
                  << " from slave " << *slave;
-    stats.invalidStatusUpdates++;
     metrics->invalid_status_updates++;
     return;
   }
@@ -3342,7 +3311,6 @@ void Master::statusUpdate(const StatusUpdate& update, const UPID& pid)
     removeTask(task);
   }
 
-  stats.validStatusUpdates++;
   metrics->valid_status_updates++;
 }
 
@@ -4646,8 +4614,6 @@ void Master::updateTask(Task* task, const StatusUpdate& update)
                 ? " (status update state: " + stringify(status.state()) + ")"
                 : "");
 
-  stats.tasks[status.state()]++;
-
   // Once the task becomes terminal, we recover the resources.
   if (terminated) {
     allocator->recoverResources(

http://git-wip-us.apache.org/repos/asf/mesos/blob/d9ba9199/src/master/master.hpp
----------------------------------------------------------------------
diff --git a/src/master/master.hpp b/src/master/master.hpp
index ce0e0b3..3c957ab 100644
--- a/src/master/master.hpp
+++ b/src/master/master.hpp
@@ -497,10 +497,6 @@ private:
     process::Future<process::http::Response> state(
         const process::http::Request& request);
 
-    // /master/stats.json
-    process::Future<process::http::Response> stats(
-        const process::http::Request& request);
-
     // /master/tasks.json
     process::Future<process::http::Response> tasks(
         const process::http::Request& request);
@@ -669,21 +665,10 @@ private:
   int64_t nextOfferId;     // Used to give each slot offer a unique ID.
   int64_t nextSlaveId;     // Used to give each slave a unique ID.
 
-  // TODO(bmahler): These are deprecated! Please use metrics instead.
-  // Statistics (initialized in Master::initialize).
-  struct
-  {
-    uint64_t tasks[TaskState_ARRAYSIZE];
-    uint64_t validStatusUpdates;
-    uint64_t invalidStatusUpdates;
-    uint64_t validFrameworkMessages;
-    uint64_t invalidFrameworkMessages;
-  } stats;
-
   // NOTE: It is safe to use a 'shared_ptr' because 'Metrics' is
   // thread safe.
-  // TODO(dhamon): Does this need to be a shared_ptr? Metrics contains copyable
-  // metric types only.
+  // TODO(dhamon): This does not need to be a shared_ptr. Metrics contains
+  // copyable metric types only.
   memory::shared_ptr<Metrics> metrics;
 
   // Gauge handlers.

http://git-wip-us.apache.org/repos/asf/mesos/blob/d9ba9199/src/slave/http.cpp
----------------------------------------------------------------------
diff --git a/src/slave/http.cpp b/src/slave/http.cpp
index d03d361..5f0c39a 100644
--- a/src/slave/http.cpp
+++ b/src/slave/http.cpp
@@ -244,88 +244,6 @@ Future<Response> Slave::Http::health(const Request& request)
 }
 
 
-// Declaration of 'stats' continuation.
-static Future<Response> _stats(
-    const Request& request,
-    JSON::Object object,
-    const Response& response);
-
-
-Future<Response> Slave::Http::stats(const Request& request)
-{
-  LOG(INFO) << "HTTP request for '" << request.path << "'";
-
-  JSON::Object object;
-  object.values["uptime"] = (Clock::now() - slave->startTime).secs();
-  object.values["total_frameworks"] = slave->frameworks.size();
-  object.values["registered"] = slave->master.isSome() ? 1 : 0;
-  object.values["recovery_errors"] = slave->recoveryErrors;
-
-  // NOTE: These are monotonically increasing counters.
-  object.values["staged_tasks"] = slave->stats.tasks[TASK_STAGING];
-  object.values["started_tasks"] = slave->stats.tasks[TASK_STARTING];
-  object.values["finished_tasks"] = slave->stats.tasks[TASK_FINISHED];
-  object.values["killed_tasks"] = slave->stats.tasks[TASK_KILLED];
-  object.values["failed_tasks"] = slave->stats.tasks[TASK_FAILED];
-  object.values["lost_tasks"] = slave->stats.tasks[TASK_LOST];
-  object.values["valid_status_updates"] = slave->stats.validStatusUpdates;
-  object.values["invalid_status_updates"] = slave->stats.invalidStatusUpdates;
-
-  // NOTE: These are gauges representing instantaneous values.
-
-  // Queued waiting for executor to register.
-  int queued_tasks = 0;
-
-  // Sent to executor (TASK_STAGING, TASK_STARTING, TASK_RUNNING).
-  int launched_tasks = 0;
-
-  foreachvalue (Framework* framework, slave->frameworks) {
-    foreachvalue (Executor* executor, framework->executors) {
-      queued_tasks += executor->queuedTasks.size();
-      launched_tasks += executor->launchedTasks.size();
-    }
-  }
-
-  object.values["queued_tasks_gauge"] = queued_tasks;
-  object.values["launched_tasks_gauge"] = launched_tasks;
-
-  // Include metrics from libprocess metrics while we sunset this
-  // endpoint in favor of libprocess metrics.
-  // TODO(benh): Remove this after transitioning to libprocess metrics.
-  return process::http::get(MetricsProcess::instance()->self(), "snapshot")
-    .then(lambda::bind(&_stats, request, object, lambda::_1));
-}
-
-
-static Future<Response> _stats(
-    const Request& request,
-    JSON::Object object,
-    const Response& response)
-{
-  if (response.status != process::http::statuses[200]) {
-    return InternalServerError("Failed to get metrics: " + response.status);
-  }
-
-  Option<string> type = response.headers.get("Content-Type");
-
-  if (type.isNone() || type.get() != "application/json") {
-    return InternalServerError("Failed to get metrics: expecting JSON");
-  }
-
-  Try<JSON::Object> parse = JSON::parse<JSON::Object>(response.body);
-
-  if (parse.isError()) {
-    return InternalServerError("Failed to parse metrics: " + parse.error());
-  }
-
-  // Now add all the values from metrics.
-  // TODO(benh): Make sure we're not overwriting any values.
-  object.values.insert(parse.get().values.begin(), parse.get().values.end());
-
-  return OK(object, request.query.get("jsonp"));
-}
-
-
 Future<Response> Slave::Http::state(const Request& request)
 {
   LOG(INFO) << "HTTP request for '" << request.path << "'";
@@ -354,12 +272,6 @@ Future<Response> Slave::Http::state(const Request& request)
   object.values["hostname"] = slave->info.hostname();
   object.values["resources"] = model(slave->info.resources());
   object.values["attributes"] = model(slave->info.attributes());
-  object.values["staged_tasks"] = slave->stats.tasks[TASK_STAGING];
-  object.values["started_tasks"] = slave->stats.tasks[TASK_STARTING];
-  object.values["finished_tasks"] = slave->stats.tasks[TASK_FINISHED];
-  object.values["killed_tasks"] = slave->stats.tasks[TASK_KILLED];
-  object.values["failed_tasks"] = slave->stats.tasks[TASK_FAILED];
-  object.values["lost_tasks"] = slave->stats.tasks[TASK_LOST];
 
   if (slave->master.isSome()) {
     Try<string> hostname = net::getHostname(slave->master.get().address.ip);

http://git-wip-us.apache.org/repos/asf/mesos/blob/d9ba9199/src/slave/slave.cpp
----------------------------------------------------------------------
diff --git a/src/slave/slave.cpp b/src/slave/slave.cpp
index a06d680..2d52ea0 100644
--- a/src/slave/slave.cpp
+++ b/src/slave/slave.cpp
@@ -342,19 +342,6 @@ void Slave::initialize()
   // a very large disk_watch_interval).
   delay(flags.disk_watch_interval, self(), &Slave::checkDiskUsage);
 
-  // Start all the statistics at 0.
-  stats.tasks[TASK_STAGING] = 0;
-  stats.tasks[TASK_STARTING] = 0;
-  stats.tasks[TASK_RUNNING] = 0;
-  stats.tasks[TASK_FINISHED] = 0;
-  stats.tasks[TASK_FAILED] = 0;
-  stats.tasks[TASK_KILLED] = 0;
-  stats.tasks[TASK_LOST] = 0;
-  stats.validStatusUpdates = 0;
-  stats.invalidStatusUpdates = 0;
-  stats.validFrameworkMessages = 0;
-  stats.invalidFrameworkMessages = 0;
-
   startTime = Clock::now();
 
   // Install protobuf handlers.
@@ -447,7 +434,6 @@ void Slave::initialize()
   route("/health",
         Http::HEALTH_HELP,
         lambda::bind(&Http::health, http, lambda::_1));
-  route("/stats.json", None(), lambda::bind(&Http::stats, http, lambda::_1));
   route("/state.json", None(), lambda::bind(&Http::state, http, lambda::_1));
 
   // Expose the log file for the webui. Fall back to 'log_dir' if
@@ -1374,8 +1360,6 @@ void Slave::_runTask(
         executor->checkpointTask(task);
       }
 
-      stats.tasks[TASK_STAGING]++;
-
       // Queue task if the executor has not yet registered.
       LOG(INFO) << "Queuing task '" << task.task_id()
                   << "' for executor " << executorId
@@ -1389,8 +1373,6 @@ void Slave::_runTask(
         executor->checkpointTask(task);
       }
 
-      stats.tasks[TASK_STAGING]++;
-
       // Queue task until the containerizer is updated with new
       // resource limits (MESOS-998).
       LOG(INFO) << "Queuing task '" << task.task_id()
@@ -1823,7 +1805,6 @@ void Slave::schedulerMessage(
   if (state != RUNNING) {
     LOG(WARNING) << "Dropping message from framework "<< frameworkId
                  << " because the slave is in " << state << " state";
-    stats.invalidFrameworkMessages++;
     metrics.invalid_framework_messages++;
     return;
   }
@@ -1833,7 +1814,6 @@ void Slave::schedulerMessage(
   if (framework == NULL) {
     LOG(WARNING) << "Dropping message from framework "<< frameworkId
                  << " because framework does not exist";
-    stats.invalidFrameworkMessages++;
     metrics.invalid_framework_messages++;
     return;
   }
@@ -1845,7 +1825,6 @@ void Slave::schedulerMessage(
   if (framework->state == Framework::TERMINATING) {
     LOG(WARNING) << "Dropping message from framework "<< frameworkId
                  << " because framework is terminating";
-    stats.invalidFrameworkMessages++;
     metrics.invalid_framework_messages++;
     return;
   }
@@ -1855,7 +1834,6 @@ void Slave::schedulerMessage(
     LOG(WARNING) << "Dropping message for executor '"
                  << executorId << "' of framework " << frameworkId
                  << " because executor does not exist";
-    stats.invalidFrameworkMessages++;
     metrics.invalid_framework_messages++;
     return;
   }
@@ -1871,7 +1849,6 @@ void Slave::schedulerMessage(
       LOG(WARNING) << "Dropping message for executor '"
                    << executorId << "' of framework " << frameworkId
                    << " because executor is not running";
-      stats.invalidFrameworkMessages++;
       metrics.invalid_framework_messages++;
       break;
     case Executor::RUNNING: {
@@ -1881,7 +1858,6 @@ void Slave::schedulerMessage(
       message.mutable_executor_id()->MergeFrom(executorId);
       message.set_data(data);
       send(executor->pid, message);
-      stats.validFrameworkMessages++;
       metrics.valid_framework_messages++;
       break;
     }
@@ -1903,7 +1879,6 @@ void Slave::updateFramework(const FrameworkID& frameworkId, const string& pid)
   if (state != RUNNING) {
     LOG(WARNING) << "Dropping updateFramework message for "<< frameworkId
                  << " because the slave is in " << state << " state";
-    stats.invalidFrameworkMessages++;
     metrics.invalid_framework_messages++;
     return;
   }
@@ -2519,7 +2494,6 @@ void Slave::statusUpdate(const StatusUpdate& update, const UPID& pid)
   if (framework == NULL) {
     LOG(WARNING) << "Ignoring status update " << update
                  << " for unknown framework " << update.framework_id();
-    stats.invalidStatusUpdates++;
     metrics.invalid_status_updates++;
     return;
   }
@@ -2533,7 +2507,6 @@ void Slave::statusUpdate(const StatusUpdate& update, const UPID& pid)
   if (framework->state == Framework::TERMINATING) {
     LOG(WARNING) << "Ignoring status update " << update
                  << " for terminating framework " << framework->id;
-    stats.invalidStatusUpdates++;
     metrics.invalid_status_updates++;
     return;
   }
@@ -2542,7 +2515,6 @@ void Slave::statusUpdate(const StatusUpdate& update, const UPID& pid)
   if (executor == NULL) {
     LOG(WARNING)  << "Could not find the executor for "
                   << "status update " << update;
-    stats.validStatusUpdates++;
     metrics.valid_status_updates++;
 
     // NOTE: We forward the update here because this update could be
@@ -2577,9 +2549,6 @@ void Slave::statusUpdate(const StatusUpdate& update, const UPID& pid)
                  << " (" << executor->pid << ")";
   }
 
-  stats.tasks[status.state()]++;
-  stats.validStatusUpdates++;
-
   metrics.valid_status_updates++;
 
   // We set the latest state of the task here so that the slave can
@@ -2782,7 +2751,6 @@ void Slave::executorMessage(
     LOG(WARNING) << "Dropping framework message from executor "
                  << executorId << " to framework " << frameworkId
                  << " because the slave is in " << state << " state";
-    stats.invalidFrameworkMessages++;
     metrics.invalid_framework_messages++;
     return;
   }
@@ -2792,7 +2760,6 @@ void Slave::executorMessage(
     LOG(WARNING) << "Cannot send framework message from executor "
                  << executorId << " to framework " << frameworkId
                  << " because framework does not exist";
-    stats.invalidFrameworkMessages++;
     metrics.invalid_framework_messages++;
     return;
   }
@@ -2805,7 +2772,6 @@ void Slave::executorMessage(
     LOG(WARNING) << "Ignoring framework message from executor "
                  << executorId << " to framework " << frameworkId
                  << " because framework is terminating";
-    stats.invalidFrameworkMessages++;
     metrics.invalid_framework_messages++;
     return;
   }
@@ -2821,7 +2787,6 @@ void Slave::executorMessage(
   message.set_data(data);
   send(framework->pid, message);
 
-  stats.validFrameworkMessages++;
   metrics.valid_framework_messages++;
 }
 

http://git-wip-us.apache.org/repos/asf/mesos/blob/d9ba9199/src/slave/slave.hpp
----------------------------------------------------------------------
diff --git a/src/slave/slave.hpp b/src/slave/slave.hpp
index 7b58cad..d476d85 100644
--- a/src/slave/slave.hpp
+++ b/src/slave/slave.hpp
@@ -370,10 +370,6 @@ private:
     process::Future<process::http::Response> health(
         const process::http::Request& request);
 
-    // /slave/stats.json
-    process::Future<process::http::Response> stats(
-        const process::http::Request& request);
-
     // /slave/state.json
     process::Future<process::http::Response> state(
         const process::http::Request& request);
@@ -440,16 +436,6 @@ private:
 
   Files* files;
 
-  // Statistics (initialized in Slave::initialize).
-  struct
-  {
-    uint64_t tasks[TaskState_ARRAYSIZE];
-    uint64_t validStatusUpdates;
-    uint64_t invalidStatusUpdates;
-    uint64_t validFrameworkMessages;
-    uint64_t invalidFrameworkMessages;
-  } stats;
-
   Metrics metrics;
 
   double _resources_total(const std::string& name);

http://git-wip-us.apache.org/repos/asf/mesos/blob/d9ba9199/src/tests/master_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/master_tests.cpp b/src/tests/master_tests.cpp
index 3af20e9..580e1f8 100644
--- a/src/tests/master_tests.cpp
+++ b/src/tests/master_tests.cpp
@@ -1485,119 +1485,101 @@ TEST_F(MasterTest, LaunchDuplicateOfferTest)
 }
 
 
-TEST_F(MasterTest, MetricsInStatsEndpoint)
+TEST_F(MasterTest, MetricsInMetricsEndpoint)
 {
-  Try<PID<Master> > master = StartMaster();
+  Try<PID<Master>> master = StartMaster();
   ASSERT_SOME(master);
 
-  Future<process::http::Response> response =
-    process::http::get(master.get(), "stats.json");
+  JSON::Object snapshot = Metrics();
 
-  AWAIT_READY(response);
+  EXPECT_EQ(1u, snapshot.values.count("master/uptime_secs"));
 
-  EXPECT_SOME_EQ(
-      "application/json",
-      response.get().headers.get("Content-Type"));
+  EXPECT_EQ(1u, snapshot.values.count("master/elected"));
+  EXPECT_EQ(1, snapshot.values["master/elected"]);
 
-  Try<JSON::Object> parse = JSON::parse<JSON::Object>(response.get().body);
+  EXPECT_EQ(1u, snapshot.values.count("master/slaves_connected"));
+  EXPECT_EQ(1u, snapshot.values.count("master/slaves_disconnected"));
+  EXPECT_EQ(1u, snapshot.values.count("master/slaves_active"));
+  EXPECT_EQ(1u, snapshot.values.count("master/slaves_inactive"));
 
-  ASSERT_SOME(parse);
+  EXPECT_EQ(1u, snapshot.values.count("master/frameworks_connected"));
+  EXPECT_EQ(1u, snapshot.values.count("master/frameworks_disconnected"));
+  EXPECT_EQ(1u, snapshot.values.count("master/frameworks_active"));
+  EXPECT_EQ(1u, snapshot.values.count("master/frameworks_inactive"));
 
-  JSON::Object stats = parse.get();
-
-  EXPECT_EQ(1u, stats.values.count("master/uptime_secs"));
-
-  EXPECT_EQ(1u, stats.values.count("elected"));
-  EXPECT_EQ(1u, stats.values.count("master/elected"));
-
-  EXPECT_EQ(1, stats.values["elected"]);
-  EXPECT_EQ(1, stats.values["master/elected"]);
-
-  EXPECT_EQ(1u, stats.values.count("master/slaves_connected"));
-  EXPECT_EQ(1u, stats.values.count("master/slaves_disconnected"));
-  EXPECT_EQ(1u, stats.values.count("master/slaves_active"));
-  EXPECT_EQ(1u, stats.values.count("master/slaves_inactive"));
-
-  EXPECT_EQ(1u, stats.values.count("master/frameworks_connected"));
-  EXPECT_EQ(1u, stats.values.count("master/frameworks_disconnected"));
-  EXPECT_EQ(1u, stats.values.count("master/frameworks_active"));
-  EXPECT_EQ(1u, stats.values.count("master/frameworks_inactive"));
-
-  EXPECT_EQ(1u, stats.values.count("master/outstanding_offers"));
-
-  EXPECT_EQ(1u, stats.values.count("master/tasks_staging"));
-  EXPECT_EQ(1u, stats.values.count("master/tasks_starting"));
-  EXPECT_EQ(1u, stats.values.count("master/tasks_running"));
-  EXPECT_EQ(1u, stats.values.count("master/tasks_finished"));
-  EXPECT_EQ(1u, stats.values.count("master/tasks_failed"));
-  EXPECT_EQ(1u, stats.values.count("master/tasks_killed"));
-  EXPECT_EQ(1u, stats.values.count("master/tasks_lost"));
+  EXPECT_EQ(1u, snapshot.values.count("master/outstanding_offers"));
 
-  // TODO(dhamon): Add expectations for task source reason metrics.
+  EXPECT_EQ(1u, snapshot.values.count("master/tasks_staging"));
+  EXPECT_EQ(1u, snapshot.values.count("master/tasks_starting"));
+  EXPECT_EQ(1u, snapshot.values.count("master/tasks_running"));
+  EXPECT_EQ(1u, snapshot.values.count("master/tasks_finished"));
+  EXPECT_EQ(1u, snapshot.values.count("master/tasks_failed"));
+  EXPECT_EQ(1u, snapshot.values.count("master/tasks_killed"));
+  EXPECT_EQ(1u, snapshot.values.count("master/tasks_lost"));
 
-  EXPECT_EQ(1u, stats.values.count("master/dropped_messages"));
+  EXPECT_EQ(1u, snapshot.values.count("master/dropped_messages"));
 
   // Messages from schedulers.
-  EXPECT_EQ(1u, stats.values.count("master/messages_register_framework"));
-  EXPECT_EQ(1u, stats.values.count("master/messages_reregister_framework"));
-  EXPECT_EQ(1u, stats.values.count("master/messages_unregister_framework"));
-  EXPECT_EQ(1u, stats.values.count("master/messages_deactivate_framework"));
-  EXPECT_EQ(1u, stats.values.count("master/messages_kill_task"));
-  EXPECT_EQ(1u, stats.values.count(
+  EXPECT_EQ(1u, snapshot.values.count("master/messages_register_framework"));
+  EXPECT_EQ(1u, snapshot.values.count("master/messages_reregister_framework"));
+  EXPECT_EQ(1u, snapshot.values.count("master/messages_unregister_framework"));
+  EXPECT_EQ(1u, snapshot.values.count("master/messages_deactivate_framework"));
+  EXPECT_EQ(1u, snapshot.values.count("master/messages_kill_task"));
+  EXPECT_EQ(1u, snapshot.values.count(
       "master/messages_status_update_acknowledgement"));
-  EXPECT_EQ(1u, stats.values.count("master/messages_resource_request"));
-  EXPECT_EQ(1u, stats.values.count("master/messages_launch_tasks"));
-  EXPECT_EQ(1u, stats.values.count("master/messages_decline_offers"));
-  EXPECT_EQ(1u, stats.values.count("master/messages_revive_offers"));
-  EXPECT_EQ(1u, stats.values.count("master/messages_reconcile_tasks"));
-  EXPECT_EQ(1u, stats.values.count("master/messages_framework_to_executor"));
+  EXPECT_EQ(1u, snapshot.values.count("master/messages_resource_request"));
+  EXPECT_EQ(1u, snapshot.values.count("master/messages_launch_tasks"));
+  EXPECT_EQ(1u, snapshot.values.count("master/messages_decline_offers"));
+  EXPECT_EQ(1u, snapshot.values.count("master/messages_revive_offers"));
+  EXPECT_EQ(1u, snapshot.values.count("master/messages_reconcile_tasks"));
+  EXPECT_EQ(1u, snapshot.values.count("master/messages_framework_to_executor"));
 
   // Messages from slaves.
-  EXPECT_EQ(1u, stats.values.count("master/messages_register_slave"));
-  EXPECT_EQ(1u, stats.values.count("master/messages_reregister_slave"));
-  EXPECT_EQ(1u, stats.values.count("master/messages_unregister_slave"));
-  EXPECT_EQ(1u, stats.values.count("master/messages_status_update"));
-  EXPECT_EQ(1u, stats.values.count("master/messages_exited_executor"));
+  EXPECT_EQ(1u, snapshot.values.count("master/messages_register_slave"));
+  EXPECT_EQ(1u, snapshot.values.count("master/messages_reregister_slave"));
+  EXPECT_EQ(1u, snapshot.values.count("master/messages_unregister_slave"));
+  EXPECT_EQ(1u, snapshot.values.count("master/messages_status_update"));
+  EXPECT_EQ(1u, snapshot.values.count("master/messages_exited_executor"));
 
   // Messages from both schedulers and slaves.
-  EXPECT_EQ(1u, stats.values.count("master/messages_authenticate"));
+  EXPECT_EQ(1u, snapshot.values.count("master/messages_authenticate"));
 
-  EXPECT_EQ(1u, stats.values.count(
+  EXPECT_EQ(1u, snapshot.values.count(
       "master/valid_framework_to_executor_messages"));
-  EXPECT_EQ(1u, stats.values.count(
+  EXPECT_EQ(1u, snapshot.values.count(
       "master/invalid_framework_to_executor_messages"));
 
-  EXPECT_EQ(1u, stats.values.count("master/valid_status_updates"));
-  EXPECT_EQ(1u, stats.values.count("master/invalid_status_updates"));
+  EXPECT_EQ(1u, snapshot.values.count("master/valid_status_updates"));
+  EXPECT_EQ(1u, snapshot.values.count("master/invalid_status_updates"));
 
-  EXPECT_EQ(1u, stats.values.count(
+  EXPECT_EQ(1u, snapshot.values.count(
       "master/valid_status_update_acknowledgements"));
-  EXPECT_EQ(1u, stats.values.count(
+  EXPECT_EQ(1u, snapshot.values.count(
       "master/invalid_status_update_acknowledgements"));
 
-  EXPECT_EQ(1u, stats.values.count("master/recovery_slave_removals"));
+  EXPECT_EQ(1u, snapshot.values.count("master/recovery_slave_removals"));
 
-  EXPECT_EQ(1u, stats.values.count("master/event_queue_messages"));
-  EXPECT_EQ(1u, stats.values.count("master/event_queue_dispatches"));
-  EXPECT_EQ(1u, stats.values.count("master/event_queue_http_requests"));
+  EXPECT_EQ(1u, snapshot.values.count("master/event_queue_messages"));
+  EXPECT_EQ(1u, snapshot.values.count("master/event_queue_dispatches"));
+  EXPECT_EQ(1u, snapshot.values.count("master/event_queue_http_requests"));
 
-  EXPECT_EQ(1u, stats.values.count("master/cpus_total"));
-  EXPECT_EQ(1u, stats.values.count("master/cpus_used"));
-  EXPECT_EQ(1u, stats.values.count("master/cpus_percent"));
+  EXPECT_EQ(1u, snapshot.values.count("master/cpus_total"));
+  EXPECT_EQ(1u, snapshot.values.count("master/cpus_used"));
+  EXPECT_EQ(1u, snapshot.values.count("master/cpus_percent"));
 
-  EXPECT_EQ(1u, stats.values.count("master/mem_total"));
-  EXPECT_EQ(1u, stats.values.count("master/mem_used"));
-  EXPECT_EQ(1u, stats.values.count("master/mem_percent"));
+  EXPECT_EQ(1u, snapshot.values.count("master/mem_total"));
+  EXPECT_EQ(1u, snapshot.values.count("master/mem_used"));
+  EXPECT_EQ(1u, snapshot.values.count("master/mem_percent"));
 
-  EXPECT_EQ(1u, stats.values.count("master/disk_total"));
-  EXPECT_EQ(1u, stats.values.count("master/disk_used"));
-  EXPECT_EQ(1u, stats.values.count("master/disk_percent"));
+  EXPECT_EQ(1u, snapshot.values.count("master/disk_total"));
+  EXPECT_EQ(1u, snapshot.values.count("master/disk_used"));
+  EXPECT_EQ(1u, snapshot.values.count("master/disk_percent"));
 
-  EXPECT_EQ(1u, stats.values.count("registrar/queued_operations"));
-  EXPECT_EQ(1u, stats.values.count("registrar/registry_size_bytes"));
+  EXPECT_EQ(1u, snapshot.values.count("registrar/queued_operations"));
+  EXPECT_EQ(1u, snapshot.values.count("registrar/registry_size_bytes"));
 
-  EXPECT_EQ(1u, stats.values.count("registrar/state_fetch_ms"));
-  EXPECT_EQ(1u, stats.values.count("registrar/state_store_ms"));
+  EXPECT_EQ(1u, snapshot.values.count("registrar/state_fetch_ms"));
+  EXPECT_EQ(1u, snapshot.values.count("registrar/state_store_ms"));
 
   Shutdown();
 }

http://git-wip-us.apache.org/repos/asf/mesos/blob/d9ba9199/src/tests/slave_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/slave_tests.cpp b/src/tests/slave_tests.cpp
index a74ff7b..27b3410 100644
--- a/src/tests/slave_tests.cpp
+++ b/src/tests/slave_tests.cpp
@@ -806,68 +806,53 @@ TEST_F(SlaveTest, IgnoreNonLeaderStatusUpdateAcknowledgement)
 }
 
 
-TEST_F(SlaveTest, MetricsInStatsEndpoint)
+TEST_F(SlaveTest, MetricsInMetricsEndpoint)
 {
-  Try<PID<Master> > master = StartMaster();
+  Try<PID<Master>> master = StartMaster();
   ASSERT_SOME(master);
 
-  Try<PID<Slave> > slave = StartSlave();
+  Try<PID<Slave>> slave = StartSlave();
   ASSERT_SOME(slave);
 
-  Future<http::Response> response =
-    http::get(slave.get(), "stats.json");
-
-  AWAIT_READY(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"));
+  JSON::Object snapshot = Metrics();
 
-  EXPECT_EQ(1u, stats.values.count("slave/recovery_errors"));
+  EXPECT_EQ(1u, snapshot.values.count("slave/uptime_secs"));
+  EXPECT_EQ(1u, snapshot.values.count("slave/registered"));
 
-  EXPECT_EQ(1u, stats.values.count("slave/frameworks_active"));
+  EXPECT_EQ(1u, snapshot.values.count("slave/recovery_errors"));
 
-  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, snapshot.values.count("slave/frameworks_active"));
 
-  // TODO(dhamon): Add expectations for task source reason metrics.
+  EXPECT_EQ(1u, snapshot.values.count("slave/tasks_staging"));
+  EXPECT_EQ(1u, snapshot.values.count("slave/tasks_starting"));
+  EXPECT_EQ(1u, snapshot.values.count("slave/tasks_running"));
+  EXPECT_EQ(1u, snapshot.values.count("slave/tasks_finished"));
+  EXPECT_EQ(1u, snapshot.values.count("slave/tasks_failed"));
+  EXPECT_EQ(1u, snapshot.values.count("slave/tasks_killed"));
+  EXPECT_EQ(1u, snapshot.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, snapshot.values.count("slave/executors_registering"));
+  EXPECT_EQ(1u, snapshot.values.count("slave/executors_running"));
+  EXPECT_EQ(1u, snapshot.values.count("slave/executors_terminating"));
+  EXPECT_EQ(1u, snapshot.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, snapshot.values.count("slave/valid_status_updates"));
+  EXPECT_EQ(1u, snapshot.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, snapshot.values.count("slave/valid_framework_messages"));
+  EXPECT_EQ(1u, snapshot.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, snapshot.values.count("slave/cpus_total"));
+  EXPECT_EQ(1u, snapshot.values.count("slave/cpus_used"));
+  EXPECT_EQ(1u, snapshot.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, snapshot.values.count("slave/mem_total"));
+  EXPECT_EQ(1u, snapshot.values.count("slave/mem_used"));
+  EXPECT_EQ(1u, snapshot.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"));
+  EXPECT_EQ(1u, snapshot.values.count("slave/disk_total"));
+  EXPECT_EQ(1u, snapshot.values.count("slave/disk_used"));
+  EXPECT_EQ(1u, snapshot.values.count("slave/disk_percent"));
 
   Shutdown();
 }