StateMachineMetrics

Struct StateMachineMetrics 

Source
pub struct StateMachineMetrics {
    pub total_transitions: u64,
    pub successful_transitions: u64,
    pub failed_transitions: u64,
    pub transition_durations: Vec<Duration>,
    pub state_visit_counts: HashMap<String, u64>,
}

Fields§

§total_transitions: u64§successful_transitions: u64§failed_transitions: u64§transition_durations: Vec<Duration>§state_visit_counts: HashMap<String, u64>

Implementations§

Source§

impl StateMachineMetrics

Source

pub fn new() -> Self

Source

pub fn average_transition_time(&self) -> Option<Duration>

Examples found in repository?
examples/traffic_light_example.rs (line 391)
384fn demonstrate_metrics(
385    state_machine: &StateMachine<TrafficLightState, TrafficLightEvent, TrafficContext>,
386) {
387    println!("--- Performance Metrics ---");
388    let metrics = state_machine.get_metrics();
389    println!("  Total transitions: {}", metrics.total_transitions);
390    println!("  Success rate: {:.1}%", metrics.success_rate() * 100.0);
391    if let Some(avg_time) = metrics.average_transition_time() {
392        println!("  Average transition time: {:?}", avg_time);
393    }
394    println!("  State visits:");
395    for (state, count) in &metrics.state_visit_counts {
396        println!("    {}: {} times", state, count);
397    }
398    println!();
399}
More examples
Hide additional examples
examples/order_example.rs (line 260)
194fn metrics_example() {
195    println!("\n=== Metrics Collection Example ===");
196
197    let mut builder = StateMachineBuilderFactory::create::<OrderState, OrderEvent, OrderContext>();
198
199    // Add multiple transitions
200    builder
201        .external_transition()
202        .from(OrderState::New)
203        .to(OrderState::PaymentPending)
204        .on(OrderEvent::Pay)
205        .perform(|_s, _e, _c| {});
206
207    builder
208        .external_transition()
209        .from(OrderState::PaymentPending)
210        .to(OrderState::PaymentReceived)
211        .on(OrderEvent::ConfirmPayment)
212        .when(|_s, _e, ctx| ctx.amount > 0.0)
213        .perform(|_s, _e, _c| {});
214
215    builder
216        .external_transitions()
217        .from_among(vec![
218            OrderState::New,
219            OrderState::PaymentPending,
220            OrderState::Processing,
221        ])
222        .to(OrderState::Cancelled)
223        .on(OrderEvent::Cancel)
224        .perform(|_s, _e, _c| {});
225
226    let state_machine = builder.id("MetricsOrderMachine").build();
227
228    // Simulate multiple orders
229    for i in 0..10 {
230        let context = OrderContext {
231            order_id: format!("ORD-{:03}", i),
232            amount: (i as f64) * 10.0,
233            customer_id: format!("CUST-{:03}", i),
234        };
235
236        let _ = state_machine.fire_event(OrderState::New, OrderEvent::Pay, context.clone());
237
238        if i % 3 == 0 {
239            // Some orders get cancelled
240            let _ =
241                state_machine.fire_event(OrderState::PaymentPending, OrderEvent::Cancel, context);
242        } else {
243            // Others proceed normally
244            let _ = state_machine.fire_event(
245                OrderState::PaymentPending,
246                OrderEvent::ConfirmPayment,
247                context,
248            );
249        }
250    }
251
252    // Get and display metrics
253    let metrics = state_machine.get_metrics();
254    println!("State Machine Metrics:");
255    println!("  Total transitions: {}", metrics.total_transitions);
256    println!("  Successful: {}", metrics.successful_transitions);
257    println!("  Failed: {}", metrics.failed_transitions);
258    println!("  Success rate: {:.2}%", metrics.success_rate() * 100.0);
259
260    if let Some(avg_time) = metrics.average_transition_time() {
261        println!("  Average transition time: {:?}", avg_time);
262    }
263
264    println!("  State visit counts:");
265    for (state, count) in &metrics.state_visit_counts {
266        println!("    {}: {}", state, count);
267    }
268}
Source

pub fn success_rate(&self) -> f64

Examples found in repository?
examples/traffic_light_example.rs (line 390)
384fn demonstrate_metrics(
385    state_machine: &StateMachine<TrafficLightState, TrafficLightEvent, TrafficContext>,
386) {
387    println!("--- Performance Metrics ---");
388    let metrics = state_machine.get_metrics();
389    println!("  Total transitions: {}", metrics.total_transitions);
390    println!("  Success rate: {:.1}%", metrics.success_rate() * 100.0);
391    if let Some(avg_time) = metrics.average_transition_time() {
392        println!("  Average transition time: {:?}", avg_time);
393    }
394    println!("  State visits:");
395    for (state, count) in &metrics.state_visit_counts {
396        println!("    {}: {} times", state, count);
397    }
398    println!();
399}
More examples
Hide additional examples
examples/order_example.rs (line 258)
194fn metrics_example() {
195    println!("\n=== Metrics Collection Example ===");
196
197    let mut builder = StateMachineBuilderFactory::create::<OrderState, OrderEvent, OrderContext>();
198
199    // Add multiple transitions
200    builder
201        .external_transition()
202        .from(OrderState::New)
203        .to(OrderState::PaymentPending)
204        .on(OrderEvent::Pay)
205        .perform(|_s, _e, _c| {});
206
207    builder
208        .external_transition()
209        .from(OrderState::PaymentPending)
210        .to(OrderState::PaymentReceived)
211        .on(OrderEvent::ConfirmPayment)
212        .when(|_s, _e, ctx| ctx.amount > 0.0)
213        .perform(|_s, _e, _c| {});
214
215    builder
216        .external_transitions()
217        .from_among(vec![
218            OrderState::New,
219            OrderState::PaymentPending,
220            OrderState::Processing,
221        ])
222        .to(OrderState::Cancelled)
223        .on(OrderEvent::Cancel)
224        .perform(|_s, _e, _c| {});
225
226    let state_machine = builder.id("MetricsOrderMachine").build();
227
228    // Simulate multiple orders
229    for i in 0..10 {
230        let context = OrderContext {
231            order_id: format!("ORD-{:03}", i),
232            amount: (i as f64) * 10.0,
233            customer_id: format!("CUST-{:03}", i),
234        };
235
236        let _ = state_machine.fire_event(OrderState::New, OrderEvent::Pay, context.clone());
237
238        if i % 3 == 0 {
239            // Some orders get cancelled
240            let _ =
241                state_machine.fire_event(OrderState::PaymentPending, OrderEvent::Cancel, context);
242        } else {
243            // Others proceed normally
244            let _ = state_machine.fire_event(
245                OrderState::PaymentPending,
246                OrderEvent::ConfirmPayment,
247                context,
248            );
249        }
250    }
251
252    // Get and display metrics
253    let metrics = state_machine.get_metrics();
254    println!("State Machine Metrics:");
255    println!("  Total transitions: {}", metrics.total_transitions);
256    println!("  Successful: {}", metrics.successful_transitions);
257    println!("  Failed: {}", metrics.failed_transitions);
258    println!("  Success rate: {:.2}%", metrics.success_rate() * 100.0);
259
260    if let Some(avg_time) = metrics.average_transition_time() {
261        println!("  Average transition time: {:?}", avg_time);
262    }
263
264    println!("  State visit counts:");
265    for (state, count) in &metrics.state_visit_counts {
266        println!("    {}: {}", state, count);
267    }
268}

Trait Implementations§

Source§

impl Clone for StateMachineMetrics

Source§

fn clone(&self) -> StateMachineMetrics

Returns a duplicate of the value. Read more
1.0.0§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for StateMachineMetrics

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

§

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

§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

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

§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
§

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

§

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

Mutably borrows from an owned value. Read more
§

impl<T> CloneToUninit for T
where T: Clone,

§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> From<T> for T

§

fn from(t: T) -> T

Returns the argument unchanged.

§

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

§

fn into(self) -> U

Calls U::from(self).

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

§

impl<T> ToOwned for T
where T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
§

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

§

type Error = Infallible

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

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

Performs the conversion.
§

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

§

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

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

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

Performs the conversion.