You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by be...@apache.org on 2013/07/13 01:10:39 UTC

[1/2] git commit: Added a '/__processes' endpoint.

Updated Branches:
  refs/heads/master 0cb8a5d73 -> b98892875


Added a '/__processes' endpoint.

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


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

Branch: refs/heads/master
Commit: b9889287526e3c5379aae71adde0b127c25ff530
Parents: e3474a3
Author: Benjamin Hindman <be...@gmail.com>
Authored: Fri Jul 12 15:33:25 2013 -0700
Committer: Benjamin Hindman <be...@gmail.com>
Committed: Fri Jul 12 16:10:18 2013 -0700

----------------------------------------------------------------------
 3rdparty/libprocess/src/process.cpp | 142 ++++++++++++++++++++++++++++++-
 1 file changed, 141 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/b9889287/3rdparty/libprocess/src/process.cpp
----------------------------------------------------------------------
diff --git a/3rdparty/libprocess/src/process.cpp b/3rdparty/libprocess/src/process.cpp
index 3bd7015..08242ce 100644
--- a/3rdparty/libprocess/src/process.cpp
+++ b/3rdparty/libprocess/src/process.cpp
@@ -296,6 +296,56 @@ private:
 };
 
 
+// Helper for creating routes without a process.
+// TODO(benh): Move this into route.hpp.
+class Route
+{
+public:
+  Route(const string& name,
+        const Option<string>& help,
+        const lambda::function<Future<Response>(const Request&)>& handler)
+  {
+    process = new RouteProcess(name, help, handler);
+    spawn(process);
+  }
+
+  ~Route()
+  {
+    terminate(process);
+    wait(process);
+  }
+
+private:
+  class RouteProcess : public Process<RouteProcess>
+  {
+  public:
+    RouteProcess(
+        const string& name,
+        const Option<string>& _help,
+        const lambda::function<Future<Response>(const Request&)>& _handler)
+      : ProcessBase(strings::remove(name, "/", strings::PREFIX)),
+        help(_help),
+        handler(_handler) {}
+
+  protected:
+    virtual void initialize()
+    {
+      route("/", help, &RouteProcess::handle);
+    }
+
+    Future<Response> handle(const Request& request)
+    {
+      return handler(request);
+    }
+
+    const Option<string> help;
+    const lambda::function<Future<Response>(const Request&)> handler;
+  };
+
+  RouteProcess* process;
+};
+
+
 class SocketManager
 {
 public:
@@ -392,6 +442,9 @@ public:
 
   void settle();
 
+  // The /__processes__ route.
+  Future<Response> __processes__(const Request&);
+
 private:
   // Delegate process name to receive root HTTP requests.
   const string delegate;
@@ -1467,7 +1520,7 @@ void initialize(const string& delegate)
   // TODO(bmahler): Investigate memory implications of this window
   // size. We may also want to provide a maximum memory size rather than
   // time window. Or, offload older data to disk, etc.
-  process::statistics = new Statistics(Weeks(2));
+  statistics = new Statistics(Weeks(2));
 
   // Initialize the mime types.
   mime::initialize();
@@ -1475,6 +1528,12 @@ void initialize(const string& delegate)
   // Initialize the response statuses.
   http::initialize();
 
+  // Add a route for getting process information.
+  lambda::function<Future<Response>(const Request&)> __processes__ =
+    lambda::bind(&ProcessManager::__processes__, process_manager, lambda::_1);
+
+  new Route("/__processes__", None(), __processes__);
+
   char temp[INET_ADDRSTRLEN];
   if (inet_ntop(AF_INET, (in_addr*) &__ip__, temp, INET_ADDRSTRLEN) == NULL) {
     PLOG(FATAL) << "Failed to initialize, inet_ntop";
@@ -2370,6 +2429,7 @@ bool ProcessManager::deliver(
   return true;
 }
 
+
 bool ProcessManager::deliver(
     const UPID& to,
     Event* event,
@@ -2826,6 +2886,86 @@ void ProcessManager::settle()
 }
 
 
+Future<Response> ProcessManager::__processes__(const Request&)
+{
+  JSON::Array array;
+
+  synchronized (processes) {
+    foreachvalue (const ProcessBase* process, process_manager->processes) {
+      JSON::Object object;
+      object.values["id"] = process->pid.id;
+
+      JSON::Array events;
+
+      struct JSONVisitor : EventVisitor
+      {
+        JSONVisitor(JSON::Array* _events) : events(_events) {}
+
+        virtual void visit(const MessageEvent& event)
+        {
+          JSON::Object object;
+          object.values["type"] = "MESSAGE";
+
+          const Message& message = *event.message;
+
+          object.values["name"] = message.name;
+          object.values["from"] = string(message.from);
+          object.values["to"] = string(message.to);
+          object.values["body"] = message.body;
+
+          events->values.push_back(object);
+        }
+
+        virtual void visit(const HttpEvent& event)
+        {
+          JSON::Object object;
+          object.values["type"] = "HTTP";
+
+          const Request& request = *event.request;
+
+          object.values["method"] = request.method;
+          object.values["url"] = request.url;
+
+          events->values.push_back(object);
+        }
+
+        virtual void visit(const DispatchEvent& event)
+        {
+          JSON::Object object;
+          object.values["type"] = "DISPATCH";
+          events->values.push_back(object);
+        }
+
+        virtual void visit(const ExitedEvent& event)
+        {
+          JSON::Object object;
+          object.values["type"] = "EXITED";
+          events->values.push_back(object);
+        }
+
+        virtual void visit(const TerminateEvent& event)
+        {
+          JSON::Object object;
+          object.values["type"] = "TERMINATE";
+          events->values.push_back(object);
+        }
+
+        JSON::Array* events;
+      } visitor(&events);
+
+      foreach (Event* event, process->events) {
+        event->visit(&visitor);
+      }
+
+      object.values["events"] = events;
+      array.values.push_back(object);
+    }
+  }
+
+  return OK(array);
+}
+
+
 Timer Timer::create(
     const Duration& duration,
     const lambda::function<void(void)>& thunk)


[2/2] git commit: Added a comment.

Posted by be...@apache.org.
Added a comment.

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


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

Branch: refs/heads/master
Commit: e3474a3741b233645fd53f5e3f1eabc217cef337
Parents: 0cb8a5d
Author: Benjamin Hindman <be...@gmail.com>
Authored: Fri Jul 12 15:32:46 2013 -0700
Committer: Benjamin Hindman <be...@gmail.com>
Committed: Fri Jul 12 16:10:18 2013 -0700

----------------------------------------------------------------------
 3rdparty/libprocess/include/process/http.hpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/e3474a37/3rdparty/libprocess/include/process/http.hpp
----------------------------------------------------------------------
diff --git a/3rdparty/libprocess/include/process/http.hpp b/3rdparty/libprocess/include/process/http.hpp
index 751cfb8..d0a26d3 100644
--- a/3rdparty/libprocess/include/process/http.hpp
+++ b/3rdparty/libprocess/include/process/http.hpp
@@ -33,8 +33,8 @@ struct Request
   // Tracked by: https://issues.apache.org/jira/browse/MESOS-328.
   hashmap<std::string, std::string> headers;
   std::string method;
+  std::string url; // path/query#fragment
   std::string path;
-  std::string url;
   std::string fragment;
   hashmap<std::string, std::string> query;
   std::string body;