hydro_lang/runtime_support/
resource_measurement.rs

1#[cfg(feature = "runtime_measure")]
2use std::panic::AssertUnwindSafe;
3
4#[cfg(feature = "runtime_measure")]
5use dfir_rs::futures::FutureExt;
6use dfir_rs::scheduled::graph::Dfir;
7#[cfg(feature = "runtime_measure")]
8#[cfg(target_os = "linux")]
9use procfs::WithCurrentSystemInfo;
10
11pub const CPU_USAGE_PREFIX: &str = "CPU:";
12// Should remain consistent with dfir_lang/src/graph/ops/_counter.rs
13pub const COUNTER_PREFIX: &str = "_counter";
14
15#[cfg(not(feature = "runtime_measure"))]
16pub async fn run(flow: Dfir<'_>) {
17    dfir_rs::util::deploy::launch_flow(flow).await;
18}
19
20#[cfg(feature = "runtime_measure")]
21pub async fn run(flow: Dfir<'_>) {
22    // Make sure to print CPU even if we crash
23    let res = AssertUnwindSafe(dfir_rs::util::deploy::launch_flow(flow))
24        .catch_unwind()
25        .await;
26
27    #[cfg(target_os = "linux")]
28    {
29        let me = procfs::process::Process::myself().unwrap();
30        let stat = me.stat().unwrap();
31        let sysinfo = procfs::current_system_info();
32
33        let start_time = stat.starttime().get().unwrap();
34        let curr_time = chrono::Local::now();
35        let elapsed_time = curr_time - start_time;
36
37        let seconds_spent = (stat.utime + stat.stime) as f32 / sysinfo.ticks_per_second() as f32;
38        let run_time = chrono::Duration::milliseconds((seconds_spent * 1000.0) as i64);
39
40        let percent_cpu_use =
41            run_time.num_milliseconds() as f32 / elapsed_time.num_milliseconds() as f32;
42        let user_time = chrono::Duration::milliseconds(
43            (stat.utime as f32 / sysinfo.ticks_per_second() as f32 * 1000.0) as i64,
44        );
45        let user_cpu_use =
46            user_time.num_milliseconds() as f32 / elapsed_time.num_milliseconds() as f32;
47        let system_time = chrono::Duration::milliseconds(
48            (stat.stime as f32 / sysinfo.ticks_per_second() as f32 * 1000.0) as i64,
49        );
50        let system_cpu_use =
51            system_time.num_milliseconds() as f32 / elapsed_time.num_milliseconds() as f32;
52        println!(
53            "{} Total {:.4}%, User {:.4}%, System {:.4}%",
54            CPU_USAGE_PREFIX, percent_cpu_use, user_cpu_use, system_cpu_use
55        );
56    }
57
58    res.unwrap();
59}