sea_orm/
metric.rs

1use std::{sync::Arc, time::Duration};
2
3pub(crate) type Callback = Arc<dyn Fn(&Info<'_>) + Send + Sync>;
4
5#[allow(unused_imports)]
6pub(crate) use inner::metric;
7
8#[derive(Debug)]
9/// Query execution infos
10pub struct Info<'a> {
11    /// Query executiuon duration
12    pub elapsed: Duration,
13    /// Query data
14    pub statement: &'a crate::Statement,
15    /// Query execution failed
16    pub failed: bool,
17}
18
19mod inner {
20    #[allow(unused_macros)]
21    macro_rules! metric {
22        ($metric_callback:expr, $stmt:expr, $code:block) => {{
23            let _start = $metric_callback.is_some().then(std::time::SystemTime::now);
24            let res = $code;
25            if let (Some(_start), Some(callback)) = (_start, $metric_callback.as_deref()) {
26                let info = crate::metric::Info {
27                    elapsed: _start.elapsed().unwrap_or_default(),
28                    statement: $stmt,
29                    failed: res.is_err(),
30                };
31                callback(&info);
32            }
33            res
34        }};
35    }
36    pub(crate) use metric;
37}