Skip to content

Commit 4f86652

Browse files
committed
trace: dirty attempt at instrumenting ldk-node
1 parent 5d0fb14 commit 4f86652

7 files changed

Lines changed: 96 additions & 0 deletions

File tree

Cargo.toml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,13 @@ serde = { version = "1.0.210", default-features = false, features = ["std", "der
7575
serde_json = { version = "1.0.128", default-features = false, features = ["std"] }
7676
log = { version = "0.4.22", default-features = false, features = ["std"]}
7777

78+
tracing ={ version = "0.1.43" , default-features = false, features = ["log", "attributes"]}
79+
tracing-subscriber = {version = "0.3.22", default-features = false, features = ["std", "fmt", "json"]}
80+
tracing-opentelemetry ={ version = "0.32.0", default-features = false}
81+
opentelemetry ={ version = "0.31.0", default-features = false}
82+
opentelemetry_sdk ={ version = "0.31.0", default-features = false}
83+
opentelemetry-otlp ={ version = "0.31.0", default-features = false, features = ["trace", "grpc-tonic"]}
84+
7885
vss-client = { package = "vss-client-ng", version = "0.4" }
7986
prost = { version = "0.11.6", default-features = false}
8087

docker-compose.yml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,16 @@ services:
4848
networks:
4949
- bitcoin-electrs
5050

51+
jaeger:
52+
image: jaegertracing/all-in-one:1.54
53+
container_name: jaeger
54+
ports:
55+
- "6831:6831/udp"
56+
- "16686:16686"
57+
- "14268:14268"
58+
- "4317:4317"
59+
- "4318:4318"
60+
5161
networks:
5262
bitcoin-electrs:
5363
driver: bridge

src/chain/electrum.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ use electrum_client::{
2222
use lightning::chain::{Confirm, Filter, WatchedOutput};
2323
use lightning::util::ser::Writeable;
2424
use lightning_transaction_sync::ElectrumSyncClient;
25+
use tracing::instrument;
2526

2627
use super::{periodically_archive_fully_resolved_monitors, WalletSyncStatus};
2728
use crate::config::{
@@ -79,6 +80,7 @@ impl ElectrumChainSource {
7980
}
8081
}
8182

83+
#[instrument(name = "electrum_chain_source.start", skip(self, runtime))]
8284
pub(super) fn start(&self, runtime: Arc<Runtime>) -> Result<(), Error> {
8385
self.electrum_runtime_status.write().unwrap().start(
8486
self.server_url.clone(),

src/chain/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ use std::time::Duration;
1515

1616
use bitcoin::{Script, Txid};
1717
use lightning::chain::{BestBlock, Filter};
18+
use tracing::instrument;
1819

1920
use crate::chain::bitcoind::{BitcoindChainSource, UtxoSourceClient};
2021
use crate::chain::electrum::ElectrumChainSource;
@@ -180,6 +181,7 @@ impl ChainSource {
180181
(Self { kind, tx_broadcaster, logger }, best_block)
181182
}
182183

184+
#[instrument(name = "chain_source.start", skip(self, runtime))]
183185
pub(crate) fn start(&self, runtime: Arc<Runtime>) -> Result<(), Error> {
184186
match &self.kind {
185187
ChainSourceKind::Electrum(electrum_chain_source) => {

src/lib.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ pub mod payment;
102102
mod peer_store;
103103
mod runtime;
104104
mod scoring;
105+
mod tracing;
105106
mod tx_broadcaster;
106107
mod types;
107108
mod wallet;
@@ -111,6 +112,8 @@ use std::net::ToSocketAddrs;
111112
use std::sync::{Arc, Mutex, RwLock};
112113
use std::time::{Duration, Instant, SystemTime, UNIX_EPOCH};
113114

115+
pub use crate::tracing::{initialize_tracing_subscriber, TracingLogWriter};
116+
use ::tracing::instrument;
114117
pub use balance::{BalanceDetails, LightningBalance, PendingSweepBalance};
115118
use bitcoin::secp256k1::PublicKey;
116119
use bitcoin::{Address, Amount};
@@ -217,6 +220,7 @@ impl Node {
217220
///
218221
/// After this returns, the [`Node`] instance can be controlled via the provided API methods in
219222
/// a thread-safe manner.
223+
#[instrument(name = "node.start", skip(self), fields(node_id = %self.node_id()))]
220224
pub fn start(&self) -> Result<(), Error> {
221225
// Acquire a run lock and hold it until we're setup.
222226
let mut is_running_lock = self.is_running.write().unwrap();

src/tracing.rs

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
use opentelemetry::trace::TracerProvider;
2+
use opentelemetry_otlp::{SpanExporter, WithExportConfig};
3+
use opentelemetry_sdk::{trace::SdkTracerProvider, Resource};
4+
5+
use tracing::{debug, error, info, level_filters::LevelFilter, trace, warn};
6+
use tracing_opentelemetry::OpenTelemetryLayer;
7+
use tracing_subscriber::{filter::Targets, fmt, layer::SubscriberExt, util::SubscriberInitExt};
8+
9+
use crate::logger::{LogRecord, LogWriter};
10+
11+
/// Tracing adapter
12+
pub struct TracingLogWriter {}
13+
14+
impl LogWriter for TracingLogWriter {
15+
fn log(&self, record: LogRecord) {
16+
match record.level {
17+
lightning::util::logger::Level::Gossip => {
18+
trace!(target: "ldk_node", module = record.module_path, line = record.line, "{}", record.args)
19+
},
20+
lightning::util::logger::Level::Trace => {
21+
trace!(target: "ldk_node", module = record.module_path, line = record.line, "{}", record.args)
22+
},
23+
lightning::util::logger::Level::Debug => {
24+
debug!(target: "ldk_node", module = record.module_path, line = record.line, "{}", record.args)
25+
},
26+
lightning::util::logger::Level::Info => {
27+
info!(target: "ldk_node", module = record.module_path, line = record.line, "{}", record.args)
28+
},
29+
lightning::util::logger::Level::Warn => {
30+
warn!(target: "ldk_node", module = record.module_path, line = record.line, "{}", record.args)
31+
},
32+
lightning::util::logger::Level::Error => {
33+
error!(target: "ldk_node", module = record.module_path, line = record.line, "{}", record.args)
34+
},
35+
}
36+
}
37+
}
38+
39+
/// Initialize tracing subscriber with Jaeger backend
40+
pub fn initialize_tracing_subscriber() {
41+
let otlp_exporter = SpanExporter::builder()
42+
.with_tonic()
43+
.with_endpoint("http://localhost:4317")
44+
.build()
45+
.expect("Failed to create OTLP exporter");
46+
47+
let tracer_provider = SdkTracerProvider::builder()
48+
.with_batch_exporter(otlp_exporter)
49+
.with_resource(Resource::builder().with_service_name("ldk-node").build())
50+
.build();
51+
52+
let tracer = tracer_provider.tracer("ldk_node");
53+
54+
tracing_subscriber::registry()
55+
.with(
56+
Targets::new()
57+
.with_default(LevelFilter::WARN)
58+
.with_target("ldk_node", LevelFilter::INFO),
59+
)
60+
.with(fmt::layer().json())
61+
.with(OpenTelemetryLayer::new(tracer))
62+
.init();
63+
}

tests/integration_tests_vss.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,27 @@
1010
mod common;
1111

1212
use std::collections::HashMap;
13+
use std::sync::Arc;
1314

1415
use ldk_node::entropy::NodeEntropy;
1516
use ldk_node::Builder;
17+
use ldk_node::{initialize_tracing_subscriber, TracingLogWriter};
1618
use rand::{rng, Rng};
1719

1820
#[tokio::test(flavor = "multi_thread", worker_threads = 1)]
1921
async fn channel_full_cycle_with_vss_store() {
2022
let (bitcoind, electrsd) = common::setup_bitcoind_and_electrsd();
2123
println!("== Node A ==");
2224
let esplora_url = format!("http://{}", electrsd.esplora_url.as_ref().unwrap());
25+
26+
initialize_tracing_subscriber();
27+
tracing::info!("tracing initialized");
2328
let config_a = common::random_config(true);
29+
let tracing_writer = Arc::new(TracingLogWriter {});
30+
2431
let mut builder_a = Builder::from_config(config_a.node_config);
2532
builder_a.set_chain_source_esplora(esplora_url.clone(), None);
33+
builder_a.set_custom_logger(tracing_writer);
2634
let vss_base_url = std::env::var("TEST_VSS_BASE_URL").unwrap();
2735
let node_a = builder_a
2836
.build_with_vss_store_and_fixed_headers(

0 commit comments

Comments
 (0)