diff options
author | Nick Vatamaniuc <vatamane@apache.org> | 2018-03-08 17:02:34 -0500 |
---|---|---|
committer | Nick Vatamaniuc <vatamane@apache.org> | 2018-03-09 09:56:54 -0500 |
commit | 7fbc61fc135952e174ee32f760b7424cae050d3f (patch) | |
tree | 3e733c5c4397af3e9d2d8c02af6895417dd11fdc | |
parent | a5cbcf8c1189d84f5838e70624667dbe0161cef5 (diff) | |
download | couchdb-7fbc61fc135952e174ee32f760b7424cae050d3f.tar.gz |
Handle repeated requests and allow stopping tracerhandle-running-tracer
-rw-r--r-- | src/chttpd/src/chttpd.erl | 32 |
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 |