pub enum Sink {
Stdout(StdoutSink),
File(FileSink),
Webhook(Box<WebhookSink>),
FanOut(Vec<Sink>),
}Expand description
Enum dispatch for output adapters.
Uses enum dispatch instead of dyn Trait because:
- Async trait methods are not object-safe
FanOut(Vec<Sink>)requires a sized, concrete type
Variants§
Stdout(StdoutSink)
Write NDJSON to stdout.
File(FileSink)
Append NDJSON to a file.
Webhook(Box<WebhookSink>)
Render and POST a templated HTTP request per result.
FanOut(Vec<Sink>)
Fan out to multiple sinks.
Implementations§
Source§impl Sink
impl Sink
Sourcepub fn send<'a>(
&'a mut self,
result: &'a ProcessResult,
) -> Pin<Box<dyn Future<Output = Result<(), RuntimeError>> + Send + 'a>>
pub fn send<'a>( &'a mut self, result: &'a ProcessResult, ) -> Pin<Box<dyn Future<Output = Result<(), RuntimeError>> + Send + 'a>>
Serialize and deliver a ProcessResult to this sink.
Synchronous sinks (Stdout, File) use block_in_place to avoid blocking
the Tokio runtime. Uses Box::pin for the FanOut case to handle
recursive async.
Sourcepub fn send_raw<'a>(
&'a mut self,
json: &'a str,
) -> Pin<Box<dyn Future<Output = Result<(), RuntimeError>> + Send + 'a>>
pub fn send_raw<'a>( &'a mut self, json: &'a str, ) -> Pin<Box<dyn Future<Output = Result<(), RuntimeError>> + Send + 'a>>
Write a pre-serialized JSON string directly to this sink.
Sourcepub fn send_incident<'a>(
&'a mut self,
env: &'a IncidentEnvelope,
) -> Pin<Box<dyn Future<Output = Result<(), RuntimeError>> + Send + 'a>>
pub fn send_incident<'a>( &'a mut self, env: &'a IncidentEnvelope, ) -> Pin<Box<dyn Future<Output = Result<(), RuntimeError>> + Send + 'a>>
Deliver a pre-serialized incident line to this sink.
Stdout/file write the line inline; NATS publishes to the per-incident subject override when set, else the sink’s configured subject. OTLP and webhook sinks no-op, since incidents are not OTLP log records and the webhook renderer templates from structured results, not incidents.
Sourcepub fn into_leaves(self) -> Vec<Sink>
pub fn into_leaves(self) -> Vec<Sink>
Flatten a (possibly nested) FanOut into its leaf sinks.
The delivery layer runs one worker per leaf, so fan-out is realized by
the dispatcher rather than by a FanOut variant on the hot path.
Trait Implementations§
Source§impl DeliverySink for Sink
impl DeliverySink for Sink
Source§fn deliver<'a>(
&'a mut self,
result: &'a ProcessResult,
_ctx: &'a DeliveryContext,
) -> Pin<Box<dyn Future<Output = Result<(), RuntimeError>> + Send + 'a>>
fn deliver<'a>( &'a mut self, result: &'a ProcessResult, _ctx: &'a DeliveryContext, ) -> Pin<Box<dyn Future<Output = Result<(), RuntimeError>> + Send + 'a>>
Source§fn deliver_incident<'a>(
&'a mut self,
incident: &'a IncidentEnvelope,
_ctx: &'a DeliveryContext,
) -> Pin<Box<dyn Future<Output = Result<(), RuntimeError>> + Send + 'a>>
fn deliver_incident<'a>( &'a mut self, incident: &'a IncidentEnvelope, _ctx: &'a DeliveryContext, ) -> Pin<Box<dyn Future<Output = Result<(), RuntimeError>> + Send + 'a>>
Auto Trait Implementations§
impl !RefUnwindSafe for Sink
impl !UnwindSafe for Sink
impl Freeze for Sink
impl Send for Sink
impl Sync for Sink
impl Unpin for Sink
impl UnsafeUnpin for Sink
Blanket Implementations§
Source§impl<T> AnyExt for T
impl<T> AnyExt for T
Source§fn downcast_ref<T>(this: &Self) -> Option<&T>where
T: Any,
fn downcast_ref<T>(this: &Self) -> Option<&T>where
T: Any,
T behind referenceSource§fn downcast_mut<T>(this: &mut Self) -> Option<&mut T>where
T: Any,
fn downcast_mut<T>(this: &mut Self) -> Option<&mut T>where
T: Any,
T behind mutable referenceSource§fn downcast_rc<T>(this: Rc<Self>) -> Result<Rc<T>, Rc<Self>>where
T: Any,
fn downcast_rc<T>(this: Rc<Self>) -> Result<Rc<T>, Rc<Self>>where
T: Any,
T behind Rc pointerSource§fn downcast_arc<T>(this: Arc<Self>) -> Result<Arc<T>, Arc<Self>>where
T: Any,
fn downcast_arc<T>(this: Arc<Self>) -> Result<Arc<T>, Arc<Self>>where
T: Any,
T behind Arc pointerSource§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T, X> CoerceTo<T> for Xwhere
T: CoerceFrom<X> + ?Sized,
impl<T, X> CoerceTo<T> for Xwhere
T: CoerceFrom<X> + ?Sized,
fn coerce_rc_to(self: Rc<X>) -> Rc<T>
fn coerce_box_to(self: Box<X>) -> Box<T>
fn coerce_ref_to(&self) -> &T
fn coerce_mut_to(&mut self) -> &mut T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
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 moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
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