Skip to content

Commit c251a8e

Browse files
committed
Introduce structured, span-based observability through Logger interface
This change allows users to create hierarchical span objects through the Logger interface for specific computations, such as the handling of HTLCs. These span objects will be held in LDK across the corresponding lifetimes before being dropped, providing insight in durations and latencies.
1 parent c6caad8 commit c251a8e

File tree

22 files changed

+975
-397
lines changed

22 files changed

+975
-397
lines changed

fuzz/src/chanmon_consistency.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ struct LatestMonitorState {
178178
}
179179

180180
struct TestChainMonitor {
181-
pub logger: Arc<dyn Logger>,
181+
pub logger: Arc<dyn Logger<UserSpan = ()>>,
182182
pub keys: Arc<KeyProvider>,
183183
pub persister: Arc<TestPersister>,
184184
pub chain_monitor: Arc<
@@ -187,16 +187,16 @@ struct TestChainMonitor {
187187
Arc<dyn chain::Filter>,
188188
Arc<TestBroadcaster>,
189189
Arc<FuzzEstimator>,
190-
Arc<dyn Logger>,
190+
Arc<dyn Logger<UserSpan = ()>>,
191191
Arc<TestPersister>,
192192
>,
193193
>,
194194
pub latest_monitors: Mutex<HashMap<ChannelId, LatestMonitorState>>,
195195
}
196196
impl TestChainMonitor {
197197
pub fn new(
198-
broadcaster: Arc<TestBroadcaster>, logger: Arc<dyn Logger>, feeest: Arc<FuzzEstimator>,
199-
persister: Arc<TestPersister>, keys: Arc<KeyProvider>,
198+
broadcaster: Arc<TestBroadcaster>, logger: Arc<dyn Logger<UserSpan = ()>>,
199+
feeest: Arc<FuzzEstimator>, persister: Arc<TestPersister>, keys: Arc<KeyProvider>,
200200
) -> Self {
201201
Self {
202202
chain_monitor: Arc::new(chainmonitor::ChainMonitor::new(
@@ -446,7 +446,7 @@ type ChanMan<'a> = ChannelManager<
446446
Arc<FuzzEstimator>,
447447
&'a FuzzRouter,
448448
&'a FuzzRouter,
449-
Arc<dyn Logger>,
449+
Arc<dyn Logger<UserSpan = ()>>,
450450
>;
451451

452452
#[inline]
@@ -622,7 +622,7 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out, anchors: bool) {
622622

623623
macro_rules! make_node {
624624
($node_id: expr, $fee_estimator: expr) => {{
625-
let logger: Arc<dyn Logger> =
625+
let logger: Arc<dyn Logger<UserSpan = ()>> =
626626
Arc::new(test_logger::TestLogger::new($node_id.to_string(), out.clone()));
627627
let node_secret = SecretKey::from_slice(&[
628628
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -685,7 +685,7 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out, anchors: bool) {
685685
keys,
686686
fee_estimator| {
687687
let keys_manager = Arc::clone(keys);
688-
let logger: Arc<dyn Logger> =
688+
let logger: Arc<dyn Logger<UserSpan = ()>> =
689689
Arc::new(test_logger::TestLogger::new(node_id.to_string(), out.clone()));
690690
let chain_monitor = Arc::new(TestChainMonitor::new(
691691
broadcast.clone(),

fuzz/src/full_stack.rs

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ type ChannelMan<'a> = ChannelManager<
221221
Arc<dyn chain::Filter>,
222222
Arc<TestBroadcaster>,
223223
Arc<FuzzEstimator>,
224-
Arc<dyn Logger>,
224+
Arc<dyn Logger<UserSpan = ()>>,
225225
Arc<TestPersister>,
226226
>,
227227
>,
@@ -232,14 +232,20 @@ type ChannelMan<'a> = ChannelManager<
232232
Arc<FuzzEstimator>,
233233
&'a FuzzRouter,
234234
&'a FuzzRouter,
235-
Arc<dyn Logger>,
235+
Arc<dyn Logger<UserSpan = ()>>,
236236
>;
237237
type PeerMan<'a> = PeerManager<
238238
Peer<'a>,
239239
Arc<ChannelMan<'a>>,
240-
Arc<P2PGossipSync<Arc<NetworkGraph<Arc<dyn Logger>>>, Arc<dyn UtxoLookup>, Arc<dyn Logger>>>,
240+
Arc<
241+
P2PGossipSync<
242+
Arc<NetworkGraph<Arc<dyn Logger<UserSpan = ()>>>>,
243+
Arc<dyn UtxoLookup>,
244+
Arc<dyn Logger<UserSpan = ()>>,
245+
>,
246+
>,
241247
IgnoringMessageHandler,
242-
Arc<dyn Logger>,
248+
Arc<dyn Logger<UserSpan = ()>>,
243249
IgnoringMessageHandler,
244250
Arc<KeyProvider>,
245251
>;
@@ -252,7 +258,7 @@ struct MoneyLossDetector<'a> {
252258
Arc<dyn chain::Filter>,
253259
Arc<TestBroadcaster>,
254260
Arc<FuzzEstimator>,
255-
Arc<dyn Logger>,
261+
Arc<dyn Logger<UserSpan = ()>>,
256262
Arc<TestPersister>,
257263
>,
258264
>,
@@ -276,7 +282,7 @@ impl<'a> MoneyLossDetector<'a> {
276282
Arc<dyn chain::Filter>,
277283
Arc<TestBroadcaster>,
278284
Arc<FuzzEstimator>,
279-
Arc<dyn Logger>,
285+
Arc<dyn Logger<UserSpan = ()>>,
280286
Arc<TestPersister>,
281287
>,
282288
>,
@@ -500,7 +506,7 @@ impl SignerProvider for KeyProvider {
500506
}
501507

502508
#[inline]
503-
pub fn do_test(mut data: &[u8], logger: &Arc<dyn Logger>) {
509+
pub fn do_test(mut data: &[u8], logger: &Arc<dyn Logger<UserSpan = ()>>) {
504510
if data.len() < 32 {
505511
return;
506512
}
@@ -1004,13 +1010,14 @@ pub fn do_test(mut data: &[u8], logger: &Arc<dyn Logger>) {
10041010
}
10051011

10061012
pub fn full_stack_test<Out: test_logger::Output>(data: &[u8], out: Out) {
1007-
let logger: Arc<dyn Logger> = Arc::new(test_logger::TestLogger::new("".to_owned(), out));
1013+
let logger: Arc<dyn Logger<UserSpan = ()>> =
1014+
Arc::new(test_logger::TestLogger::new("".to_owned(), out));
10081015
do_test(data, &logger);
10091016
}
10101017

10111018
#[no_mangle]
10121019
pub extern "C" fn full_stack_run(data: *const u8, datalen: usize) {
1013-
let logger: Arc<dyn Logger> =
1020+
let logger: Arc<dyn Logger<UserSpan = ()>> =
10141021
Arc::new(test_logger::TestLogger::new("".to_owned(), test_logger::DevNull {}));
10151022
do_test(unsafe { std::slice::from_raw_parts(data, datalen) }, &logger);
10161023
}
@@ -1639,7 +1646,7 @@ pub fn write_fst_seeds(path: &str) {
16391646

16401647
#[cfg(test)]
16411648
mod tests {
1642-
use lightning::util::logger::{Logger, Record};
1649+
use lightning::util::logger::{Logger, Record, Span};
16431650
use std::collections::HashMap;
16441651
use std::sync::{Arc, Mutex};
16451652

@@ -1648,6 +1655,8 @@ mod tests {
16481655
pub lines: Mutex<HashMap<(String, String), usize>>,
16491656
}
16501657
impl Logger for TrackingLogger {
1658+
type UserSpan = ();
1659+
16511660
fn log(&self, record: Record) {
16521661
*self
16531662
.lines
@@ -1664,6 +1673,8 @@ mod tests {
16641673
record.args
16651674
);
16661675
}
1676+
1677+
fn start(&self, _span: Span, _parent: Option<&()>) -> () {}
16671678
}
16681679

16691680
#[test]
@@ -1677,7 +1688,7 @@ mod tests {
16771688
let test = super::two_peer_forwarding_seed();
16781689

16791690
let logger = Arc::new(TrackingLogger { lines: Mutex::new(HashMap::new()) });
1680-
super::do_test(&test, &(Arc::clone(&logger) as Arc<dyn Logger>));
1691+
super::do_test(&test, &(Arc::clone(&logger) as Arc<dyn Logger<UserSpan = ()>>));
16811692

16821693
let log_entries = logger.lines.lock().unwrap();
16831694
// 1
@@ -1713,7 +1724,7 @@ mod tests {
17131724
let test = super::gossip_exchange_seed();
17141725

17151726
let logger = Arc::new(TrackingLogger { lines: Mutex::new(HashMap::new()) });
1716-
super::do_test(&test, &(Arc::clone(&logger) as Arc<dyn Logger>));
1727+
super::do_test(&test, &(Arc::clone(&logger) as Arc<dyn Logger<UserSpan = ()>>));
17171728

17181729
let log_entries = logger.lines.lock().unwrap();
17191730
assert_eq!(log_entries.get(&("lightning::ln::peer_handler".to_string(), "Sending message to all peers except Some(PublicKey(0000000000000000000000000000000000000000000000000000000000000002ff00000000000000000000000000000000000000000000000000000000000002)) or the announced channel's counterparties: ChannelAnnouncement { node_signature_1: 3026020200b202200303030303030303030303030303030303030303030303030303030303030303, node_signature_2: 3026020200b202200202020202020202020202020202020202020202020202020202020202020202, bitcoin_signature_1: 3026020200b202200303030303030303030303030303030303030303030303030303030303030303, bitcoin_signature_2: 3026020200b202200202020202020202020202020202020202020202020202020202020202020202, contents: UnsignedChannelAnnouncement { features: [], chain_hash: 6fe28c0ab6f1b372c1a6a246ae63f74f931e8365e15a089c68d6190000000000, short_channel_id: 42, node_id_1: NodeId(030303030303030303030303030303030303030303030303030303030303030303), node_id_2: NodeId(020202020202020202020202020202020202020202020202020202020202020202), bitcoin_key_1: NodeId(030303030303030303030303030303030303030303030303030303030303030303), bitcoin_key_2: NodeId(020202020202020202020202020202020202020202020202020202020202020202), excess_data: [] } }".to_string())), Some(&1));

fuzz/src/onion_message.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,7 @@ impl SignerProvider for KeyProvider {
276276
#[cfg(test)]
277277
mod tests {
278278
use bitcoin::hex::FromHex;
279-
use lightning::util::logger::{Logger, Record};
279+
use lightning::util::logger::{Logger, Record, Span};
280280
use std::collections::HashMap;
281281
use std::sync::Mutex;
282282

@@ -285,6 +285,8 @@ mod tests {
285285
pub lines: Mutex<HashMap<(String, String), usize>>,
286286
}
287287
impl Logger for TrackingLogger {
288+
type UserSpan = ();
289+
288290
fn log(&self, record: Record) {
289291
let mut lines_lock = self.lines.lock().unwrap();
290292
let key = (record.module_path.to_string(), format!("{}", record.args));
@@ -298,6 +300,8 @@ mod tests {
298300
record.args
299301
);
300302
}
303+
304+
fn start(&self, _span: Span, _parent: Option<&()>) -> () {}
301305
}
302306

303307
#[test]

fuzz/src/process_onion_failure.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,8 @@ fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
6363
}
6464

6565
let secp_ctx = Secp256k1::new();
66-
let logger: Arc<dyn Logger> = Arc::new(test_logger::TestLogger::new("".to_owned(), out));
66+
let logger: Arc<dyn Logger<UserSpan = ()>> =
67+
Arc::new(test_logger::TestLogger::new("".to_owned(), out));
6768

6869
let session_priv = SecretKey::from_slice(&usize_to_32_bytes(213127)).unwrap();
6970
let payment_id = PaymentId(usize_to_32_bytes(232299));

fuzz/src/utils/test_logger.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
// You may not use this file except in accordance with one or both of these
88
// licenses.
99

10-
use lightning::util::logger::{Logger, Record};
10+
use lightning::util::logger::{Logger, Record, Span};
1111
use std::io::Write;
1212
use std::sync::{Arc, Mutex};
1313

@@ -58,6 +58,8 @@ impl<'a, Out: Output> Write for LockedWriteAdapter<'a, Out> {
5858
}
5959

6060
impl<Out: Output> Logger for TestLogger<Out> {
61+
type UserSpan = ();
62+
6163
fn log(&self, record: Record) {
6264
write!(
6365
LockedWriteAdapter(&self.out),
@@ -70,4 +72,6 @@ impl<Out: Output> Logger for TestLogger<Out> {
7072
)
7173
.unwrap();
7274
}
75+
76+
fn start(&self, _span: Span, _parent: Option<&()>) -> () {}
7377
}

lightning-background-processor/src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -649,7 +649,9 @@ use futures_util::{dummy_waker, OptionalSelector, Selector, SelectorOutput};
649649
/// # use lightning_background_processor::{process_events_async, GossipSync};
650650
/// # struct Logger {}
651651
/// # impl lightning::util::logger::Logger for Logger {
652+
/// # type UserSpan = ();
652653
/// # fn log(&self, _record: lightning::util::logger::Record) {}
654+
/// # fn start(&self, _span: lightning::util::logger::Span, _parent: Option<&()>) -> () {}
653655
/// # }
654656
/// # struct Store {}
655657
/// # impl lightning::util::persist::KVStore for Store {

lightning-dns-resolver/src/lib.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ mod test {
176176
use lightning::sign::{KeysManager, NodeSigner, Recipient};
177177
use lightning::types::features::InitFeatures;
178178
use lightning::types::payment::PaymentHash;
179-
use lightning::util::logger::Logger;
179+
use lightning::util::logger::{Logger, Span};
180180

181181
use lightning::{
182182
commitment_signed_dance, expect_payment_claimed, expect_pending_htlcs_forwardable,
@@ -191,9 +191,13 @@ mod test {
191191
node: &'static str,
192192
}
193193
impl Logger for TestLogger {
194+
type UserSpan = ();
195+
194196
fn log(&self, record: lightning::util::logger::Record) {
195197
eprintln!("{}: {}", self.node, record.args);
196198
}
199+
200+
fn start(&self, _span: Span, _parent: Option<&()>) -> () {}
197201
}
198202
impl Deref for TestLogger {
199203
type Target = TestLogger;

lightning-net-tokio/src/lib.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -640,6 +640,8 @@ mod tests {
640640

641641
pub struct TestLogger();
642642
impl lightning::util::logger::Logger for TestLogger {
643+
type UserSpan = ();
644+
643645
fn log(&self, record: lightning::util::logger::Record) {
644646
println!(
645647
"{:<5} [{} : {}, {}] {}",
@@ -650,6 +652,8 @@ mod tests {
650652
record.args
651653
);
652654
}
655+
656+
fn start(&self, _span: lightning::util::logger::Span, _parent: Option<&()>) -> () {}
653657
}
654658

655659
struct MsgHandler {

lightning-rapid-gossip-sync/src/lib.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,12 @@
5151
//! use lightning::routing::gossip::NetworkGraph;
5252
//! use lightning_rapid_gossip_sync::RapidGossipSync;
5353
//!
54-
//! # use lightning::util::logger::{Logger, Record};
54+
//! # use lightning::util::logger::{Logger, Record, Span};
5555
//! # struct FakeLogger {}
5656
//! # impl Logger for FakeLogger {
57+
//! # type UserSpan = ();
5758
//! # fn log(&self, record: Record) { }
59+
//! # fn start(&self, _span: Span, parent: Option<&()>) -> () {}
5860
//! # }
5961
//! # let logger = FakeLogger {};
6062
//!

lightning/src/chain/channelmonitor.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ use crate::sign::{ChannelDerivationParameters, HTLCDescriptor, SpendableOutputDe
5050
use crate::chain::onchaintx::{ClaimEvent, FeerateStrategy, OnchainTxHandler};
5151
use crate::chain::package::{CounterpartyOfferedHTLCOutput, CounterpartyReceivedHTLCOutput, HolderFundingOutput, HolderHTLCOutput, PackageSolvingData, PackageTemplate, RevokedOutput, RevokedHTLCOutput};
5252
use crate::chain::Filter;
53-
use crate::util::logger::{Logger, Record};
53+
use crate::util::logger::{Logger, Record, Span};
5454
use crate::util::persist::MonitorName;
5555
use crate::util::ser::{Readable, ReadableArgs, RequiredWrapper, MaybeReadable, UpgradableRequired, Writer, Writeable, U48};
5656
use crate::util::byte_utils;
@@ -1473,12 +1473,18 @@ pub(crate) struct WithChannelMonitor<'a, L: Deref> where L::Target: Logger {
14731473
}
14741474

14751475
impl<'a, L: Deref> Logger for WithChannelMonitor<'a, L> where L::Target: Logger {
1476+
type UserSpan = <<L as Deref>::Target as Logger>::UserSpan;
1477+
14761478
fn log(&self, mut record: Record) {
14771479
record.peer_id = self.peer_id;
14781480
record.channel_id = self.channel_id;
14791481
record.payment_hash = self.payment_hash;
14801482
self.logger.log(record)
14811483
}
1484+
1485+
fn start(&self, span: Span, parent: Option<&Self::UserSpan>) -> Self::UserSpan {
1486+
self.logger.start(span, parent)
1487+
}
14821488
}
14831489

14841490
impl<'a, L: Deref> WithChannelMonitor<'a, L> where L::Target: Logger {

0 commit comments

Comments
 (0)