use std::time::{Duration, Instant};
use tower_resilience_core::ResilienceEvent;
#[derive(Debug, Clone)]
pub enum HedgeEvent {
PrimaryStarted {
name: Option<String>,
timestamp: Instant,
},
HedgeStarted {
name: Option<String>,
attempt: usize,
delay: Duration,
timestamp: Instant,
},
PrimarySucceeded {
name: Option<String>,
duration: Duration,
hedges_cancelled: usize,
timestamp: Instant,
},
HedgeSucceeded {
name: Option<String>,
attempt: usize,
duration: Duration,
primary_cancelled: bool,
timestamp: Instant,
},
AllFailed {
name: Option<String>,
attempts: usize,
timestamp: Instant,
},
}
impl ResilienceEvent for HedgeEvent {
fn event_type(&self) -> &'static str {
match self {
HedgeEvent::PrimaryStarted { .. } => "primary_started",
HedgeEvent::HedgeStarted { .. } => "hedge_started",
HedgeEvent::PrimarySucceeded { .. } => "primary_succeeded",
HedgeEvent::HedgeSucceeded { .. } => "hedge_succeeded",
HedgeEvent::AllFailed { .. } => "all_failed",
}
}
fn timestamp(&self) -> Instant {
match self {
HedgeEvent::PrimaryStarted { timestamp, .. } => *timestamp,
HedgeEvent::HedgeStarted { timestamp, .. } => *timestamp,
HedgeEvent::PrimarySucceeded { timestamp, .. } => *timestamp,
HedgeEvent::HedgeSucceeded { timestamp, .. } => *timestamp,
HedgeEvent::AllFailed { timestamp, .. } => *timestamp,
}
}
fn pattern_name(&self) -> &str {
match self {
HedgeEvent::PrimaryStarted { name, .. } => name.as_deref().unwrap_or("hedge"),
HedgeEvent::HedgeStarted { name, .. } => name.as_deref().unwrap_or("hedge"),
HedgeEvent::PrimarySucceeded { name, .. } => name.as_deref().unwrap_or("hedge"),
HedgeEvent::HedgeSucceeded { name, .. } => name.as_deref().unwrap_or("hedge"),
HedgeEvent::AllFailed { name, .. } => name.as_deref().unwrap_or("hedge"),
}
}
}