Skip to content

Commit a22868d

Browse files
committed
refactor: [torrust#1184] remove stats functionality from core tracker
1 parent c415430 commit a22868d

File tree

26 files changed

+702
-396
lines changed

26 files changed

+702
-396
lines changed

src/app.rs

+8-1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ use torrust_tracker_configuration::Configuration;
2929
use tracing::instrument;
3030

3131
use crate::bootstrap::jobs::{health_check_api, http_tracker, torrent_cleanup, tracker_apis, udp_tracker};
32+
use crate::core::statistics::event::sender::Sender;
33+
use crate::core::statistics::repository::Repository;
3234
use crate::servers::registar::Registar;
3335
use crate::servers::udp::server::banning::BanService;
3436
use crate::{core, servers};
@@ -39,11 +41,13 @@ use crate::{core, servers};
3941
///
4042
/// - Can't retrieve tracker keys from database.
4143
/// - Can't load whitelist from database.
42-
#[instrument(skip(config, tracker, ban_service))]
44+
#[instrument(skip(config, tracker, ban_service, stats_event_sender, stats_repository))]
4345
pub async fn start(
4446
config: &Configuration,
4547
tracker: Arc<core::Tracker>,
4648
ban_service: Arc<RwLock<BanService>>,
49+
stats_event_sender: Arc<Option<Box<dyn Sender>>>,
50+
stats_repository: Arc<Repository>,
4751
) -> Vec<JoinHandle<()>> {
4852
if config.http_api.is_none()
4953
&& (config.udp_trackers.is_none() || config.udp_trackers.as_ref().map_or(true, std::vec::Vec::is_empty))
@@ -97,6 +101,7 @@ pub async fn start(
97101
if let Some(job) = http_tracker::start_job(
98102
http_tracker_config,
99103
tracker.clone(),
104+
stats_event_sender.clone(),
100105
registar.give_form(),
101106
servers::http::Version::V1,
102107
)
@@ -115,6 +120,8 @@ pub async fn start(
115120
http_api_config,
116121
tracker.clone(),
117122
ban_service.clone(),
123+
stats_event_sender.clone(),
124+
stats_repository.clone(),
118125
registar.give_form(),
119126
servers::apis::Version::V1,
120127
)

src/bootstrap/app.rs

+19-17
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,13 @@ use crate::shared::crypto::keys::{self, Keeper as _};
3939
/// Setup can file if the configuration is invalid.
4040
#[must_use]
4141
#[instrument(skip())]
42-
pub fn setup() -> (Configuration, Arc<Tracker>, Arc<RwLock<BanService>>) {
42+
pub fn setup() -> (
43+
Configuration,
44+
Arc<Tracker>,
45+
Arc<RwLock<BanService>>,
46+
Arc<Option<Box<dyn Sender>>>,
47+
Arc<Repository>,
48+
) {
4349
#[cfg(not(test))]
4450
check_seed();
4551

@@ -49,13 +55,19 @@ pub fn setup() -> (Configuration, Arc<Tracker>, Arc<RwLock<BanService>>) {
4955
panic!("Configuration error: {e}");
5056
}
5157

52-
let tracker = initialize_with_configuration(&configuration);
58+
// Initialize services
59+
60+
let (stats_event_sender, stats_repository) = statistics::setup::factory(configuration.core.tracker_usage_statistics);
61+
let stats_event_sender = Arc::new(stats_event_sender);
62+
let stats_repository = Arc::new(stats_repository);
5363

5464
let udp_ban_service = Arc::new(RwLock::new(BanService::new(MAX_CONNECTION_ID_ERRORS_PER_IP)));
5565

66+
let tracker = initialize_with_configuration(&configuration);
67+
5668
tracing::info!("Configuration:\n{}", configuration.clone().mask_secrets().to_json());
5769

58-
(configuration, tracker, udp_ban_service)
70+
(configuration, tracker, udp_ban_service, stats_event_sender, stats_repository)
5971
}
6072

6173
/// checks if the seed is the instance seed in production.
@@ -109,28 +121,18 @@ pub fn initialize_static() {
109121
#[must_use]
110122
#[instrument(skip(config))]
111123
pub fn initialize_tracker(config: &Configuration) -> Tracker {
112-
let (database, whitelist_manager, stats_event_sender, stats_repository) = initialize_tracker_dependencies(config);
124+
let (database, whitelist_manager) = initialize_tracker_dependencies(config);
113125

114-
tracker_factory(config, &database, &whitelist_manager, &stats_event_sender, &stats_repository)
126+
tracker_factory(config, &database, &whitelist_manager)
115127
}
116128

117129
#[allow(clippy::type_complexity)]
118130
#[must_use]
119-
pub fn initialize_tracker_dependencies(
120-
config: &Configuration,
121-
) -> (
122-
Arc<Box<dyn Database>>,
123-
Arc<WhiteListManager>,
124-
Arc<Option<Box<dyn Sender>>>,
125-
Arc<Repository>,
126-
) {
131+
pub fn initialize_tracker_dependencies(config: &Configuration) -> (Arc<Box<dyn Database>>, Arc<WhiteListManager>) {
127132
let database = initialize_database(config);
128133
let whitelist_manager = initialize_whitelist(database.clone());
129-
let (stats_event_sender, stats_repository) = statistics::setup::factory(config.core.tracker_usage_statistics);
130-
let stats_event_sender = Arc::new(stats_event_sender);
131-
let stats_repository = Arc::new(stats_repository);
132134

133-
(database, whitelist_manager, stats_event_sender, stats_repository)
135+
(database, whitelist_manager)
134136
}
135137

136138
/// It initializes the log threshold, format and channel.

src/bootstrap/jobs/http_tracker.rs

+13-6
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ use torrust_tracker_configuration::HttpTracker;
1919
use tracing::instrument;
2020

2121
use super::make_rust_tls;
22-
use crate::core;
22+
use crate::core::statistics::event::sender::Sender;
23+
use crate::core::{self, statistics};
2324
use crate::servers::http::server::{HttpServer, Launcher};
2425
use crate::servers::http::Version;
2526
use crate::servers::registar::ServiceRegistrationForm;
@@ -33,10 +34,11 @@ use crate::servers::registar::ServiceRegistrationForm;
3334
///
3435
/// It would panic if the `config::HttpTracker` struct would contain inappropriate values.
3536
///
36-
#[instrument(skip(config, tracker, form))]
37+
#[instrument(skip(config, tracker, stats_event_sender, form))]
3738
pub async fn start_job(
3839
config: &HttpTracker,
3940
tracker: Arc<core::Tracker>,
41+
stats_event_sender: Arc<Option<Box<dyn Sender>>>,
4042
form: ServiceRegistrationForm,
4143
version: Version,
4244
) -> Option<JoinHandle<()>> {
@@ -47,20 +49,21 @@ pub async fn start_job(
4749
.map(|tls| tls.expect("it should have a valid http tracker tls configuration"));
4850

4951
match version {
50-
Version::V1 => Some(start_v1(socket, tls, tracker.clone(), form).await),
52+
Version::V1 => Some(start_v1(socket, tls, tracker.clone(), stats_event_sender.clone(), form).await),
5153
}
5254
}
5355

5456
#[allow(clippy::async_yields_async)]
55-
#[instrument(skip(socket, tls, tracker, form))]
57+
#[instrument(skip(socket, tls, tracker, stats_event_sender, form))]
5658
async fn start_v1(
5759
socket: SocketAddr,
5860
tls: Option<RustlsConfig>,
5961
tracker: Arc<core::Tracker>,
62+
stats_event_sender: Arc<Option<Box<dyn statistics::event::sender::Sender>>>,
6063
form: ServiceRegistrationForm,
6164
) -> JoinHandle<()> {
6265
let server = HttpServer::new(Launcher::new(socket, tls))
63-
.start(tracker, form)
66+
.start(tracker, stats_event_sender, form)
6467
.await
6568
.expect("it should be able to start to the http tracker");
6669

@@ -85,6 +88,7 @@ mod tests {
8588

8689
use crate::bootstrap::app::initialize_with_configuration;
8790
use crate::bootstrap::jobs::http_tracker::start_job;
91+
use crate::core::services::statistics;
8892
use crate::servers::http::Version;
8993
use crate::servers::registar::Registar;
9094

@@ -93,10 +97,13 @@ mod tests {
9397
let cfg = Arc::new(ephemeral_public());
9498
let http_tracker = cfg.http_trackers.clone().expect("missing HTTP tracker configuration");
9599
let config = &http_tracker[0];
100+
let (stats_event_sender, stats_repository) = statistics::setup::factory(cfg.core.tracker_usage_statistics);
101+
let stats_event_sender = Arc::new(stats_event_sender);
102+
let _stats_repository = Arc::new(stats_repository);
96103
let tracker = initialize_with_configuration(&cfg);
97104
let version = Version::V1;
98105

99-
start_job(config, tracker, Registar::default().give_form(), version)
106+
start_job(config, tracker, stats_event_sender, Registar::default().give_form(), version)
100107
.await
101108
.expect("it should be able to join to the http tracker start-job");
102109
}

src/bootstrap/jobs/tracker_apis.rs

+57-8
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ use tracing::instrument;
3131

3232
use super::make_rust_tls;
3333
use crate::core;
34+
use crate::core::statistics::event::sender::Sender;
35+
use crate::core::statistics::repository::Repository;
3436
use crate::servers::apis::server::{ApiServer, Launcher};
3537
use crate::servers::apis::Version;
3638
use crate::servers::registar::ServiceRegistrationForm;
@@ -56,11 +58,13 @@ pub struct ApiServerJobStarted();
5658
/// It would panic if unable to send the `ApiServerJobStarted` notice.
5759
///
5860
///
59-
#[instrument(skip(config, tracker, ban_service, form))]
61+
#[instrument(skip(config, tracker, ban_service, stats_event_sender, stats_repository, form))]
6062
pub async fn start_job(
6163
config: &HttpApi,
6264
tracker: Arc<core::Tracker>,
6365
ban_service: Arc<RwLock<BanService>>,
66+
stats_event_sender: Arc<Option<Box<dyn Sender>>>,
67+
stats_repository: Arc<Repository>,
6468
form: ServiceRegistrationForm,
6569
version: Version,
6670
) -> Option<JoinHandle<()>> {
@@ -73,22 +77,52 @@ pub async fn start_job(
7377
let access_tokens = Arc::new(config.access_tokens.clone());
7478

7579
match version {
76-
Version::V1 => Some(start_v1(bind_to, tls, tracker.clone(), ban_service.clone(), form, access_tokens).await),
80+
Version::V1 => Some(
81+
start_v1(
82+
bind_to,
83+
tls,
84+
tracker.clone(),
85+
ban_service.clone(),
86+
stats_event_sender.clone(),
87+
stats_repository.clone(),
88+
form,
89+
access_tokens,
90+
)
91+
.await,
92+
),
7793
}
7894
}
7995

8096
#[allow(clippy::async_yields_async)]
81-
#[instrument(skip(socket, tls, tracker, ban_service, form, access_tokens))]
97+
#[instrument(skip(
98+
socket,
99+
tls,
100+
tracker,
101+
ban_service,
102+
stats_event_sender,
103+
stats_repository,
104+
form,
105+
access_tokens
106+
))]
82107
async fn start_v1(
83108
socket: SocketAddr,
84109
tls: Option<RustlsConfig>,
85110
tracker: Arc<core::Tracker>,
86111
ban_service: Arc<RwLock<BanService>>,
112+
stats_event_sender: Arc<Option<Box<dyn Sender>>>,
113+
stats_repository: Arc<Repository>,
87114
form: ServiceRegistrationForm,
88115
access_tokens: Arc<AccessTokens>,
89116
) -> JoinHandle<()> {
90117
let server = ApiServer::new(Launcher::new(socket, tls))
91-
.start(tracker, ban_service, form, access_tokens)
118+
.start(
119+
tracker,
120+
ban_service,
121+
stats_event_sender,
122+
stats_repository,
123+
form,
124+
access_tokens,
125+
)
92126
.await
93127
.expect("it should be able to start to the tracker api");
94128

@@ -107,6 +141,7 @@ mod tests {
107141

108142
use crate::bootstrap::app::initialize_with_configuration;
109143
use crate::bootstrap::jobs::tracker_apis::start_job;
144+
use crate::core::services::statistics;
110145
use crate::servers::apis::Version;
111146
use crate::servers::registar::Registar;
112147
use crate::servers::udp::server::banning::BanService;
@@ -116,12 +151,26 @@ mod tests {
116151
async fn it_should_start_http_tracker() {
117152
let cfg = Arc::new(ephemeral_public());
118153
let config = &cfg.http_api.clone().unwrap();
119-
let tracker = initialize_with_configuration(&cfg);
154+
120155
let ban_service = Arc::new(RwLock::new(BanService::new(MAX_CONNECTION_ID_ERRORS_PER_IP)));
156+
let (stats_event_sender, stats_repository) = statistics::setup::factory(cfg.core.tracker_usage_statistics);
157+
let stats_event_sender = Arc::new(stats_event_sender);
158+
let stats_repository = Arc::new(stats_repository);
159+
160+
let tracker = initialize_with_configuration(&cfg);
161+
121162
let version = Version::V1;
122163

123-
start_job(config, tracker, ban_service, Registar::default().give_form(), version)
124-
.await
125-
.expect("it should be able to join to the tracker api start-job");
164+
start_job(
165+
config,
166+
tracker,
167+
ban_service,
168+
stats_event_sender,
169+
stats_repository,
170+
Registar::default().give_form(),
171+
version,
172+
)
173+
.await
174+
.expect("it should be able to join to the tracker api start-job");
126175
}
127176
}

src/console/profiling.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -179,9 +179,9 @@ pub async fn run() {
179179
return;
180180
};
181181

182-
let (config, tracker, ban_service) = bootstrap::app::setup();
182+
let (config, tracker, ban_service, stats_event_sender, stats_repository) = bootstrap::app::setup();
183183

184-
let jobs = app::start(&config, tracker, ban_service).await;
184+
let jobs = app::start(&config, tracker, ban_service, stats_event_sender, stats_repository).await;
185185

186186
// Run the tracker for a fixed duration
187187
let run_duration = sleep(Duration::from_secs(duration_secs));

0 commit comments

Comments
 (0)