Skip to main content

tdm_server_rust/profile/
layer.rs

1//! tracing Layer:在 dev 请求作用域内采集 span 耗时
2
3use super::{is_active, record_close, record_enter, span_label};
4use tracing_subscriber::layer::{Context, Layer};
5use tracing_subscriber::registry::LookupSpan;
6
7/// 开发模式 span 耗时 Layer
8pub struct DevProfileLayer;
9
10impl DevProfileLayer {
11    /// 创建 Layer 实例
12    pub fn new() -> Self {
13        Self
14    }
15}
16
17impl Default for DevProfileLayer {
18    fn default() -> Self {
19        Self::new()
20    }
21}
22
23impl<S> Layer<S> for DevProfileLayer
24where
25    S: tracing::Subscriber + for<'a> LookupSpan<'a>,
26{
27    /// span 开始时登记
28    fn on_enter(&self, id: &tracing::span::Id, ctx: Context<'_, S>) {
29        if !is_active() {
30            return;
31        }
32        let Some(span) = ctx.span(id) else {
33            return;
34        };
35        let meta = span.metadata();
36        let label = span_label(meta);
37        let parent = span.parent().map(|p| p.id());
38        record_enter(
39            id.clone(),
40            label,
41            parent,
42            meta.file(),
43            meta.line(),
44        );
45    }
46
47    /// span 结束时记录耗时
48    fn on_close(&self, id: tracing::span::Id, _ctx: Context<'_, S>) {
49        if !is_active() {
50            return;
51        }
52        record_close(id);
53    }
54}