Skip to content

Commit ab90a97

Browse files
committed
tracing poc
1 parent 08c2236 commit ab90a97

File tree

11 files changed

+288
-10
lines changed

11 files changed

+288
-10
lines changed

lightning-background-processor/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ lightning = { version = "0.2.0", path = "../lightning", default-features = false
2828
lightning-rapid-gossip-sync = { version = "0.2.0", path = "../lightning-rapid-gossip-sync", default-features = false }
2929
lightning-liquidity = { version = "0.2.0", path = "../lightning-liquidity", default-features = false }
3030
possiblyrandom = { version = "0.2", path = "../possiblyrandom", default-features = false }
31+
tracing = "0.1.41"
3132

3233
[dev-dependencies]
3334
tokio = { version = "1.35", features = [ "macros", "rt", "rt-multi-thread", "sync", "time" ] }

lightning-liquidity/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ chrono = { version = "0.4", default-features = false, features = ["serde", "allo
3333
serde = { version = "1.0", default-features = false, features = ["derive", "alloc"] }
3434
serde_json = { version = "1.0", default-features = false, features = ["alloc"] }
3535
backtrace = { version = "0.3", optional = true }
36+
tracing = "0.1.41"
3637

3738
[dev-dependencies]
3839
lightning = { version = "0.2.0", path = "../lightning", default-features = false, features = ["_test_utils"] }

lightning-macros/src/lib.rs

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ use proc_macro::{Delimiter, Group, TokenStream, TokenTree};
2525
use proc_macro2::TokenStream as TokenStream2;
2626
use quote::quote;
2727
use syn::spanned::Spanned;
28-
use syn::{parse, ImplItemFn, Token};
28+
use syn::{parse, Attribute, FnArg, ImplItem, ImplItemFn, ItemImpl, Meta, Token, Visibility};
2929
use syn::{parse_macro_input, Item};
3030

3131
fn add_async_method(mut parsed: ImplItemFn) -> TokenStream {
@@ -400,3 +400,30 @@ pub fn xtest_inventory(_input: TokenStream) -> TokenStream {
400400

401401
TokenStream::from(expanded)
402402
}
403+
404+
/// Auto-enters the parent span.
405+
#[proc_macro_attribute]
406+
pub fn auto_span_methods(_attr: TokenStream, item: TokenStream) -> TokenStream {
407+
let mut input = parse_macro_input!(item as ItemImpl);
408+
409+
for item in input.items.iter_mut() {
410+
if let ImplItem::Fn(method) = item {
411+
if let Visibility::Public(_) = method.vis {
412+
// Skip the method that sets the node_span
413+
if method.sig.ident == "set_node_id" {
414+
continue;
415+
}
416+
417+
if let Some(FnArg::Receiver(_)) = method.sig.inputs.first() {
418+
let block = &method.block;
419+
method.block = syn::parse_quote!({
420+
let _entered_span = self.node_span.enter();
421+
#block
422+
});
423+
}
424+
}
425+
}
426+
}
427+
428+
TokenStream::from(quote!(#input))
429+
}

lightning-rapid-gossip-sync/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ lightning = { version = "0.2.0", path = "../lightning", default-features = false
1919
bitcoin = { version = "0.32.2", default-features = false }
2020
bitcoin_hashes = { version = "0.14.0", default-features = false }
2121
bitcoin-io = { version = "0.1.2", default-features = false }
22+
tracing = "0.1.41"
2223

2324
[target.'cfg(ldk_bench)'.dependencies]
2425
criterion = { version = "0.4", optional = true, default-features = false }

lightning/Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ backtrace = { version = "0.3", optional = true }
5050

5151
libm = { version = "0.2", default-features = false }
5252
inventory = { version = "0.3", optional = true }
53+
tracing = "0.1.41"
54+
tracing-subscriber = "0.3.20"
5355

5456
[dev-dependencies]
5557
regex = "1.5.6"

lightning/src/ln/channelmanager.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2927,6 +2927,8 @@ pub struct ChannelManager<
29272927
signer_provider: SP,
29282928

29292929
logger: L,
2930+
2931+
node_span: tracing::Span,
29302932
}
29312933

29322934
/// Chain-related parameters used to construct a new `ChannelManager`.
@@ -3926,6 +3928,7 @@ macro_rules! process_events_body {
39263928
}
39273929
}
39283930

3931+
#[lightning_macros::auto_span_methods]
39293932
impl<
39303933
M: Deref,
39313934
T: Deref,
@@ -4043,9 +4046,15 @@ where
40434046

40444047
#[cfg(feature = "_test_utils")]
40454048
testing_dnssec_proof_offer_resolution_override: Mutex::new(new_hash_map()),
4049+
4050+
node_span: tracing::span!(tracing::Level::INFO, "node"),
40464051
}
40474052
}
40484053

4054+
pub fn set_node_id(&mut self, id: String) {
4055+
self.node_span = tracing::span!(tracing::Level::INFO, "node", node_id = id);
4056+
}
4057+
40494058
/// Gets the current [`UserConfig`] which controls some global behavior and includes the
40504059
/// default configuration applied to all new channels.
40514060
pub fn get_current_config(&self) -> UserConfig {
@@ -4125,7 +4134,10 @@ where
41254134
/// [`Event::FundingGenerationReady::temporary_channel_id`]: events::Event::FundingGenerationReady::temporary_channel_id
41264135
/// [`Event::ChannelClosed::channel_id`]: events::Event::ChannelClosed::channel_id
41274136
#[rustfmt::skip]
4137+
// #[tracing::instrument(parent = &self.node_span, skip(self))]
41284138
pub fn create_channel(&self, their_network_key: PublicKey, channel_value_satoshis: u64, push_msat: u64, user_channel_id: u128, temporary_channel_id: Option<ChannelId>, override_config: Option<UserConfig>) -> Result<ChannelId, APIError> {
4139+
tracing::info!("create_channel called");
4140+
41294141
if channel_value_satoshis < 1000 {
41304142
return Err(APIError::APIMisuseError { err: format!("Channel value must be at least 1000 satoshis. It was {}", channel_value_satoshis) });
41314143
}
@@ -18122,6 +18134,7 @@ where
1812218134

1812318135
#[cfg(feature = "_test_utils")]
1812418136
testing_dnssec_proof_offer_resolution_override: Mutex::new(new_hash_map()),
18137+
node_span: tracing::span!(tracing::Level::INFO, "node"),
1812518138
};
1812618139

1812718140
let mut processed_claims: HashSet<Vec<MPPClaimHTLCSource>> = new_hash_set();

lightning/src/ln/functional_test_utils.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4572,7 +4572,7 @@ pub fn create_node_chanmgrs<'a, 'b>(
45724572
let network = Network::Testnet;
45734573
let genesis_block = bitcoin::constants::genesis_block(network);
45744574
let params = ChainParameters { network, best_block: BestBlock::from_network(network) };
4575-
let node = ChannelManager::new(
4575+
let mut node = ChannelManager::new(
45764576
cfgs[i].fee_estimator,
45774577
&cfgs[i].chain_monitor,
45784578
cfgs[i].tx_broadcaster,
@@ -4590,6 +4590,9 @@ pub fn create_node_chanmgrs<'a, 'b>(
45904590
params,
45914591
genesis_block.header.time,
45924592
);
4593+
4594+
node.set_node_id(format!("{}", i));
4595+
45934596
chanmgrs.push(node);
45944597
}
45954598

lightning/src/ln/payment_tests.rs

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,12 @@ use crate::types::features::{Bolt11InvoiceFeatures, ChannelTypeFeatures};
4646
use crate::types::payment::{PaymentHash, PaymentPreimage, PaymentSecret};
4747
use crate::types::string::UntrustedString;
4848
use crate::util::errors::APIError;
49+
use crate::util::logger::TracingToLogger;
4950
use crate::util::ser::Writeable;
50-
use crate::util::test_utils;
51+
use crate::util::test_utils::{self, TestTracerLayer};
52+
53+
use tracing_subscriber::fmt::format::FmtSpan;
54+
use tracing_subscriber::{fmt, prelude::*};
5155

5256
use bitcoin::hashes::sha256::Hash as Sha256;
5357
use bitcoin::hashes::Hash;
@@ -61,6 +65,7 @@ use crate::ln::functional_test_utils::*;
6165
use crate::routing::gossip::NodeId;
6266

6367
use core::cmp::Ordering;
68+
use std::sync::Arc;
6469
#[cfg(feature = "std")]
6570
use std::thread;
6671

@@ -428,11 +433,25 @@ fn mpp_receive_timeout() {
428433

429434
#[test]
430435
fn test_keysend_payments() {
436+
// tracing_subscriber::fmt().init();
437+
// tracing_subscriber::fmt()
438+
// // .with_span_list(true) // <--- print parent span chain
439+
// .with_span_events(FmtSpan::FULL)
440+
// .init();
441+
431442
do_test_keysend_payments(false);
432443
do_test_keysend_payments(true);
433444
}
434445

435446
fn do_test_keysend_payments(public_node: bool) {
447+
let layer = TestTracerLayer {};
448+
let subscriber = tracing_subscriber::registry().with(layer);
449+
let _guard = tracing::subscriber::set_default(subscriber);
450+
{
451+
let _enter = tracing::info_span!("hello").entered();
452+
tracing::info!("Hello from tracing!");
453+
}
454+
436455
let chanmon_cfgs = create_chanmon_cfgs(2);
437456
let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
438457
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);

lightning/src/util/logger.rs

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,11 @@
1414
//! [`Level`] field. Each module may have its own Logger or share one.
1515
1616
use bitcoin::secp256k1::PublicKey;
17+
use tracing::Event;
18+
use tracing::Subscriber;
19+
use tracing_subscriber::layer::Context;
20+
use tracing_subscriber::registry::LookupSpan;
21+
use tracing_subscriber::Layer;
1722

1823
use core::cmp;
1924
use core::fmt;
@@ -261,6 +266,81 @@ impl<T: fmt::Display, I: core::iter::Iterator<Item = T> + Clone> fmt::Display fo
261266
}
262267
}
263268

269+
/// A tracing `Layer` that forwards tracing events to a given `Logger`.
270+
pub struct TracingToLogger<L: Deref>
271+
where
272+
L::Target: Logger,
273+
{
274+
logger: L,
275+
}
276+
277+
impl<L: Deref> TracingToLogger<L>
278+
where
279+
L::Target: Logger,
280+
{
281+
pub fn new(logger: L) -> Self {
282+
Self { logger }
283+
}
284+
}
285+
286+
impl<S, L> Layer<S> for TracingToLogger<L>
287+
where
288+
S: Subscriber + for<'lookup> LookupSpan<'lookup>,
289+
L: Deref + 'static,
290+
L::Target: Logger,
291+
{
292+
fn on_event(&self, event: &Event<'_>, _ctx: Context<'_, S>) {
293+
let meta = event.metadata();
294+
let level = *meta.level();
295+
296+
// Extract the "message" field from the event
297+
let mut visitor = MessageVisitor::new();
298+
event.record(&mut visitor);
299+
let message = visitor.message.unwrap_or_else(|| "<no message>".to_string());
300+
301+
self.logger.log(Record::new(
302+
match level {
303+
tracing::Level::ERROR => Level::Error,
304+
tracing::Level::WARN => Level::Warn,
305+
tracing::Level::INFO => Level::Info,
306+
tracing::Level::DEBUG => Level::Debug,
307+
tracing::Level::TRACE => Level::Trace,
308+
},
309+
None,
310+
None,
311+
format_args!("{}", message),
312+
meta.module_path().unwrap_or("<unknown>"),
313+
meta.file().unwrap_or("<unknown>"),
314+
meta.line().unwrap_or(0),
315+
None,
316+
));
317+
}
318+
}
319+
320+
struct MessageVisitor {
321+
message: Option<String>,
322+
}
323+
324+
impl MessageVisitor {
325+
fn new() -> Self {
326+
Self { message: None }
327+
}
328+
}
329+
330+
impl tracing::field::Visit for MessageVisitor {
331+
fn record_debug(&mut self, field: &tracing::field::Field, value: &dyn fmt::Debug) {
332+
if field.name() == "message" {
333+
self.message = Some(format!("{:?}", value));
334+
}
335+
}
336+
337+
fn record_str(&mut self, field: &tracing::field::Field, value: &str) {
338+
if field.name() == "message" {
339+
self.message = Some(value.to_string());
340+
}
341+
}
342+
}
343+
264344
#[cfg(test)]
265345
mod tests {
266346
use crate::ln::types::ChannelId;

lightning/src/util/macro_logger.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -183,39 +183,39 @@ macro_rules! log_given_level {
183183
#[macro_export]
184184
macro_rules! log_error {
185185
($logger: expr, $($arg:tt)*) => (
186-
$crate::log_given_level!($logger, $crate::util::logger::Level::Error, $($arg)*);
186+
tracing::error!($($arg)*);
187187
)
188188
}
189189

190190
/// Log at the `WARN` level.
191191
#[macro_export]
192192
macro_rules! log_warn {
193193
($logger: expr, $($arg:tt)*) => (
194-
$crate::log_given_level!($logger, $crate::util::logger::Level::Warn, $($arg)*);
194+
tracing::warn!($($arg)*);
195195
)
196196
}
197197

198198
/// Log at the `INFO` level.
199199
#[macro_export]
200200
macro_rules! log_info {
201201
($logger: expr, $($arg:tt)*) => (
202-
$crate::log_given_level!($logger, $crate::util::logger::Level::Info, $($arg)*);
202+
tracing::info!($($arg)*);
203203
)
204204
}
205205

206206
/// Log at the `DEBUG` level.
207207
#[macro_export]
208208
macro_rules! log_debug {
209209
($logger: expr, $($arg:tt)*) => (
210-
$crate::log_given_level!($logger, $crate::util::logger::Level::Debug, $($arg)*);
210+
tracing::debug!($($arg)*);
211211
)
212212
}
213213

214214
/// Log at the `TRACE` level.
215215
#[macro_export]
216216
macro_rules! log_trace {
217217
($logger: expr, $($arg:tt)*) => (
218-
$crate::log_given_level!($logger, $crate::util::logger::Level::Trace, $($arg)*)
218+
tracing::trace!($($arg)*);
219219
)
220220
}
221221

0 commit comments

Comments
 (0)