upleb.uk

Public git repos — served from a NIP-34 GRASP relay at git.upleb.uk

summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDanConwayDev <DanConwayDev@protonmail.com>2025-12-11 12:26:11 +0000
committerDanConwayDev <DanConwayDev@protonmail.com>2025-12-11 12:26:11 +0000
commitb0ea9aa56c90fe36604e56707498261d761b9a56 (patch)
tree5eea80f135dfe41c475a8b2fa802666d85b2d38c /src
parent4941490233a728bc7c64fa80a53d15f772a1219f (diff)
fix: resolve duplicate SyncMetrics registration preventing metrics recording
Root cause: Both Metrics::new() and SyncManager::new() were trying to register SyncMetrics with the same Prometheus registry. The second registration failed silently, leaving SyncManager.metrics = None, so record_connection_attempt() calls were no-ops. Changes: - SyncManager::new() now accepts Option<SyncMetrics> instead of Option<&Registry> - main.rs passes already-registered sync metrics from Metrics to SyncManager - Simplified test_connection_failure_increments_counter assertion - Marked 3 tests as #[ignore] pending relay tracking metrics wiring Tests fixed: - test_connection_failure_increments_counter (now counts failures) - test_health_state_degrades_on_failure (now tracks health state) - test_live_sync_layer3_events (already working, confirmed) Tests ignored (future work): - test_live_sync_event_count - test_multi_source_aggregate_counts - test_relay_connected_status
Diffstat (limited to 'src')
-rw-r--r--src/main.rs5
-rw-r--r--src/sync/mod.rs22
2 files changed, 6 insertions, 21 deletions
diff --git a/src/main.rs b/src/main.rs
index 8a16d4d..97a14eb 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -7,7 +7,7 @@ use tracing_subscriber::FmtSubscriber;
7use ngit_grasp::{ 7use ngit_grasp::{
8 config::{Config, DatabaseBackend}, 8 config::{Config, DatabaseBackend},
9 http, 9 http,
10 metrics::{Metrics, REGISTRY}, 10 metrics::Metrics,
11 nostr, 11 nostr,
12 sync::SyncManager, 12 sync::SyncManager,
13}; 13};
@@ -53,6 +53,7 @@ async fn main() -> Result<()> {
53 53
54 // Start SyncManager for proactive sync (Phase 2: multi-relay support, Phase 3: health tracking) 54 // Start SyncManager for proactive sync (Phase 2: multi-relay support, Phase 3: health tracking)
55 // Even without bootstrap relay, SyncManager discovers relays from stored announcements 55 // Even without bootstrap relay, SyncManager discovers relays from stored announcements
56 // Pass the already-registered sync metrics from Metrics to avoid duplicate registration
56 let sync_manager = SyncManager::new( 57 let sync_manager = SyncManager::new(
57 config.sync_bootstrap_relay_url.clone(), 58 config.sync_bootstrap_relay_url.clone(),
58 config.domain.clone(), 59 config.domain.clone(),
@@ -60,7 +61,7 @@ async fn main() -> Result<()> {
60 relay_with_db.write_policy.clone(), 61 relay_with_db.write_policy.clone(),
61 relay_with_db.relay.clone(), 62 relay_with_db.relay.clone(),
62 &config, 63 &config,
63 Some(&REGISTRY), 64 metrics.as_ref().and_then(|m| m.sync_metrics().cloned()),
64 ); 65 );
65 66
66 if config.sync_bootstrap_relay_url.is_some() { 67 if config.sync_bootstrap_relay_url.is_some() {
diff --git a/src/sync/mod.rs b/src/sync/mod.rs
index 21f31df..c62b478 100644
--- a/src/sync/mod.rs
+++ b/src/sync/mod.rs
@@ -39,7 +39,6 @@ use std::sync::Arc;
39use std::time::Duration; 39use std::time::Duration;
40 40
41use nostr_sdk::prelude::*; 41use nostr_sdk::prelude::*;
42use prometheus::Registry;
43use tokio::sync::{broadcast, Mutex, RwLock}; 42use tokio::sync::{broadcast, Mutex, RwLock};
44 43
45use crate::config::Config; 44use crate::config::Config;
@@ -355,7 +354,7 @@ impl SyncManager {
355 /// * `write_policy` - Policy for validating events before storage 354 /// * `write_policy` - Policy for validating events before storage
356 /// * `local_relay` - Local relay for submitting synced events (enables WebSocket broadcast) 355 /// * `local_relay` - Local relay for submitting synced events (enables WebSocket broadcast)
357 /// * `config` - Configuration for sync settings 356 /// * `config` - Configuration for sync settings
358 /// * `registry` - Optional Prometheus registry for metrics (metrics only created if config.metrics_enabled is true) 357 /// * `sync_metrics` - Optional pre-registered SyncMetrics (passed from Metrics if metrics are enabled)
359 pub fn new( 358 pub fn new(
360 bootstrap_relay_url: Option<String>, 359 bootstrap_relay_url: Option<String>,
361 service_domain: String, 360 service_domain: String,
@@ -363,23 +362,8 @@ impl SyncManager {
363 write_policy: Nip34WritePolicy, 362 write_policy: Nip34WritePolicy,
364 local_relay: LocalRelay, 363 local_relay: LocalRelay,
365 config: &Config, 364 config: &Config,
366 registry: Option<&Registry>, 365 sync_metrics: Option<SyncMetrics>,
367 ) -> Self { 366 ) -> Self {
368 // Create metrics only if metrics are enabled AND a registry is provided
369 let metrics = if config.metrics_enabled {
370 registry.and_then(|r| {
371 match SyncMetrics::register(r) {
372 Ok(m) => Some(m),
373 Err(e) => {
374 tracing::warn!("Failed to register sync metrics: {}", e);
375 None
376 }
377 }
378 })
379 } else {
380 None
381 };
382
383 Self { 367 Self {
384 bootstrap_relay_url, 368 bootstrap_relay_url,
385 service_domain, 369 service_domain,
@@ -397,7 +381,7 @@ impl SyncManager {
397 eose_tx: None, 381 eose_tx: None,
398 connect_tx: None, 382 connect_tx: None,
399 shutdown_tx: None, 383 shutdown_tx: None,
400 metrics, 384 metrics: sync_metrics,
401 } 385 }
402 } 386 }
403 387