#[cfg(feature = "layer")]
use crate::TimingLayer;
use crate::{group, EventGroup, Histogram, SpanGroup, Timing, TimingSubscriber};
use std::hash::Hash;
pub struct Builder<S = group::ByName, E = group::ByMessage> {
span_group: S,
event_group: E,
time: quanta::Clock,
bubble_spans: bool,
span_close_events: bool,
}
impl Default for Builder<group::ByName, group::ByMessage> {
fn default() -> Self {
Builder {
span_group: group::ByName,
event_group: group::ByMessage,
time: quanta::Clock::new(),
bubble_spans: true,
span_close_events: false,
}
}
}
impl<S, E> Builder<S, E> {
pub fn spans<S2>(self, span_group: S2) -> Builder<S2, E> {
Builder {
span_group,
event_group: self.event_group,
time: self.time,
bubble_spans: self.bubble_spans,
span_close_events: self.span_close_events,
}
}
pub fn events<E2>(self, event_group: E2) -> Builder<S, E2> {
Builder {
span_group: self.span_group,
event_group,
time: self.time,
bubble_spans: self.bubble_spans,
span_close_events: self.span_close_events,
}
}
pub fn time(self, time: quanta::Clock) -> Builder<S, E> {
Builder { time, ..self }
}
pub fn no_span_recursion(self) -> Self {
Builder {
bubble_spans: false,
..self
}
}
pub fn span_close_events(self) -> Self {
Builder {
span_close_events: true,
..self
}
}
pub fn build_informed<F>(self, new_histogram: F) -> TimingSubscriber<S, E>
where
S: SpanGroup,
E: EventGroup,
S::Id: Hash + Eq,
E::Id: Hash + Eq,
F: FnMut(&S::Id, &E::Id) -> Histogram<u64> + Send + Sync + 'static,
{
let (tx, rx) = crossbeam::channel::unbounded();
TimingSubscriber::new(Timing {
span_group: self.span_group,
event_group: self.event_group,
time: self.time,
bubble_spans: self.bubble_spans,
span_close_events: self.span_close_events,
reader: super::ReaderState {
created: rx,
histograms: Default::default(),
}
.into(),
writers: super::WriterState {
tls: Default::default(),
idle_recorders: Default::default(),
new_histogram: Box::new(new_histogram),
created: tx,
}
.into(),
})
}
pub fn build<F>(self, mut new_histogram: F) -> TimingSubscriber<S, E>
where
S: SpanGroup,
E: EventGroup,
S::Id: Hash + Eq,
E::Id: Hash + Eq,
F: FnMut() -> Histogram<u64> + Send + Sync + 'static,
{
self.build_informed(move |_: &_, _: &_| (new_histogram)())
}
#[cfg(feature = "layer")]
pub fn layer_informed<F>(self, new_histogram: F) -> TimingLayer<S, E>
where
S: SpanGroup,
E: EventGroup,
S::Id: Hash + Eq,
E::Id: Hash + Eq,
F: FnMut(&S::Id, &E::Id) -> Histogram<u64> + Send + Sync + 'static,
{
let (tx, rx) = crossbeam::channel::unbounded();
TimingLayer::new(Timing {
span_group: self.span_group,
event_group: self.event_group,
time: self.time,
bubble_spans: self.bubble_spans,
span_close_events: self.span_close_events,
reader: super::ReaderState {
created: rx,
histograms: Default::default(),
}
.into(),
writers: super::WriterState {
tls: Default::default(),
idle_recorders: Default::default(),
new_histogram: Box::new(new_histogram),
created: tx,
}
.into(),
})
}
#[cfg(feature = "layer")]
pub fn layer<F>(self, mut new_histogram: F) -> TimingLayer<S, E>
where
S: SpanGroup,
E: EventGroup,
S::Id: Hash + Eq,
E::Id: Hash + Eq,
F: FnMut() -> Histogram<u64> + Send + Sync + 'static,
{
self.layer_informed(move |_: &_, _: &_| (new_histogram)())
}
}