Skip to content

Commit c1edca2

Browse files
committed
Update balance & channels metrics via event
1 parent 6856ef9 commit c1edca2

3 files changed

Lines changed: 43 additions & 30 deletions

File tree

e2e-tests/tests/e2e.rs

Lines changed: 7 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -810,30 +810,6 @@ async fn test_metrics_endpoint() {
810810
// Set up channel and make a payment to trigger metric update
811811
setup_funded_channel(&bitcoind, &server_a, &server_b, 100_000).await;
812812

813-
// We need to poll here because the metrics below are poll-based and
814-
// updates every 60 seconds.
815-
let timeout = Duration::from_secs(65);
816-
let start = std::time::Instant::now();
817-
loop {
818-
let metrics = client.get_metrics().await.unwrap();
819-
if metrics.contains("ldk_server_total_peers_count 1")
820-
&& metrics.contains("ldk_server_total_channels_count 1")
821-
&& metrics.contains("ldk_server_total_public_channels_count 1")
822-
&& metrics.contains("ldk_server_total_payments_count 2")
823-
&& !metrics.contains("ldk_server_total_lightning_balance_sats 0")
824-
&& !metrics.contains("ldk_server_total_onchain_balance_sats 0")
825-
&& !metrics.contains("ldk_server_spendable_onchain_balance_sats 0")
826-
&& !metrics.contains("ldk_server_total_anchor_channels_reserve_sats 0")
827-
{
828-
break;
829-
}
830-
831-
if start.elapsed() > timeout {
832-
panic!("Timed out waiting for channel/peer metrics to update",);
833-
}
834-
tokio::time::sleep(Duration::from_secs(1)).await;
835-
}
836-
837813
// Make a payment to trigger payment metric updates.
838814
let invoice_resp = server_b
839815
.client()
@@ -854,7 +830,13 @@ async fn test_metrics_endpoint() {
854830
let start = std::time::Instant::now();
855831
loop {
856832
let metrics = client.get_metrics().await.unwrap();
857-
if metrics.contains("ldk_server_total_successful_payments_count 1") {
833+
if metrics.contains("ldk_server_total_successful_payments_count 1")
834+
&& metrics.contains("ldk_server_total_channels_count 1")
835+
&& !metrics.contains("ldk_server_total_lightning_balance_sats 0")
836+
&& !metrics.contains("ldk_server_total_onchain_balance_sats 0")
837+
&& !metrics.contains("ldk_server_spendable_onchain_balance_sats 0")
838+
&& !metrics.contains("ldk_server_total_anchor_channels_reserve_sats 0")
839+
{
858840
break;
859841
}
860842
if start.elapsed() > timeout {

ldk-server/src/main.rs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -327,7 +327,24 @@ fn main() {
327327
if let Err(e) = event_node.event_handled() {
328328
error!("Failed to mark event as handled: {e}");
329329
}
330+
331+
if let Some(metrics) = &metrics {
332+
metrics.update_channels_count(false);
333+
}
330334
},
335+
Event::ChannelClosed { channel_id, counterparty_node_id, .. } => {
336+
info!(
337+
"CHANNEL_CLOSED: {} from counterparty {:?}",
338+
channel_id, counterparty_node_id
339+
);
340+
if let Err(e) = event_node.event_handled() {
341+
error!("Failed to mark event as handled: {e}");
342+
}
343+
344+
if let Some(metrics) = &metrics {
345+
metrics.update_channels_count(true);
346+
}
347+
}
331348
Event::PaymentReceived { payment_id, payment_hash, amount_msat, .. } => {
332349
info!(
333350
"PAYMENT_RECEIVED: with id {:?}, hash {}, amount_msat {}",
@@ -342,6 +359,10 @@ fn main() {
342359
&event_node,
343360
Arc::clone(&event_publisher),
344361
Arc::clone(&paginated_store)).await;
362+
363+
if let Some(metrics) = &metrics {
364+
metrics.update_all_balances(&event_node);
365+
}
345366
},
346367
Event::PaymentSuccessful {payment_id, ..} => {
347368
let payment_id = payment_id.expect("PaymentId expected for ldk-server >=0.1");
@@ -356,6 +377,7 @@ fn main() {
356377

357378
if let Some(metrics) = &metrics {
358379
metrics.update_payments_count(true);
380+
metrics.update_all_balances(&event_node);
359381
}
360382
},
361383
Event::PaymentFailed {payment_id, ..} => {

ldk-server/src/util/metrics.rs

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,14 @@ impl Metrics {
8484
}
8585
}
8686

87+
pub fn update_channels_count(&self, is_closed: bool) {
88+
if is_closed {
89+
self.total_channels_count.fetch_sub(1, Ordering::Relaxed);
90+
} else {
91+
self.total_channels_count.fetch_add(1, Ordering::Relaxed);
92+
}
93+
}
94+
8795
pub fn initialize_payment_metrics(&self, node: &Node) {
8896
let mut successful_payments_count = 0;
8997
let mut failed_payments_count = 0;
@@ -99,9 +107,14 @@ impl Metrics {
99107
self.total_successful_payments_count.store(successful_payments_count, Ordering::Relaxed);
100108
self.total_failed_payments_count.store(failed_payments_count, Ordering::Relaxed);
101109
self.total_pending_payments_count.store(pending_payments_count, Ordering::Relaxed);
110+
111+
let channels_count = node.list_channels().len() as i64;
112+
self.total_channels_count.store(channels_count, Ordering::Relaxed);
113+
114+
self.update_all_balances(node);
102115
}
103116

104-
fn update_all_balances(&self, node: &Node) {
117+
pub fn update_all_balances(&self, node: &Node) {
105118
let all_balances = node.list_balances();
106119
self.total_onchain_balance_sats
107120
.store(all_balances.total_onchain_balance_sats, Ordering::Relaxed);
@@ -129,9 +142,6 @@ impl Metrics {
129142
.count() as i64;
130143
self.total_pending_payments_count.store(pending_payments_count, Ordering::Relaxed);
131144

132-
let channels_count = all_channels.len() as i64;
133-
self.total_channels_count.store(channels_count, Ordering::Relaxed);
134-
135145
let public_channels_count =
136146
all_channels.iter().filter(|channel_details| channel_details.is_announced).count()
137147
as i64;
@@ -143,7 +153,6 @@ impl Metrics {
143153
self.total_private_channels_count.store(private_channels_count, Ordering::Relaxed);
144154

145155
self.update_peer_count(node);
146-
self.update_all_balances(node);
147156
}
148157

149158
/// Gathers all metrics and formats them into the Prometheus text-based format.

0 commit comments

Comments
 (0)