pub struct PlatformNotifyMiddleware { /* private fields */ }Expand description
Platform notification middleware — monitors error rates and latency, emits threshold events with hysteresis.
Emits apcore.health.error_threshold_exceeded when a module’s error rate
crosses the configured threshold, apcore.health.latency_threshold_exceeded
when p99 latency exceeds the limit, and apcore.health.recovered when a
previously alerted module recovers below threshold * 0.5.
Issue #36 — canonical event-name standardization: every threshold
event is dual-emitted under both the canonical apcore.health.* name and
its legacy bare-name alias (e.g. error_threshold_exceeded) so that
existing subscribers continue to fire while consumers migrate to the
canonical names. The legacy event payload carries a deprecated: true
marker.
Hysteresis prevents repeated alerts until recovery is observed.
Implementations§
Source§impl PlatformNotifyMiddleware
impl PlatformNotifyMiddleware
Sourcepub fn new(
emitter: EventEmitter,
metrics_collector: Option<MetricsCollector>,
error_rate_threshold: f64,
latency_p99_threshold_ms: f64,
) -> Self
pub fn new( emitter: EventEmitter, metrics_collector: Option<MetricsCollector>, error_rate_threshold: f64, latency_p99_threshold_ms: f64, ) -> Self
Create a new platform notify middleware.
§Arguments
emitter—EventEmitterto emit threshold events to.metrics_collector— OptionalMetricsCollectorto read error rates and latency from. If None, all checks return 0.error_rate_threshold— Error rate (0.0-1.0) above which to alert.latency_p99_threshold_ms— p99 latency in ms above which to alert.
Sourcepub fn with_defaults(
emitter: EventEmitter,
metrics_collector: Option<MetricsCollector>,
) -> Self
pub fn with_defaults( emitter: EventEmitter, metrics_collector: Option<MetricsCollector>, ) -> Self
Create with default thresholds (10% error rate, 5000ms p99 latency).
Trait Implementations§
Source§impl Debug for PlatformNotifyMiddleware
impl Debug for PlatformNotifyMiddleware
Source§impl Middleware for PlatformNotifyMiddleware
impl Middleware for PlatformNotifyMiddleware
Source§fn before<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
_module_id: &'life1 str,
_inputs: Value,
_ctx: &'life2 Context<Value>,
) -> Pin<Box<dyn Future<Output = Result<Option<Value>, ModuleError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
fn before<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
_module_id: &'life1 str,
_inputs: Value,
_ctx: &'life2 Context<Value>,
) -> Pin<Box<dyn Future<Output = Result<Option<Value>, ModuleError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
Ok(None) to pass through unchanged, Ok(Some(v)) to modify.Source§fn after<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
module_id: &'life1 str,
_inputs: Value,
_output: Value,
_ctx: &'life2 Context<Value>,
) -> Pin<Box<dyn Future<Output = Result<Option<Value>, ModuleError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
fn after<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
module_id: &'life1 str,
_inputs: Value,
_output: Value,
_ctx: &'life2 Context<Value>,
) -> Pin<Box<dyn Future<Output = Result<Option<Value>, ModuleError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
inputs is the original (post-before) input for correlation.
Return Ok(None) to pass through unchanged, Ok(Some(v)) to modify.Source§fn on_error<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
module_id: &'life1 str,
_inputs: Value,
_error: &'life2 ModuleError,
_ctx: &'life3 Context<Value>,
) -> Pin<Box<dyn Future<Output = Result<Option<Value>, ModuleError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
fn on_error<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
module_id: &'life1 str,
_inputs: Value,
_error: &'life2 ModuleError,
_ctx: &'life3 Context<Value>,
) -> Pin<Box<dyn Future<Output = Result<Option<Value>, ModuleError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
inputs is the original (post-before) input for correlation.
Return Ok(Some(v)) to signal a recovery output, or Ok(None) to
let the error propagate. Read moreSource§fn priority(&self) -> u16
fn priority(&self) -> u16
MiddlewareManager::add).
When two middlewares have the same priority, registration order is preserved.Source§fn on_error_outcome<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
module_id: &'life1 str,
inputs: Value,
error: &'life2 ModuleError,
ctx: &'life3 Context<Value>,
) -> Pin<Box<dyn Future<Output = Result<Option<OnErrorOutcome>, ModuleError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
fn on_error_outcome<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
module_id: &'life1 str,
inputs: Value,
error: &'life2 ModuleError,
ctx: &'life3 Context<Value>,
) -> Pin<Box<dyn Future<Output = Result<Option<OnErrorOutcome>, ModuleError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
OnErrorOutcome::Retry in addition to producing a recovery output. Read more