Log request measures in dedicated log channel
diff --git a/src/chttpd/src/chttpd_db.erl b/src/chttpd/src/chttpd_db.erl
index 748b356..9e8f06e 100644
--- a/src/chttpd/src/chttpd_db.erl
+++ b/src/chttpd/src/chttpd_db.erl
@@ -103,6 +103,7 @@
             do_db_req(Req, fun db_req/2);
         {_, [SecondPart | _]} ->
             Handler = chttpd_handlers:db_handler(SecondPart, fun db_req/2),
+            io:format("HANDLING {~p} WITH: ~p~n", [SecondPart, Handler]),
             do_db_req(Req, Handler)
     end.
 
diff --git a/src/couch_log/priv/stats_descriptions.cfg b/src/couch_log/priv/stats_descriptions.cfg
index 31e4161..73acb95 100644
--- a/src/couch_log/priv/stats_descriptions.cfg
+++ b/src/couch_log/priv/stats_descriptions.cfg
@@ -46,3 +46,7 @@
     {type, counter},
     {desc, <<"number of logged warning messages">>}
 ]}.
+{[couch_log, level, measures], [
+    {type, counter},
+    {desc, <<"number of logged measures messages">>}
+]}.
diff --git a/src/couch_log/src/couch_log.erl b/src/couch_log/src/couch_log.erl
index b8a1ca4..42f7944 100644
--- a/src/couch_log/src/couch_log.erl
+++ b/src/couch_log/src/couch_log.erl
@@ -21,6 +21,7 @@
     critical/2,
     alert/2,
     emergency/2,
+    measures/2,
 
     set_level/1
 ]).
@@ -49,6 +50,9 @@
 -spec emergency(string(), list()) -> ok.
 emergency(Fmt, Args) -> log(emergency, Fmt, Args).
 
+-spec measures(string(), list()) -> ok.
+measures(Fmt, Args) -> log(measures, Fmt, Args).
+
 -spec set_level(atom() | string() | integer()) -> true.
 set_level(Level) ->
     config:set("log", "level", couch_log_util:level_to_string(Level)).
diff --git a/src/couch_log/src/couch_log_config.erl b/src/couch_log/src/couch_log_config.erl
index 9259731..e85c347 100644
--- a/src/couch_log/src/couch_log_config.erl
+++ b/src/couch_log/src/couch_log_config.erl
@@ -17,6 +17,7 @@
 -export([
     init/0,
     reconfigure/0,
+    should_log_measures/1,
     get/1
 ]).
 
@@ -38,6 +39,14 @@
 get(Key) ->
     ?MOD_NAME:get(Key).
 
+-spec should_log_measures(term()) -> boolean().
+should_log_measures(_LogEntry) ->
+    case ?MODULE:get(should_log_measures) of
+        true   -> true;
+        false  -> false;
+        _Other -> false
+    end.
+
 -spec entries() -> [string()].
 entries() ->
     [
@@ -45,6 +54,7 @@
         {level_int, "level", "info"},
         {max_message_size, "max_message_size", "16000"},
         {strip_last_msg, "strip_last_msg", "true"},
+        {should_log_measures, "should_log_measures", "true"},
         {filter_fields, "filter_fields", "[pid, registered_name, error_info, messages]"}
     ].
 
@@ -101,6 +111,12 @@
     false;
 transform(strip_last_msg, _) ->
     true;
+transform(should_log_measures, "false") ->
+    false;
+transform(should_log_measures, "true") ->
+    true;
+transform(should_log_measures, _) ->
+    false;
 transform(filter_fields, FieldsStr) ->
     Default = [pid, registered_name, error_info, messages],
     case parse_term(FieldsStr) of
diff --git a/src/couch_log/src/couch_log_util.erl b/src/couch_log/src/couch_log_util.erl
index 8be11e1..abcdcb7 100644
--- a/src/couch_log/src/couch_log_util.erl
+++ b/src/couch_log/src/couch_log_util.erl
@@ -27,6 +27,13 @@
 -include("couch_log.hrl").
 
 -spec should_log(#log_entry{} | atom()) -> boolean().
+should_log(#log_entry{level = measures = Level}=Entry) ->
+    case couch_log_config:should_log_measures(Entry) of
+        true ->
+            true;
+        false ->
+            should_log(Level)
+    end;
 should_log(#log_entry{level = Level}) ->
     should_log(Level);
 should_log(Level) ->
@@ -53,6 +60,7 @@
 level_to_integer(notice) -> 3;
 level_to_integer(warning) -> 4;
 level_to_integer(warn) -> 4;
+level_to_integer(measures) -> 4;
 level_to_integer(error) -> 5;
 level_to_integer(err) -> 5;
 level_to_integer(critical) -> 6;
@@ -66,6 +74,7 @@
 level_to_integer("notice") -> 3;
 level_to_integer("warning") -> 4;
 level_to_integer("warn") -> 4;
+level_to_integer("measures") -> 4;
 level_to_integer("error") -> 5;
 level_to_integer("err") -> 5;
 level_to_integer("critical") -> 6;
@@ -95,6 +104,7 @@
 level_to_atom("4") -> warning;
 level_to_atom("warning") -> warning;
 level_to_atom("warn") -> warning;
+level_to_atom("measures") -> measures;
 level_to_atom("5") -> error;
 level_to_atom("error") -> error;
 level_to_atom("err") -> error;
diff --git a/src/mango/src/mango_cursor_view.erl b/src/mango/src/mango_cursor_view.erl
index 9202ce0..9bca19c 100644
--- a/src/mango/src/mango_cursor_view.erl
+++ b/src/mango/src/mango_cursor_view.erl
@@ -159,6 +159,7 @@
                     Arg = {add_key, bookmark, NewBookmark},
                     {_Go, FinalUserAcc} = UserFun(Arg, LastCursor#cursor.user_acc),
                     Stats0 = LastCursor#cursor.execution_stats,
+                    mango_execution_stats:log_stats(Stats0),
                     FinalUserAcc0 = mango_execution_stats:maybe_add_stats(
                         Opts, UserFun, Stats0, FinalUserAcc
                     ),
diff --git a/src/mango/src/mango_execution_stats.erl b/src/mango/src/mango_execution_stats.erl
index 0db3edf..7d91d08 100644
--- a/src/mango/src/mango_execution_stats.erl
+++ b/src/mango/src/mango_execution_stats.erl
@@ -21,6 +21,7 @@
     incr_results_returned/1,
     log_start/1,
     log_end/1,
+    log_stats/1,
     maybe_add_stats/4
 ]).
 
@@ -74,6 +75,9 @@
 maybe_add_stats(Opts, UserFun, Stats0, UserAcc) ->
     Stats1 = log_end(Stats0),
     couch_stats:update_histogram([mango, query_time], Stats1#execution_stats.executionTimeMs),
+    %% TODO: validate rows/reads assignments
+    chttpd_stats:incr_rows(Stats1#execution_stats.totalDocsExamined),
+    chttpd_stats:incr_reads(Stats1#execution_stats.totalQuorumDocsExamined),
 
     case couch_util:get_value(execution_stats, Opts) of
         true ->
@@ -84,3 +88,9 @@
         _ ->
             UserAcc
     end.
+
+log_stats(Stats) ->
+    {JStats0} = mango_execution_stats:to_json(Stats),
+    Nonce = list_to_binary(couch_log_util:get_msg_id()),
+    JStats = {[{<<"nonce">>, Nonce} | JStats0]},
+    couch_log:measures("GOT MANGO EXEC STATS: ~s", [binary_to_list(jiffy:encode(JStats))]).