Skip to content

Commit 480a669

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 ed42300 commit 480a669

File tree

22 files changed

+1044
-402
lines changed

22 files changed

+1044
-402
lines changed

fuzz/src/chanmon_consistency.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ struct LatestMonitorState {
181181
}
182182

183183
struct TestChainMonitor {
184-
pub logger: Arc<dyn Logger>,
184+
pub logger: Arc<dyn Logger<UserSpan = ()>>,
185185
pub keys: Arc<KeyProvider>,
186186
pub persister: Arc<TestPersister>,
187187
pub chain_monitor: Arc<
@@ -190,7 +190,7 @@ struct TestChainMonitor {
190190
Arc<dyn chain::Filter>,
191191
Arc<TestBroadcaster>,
192192
Arc<FuzzEstimator>,
193-
Arc<dyn Logger>,
193+
Arc<dyn Logger<UserSpan = ()>>,
194194
Arc<TestPersister>,
195195
Arc<KeyProvider>,
196196
>,
@@ -199,8 +199,8 @@ struct TestChainMonitor {
199199
}
200200
impl TestChainMonitor {
201201
pub fn new(
202-
broadcaster: Arc<TestBroadcaster>, logger: Arc<dyn Logger>, feeest: Arc<FuzzEstimator>,
203-
persister: Arc<TestPersister>, keys: Arc<KeyProvider>,
202+
broadcaster: Arc<TestBroadcaster>, logger: Arc<dyn Logger<UserSpan = ()>>,
203+
feeest: Arc<FuzzEstimator>, persister: Arc<TestPersister>, keys: Arc<KeyProvider>,
204204
) -> Self {
205205
Self {
206206
chain_monitor: Arc::new(chainmonitor::ChainMonitor::new(
@@ -464,7 +464,7 @@ type ChanMan<'a> = ChannelManager<
464464
Arc<FuzzEstimator>,
465465
&'a FuzzRouter,
466466
&'a FuzzRouter,
467-
Arc<dyn Logger>,
467+
Arc<dyn Logger<UserSpan = ()>>,
468468
>;
469469

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

641641
macro_rules! make_node {
642642
($node_id: expr, $fee_estimator: expr) => {{
643-
let logger: Arc<dyn Logger> =
643+
let logger: Arc<dyn Logger<UserSpan = ()>> =
644644
Arc::new(test_logger::TestLogger::new($node_id.to_string(), out.clone()));
645645
let node_secret = SecretKey::from_slice(&[
646646
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,
@@ -703,7 +703,7 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out, anchors: bool) {
703703
keys,
704704
fee_estimator| {
705705
let keys_manager = Arc::clone(keys);
706-
let logger: Arc<dyn Logger> =
706+
let logger: Arc<dyn Logger<UserSpan = ()>> =
707707
Arc::new(test_logger::TestLogger::new(node_id.to_string(), out.clone()));
708708
let chain_monitor = Arc::new(TestChainMonitor::new(
709709
broadcast.clone(),

fuzz/src/full_stack.rs

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ type ChannelMan<'a> = ChannelManager<
224224
Arc<dyn chain::Filter>,
225225
Arc<TestBroadcaster>,
226226
Arc<FuzzEstimator>,
227-
Arc<dyn Logger>,
227+
Arc<dyn Logger<UserSpan = ()>>,
228228
Arc<TestPersister>,
229229
Arc<KeyProvider>,
230230
>,
@@ -236,14 +236,20 @@ type ChannelMan<'a> = ChannelManager<
236236
Arc<FuzzEstimator>,
237237
&'a FuzzRouter,
238238
&'a FuzzRouter,
239-
Arc<dyn Logger>,
239+
Arc<dyn Logger<UserSpan = ()>>,
240240
>;
241241
type PeerMan<'a> = PeerManager<
242242
Peer<'a>,
243243
Arc<ChannelMan<'a>>,
244-
Arc<P2PGossipSync<Arc<NetworkGraph<Arc<dyn Logger>>>, Arc<dyn UtxoLookup>, Arc<dyn Logger>>>,
244+
Arc<
245+
P2PGossipSync<
246+
Arc<NetworkGraph<Arc<dyn Logger<UserSpan = ()>>>>,
247+
Arc<dyn UtxoLookup>,
248+
Arc<dyn Logger<UserSpan = ()>>,
249+
>,
250+
>,
245251
IgnoringMessageHandler,
246-
Arc<dyn Logger>,
252+
Arc<dyn Logger<UserSpan = ()>>,
247253
IgnoringMessageHandler,
248254
Arc<KeyProvider>,
249255
IgnoringMessageHandler,
@@ -257,7 +263,7 @@ struct MoneyLossDetector<'a> {
257263
Arc<dyn chain::Filter>,
258264
Arc<TestBroadcaster>,
259265
Arc<FuzzEstimator>,
260-
Arc<dyn Logger>,
266+
Arc<dyn Logger<UserSpan = ()>>,
261267
Arc<TestPersister>,
262268
Arc<KeyProvider>,
263269
>,
@@ -282,7 +288,7 @@ impl<'a> MoneyLossDetector<'a> {
282288
Arc<dyn chain::Filter>,
283289
Arc<TestBroadcaster>,
284290
Arc<FuzzEstimator>,
285-
Arc<dyn Logger>,
291+
Arc<dyn Logger<UserSpan = ()>>,
286292
Arc<TestPersister>,
287293
Arc<KeyProvider>,
288294
>,
@@ -519,7 +525,7 @@ impl SignerProvider for KeyProvider {
519525
}
520526

521527
#[inline]
522-
pub fn do_test(mut data: &[u8], logger: &Arc<dyn Logger>) {
528+
pub fn do_test(mut data: &[u8], logger: &Arc<dyn Logger<UserSpan = ()>>) {
523529
if data.len() < 32 {
524530
return;
525531
}
@@ -1021,13 +1027,14 @@ pub fn do_test(mut data: &[u8], logger: &Arc<dyn Logger>) {
10211027
}
10221028

10231029
pub fn full_stack_test<Out: test_logger::Output>(data: &[u8], out: Out) {
1024-
let logger: Arc<dyn Logger> = Arc::new(test_logger::TestLogger::new("".to_owned(), out));
1030+
let logger: Arc<dyn Logger<UserSpan = ()>> =
1031+
Arc::new(test_logger::TestLogger::new("".to_owned(), out));
10251032
do_test(data, &logger);
10261033
}
10271034

10281035
#[no_mangle]
10291036
pub extern "C" fn full_stack_run(data: *const u8, datalen: usize) {
1030-
let logger: Arc<dyn Logger> =
1037+
let logger: Arc<dyn Logger<UserSpan = ()>> =
10311038
Arc::new(test_logger::TestLogger::new("".to_owned(), test_logger::DevNull {}));
10321039
do_test(unsafe { std::slice::from_raw_parts(data, datalen) }, &logger);
10331040
}
@@ -1656,7 +1663,7 @@ pub fn write_fst_seeds(path: &str) {
16561663

16571664
#[cfg(test)]
16581665
mod tests {
1659-
use lightning::util::logger::{Logger, Record};
1666+
use lightning::util::logger::{Logger, Record, Span};
16601667
use std::collections::HashMap;
16611668
use std::sync::{Arc, Mutex};
16621669

@@ -1665,6 +1672,8 @@ mod tests {
16651672
pub lines: Mutex<HashMap<(String, String), usize>>,
16661673
}
16671674
impl Logger for TrackingLogger {
1675+
type UserSpan = ();
1676+
16681677
fn log(&self, record: Record) {
16691678
*self
16701679
.lines
@@ -1681,6 +1690,8 @@ mod tests {
16811690
record.args
16821691
);
16831692
}
1693+
1694+
fn start(&self, _span: Span, _parent: Option<&()>) -> () {}
16841695
}
16851696

16861697
#[test]
@@ -1694,7 +1705,7 @@ mod tests {
16941705
let test = super::two_peer_forwarding_seed();
16951706

16961707
let logger = Arc::new(TrackingLogger { lines: Mutex::new(HashMap::new()) });
1697-
super::do_test(&test, &(Arc::clone(&logger) as Arc<dyn Logger>));
1708+
super::do_test(&test, &(Arc::clone(&logger) as Arc<dyn Logger<UserSpan = ()>>));
16981709

16991710
let log_entries = logger.lines.lock().unwrap();
17001711
// 1
@@ -1730,7 +1741,7 @@ mod tests {
17301741
let test = super::gossip_exchange_seed();
17311742

17321743
let logger = Arc::new(TrackingLogger { lines: Mutex::new(HashMap::new()) });
1733-
super::do_test(&test, &(Arc::clone(&logger) as Arc<dyn Logger>));
1744+
super::do_test(&test, &(Arc::clone(&logger) as Arc<dyn Logger<UserSpan = ()>>));
17341745

17351746
let log_entries = logger.lines.lock().unwrap();
17361747
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
@@ -315,7 +315,7 @@ impl SignerProvider for KeyProvider {
315315
#[cfg(test)]
316316
mod tests {
317317
use bitcoin::hex::FromHex;
318-
use lightning::util::logger::{Logger, Record};
318+
use lightning::util::logger::{Logger, Record, Span};
319319
use std::collections::HashMap;
320320
use std::sync::Mutex;
321321

@@ -324,6 +324,8 @@ mod tests {
324324
pub lines: Mutex<HashMap<(String, String), usize>>,
325325
}
326326
impl Logger for TrackingLogger {
327+
type UserSpan = ();
328+
327329
fn log(&self, record: Record) {
328330
let mut lines_lock = self.lines.lock().unwrap();
329331
let key = (record.module_path.to_string(), format!("{}", record.args));
@@ -337,6 +339,8 @@ mod tests {
337339
record.args
338340
);
339341
}
342+
343+
fn start(&self, _span: Span, _parent: Option<&()>) -> () {}
340344
}
341345

342346
#[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
@@ -738,7 +738,9 @@ use futures_util::{dummy_waker, OptionalSelector, Selector, SelectorOutput};
738738
/// # use lightning_liquidity::lsps5::service::TimeProvider;
739739
/// # struct Logger {}
740740
/// # impl lightning::util::logger::Logger for Logger {
741+
/// # type UserSpan = ();
741742
/// # fn log(&self, _record: lightning::util::logger::Record) {}
743+
/// # fn start(&self, _span: lightning::util::logger::Span, _parent: Option<&()>) -> () {}
742744
/// # }
743745
/// # struct StoreSync {}
744746
/// # impl lightning::util::persist::KVStoreSync for StoreSync {

lightning-dns-resolver/src/lib.rs

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

184184
use lightning::{commitment_signed_dance, expect_payment_claimed, get_htlc_update_msgs};
185185
use lightning_types::string::UntrustedString;
@@ -192,9 +192,13 @@ mod test {
192192
node: &'static str,
193193
}
194194
impl Logger for TestLogger {
195+
type UserSpan = ();
196+
195197
fn log(&self, record: lightning::util::logger::Record) {
196198
eprintln!("{}: {}", self.node, record.args);
197199
}
200+
201+
fn start(&self, _span: Span, _parent: Option<&()>) -> () {}
198202
}
199203
impl Deref for TestLogger {
200204
type Target = TestLogger;

lightning-net-tokio/src/lib.rs

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

640640
pub struct TestLogger();
641641
impl lightning::util::logger::Logger for TestLogger {
642+
type UserSpan = ();
643+
642644
fn log(&self, record: lightning::util::logger::Record) {
643645
println!(
644646
"{:<5} [{} : {}, {}] {}",
@@ -649,6 +651,8 @@ mod tests {
649651
record.args
650652
);
651653
}
654+
655+
fn start(&self, _span: lightning::util::logger::Span, _parent: Option<&()>) -> () {}
652656
}
653657

654658
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
@@ -66,7 +66,7 @@ use crate::sign::{
6666
use crate::types::features::ChannelTypeFeatures;
6767
use crate::types::payment::{PaymentHash, PaymentPreimage};
6868
use crate::util::byte_utils;
69-
use crate::util::logger::{Logger, Record};
69+
use crate::util::logger::{Logger, Record, Span};
7070
use crate::util::persist::MonitorName;
7171
use crate::util::ser::{
7272
MaybeReadable, Readable, ReadableArgs, RequiredWrapper, UpgradableRequired, Writeable, Writer,
@@ -1634,12 +1634,18 @@ impl<'a, L: Deref> Logger for WithChannelMonitor<'a, L>
16341634
where
16351635
L::Target: Logger,
16361636
{
1637+
type UserSpan = <<L as Deref>::Target as Logger>::UserSpan;
1638+
16371639
fn log(&self, mut record: Record) {
16381640
record.peer_id = self.peer_id;
16391641
record.channel_id = self.channel_id;
16401642
record.payment_hash = self.payment_hash;
16411643
self.logger.log(record)
16421644
}
1645+
1646+
fn start(&self, span: Span, parent: Option<&Self::UserSpan>) -> Self::UserSpan {
1647+
self.logger.start(span, parent)
1648+
}
16431649
}
16441650

16451651
impl<'a, L: Deref> WithChannelMonitor<'a, L>

0 commit comments

Comments
 (0)