pub struct FlameLayer<S, W> { /* private fields */ }
Expand description
A Layer
that records span open/close events as folded flamegraph stack
samples.
The output of FlameLayer
emulates the output of commands like perf
once
they’ve been collapsed by inferno-flamegraph
. The output of this layer
should look similar to the output of the following commands:
perf record --call-graph dwarf target/release/mybin
perf script | inferno-collapse-perf > stacks.folded
§Sample Counts
Because tracing-flame
doesn’t use sampling, the number at the end of each
folded stack trace does not represent a number of samples of that stack.
Instead, the numbers on each line are the number of nanoseconds since the
last event in the same thread.
§Dropping and Flushing
If you use a global subscriber the drop implementations on your various
layers will not get called when your program exits. This means that if
you’re using a buffered writer as the inner writer for the FlameLayer
you’re not guaranteed to see all the events that have been emitted in the
file by default.
To ensure all data is flushed when the program exits, FlameLayer
exposes
the flush_on_drop
function, which returns a FlushGuard
. The FlushGuard
will flush the writer when it is dropped. If necessary, it can also be used to manually
flush the writer.
Implementations§
source§impl<S, W> FlameLayer<S, W>
impl<S, W> FlameLayer<S, W>
sourcepub fn new(writer: W) -> Self
pub fn new(writer: W) -> Self
Returns a new FlameLayer
that outputs all folded stack samples to the
provided writer.
sourcepub fn flush_on_drop(&self) -> FlushGuard<W>
pub fn flush_on_drop(&self) -> FlushGuard<W>
Returns a FlushGuard
which will flush the FlameLayer
’s writer when
it is dropped, or when flush
is manually invoked on the guard.
sourcepub fn with_empty_samples(self, enabled: bool) -> Self
pub fn with_empty_samples(self, enabled: bool) -> Self
Configures whether or not periods of time where no spans are entered should be included in the output.
Defaults to true
.
Setting this feature to false can help with situations where no span is active for large periods of time. This can include time spent idling, or doing uninteresting work that isn’t being measured. When a large number of empty samples are recorded, the flamegraph may be harder to interpret and navigate, since the recorded spans will take up a correspondingly smaller percentage of the graph. In some cases, a large number of empty samples may even hide spans which would otherwise appear in the flamegraph.
sourcepub fn with_threads_collapsed(self, enabled: bool) -> Self
pub fn with_threads_collapsed(self, enabled: bool) -> Self
Configures whether or not spans from different threads should be collapsed into one pool of events.
Defaults to false
.
Setting this feature to true can help with applications that distribute work evenly across many threads, such as thread pools. In such cases it can be difficult to get an overview of where the application as a whole spent most of its time, because work done in the same span may be split up across many threads.
sourcepub fn with_module_path(self, enabled: bool) -> Self
pub fn with_module_path(self, enabled: bool) -> Self
Configures whether or not module paths should be included in the output.
sourcepub fn with_file_and_line(self, enabled: bool) -> Self
pub fn with_file_and_line(self, enabled: bool) -> Self
Configures whether or not file and line should be included in the output.
source§impl<S> FlameLayer<S, BufWriter<File>>where
S: Subscriber + for<'span> LookupSpan<'span>,
impl<S> FlameLayer<S, BufWriter<File>>where
S: Subscriber + for<'span> LookupSpan<'span>,
Trait Implementations§
source§impl<S, W> Layer<S> for FlameLayer<S, W>
impl<S, W> Layer<S> for FlameLayer<S, W>
source§fn on_enter(&self, id: &Id, ctx: Context<'_, S>)
fn on_enter(&self, id: &Id, ctx: Context<'_, S>)
source§fn on_exit(&self, id: &Id, ctx: Context<'_, S>)
fn on_exit(&self, id: &Id, ctx: Context<'_, S>)
source§fn on_register_dispatch(&self, subscriber: &Dispatch)
fn on_register_dispatch(&self, subscriber: &Dispatch)
Subscriber
. Read moresource§fn register_callsite(&self, metadata: &'static Metadata<'static>) -> Interest
fn register_callsite(&self, metadata: &'static Metadata<'static>) -> Interest
Subscriber::register_callsite
. Read moresource§fn enabled(&self, metadata: &Metadata<'_>, ctx: Context<'_, S>) -> bool
fn enabled(&self, metadata: &Metadata<'_>, ctx: Context<'_, S>) -> bool
true
if this layer is interested in a span or event with the
given metadata
in the current Context
, similarly to
Subscriber::enabled
. Read moresource§fn on_new_span(&self, attrs: &Attributes<'_>, id: &Id, ctx: Context<'_, S>)
fn on_new_span(&self, attrs: &Attributes<'_>, id: &Id, ctx: Context<'_, S>)
Attributes
and Id
.source§fn on_record(&self, _span: &Id, _values: &Record<'_>, _ctx: Context<'_, S>)
fn on_record(&self, _span: &Id, _values: &Record<'_>, _ctx: Context<'_, S>)
Id
recorded the given
values
.source§fn on_follows_from(&self, _span: &Id, _follows: &Id, _ctx: Context<'_, S>)
fn on_follows_from(&self, _span: &Id, _follows: &Id, _ctx: Context<'_, S>)
span
recorded that it
follows from the span with the ID follows
.source§fn on_event(&self, _event: &Event<'_>, _ctx: Context<'_, S>)
fn on_event(&self, _event: &Event<'_>, _ctx: Context<'_, S>)
source§fn on_close(&self, _id: Id, _ctx: Context<'_, S>)
fn on_close(&self, _id: Id, _ctx: Context<'_, S>)
source§fn on_id_change(&self, _old: &Id, _new: &Id, _ctx: Context<'_, S>)
fn on_id_change(&self, _old: &Id, _new: &Id, _ctx: Context<'_, S>)
source§fn and_then<L>(self, layer: L) -> Layered<L, Self, S>
fn and_then<L>(self, layer: L) -> Layered<L, Self, S>
Layer
, returning a Layered
struct implementing Layer
. Read moresource§fn with_subscriber(self, inner: S) -> Layered<Self, S>where
Self: Sized,
fn with_subscriber(self, inner: S) -> Layered<Self, S>where
Self: Sized,
Layer
with the given Subscriber
, returning a
Layered
struct that implements Subscriber
. Read more