aboutsummaryrefslogtreecommitdiffstats
path: root/src/cowboy_tracer_h.erl
diff options
context:
space:
mode:
authorLoïc Hoguin <[email protected]>2017-11-17 13:20:14 +0100
committerLoïc Hoguin <[email protected]>2017-11-17 13:23:38 +0100
commitce5ab4b49ae5b8c0f701334ada48a2e517079e1b (patch)
tree4c5feb65c5b1c560f07688743226dda429ec2082 /src/cowboy_tracer_h.erl
parent52d869128b28011e0387f1744c8b547faac46cba (diff)
downloadcowboy-ce5ab4b49ae5b8c0f701334ada48a2e517079e1b.tar.gz
cowboy-ce5ab4b49ae5b8c0f701334ada48a2e517079e1b.tar.bz2
cowboy-ce5ab4b49ae5b8c0f701334ada48a2e517079e1b.zip
Initialize trace patterns only once
They are global for the node for all future call trace flags, so it's not necessary to set them repeatedly with every request. Doing it once at startup also ensures we can't have race conditions when the user wants to change which trace patterns should be used (because requests are concurrent and patterns end up overwriting themselves repeatedly), and makes this changing of trace patterns much more straightforward: the user can just define the ones they want. The default function traces everything. In addition I have also added the tracer_flags option to make the trace flags configurable, excluding the tracer pid.
Diffstat (limited to 'src/cowboy_tracer_h.erl')
-rw-r--r--src/cowboy_tracer_h.erl24
1 files changed, 19 insertions, 5 deletions
diff --git a/src/cowboy_tracer_h.erl b/src/cowboy_tracer_h.erl
index 914c678..6c6340d 100644
--- a/src/cowboy_tracer_h.erl
+++ b/src/cowboy_tracer_h.erl
@@ -21,6 +21,8 @@
-export([terminate/3]).
-export([early_error/5]).
+-export([set_trace_patterns/0]).
+
-export([tracer_process/3]).
-export([system_continue/3]).
-export([system_terminate/4]).
@@ -66,6 +68,15 @@ terminate(StreamID, Reason, Next) ->
early_error(StreamID, Reason, PartialReq, Resp, Opts) ->
cowboy_stream:early_error(StreamID, Reason, PartialReq, Resp, Opts).
+%% API.
+
+%% These trace patterns are most likely not suitable for production.
+-spec set_trace_patterns() -> ok.
+set_trace_patterns() ->
+ erlang:trace_pattern({'_', '_', '_'}, [{'_', [], [{return_trace}]}], [local]),
+ erlang:trace_pattern(on_load, [{'_', [], [{return_trace}]}], [local]),
+ ok.
+
%% Internal.
init_tracer(StreamID, Req, Opts=#{tracer_match_specs := List, tracer_callback := _}) ->
@@ -119,12 +130,15 @@ start_tracer(StreamID, Req, Opts) ->
case erlang:trace_info(self(), tracer) of
{tracer, []} ->
TracerPid = proc_lib:spawn_link(?MODULE, tracer_process, [StreamID, Req, Opts]),
- erlang:trace_pattern({'_', '_', '_'}, [{'_', [], [{return_trace}]}], [local]),
- erlang:trace_pattern(on_load, [{'_', [], [{return_trace}]}], [local]),
- erlang:trace(self(), true, [
- send, 'receive', call, return_to, procs, ports,
- monotonic_timestamp, set_on_spawn, {tracer, TracerPid}
+ %% The default flags are probably not suitable for production.
+ Flags = maps:get(tracer_flags, Opts, [
+ send, 'receive', call, return_to,
+ procs, ports, monotonic_timestamp,
+ %% The set_on_spawn flag is necessary to catch events
+ %% from request processes.
+ set_on_spawn
]),
+ erlang:trace(self(), true, [{tracer, TracerPid}|Flags]),
ok;
_ ->
ok