add awareness for threads

This commit is contained in:
hal8174 2025-02-19 21:49:09 +01:00
parent 349b37edda
commit 349c0e688c

View file

@ -1,6 +1,7 @@
use std::{ use std::{
collections::HashMap, collections::{HashMap, HashSet},
sync::{atomic::AtomicU64, Mutex}, sync::{atomic::AtomicU64, Mutex},
thread::ThreadId,
time::Instant, time::Instant,
}; };
@ -33,6 +34,7 @@ struct SpanInfo {
struct InnerPerfettoSubscriber { struct InnerPerfettoSubscriber {
buffer: Vec<perfetto::TracePacket>, buffer: Vec<perfetto::TracePacket>,
spans: HashMap<u64, SpanInfo>, spans: HashMap<u64, SpanInfo>,
threads: HashMap<ThreadId, u64>,
} }
impl InnerPerfettoSubscriber { impl InnerPerfettoSubscriber {
@ -40,6 +42,42 @@ impl InnerPerfettoSubscriber {
Self { Self {
buffer, buffer,
spans: HashMap::new(), spans: HashMap::new(),
threads: HashMap::new(),
}
}
fn get_track_id(&mut self) -> u64 {
let current = std::thread::current();
let nextfree = self.threads.len() as u64;
match self.threads.entry(current.id()) {
std::collections::hash_map::Entry::Occupied(occupied_entry) => *occupied_entry.get(),
std::collections::hash_map::Entry::Vacant(vacant_entry) => {
vacant_entry.insert(nextfree);
self.buffer.push(perfetto::TracePacket {
timestamp: None,
data: Some(perfetto::trace_packet::Data::TrackDescriptor(
perfetto::TrackDescriptor {
uuid: Some(nextfree),
parent_uuid: None,
static_or_dynamic_name: None,
process: None,
thread: Some(perfetto::ThreadDescriptor {
pid: Some(1234),
thread_name: current.name().map(|s| s.to_owned()),
tid: Some(nextfree as i32),
}),
},
)),
optional_trusted_packet_sequence_id: Some(
perfetto::trace_packet::OptionalTrustedPacketSequenceId::TrustedPacketSequenceId(
3903809,
),
),
});
nextfree
}
} }
} }
} }
@ -151,7 +189,7 @@ impl PerfettoSubscriber {
static_or_dynamic_name: None, static_or_dynamic_name: None,
process: Some(perfetto::ProcessDescriptor { process: Some(perfetto::ProcessDescriptor {
pid: Some(1234), pid: Some(1234),
process_name: Some(String::from("test")), process_name: Some(String::from("process")),
}), }),
thread: None, thread: None,
}, },
@ -162,27 +200,6 @@ impl PerfettoSubscriber {
), ),
), ),
}); });
packets.push(perfetto::TracePacket {
timestamp: None,
data: Some(perfetto::trace_packet::Data::TrackDescriptor(
perfetto::TrackDescriptor {
uuid: Some(49083589894),
parent_uuid: None,
static_or_dynamic_name: None,
process: None,
thread: Some(perfetto::ThreadDescriptor {
pid: Some(1234),
thread_name: Some(String::from("test_thread")),
tid: Some(10),
}),
},
)),
optional_trusted_packet_sequence_id: Some(
perfetto::trace_packet::OptionalTrustedPacketSequenceId::TrustedPacketSequenceId(
3903809,
),
),
});
Self { Self {
id_counter: AtomicU64::new(1), id_counter: AtomicU64::new(1),
inner: Mutex::new(InnerPerfettoSubscriber::new(packets)), inner: Mutex::new(InnerPerfettoSubscriber::new(packets)),
@ -255,11 +272,12 @@ impl Subscriber for PerfettoSubscriber {
let mut debug_annotations = DebugAnnotationVisitor::new_with_metadata(event.metadata()); let mut debug_annotations = DebugAnnotationVisitor::new_with_metadata(event.metadata());
event.record(&mut debug_annotations); event.record(&mut debug_annotations);
let track_id = inner.get_track_id();
inner.buffer.push(perfetto::TracePacket { inner.buffer.push(perfetto::TracePacket {
timestamp: Some(time), timestamp: Some(time),
data: Some(perfetto::trace_packet::Data::TrackEvent( data: Some(perfetto::trace_packet::Data::TrackEvent(
perfetto::TrackEvent { perfetto::TrackEvent {
track_uuid: Some(49083589894), track_uuid: Some(track_id),
categories: vec![event.metadata().level().as_str().to_owned()], categories: vec![event.metadata().level().as_str().to_owned()],
category_iids: vec![], category_iids: vec![],
name_field: Some(perfetto::track_event::NameField::Name(String::from(event.metadata().name()))), name_field: Some(perfetto::track_event::NameField::Name(String::from(event.metadata().name()))),
@ -287,11 +305,12 @@ impl Subscriber for PerfettoSubscriber {
let level = inner.spans[&span.into_u64()].level; let level = inner.spans[&span.into_u64()].level;
let name = inner.spans[&span.into_u64()].name.clone(); let name = inner.spans[&span.into_u64()].name.clone();
let track_id = inner.get_track_id();
inner.buffer.push(perfetto::TracePacket { inner.buffer.push(perfetto::TracePacket {
timestamp: Some(time), timestamp: Some(time),
data: Some(perfetto::trace_packet::Data::TrackEvent( data: Some(perfetto::trace_packet::Data::TrackEvent(
perfetto::TrackEvent { perfetto::TrackEvent {
track_uuid: Some(49083589894), track_uuid: Some(track_id),
categories: vec![level.as_str().to_owned()], categories: vec![level.as_str().to_owned()],
category_iids: vec![], category_iids: vec![],
name_field: Some(perfetto::track_event::NameField::Name(name)), name_field: Some(perfetto::track_event::NameField::Name(name)),
@ -319,11 +338,12 @@ impl Subscriber for PerfettoSubscriber {
let level = inner.spans[&span.into_u64()].level; let level = inner.spans[&span.into_u64()].level;
let name = inner.spans[&span.into_u64()].name.clone(); let name = inner.spans[&span.into_u64()].name.clone();
let track_id = inner.get_track_id();
inner.buffer.push(perfetto::TracePacket { inner.buffer.push(perfetto::TracePacket {
timestamp: Some(time), timestamp: Some(time),
data: Some(perfetto::trace_packet::Data::TrackEvent( data: Some(perfetto::trace_packet::Data::TrackEvent(
perfetto::TrackEvent { perfetto::TrackEvent {
track_uuid: Some(49083589894), track_uuid: Some(track_id),
categories: vec![level.as_str().to_owned()], categories: vec![level.as_str().to_owned()],
category_iids: vec![], category_iids: vec![],
name_field: Some(perfetto::track_event::NameField::Name(name)), name_field: Some(perfetto::track_event::NameField::Name(name)),