summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Vatamaniuc <vatamane@apache.org>2018-03-08 17:02:34 -0500
committerNick Vatamaniuc <vatamane@apache.org>2018-03-09 09:56:54 -0500
commit7fbc61fc135952e174ee32f760b7424cae050d3f (patch)
tree3e733c5c4397af3e9d2d8c02af6895417dd11fdc
parenta5cbcf8c1189d84f5838e70624667dbe0161cef5 (diff)
downloadcouchdb-handle-running-tracer.tar.gz
Handle repeated requests and allow stopping tracerhandle-running-tracer
-rw-r--r--src/chttpd/src/chttpd.erl32
1 files changed, 30 insertions, 2 deletions
diff --git a/src/chttpd/src/chttpd.erl b/src/chttpd/src/chttpd.erl
index 258449a79..ce7e0fe39 100644
--- a/src/chttpd/src/chttpd.erl
+++ b/src/chttpd/src/chttpd.erl
@@ -149,13 +149,41 @@ handle_request(MochiReq0) ->
maybe_trace(MochiReq) ->
case MochiReq:get_header_value("x-couchdb-trace") of
"true" ->
- couch_log:info("Trace initializing...", []),
- lg:trace(['_', {scope, [self()]}], lg_file_tracer, "traces.lz4", #{mode => profile});
+ case is_tracer_running() of
+ true ->
+ couch_log:info("Tracer updating scope with request pid:~p", [self()]),
+ % https://github.com/rabbitmq/looking_glass/blob/master/src/lg.erl#L125
+ Children = supervisor:which_children(looking_glass_sup),
+ {default, PoolPid, supervisor, _} = lists:keyfind(default, 1, Children),
+ Tracers = lg_tracer_pool:tracers(PoolPid),
+ TracersMap = maps:from_list(lists:zip(lists:seq(0, length(Tracers) - 1), Tracers)),
+ TracerState = #{mode => profile, tracers => TracersMap},
+ TraceFlags = [call, procs, timestamp, arity, return_to, set_on_spawn],
+ erlang:trace(self(), true, [{tracer, lg_tracer, TracerState} | TraceFlags]);
+ false ->
+ couch_log:info("Trace initializing...", []),
+ lg:trace(['_', {scope, [self()]}], lg_file_tracer, "traces.lz4", #{mode => profile})
+ end;
+ "false" ->
+ case is_tracer_running() of false -> ok; true ->
+ couch_log:info("Trace stopping...", []),
+ lg:stop()
+ end;
_ ->
ok
end.
+is_tracer_running() ->
+ case whereis(looking_glass_sup) of
+ undefined ->
+ false;
+ Pid when is_pid(Pid) ->
+ Children = supervisor:which_children(Pid),
+ lists:keymember(default, 1, Children)
+ end.
+
+
handle_request_int(MochiReq) ->
Begin = os:timestamp(),
case config:get("chttpd", "socket_options") of