tdm_server_rust/profile/
layer.rs1use super::{is_active, record_close, record_enter, span_label};
4use tracing_subscriber::layer::{Context, Layer};
5use tracing_subscriber::registry::LookupSpan;
6
7pub struct DevProfileLayer;
9
10impl DevProfileLayer {
11 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 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 fn on_close(&self, id: tracing::span::Id, _ctx: Context<'_, S>) {
49 if !is_active() {
50 return;
51 }
52 record_close(id);
53 }
54}