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:";
12pub 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 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}