Skip to content

Commit 40a6022

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 40a6022

File tree

20 files changed

+845
-318
lines changed

20 files changed

+845
-318
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

+18-11
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
}
@@ -1733,7 +1740,7 @@ mod tests {
17331740
let test = super::two_peer_forwarding_seed();
17341741

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

17381745
let log_entries = logger.lines.lock().unwrap();
17391746
// 1
@@ -1769,7 +1776,7 @@ mod tests {
17691776
let test = super::gossip_exchange_seed();
17701777

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

17741781
let log_entries = logger.lines.lock().unwrap();
17751782
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/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-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)