Skip to content

Commit f7c48f7

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 89f5217 commit f7c48f7

File tree

22 files changed

+869
-320
lines changed

22 files changed

+869
-320
lines changed

fuzz/src/chanmon_consistency.rs

+7-7
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ struct LatestMonitorState {
177177
}
178178

179179
struct TestChainMonitor {
180-
pub logger: Arc<dyn Logger>,
180+
pub logger: Arc<dyn Logger<UserSpan = ()>>,
181181
pub keys: Arc<KeyProvider>,
182182
pub persister: Arc<TestPersister>,
183183
pub chain_monitor: Arc<
@@ -186,16 +186,16 @@ struct TestChainMonitor {
186186
Arc<dyn chain::Filter>,
187187
Arc<TestBroadcaster>,
188188
Arc<FuzzEstimator>,
189-
Arc<dyn Logger>,
189+
Arc<dyn Logger<UserSpan = ()>>,
190190
Arc<TestPersister>,
191191
>,
192192
>,
193193
pub latest_monitors: Mutex<HashMap<ChannelId, LatestMonitorState>>,
194194
}
195195
impl TestChainMonitor {
196196
pub fn new(
197-
broadcaster: Arc<TestBroadcaster>, logger: Arc<dyn Logger>, feeest: Arc<FuzzEstimator>,
198-
persister: Arc<TestPersister>, keys: Arc<KeyProvider>,
197+
broadcaster: Arc<TestBroadcaster>, logger: Arc<dyn Logger<UserSpan = ()>>,
198+
feeest: Arc<FuzzEstimator>, persister: Arc<TestPersister>, keys: Arc<KeyProvider>,
199199
) -> Self {
200200
Self {
201201
chain_monitor: Arc::new(chainmonitor::ChainMonitor::new(
@@ -445,7 +445,7 @@ type ChanMan<'a> = ChannelManager<
445445
Arc<FuzzEstimator>,
446446
&'a FuzzRouter,
447447
&'a FuzzRouter,
448-
Arc<dyn Logger>,
448+
Arc<dyn Logger<UserSpan = ()>>,
449449
>;
450450

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

622622
macro_rules! make_node {
623623
($node_id: expr, $fee_estimator: expr) => {{
624-
let logger: Arc<dyn Logger> =
624+
let logger: Arc<dyn Logger<UserSpan = ()>> =
625625
Arc::new(test_logger::TestLogger::new($node_id.to_string(), out.clone()));
626626
let node_secret = SecretKey::from_slice(&[
627627
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,
@@ -677,7 +677,7 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out, anchors: bool) {
677677
macro_rules! reload_node {
678678
($ser: expr, $node_id: expr, $old_monitors: expr, $keys_manager: expr, $fee_estimator: expr) => {{
679679
let keys_manager = Arc::clone(&$keys_manager);
680-
let logger: Arc<dyn Logger> =
680+
let logger: Arc<dyn Logger<UserSpan = ()>> =
681681
Arc::new(test_logger::TestLogger::new($node_id.to_string(), out.clone()));
682682
let chain_monitor = Arc::new(TestChainMonitor::new(
683683
broadcast.clone(),

fuzz/src/full_stack.rs

+23-12
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
>,
@@ -556,7 +562,7 @@ impl SignerProvider for KeyProvider {
556562
}
557563

558564
#[inline]
559-
pub fn do_test(mut data: &[u8], logger: &Arc<dyn Logger>) {
565+
pub fn do_test(mut data: &[u8], logger: &Arc<dyn Logger<UserSpan = ()>>) {
560566
if data.len() < 32 {
561567
return;
562568
}
@@ -1060,13 +1066,14 @@ pub fn do_test(mut data: &[u8], logger: &Arc<dyn Logger>) {
10601066
}
10611067

10621068
pub fn full_stack_test<Out: test_logger::Output>(data: &[u8], out: Out) {
1063-
let logger: Arc<dyn Logger> = Arc::new(test_logger::TestLogger::new("".to_owned(), out));
1069+
let logger: Arc<dyn Logger<UserSpan = ()>> =
1070+
Arc::new(test_logger::TestLogger::new("".to_owned(), out));
10641071
do_test(data, &logger);
10651072
}
10661073

10671074
#[no_mangle]
10681075
pub extern "C" fn full_stack_run(data: *const u8, datalen: usize) {
1069-
let logger: Arc<dyn Logger> =
1076+
let logger: Arc<dyn Logger<UserSpan = ()>> =
10701077
Arc::new(test_logger::TestLogger::new("".to_owned(), test_logger::DevNull {}));
10711078
do_test(unsafe { std::slice::from_raw_parts(data, datalen) }, &logger);
10721079
}
@@ -1695,7 +1702,7 @@ pub fn write_fst_seeds(path: &str) {
16951702

16961703
#[cfg(test)]
16971704
mod tests {
1698-
use lightning::util::logger::{Logger, Record};
1705+
use lightning::util::logger::{Logger, Record, Span};
16991706
use std::collections::HashMap;
17001707
use std::sync::{Arc, Mutex};
17011708

@@ -1704,6 +1711,8 @@ mod tests {
17041711
pub lines: Mutex<HashMap<(String, String), usize>>,
17051712
}
17061713
impl Logger for TrackingLogger {
1714+
type UserSpan = ();
1715+
17071716
fn log(&self, record: Record) {
17081717
*self
17091718
.lines
@@ -1720,6 +1729,8 @@ mod tests {
17201729
record.args
17211730
);
17221731
}
1732+
1733+
fn start(&self, _span: Span, _parent: Option<&()>) -> () {}
17231734
}
17241735

17251736
#[test]
@@ -1733,7 +1744,7 @@ mod tests {
17331744
let test = super::two_peer_forwarding_seed();
17341745

17351746
let logger = Arc::new(TrackingLogger { lines: Mutex::new(HashMap::new()) });
1736-
super::do_test(&test, &(Arc::clone(&logger) as Arc<dyn Logger>));
1747+
super::do_test(&test, &(Arc::clone(&logger) as Arc<dyn Logger<UserSpan = ()>>));
17371748

17381749
let log_entries = logger.lines.lock().unwrap();
17391750
// 1
@@ -1769,7 +1780,7 @@ mod tests {
17691780
let test = super::gossip_exchange_seed();
17701781

17711782
let logger = Arc::new(TrackingLogger { lines: Mutex::new(HashMap::new()) });
1772-
super::do_test(&test, &(Arc::clone(&logger) as Arc<dyn Logger>));
1783+
super::do_test(&test, &(Arc::clone(&logger) as Arc<dyn Logger<UserSpan = ()>>));
17731784

17741785
let log_entries = logger.lines.lock().unwrap();
17751786
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

+5-1
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

+2-1
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

+5-1
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

+2
Original file line numberDiff line numberDiff line change
@@ -633,7 +633,9 @@ use futures_util::{dummy_waker, OptionalSelector, Selector, SelectorOutput};
633633
/// # use lightning_background_processor::{process_events_async, GossipSync};
634634
/// # struct Logger {}
635635
/// # impl lightning::util::logger::Logger for Logger {
636+
/// # type UserSpan = ();
636637
/// # fn log(&self, _record: lightning::util::logger::Record) {}
638+
/// # fn start(&self, _span: lightning::util::logger::Span, _parent: Option<&()>) -> () {}
637639
/// # }
638640
/// # struct Store {}
639641
/// # impl lightning::util::persist::KVStore for Store {

lightning-dns-resolver/src/lib.rs

+5-1
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

+4
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

+3-1
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

+7-1
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ use crate::sign::{ChannelDerivationParameters, HTLCDescriptor, SpendableOutputDe
4848
use crate::chain::onchaintx::{ClaimEvent, FeerateStrategy, OnchainTxHandler};
4949
use crate::chain::package::{CounterpartyOfferedHTLCOutput, CounterpartyReceivedHTLCOutput, HolderFundingOutput, HolderHTLCOutput, PackageSolvingData, PackageTemplate, RevokedOutput, RevokedHTLCOutput};
5050
use crate::chain::Filter;
51-
use crate::util::logger::{Logger, Record};
51+
use crate::util::logger::{Logger, Record, Span};
5252
use crate::util::persist::MonitorName;
5353
use crate::util::ser::{Readable, ReadableArgs, RequiredWrapper, MaybeReadable, UpgradableRequired, Writer, Writeable, U48};
5454
use crate::util::byte_utils;
@@ -1471,12 +1471,18 @@ pub(crate) struct WithChannelMonitor<'a, L: Deref> where L::Target: Logger {
14711471
}
14721472

14731473
impl<'a, L: Deref> Logger for WithChannelMonitor<'a, L> where L::Target: Logger {
1474+
type UserSpan = <<L as Deref>::Target as Logger>::UserSpan;
1475+
14741476
fn log(&self, mut record: Record) {
14751477
record.peer_id = self.peer_id;
14761478
record.channel_id = self.channel_id;
14771479
record.payment_hash = self.payment_hash;
14781480
self.logger.log(record)
14791481
}
1482+
1483+
fn start(&self, span: Span, parent: Option<&Self::UserSpan>) -> Self::UserSpan {
1484+
self.logger.start(span, parent)
1485+
}
14801486
}
14811487

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

0 commit comments

Comments
 (0)