recon
Recon wants to be a set of tools usable in production to diagnose Erlang problems or inspect production environment safely.
To build the library:
rebar3 compile
Documentation for the library can be obtained at http://ferd.github.io/recon/
It is recommended that you use tags if you do not want bleeding edge and development content for this library.
Current Status
Versions supported: OTP-17 and up. Support of R16B03-1 down to R15B02 is best effort. Builds with Rebar3 require OTP-17.1 and up because that's what the tool supports.
Changelog
Branches are organized by version. master
contains the bleeding edge, 2.x
contains all stable changes up to the latest release of v2, and 1.x
contains
all stable changes of the first version of Recon.
2.x
- 2.4.0
- Optional formatting of records in traces (thanks to @bartekgorny)
- 2.3.6
- Adapting for OTP-21. Includes the 'deprecation' of
recon:files/0
since OTP-21 no longer supports listing all file descriptors, and removingerror_logger_queue_len
from node stats since a new logging mechanism was introduced in-process instead.
- Adapting for OTP-21. Includes the 'deprecation' of
- 2.3.5
- fixing timefold's first iteration to prevent errors at call-site by sleeping before sampling
- 2.3.4
- fixing edoc tag that broke some downstream packaging attempts
- 2.3.3
- fixing
bin_leak
arith errors - fixes to
recon_alloc:allocators/1
(incl. R16 compatibility) - fix errors in scheduler wall time calculations
term_to_pid
supports binaries
- fixing
- 2.3.2
- Allow the
return_to
option inrecon_trace
- More efficient sorting function for procs and ports attributes (thanks to @zhongwencool and @pichi)
- Allow the usage of
return_trace
inrecon_trace:calls/2-3
instead offun(_) -> return_trace() end
.
- Allow the
- 2.3.1
- Updated
app_deps
script to run with rebar3 dependencies - Minor docs update
- Updated
- 2.3.0
- Doc made clearer around semantics of
recon:proc_count
andrecon:proc_window
. - Fix doc typos
- Fix potential race condition on waiting for death of tracing process
- Add an option which allows sending tracing output somewhere other than group_leader() (thanks @djnym)
- Add ability to pass custom formatter function when tracing (thanks @iilyak)
- Doc made clearer around semantics of
- 2.2.1
- Fixing type specs for
recon:port_types/0
andrecon_lib:count/1
, thanks to @lucafavatella - Minor documentation fixes.
- Fixing type specs for
- 2.2.0:
- Adding scheduler info metrics to get a more accurate picture than what top and CPU gives.
- Broadening
recon_trace:calls/2
interface to allow multiple match specs, which was currently only allowed forcalls/3
. - Support for
mbcs_pool
data inerts_alloc
, and some internal refactoring, thanks to Lukas Larsson.
- 2.1.2:
- Fixing tests for R15B02 and up
- Fixing a backwards compatibility for R15B03 on
recon_alloc
operations with dumps on disk
- 2.1.1:
- Renaming
recon_trace:mfa()
type torecon_trace:tspec()
to avoid issues in older Erlang versions regarding redefining an existing type (Thanks Roberto Aloi)
- Renaming
- 2.1.0:
- Adding
recon_trace
script to allow safe tracing of function calls on production nodes. - Adding
queue_fun.awk
script to inspect running functions of processes with large mailboxes in a crash dump.
- Adding
- 2.0.2:
- Preventing crashes in
recon_alloc
when certain expected allocators do not return results (Thanks to Michal Ptaszek)
- Preventing crashes in
- 2.0.1:
- Add support for R16B03 in
recon_alloc
.
- Add support for R16B03 in
- 2.0.0:
- Test suite added
- Major rewrite of
recon_alloc
, thanks to Lukas Larsson. Things that changed include:average_sizes/0
is renamedaverage_block_sizes/1
and now takes the keywordscurrent
andmax
.- Documentation updates.
memory/1
has new options inallocated_types
andallocated_instances
.memory/2
has been added, which allows to choose betweencurrent
andmax
values.memory(Term)
is made equivalent tomemory(Term, current)
.- Allow
sbcs_to_mbcs/0
to take the argumentscurrent
andmax
. - Added unit conversion function
set_unit/1
, which allows to get therecon_alloc
results in bytes (default), kilobytes, megabytes, and gigabytes, to help with readability.
- Updated the internal rebar version, if anybody were to use it.
recon:port_info/1
no longer includes theparallelism
option by default within themeta
category as this would hurt backwards compatibility on some installations.recon:get_state/2
is added in order to specify timeouts.recon:get_state/1
keeps its 5000 milliseconds timeout.- Addition of a fake attribute called
binary_memory
, which is callable inrecon:info/2,4
,recon:proc_count/2
, andrecon:proc_window/3
. This attribute allows to fetch the amount of memory used by refc binaries for a process, and to sort by that value for counts and windows.
1.x
- 1.2.0:
- add
recon_alloc:snapshot*
functions, which allow memory allocation snapshots to be taken, saved on disk, reloaded, and analyzed on-demand. Thanks to Lukas Larsson for this functionality. - remove
parallelism
data fromport_info
for better OTP backwards compatibility with little loss of information.
- add
- 1.1.0:
- add
recon_lib:term_to_port
to convert a string back to a usable port. - add
recon:port_info/1
andrecon:port_info/2
- add
recon_alloc
module
- add
- 1.0.0: add
info/2
andinfo/4
. Thememory
info type thus gets renamed tomemory_used
, in order to avoid conflicts when picking between a type and a specific process attribute. Types exported by the module also get updated. - 0.4.2: extended
app_deps.erl
to read apps/ directories for releases - 0.4.1: fixed bug where nodes with lots of processes could see the GC call
fail if said processes failed between long calls within the
bin_leak
function call. - 0.4.0: fixed bug where nodes with lots of processes or ports could see their
count or window functions fail because a process or socket closed between the
time the function started and before it finished. This ends up changing the
API in
recon_lib
for the window and count functions that take a specific pid as an argument. - 0.3.1: factored out some logic from
recon:info/1
intorecon_lib:term_to_pid
and allowed arbitrary terms to be used for pids inrecon:get_state/1
.