Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adds timing info to each sample #133

Merged
merged 4 commits into from Jun 20, 2022
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
3 changes: 3 additions & 0 deletions CHANGELOG.md
Expand Up @@ -9,6 +9,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Changed
- Remove `backtrace-rs` feature, as the default choice when not specified (#130)

### Added
- Add `sample_timestamp` to Frames and UnresolvedFrames in order to have more fine-grained info on when the samples are collected (#133)

## [0.9.1] - 2022-05-19

### Fixed
Expand Down
7 changes: 7 additions & 0 deletions src/frames.rs
Expand Up @@ -5,6 +5,7 @@ use std::fmt::{self, Debug, Display, Formatter};
use std::hash::{Hash, Hasher};
use std::os::raw::c_void;
use std::path::PathBuf;
use std::time::SystemTime;

use smallvec::SmallVec;
use symbolic_demangle::demangle;
Expand All @@ -18,6 +19,7 @@ pub struct UnresolvedFrames {
pub thread_name: [u8; MAX_THREAD_NAME],
pub thread_name_length: usize,
pub thread_id: u64,
pub sample_timestamp: SystemTime,
}

impl Default for UnresolvedFrames {
Expand All @@ -28,6 +30,7 @@ impl Default for UnresolvedFrames {
thread_name: [0; MAX_THREAD_NAME],
thread_name_length: 0,
thread_id: 0,
sample_timestamp: SystemTime::now(),
}
}
}
Expand All @@ -43,6 +46,7 @@ impl UnresolvedFrames {
frames: SmallVec<[<TraceImpl as Trace>::Frame; MAX_DEPTH]>,
tn: &[u8],
thread_id: u64,
sample_timestamp: SystemTime,
) -> Self {
let thread_name_length = tn.len();
let mut thread_name = [0; MAX_THREAD_NAME];
Expand All @@ -53,6 +57,7 @@ impl UnresolvedFrames {
thread_name,
thread_name_length,
thread_id,
sample_timestamp,
}
}
}
Expand Down Expand Up @@ -164,6 +169,7 @@ pub struct Frames {
pub frames: Vec<Vec<Symbol>>,
pub thread_name: String,
pub thread_id: u64,
pub sample_timestamp: SystemTime,
}

impl Frames {
Expand Down Expand Up @@ -210,6 +216,7 @@ impl From<UnresolvedFrames> for Frames {
thread_name: String::from_utf8_lossy(&frames.thread_name[0..frames.thread_name_length])
.into_owned(),
thread_id: frames.thread_id,
sample_timestamp: frames.sample_timestamp,
}
}
}
Expand Down
8 changes: 6 additions & 2 deletions src/profiler.rs
Expand Up @@ -2,6 +2,7 @@

use std::convert::TryInto;
use std::os::raw::c_int;
use std::time::SystemTime;

use nix::sys::signal;
use once_cell::sync::Lazy;
Expand Down Expand Up @@ -284,6 +285,8 @@ extern "C" fn perf_signal_handler(
let mut bt: SmallVec<[<TraceImpl as Trace>::Frame; MAX_DEPTH]> =
SmallVec::with_capacity(MAX_DEPTH);
let mut index = 0;

let sample_timestamp: SystemTime = SystemTime::now();
TraceImpl::trace(ucontext, |frame| {
let ip = Frame::ip(frame);
if profiler.is_blocklisted(ip) {
Expand All @@ -306,7 +309,7 @@ extern "C" fn perf_signal_handler(
write_thread_name(current_thread, &mut name);

let name = unsafe { std::ffi::CStr::from_ptr(name_ptr) };
profiler.sample(bt, name.to_bytes(), current_thread as u64);
profiler.sample(bt, name.to_bytes(), current_thread as u64, sample_timestamp);
}
}
}
Expand Down Expand Up @@ -392,8 +395,9 @@ impl Profiler {
backtrace: SmallVec<[<TraceImpl as Trace>::Frame; MAX_DEPTH]>,
thread_name: &[u8],
thread_id: u64,
sample_timestamp: SystemTime,
) {
let frames = UnresolvedFrames::new(backtrace, thread_name, thread_id);
let frames = UnresolvedFrames::new(backtrace, thread_name, thread_id, sample_timestamp);
self.sample_counter += 1;

if let Ok(()) = self.data.add(frames, 1) {}
Expand Down