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
impl StateMachineMetrics
pub fn new() -> Self
Sourcepub fn average_transition_time(&self) -> Option<Duration>
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
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}Sourcepub fn success_rate(&self) -> f64
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
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
impl Clone for StateMachineMetrics
Source§fn clone(&self) -> StateMachineMetrics
fn clone(&self) -> StateMachineMetrics
Returns a duplicate of the value. Read more
1.0.0§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from
source. Read moreAuto Trait Implementations§
impl Freeze for StateMachineMetrics
impl RefUnwindSafe for StateMachineMetrics
impl Send for StateMachineMetrics
impl Sync for StateMachineMetrics
impl Unpin for StateMachineMetrics
impl UnwindSafe for StateMachineMetrics
Blanket Implementations§
§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§unsafe fn clone_to_uninit(&self, dest: *mut u8)
unsafe fn clone_to_uninit(&self, dest: *mut u8)
🔬This is a nightly-only experimental API. (
clone_to_uninit)