Skip to content

Commit 61d8fc8

Browse files
committed
wip: Report conversion
1 parent dd00869 commit 61d8fc8

File tree

3 files changed

+57
-19
lines changed

3 files changed

+57
-19
lines changed

pyroscope_backends/src/pprof.rs

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
use pprof::{ProfilerGuard, ProfilerGuardBuilder, Report};
1+
use pprof::{ProfilerGuard, ProfilerGuardBuilder};
2+
3+
use crate::types::{Report, StackFrame, StackTrace};
24

35
use super::error::{BackendError, Result};
46
use super::types::{Backend, State};
@@ -122,6 +124,7 @@ impl Backend for Pprof<'_> {
122124
.ok_or_else(|| BackendError::new("pprof-rs: ProfilerGuard report error"))?
123125
.report()
124126
.build()?;
127+
125128
fold(&report, true, &mut buffer)?;
126129

127130
// Restart Profiler
@@ -133,7 +136,7 @@ impl Backend for Pprof<'_> {
133136
}
134137

135138
// Copyright: https://github.com/YangKeao
136-
fn fold<W>(report: &Report, with_thread_name: bool, mut writer: W) -> Result<()>
139+
fn fold<W>(report: &pprof::Report, with_thread_name: bool, mut writer: W) -> Result<()>
137140
where
138141
W: std::io::Write,
139142
{
@@ -165,3 +168,40 @@ where
165168

166169
Ok(())
167170
}
171+
172+
impl From<pprof::Report> for Report {
173+
fn from(report: pprof::Report) -> Self {
174+
Report { data: report.data }
175+
}
176+
}
177+
178+
impl From<pprof::Frames> for StackTrace {
179+
fn from(frames: pprof::Frames) -> Self {
180+
StackTrace::new(
181+
None,
182+
Some(frames.thread_id),
183+
Some(frames.thread_name),
184+
frames.frames.iter().map(|frame| frame.into()).collect(),
185+
)
186+
}
187+
}
188+
189+
impl From<pprof::Symbol> for StackFrame {
190+
fn from(symbol: pprof::Symbol) -> Self {
191+
StackFrame::new(
192+
None,
193+
Some(String::from_utf8(symbol.name.unwrap_or(vec![])).unwrap_or("".to_string())),
194+
Some(
195+
symbol
196+
.filename
197+
.unwrap_or(std::path::PathBuf::new())
198+
.to_str()
199+
.unwrap_or("")
200+
.to_string(),
201+
),
202+
None,
203+
None,
204+
symbol.lineno,
205+
)
206+
}
207+
}

pyroscope_backends/src/pyspy.rs

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
use crate::types::Report;
2+
13
use super::{
24
error::{BackendError, Result},
35
types::{Backend, StackFrame, StackTrace, State},
@@ -119,7 +121,7 @@ pub struct Pyspy {
119121
/// Pyspy State
120122
state: State,
121123
/// Profiling buffer
122-
buffer: Arc<Mutex<HashMap<String, usize>>>,
124+
buffer: Arc<Mutex<Report>>,
123125
/// Pyspy Configuration
124126
config: PyspyConfig,
125127
/// Sampler configuration
@@ -140,7 +142,7 @@ impl Pyspy {
140142
pub fn new(config: PyspyConfig) -> Self {
141143
Pyspy {
142144
state: State::Uninitialized,
143-
buffer: Arc::new(Mutex::new(HashMap::new())),
145+
buffer: Arc::new(Mutex::new(Report::default())),
144146
config,
145147
sampler_config: None,
146148
sampler_thread: None,
@@ -223,7 +225,7 @@ impl Backend for Pyspy {
223225

224226
let own_trace: StackTrace = trace.clone().into();
225227

226-
*buffer.lock()?.entry(own_trace.to_string()).or_insert(0) += 1;
228+
buffer.lock()?.record(own_trace)?;
227229
}
228230
}
229231

@@ -262,13 +264,7 @@ impl Backend for Pyspy {
262264

263265
let buffer = self.buffer.clone();
264266

265-
let col: Vec<String> = buffer
266-
.lock()?
267-
.iter()
268-
.map(|(k, v)| format!("{} {}", k, v))
269-
.collect();
270-
271-
let v8: Vec<u8> = col.join("\n").into_bytes();
267+
let v8: Vec<u8> = buffer.lock()?.to_string().into_bytes();
272268

273269
buffer.lock()?.clear();
274270

pyroscope_backends/src/void.rs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::types::{StackFrame, StackTrace};
1+
use crate::types::{Report, StackFrame, StackTrace};
22

33
use super::{
44
error::Result,
@@ -31,6 +31,7 @@ impl VoidConfig {
3131
pub struct VoidBackend {
3232
state: State,
3333
config: VoidConfig,
34+
buffer: Report,
3435
}
3536

3637
impl VoidBackend {
@@ -56,6 +57,12 @@ impl Backend for VoidBackend {
5657
}
5758

5859
fn initialize(&mut self) -> Result<()> {
60+
// Generate a dummy Stack Trace
61+
let stack_trace = generate_stack_trace()?;
62+
63+
// Add the StackTrace to the buffer
64+
self.buffer.record(stack_trace);
65+
5966
Ok(())
6067
}
6168

@@ -68,12 +75,7 @@ impl Backend for VoidBackend {
6875
}
6976

7077
fn report(&mut self) -> Result<Vec<u8>> {
71-
// Generate a dummy Stack Trace
72-
let stack_trace = generate_stack_trace()?;
73-
74-
// Format the stack trace
75-
let a = format!("{} 1", stack_trace);
76-
let report = a.into_bytes();
78+
let report = self.buffer.to_string().into_bytes();
7779

7880
Ok(report)
7981
}

0 commit comments

Comments
 (0)