Skip to content

Commit 489acde

Browse files
committed
[trace-guest] Add trace/events filtering based on max_log_level
Signed-off-by: Doru Blânzeanu <[email protected]>
1 parent bf7be03 commit 489acde

File tree

7 files changed

+40
-16
lines changed

7 files changed

+40
-16
lines changed

src/hyperlight_guest_bin/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ pub extern "C" fn entrypoint(peb_address: u64, seed: u64, ops: u64, max_log_leve
236236
// It is important that all the tracing events are produced after the tracing is initialized.
237237
#[cfg(feature = "trace_guest")]
238238
if max_log_level != LevelFilter::Off {
239-
hyperlight_guest_tracing::init_guest_tracing(guest_start_tsc);
239+
hyperlight_guest_tracing::init_guest_tracing(guest_start_tsc, max_log_level);
240240
}
241241

242242
hyperlight_main();

src/hyperlight_guest_tracing/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ description = """Provides the tracing functionality for the hyperlight guest."""
1313
heapless = { version = "0.9.1", features = ["serde"] }
1414
hyperlight-common = { workspace = true, default-features = false }
1515
spin = "0.10.0"
16-
tracing = { version = "0.1.41", default-features = false, features = ["attributes"] }
16+
tracing = { version = "0.1.41", default-features = false, features = ["attributes", "log"] }
1717
tracing-core = { version = "0.1.34", default-features = false }
1818

1919
[lints]

src/hyperlight_guest_tracing/src/lib.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@ mod trace {
146146
use alloc::sync::{Arc, Weak};
147147

148148
use spin::Mutex;
149+
use tracing::log::LevelFilter;
149150

150151
use super::*;
151152
use crate::state::GuestState;
@@ -155,12 +156,12 @@ mod trace {
155156
static GUEST_STATE: spin::Once<Weak<Mutex<GuestState>>> = spin::Once::new();
156157

157158
/// Initialize the guest tracing subscriber as global default.
158-
pub fn init_guest_tracing(guest_start_tsc: u64) {
159+
pub fn init_guest_tracing(guest_start_tsc: u64, max_log_level: LevelFilter) {
159160
// Set as global default if not already set.
160161
if tracing_core::dispatcher::has_been_set() {
161162
return;
162163
}
163-
let sub = GuestSubscriber::new(guest_start_tsc);
164+
let sub = GuestSubscriber::new(guest_start_tsc, max_log_level);
164165
let state = sub.state();
165166
// Store state Weak<GuestState> to use later at runtime
166167
GUEST_STATE.call_once(|| Arc::downgrade(state));

src/hyperlight_guest_tracing/src/subscriber.rs

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ use alloc::sync::Arc;
2020
use spin::Mutex;
2121
use tracing_core::span::{Attributes, Id, Record};
2222
use tracing_core::subscriber::Subscriber;
23-
use tracing_core::{Event, Metadata};
23+
use tracing_core::{Event, LevelFilter, Metadata};
2424

2525
use crate::state::GuestState;
2626

@@ -30,22 +30,42 @@ pub(crate) struct GuestSubscriber {
3030
/// Protected by a Mutex for inner mutability
3131
/// A reference to this state is stored in a static variable
3232
state: Arc<Mutex<GuestState>>,
33+
/// Maximum log level to record
34+
max_log_level: LevelFilter,
35+
}
36+
37+
/// Converts a `tracing::log::LevelFilter` to a `tracing_core::LevelFilter`
38+
/// Used to check if an event should be recorded based on the maximum log level
39+
fn convert_level_filter(filter: tracing::log::LevelFilter) -> tracing_core::LevelFilter {
40+
match filter {
41+
tracing::log::LevelFilter::Off => tracing_core::LevelFilter::OFF,
42+
tracing::log::LevelFilter::Error => tracing_core::LevelFilter::ERROR,
43+
tracing::log::LevelFilter::Warn => tracing_core::LevelFilter::WARN,
44+
tracing::log::LevelFilter::Info => tracing_core::LevelFilter::INFO,
45+
tracing::log::LevelFilter::Debug => tracing_core::LevelFilter::DEBUG,
46+
tracing::log::LevelFilter::Trace => tracing_core::LevelFilter::TRACE,
47+
}
3348
}
3449

3550
impl GuestSubscriber {
36-
pub(crate) fn new(guest_start_tsc: u64) -> Self {
51+
/// Creates a new `GuestSubscriber` with the given guest start TSC and maximum log level
52+
pub(crate) fn new(guest_start_tsc: u64, max_log_level: tracing::log::LevelFilter) -> Self {
3753
Self {
3854
state: Arc::new(Mutex::new(GuestState::new(guest_start_tsc))),
55+
max_log_level: convert_level_filter(max_log_level),
3956
}
4057
}
58+
/// Returns a reference to the internal state of the subscriber
59+
/// This is used to access the spans and events collected by the subscriber
4160
pub(crate) fn state(&self) -> &Arc<Mutex<GuestState>> {
4261
&self.state
4362
}
4463
}
4564

4665
impl Subscriber for GuestSubscriber {
47-
fn enabled(&self, _md: &Metadata<'_>) -> bool {
48-
true
66+
fn enabled(&self, md: &Metadata<'_>) -> bool {
67+
// Check if the metadata level is less than or equal to the maximum log level filter
68+
self.max_log_level >= *md.level()
4969
}
5070

5171
fn new_span(&self, attrs: &Attributes<'_>) -> Id {

src/tests/rust_guests/dummyguest/Cargo.lock

Lines changed: 3 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/tests/rust_guests/simpleguest/Cargo.lock

Lines changed: 3 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/tests/rust_guests/witguest/Cargo.lock

Lines changed: 5 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)