@@ -17,16 +17,14 @@
18-- [Enabling Tracing]
18-- [Enabling Tracing]
20−-- Tracing is disabled by default, because it carries a relatively small, but
20+-- Throughout the lifecycle of a local node, the distributed-process runtime
21−-- tangible cost. To enable tracing, the environment variable
21+-- generates /trace events/, describing internal runtime activities such as
22−-- @DISTRIBUTED_PROCESS_TRACE_ENABLED@ must be set to some value (actual content
22+-- the spawning and death of processes, message sending, delivery and so on.
23−-- is ignored). When the environment variable /is/ set, the system will
23+-- See the 'TraceEvent' type's documentation for a list of all the published
24−-- generate /trace events/ in various circumstances - see 'TraceEvent' for a
24+-- event types.
25−-- list of all the published events. A user can additionally publish custom
25+-- Users can additionally publish custom trace events in the form of
26−-- trace events in the form of 'TraceEvLog' log messages or pass custom
26+-- 'TraceEvLog' log messages or pass custom (i.e., completely user defined)
27−-- (i.e., completely user defined) event data using the 'traceMessage' function.
27+-- event data using the 'traceMessage' function.
28−-- If the environment variable is not set, no trace events will ever be
31-- All published traces are forwarded to a /tracer process/, which can be
29-- All published traces are forwarded to a /tracer process/, which can be
32-- specified (and changed) at runtime using 'traceEnable'. Some pre-defined
30-- specified (and changed) at runtime using 'traceEnable'. Some pre-defined
@@ -37,15 +35,15 @@
38-- [Working with multiple tracer processes]
36-- [Working with multiple tracer processes]
40−-- The system tracing facility only ever writes to a single tracer process. This
38+-- The tracing facility only ever writes to a single tracer process. This
41-- invariant insulates the tracer controller and ensures a fast path for
39-- invariant insulates the tracer controller and ensures a fast path for
42-- handling all trace events. /This/ module provides facilities for layering
40-- handling all trace events. /This/ module provides facilities for layering
43-- trace handlers using Cloud Haskell's built-in delegation primitives.
41-- trace handlers using Cloud Haskell's built-in delegation primitives.
45-- The 'startTracer' function wraps the registered @tracer@ process with the
43-- The 'startTracer' function wraps the registered @tracer@ process with the
46−-- supplied handler and also forwarding trace events to the original tracer.
44+-- supplied handler and also forwards trace events to the original tracer.
47-- The corresponding 'stopTracer' function terminates tracer processes in
45-- The corresponding 'stopTracer' function terminates tracer processes in
48−-- reverse of the order in which they were started, and re-establishes the
46+-- reverse of the order in which they were started, and re-registers the
49-- previous tracer process.
47-- previous tracer process.
51-- [Built in tracers]
49-- [Built in tracers]
@@ -53,22 +51,21 @@
53-- The built in tracers provide a simple /logging/ facility that writes trace
51-- The built in tracers provide a simple /logging/ facility that writes trace
54-- events out to either a log file, @stderr@ or the GHC eventlog. These tracers
52-- events out to either a log file, @stderr@ or the GHC eventlog. These tracers
55-- can be configured using environment variables, or specified manually using
53-- can be configured using environment variables, or specified manually using
56−-- the 'traceEnable' function. The base tracer process cannot be
54+-- the 'traceEnable' function.
58-- When a new local node is started, the contents of several environment
56-- When a new local node is started, the contents of several environment
59−-- variables are checked to determine how the default tracer process
57+-- variables are checked to determine which default tracer process is selected.
60−-- will handle trace events. If none of these variables is set, then the
58+-- If none of these variables is set, a no-op tracer process is installed,
61−-- trace events will be effectively ignored, although they will still be
59+-- which effectively ignores all trace messages. Note that in this case,
62−-- generated and passed through the system. Only one configuration will be
60+-- trace events are still generated and passed through the system.
63−-- chosen - the first that contains a (valid) value. These environment
61+-- Only one default tracer will be chosen - the first that contains a (valid)
64−-- variables, in the order they're checked, are:
62+-- value. These environment variables, in the order they're examined, are:
66-- 1. @DISTRIBUTED_PROCESS_TRACE_FILE@
64-- 1. @DISTRIBUTED_PROCESS_TRACE_FILE@
67-- This is checked for a valid file path. If it exists and the file can be
65-- This is checked for a valid file path. If it exists and the file can be
68-- opened for writing, all trace output will be directed thence. If the supplied
66-- opened for writing, all trace output will be directed thence. If the supplied
69−-- path is invalid, or the file is unavailable for writing - e.g., because
67+-- path is invalid, or the file is unavailable for writing, this tracer will not
70−-- another node has already started tracing to it - then this tracer will be
68+-- be selected.
73-- 2. @DISTRIBUTED_PROCESS_TRACE_CONSOLE@
70-- 2. @DISTRIBUTED_PROCESS_TRACE_CONSOLE@
74-- This is checked for /any/ non-empty value. If set, then all trace output will
71-- This is checked for /any/ non-empty value. If set, then all trace output will
@@ -81,8 +78,10 @@
81-- Users of the /simplelocalnet/ Cloud Haskell backend should also note that
78-- Users of the /simplelocalnet/ Cloud Haskell backend should also note that
82-- because the trace file option only supports trace output from a single node
79-- because the trace file option only supports trace output from a single node
83-- (so as to avoid interleaving), a file trace configured for the master node
80-- (so as to avoid interleaving), a file trace configured for the master node
84−-- will prevent slaves from tracing to the file and will need to fall back to
81+-- will prevent slaves from tracing to the file. They will need to fall back to
85−-- the console or eventlog tracers instead.
82+-- the console or eventlog tracers instead, which can be accomplished by setting
83+-- one of these environment variables /as well/, since the latter will only be
84+-- selected on slaves (when the file tracer selection fails).
87-- Support for writing to the eventlog requires specific intervention to work,
86-- Support for writing to the eventlog requires specific intervention to work,
88-- without which, written traces are silently dropped/ignored and no output will
87-- without which, written traces are silently dropped/ignored and no output will
@@ -97,7 +96,6 @@ module Control.Distributed.Process.Debug
97 , TraceFlags(..)
96 , TraceFlags(..)
98 , TraceSubject(..)
97 , TraceSubject(..)
99 -- * Configuring Tracing
98 -- * Configuring Tracing
101 , enableTrace
99 , enableTrace
102 , enableTraceAsync
100 , enableTraceAsync
103 , disableTrace
101 , disableTrace
@@ -167,7 +165,6 @@ import Control.Distributed.Process.Internal.Trace.Primitives
167 , setTraceFlags
165 , setTraceFlags
168 , setTraceFlagsAsync
166 , setTraceFlagsAsync
169 , getTraceFlags
167 , getTraceFlags
171 , traceOn
168 , traceOn
172 , traceOff
169 , traceOff
173 , traceOnly
170 , traceOnly
@@ -264,8 +261,7 @@ traceProxy pid act = do
264-- supplied tracers (i.e., processes started via 'startTracer') have exited,
261-- supplied tracers (i.e., processes started via 'startTracer') have exited,
265-- subsequent calls to this function will have no effect.
262-- subsequent calls to this function will have no effect.
267−-- If tracing support is disabled for the node, this function will also
268−-- have no effect. If the last tracer to have been registered was not started
264+-- If the last tracer to have been registered was not started
269-- with 'startTracer' then the behaviour of this function is /undefined/.
265-- with 'startTracer' then the behaviour of this function is /undefined/.
270stopTracer :: Process ()
266stopTracer :: Process ()
271stopTracer =
267stopTracer =