dial9_perf_self_profile/
symbolize_processor.rs1use dial9_core::pipeline::{Payload, ProcessError, SegmentData, SegmentProcessor};
2use dial9_core::rate_limited;
3use std::future::Future;
4use std::pin::Pin;
5use std::time::Duration;
6
7pub struct SymbolizeProcessor {
20 symbolizer: std::sync::Arc<crate::offline_symbolize::OfflineSymbolizer>,
21}
22
23impl SymbolizeProcessor {
24 pub fn new() -> Self {
25 Self {
26 symbolizer: std::sync::Arc::new(crate::offline_symbolize::OfflineSymbolizer::new()),
27 }
28 }
29}
30
31impl Default for SymbolizeProcessor {
32 fn default() -> Self {
33 Self::new()
34 }
35}
36
37impl std::fmt::Debug for SymbolizeProcessor {
38 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
39 f.debug_struct("SymbolizeProcessor").finish_non_exhaustive()
40 }
41}
42
43impl SegmentProcessor for SymbolizeProcessor {
44 fn name(&self) -> &'static str {
45 "Symbolize"
46 }
47
48 fn process(
49 &mut self,
50 mut data: SegmentData,
51 ) -> Pin<Box<dyn Future<Output = Result<SegmentData, ProcessError>> + Send + '_>> {
52 let symbolizer = self.symbolizer.clone();
53 Box::pin(async move {
54 if data.payload().starts_with(&[0x1f, 0x8b]) {
56 tracing::debug!(target: "dial9_worker", "segment is gzip-compressed, skipping symbolization");
57 return Ok(data);
58 }
59 let input = data.take_payload().into_bytes();
64 let result = tokio::task::spawn_blocking(move || {
68 let maps = crate::read_proc_maps();
69 let output = symbolizer.symbolize_bytes(input.clone(), &maps)?;
70 let mut combined = Payload::new();
73 combined.push(input);
74 combined.push(bytes::Bytes::from(output));
75 Ok::<_, std::io::Error>(combined)
76 })
77 .await;
78 match result {
79 Ok(Ok(payload)) => {
80 data.set_payload(payload);
81 Ok(data)
82 }
83 Ok(Err(e)) => {
84 rate_limited!(Duration::from_secs(60), {
85 tracing::warn!(target: "dial9_worker", error = %e, "symbolization failed, preserving original bytes");
86 });
87 Err(ProcessError::io(data, e))
88 }
89 Err(e) => Err(ProcessError::io(data, std::io::Error::other(e))),
90 }
91 })
92 }
93}