rig_ecs/systems/
diagnostics.rs1use bevy_app::App;
10use bevy_diagnostic::{Diagnostic, DiagnosticPath, Diagnostics, RegisterDiagnostic};
11use bevy_ecs::{prelude::*, query::QueryFilter};
12
13use crate::{
14 agent::{Failed, Run, Settled},
15 bus::{InFlight, PendingEffect},
16};
17
18pub const EFFECTS_IN_FLIGHT: DiagnosticPath = DiagnosticPath::const_new("rig/effects/in_flight");
20pub const EFFECTS_PENDING: DiagnosticPath = DiagnosticPath::const_new("rig/effects/pending");
22pub const RUNS_LIVE: DiagnosticPath = DiagnosticPath::const_new("rig/runs/live");
24
25pub fn register(app: &mut App) {
27 app.register_diagnostic(Diagnostic::new(EFFECTS_IN_FLIGHT))
28 .register_diagnostic(Diagnostic::new(EFFECTS_PENDING))
29 .register_diagnostic(Diagnostic::new(RUNS_LIVE));
30}
31
32#[derive(QueryFilter)]
34pub struct PendingDispatch {
35 _pending: With<PendingEffect>,
36 _not_taken: Without<InFlight>,
37 _not_answered: Without<crate::bus::EffectOutcome>,
38}
39
40#[derive(QueryFilter)]
42pub struct LiveRun {
43 _run: With<Run>,
44 _not_settled: Without<Settled>,
45 _not_failed: Without<Failed>,
46}
47
48pub fn measure(
50 mut diagnostics: Diagnostics,
51 in_flight: Query<(), With<InFlight>>,
52 pending: Query<(), PendingDispatch>,
53 live: Query<(), LiveRun>,
54) {
55 diagnostics.add_measurement(&EFFECTS_IN_FLIGHT, || in_flight.iter().count() as f64);
56 diagnostics.add_measurement(&EFFECTS_PENDING, || pending.iter().count() as f64);
57 diagnostics.add_measurement(&RUNS_LIVE, || live.iter().count() as f64);
58}