Struct Profiler

Source
pub struct Profiler { /* private fields */ }
Expand description

Rust profiler based on async-profiler.

Implementations§

Source§

impl Profiler

Source

pub fn spawn(self) -> Result<JoinHandle<()>, SpawnError>

Start profiling. The profiler will run in a tokio task at the configured interval.

This is the same as calling Profiler::spawn_controllable followed by RunningProfiler::detach, except it returns a JoinHandle.

The returned JoinHandle can be used to detect if the profiler has exited due to a fatal error.

This function will fail if it is unable to start async-profiler, for example if it can’t find or load libasyncProfiler.so.

§Example

This example uses a LocalReporter which reports the profiles to a directory. It works with any other Reporter.

let profiler = ProfilerBuilder::default()
   .with_reporter(LocalReporter::new("/tmp/profiles"))
   .build();
profiler.spawn()?;
Source

pub fn spawn_controllable(self) -> Result<RunningProfiler, SpawnError>

Like Self::spawn, but returns a RunningProfiler that allows for controlling (currently only stopping) the profiler.

This allows for changing the configuration of the profiler at runtime, by stopping it and then starting a new Profiler with a new configuration. It also allows for stopping profiling in case the profiler is suspected to cause operational issues.

Dropping the returned RunningProfiler will cause the profiler to quit, so if your application doen’t need to change the profiler’s configuration at runtime, it will be easier to use Profiler::spawn.

This function will fail if it is unable to start async-profiler, for example if it can’t find or load libasyncProfiler.so.

§Example

This example uses a LocalReporter which reports the profiles to a directory. It works with any other Reporter.

let profiler = ProfilerBuilder::default()
   .with_reporter(LocalReporter::new("/tmp/profiles"))
   .build();

let profiler = profiler.spawn_controllable()?;

// [insert your signaling/monitoring mechanism to have a request to disable
// profiling in case of a problem]
let got_request_to_disable_profiling = async move {
    // ...
};
// spawn a task that will disable profiling if requested
tokio::task::spawn(async move {
    if got_request_to_disable_profiling.await {
        profiler.stop().await;
    }
});

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<Unshared, Shared> IntoShared<Shared> for Unshared
where Shared: FromUnshared<Unshared>,

Source§

fn into_shared(self) -> Shared

Creates a shared type from an unshared type.
Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

impl<T> ErasedDestructor for T
where T: 'static,