Skip to content

Commit 8e5e28a

Browse files
authored
Some stats (#19)
1 parent 574ebe0 commit 8e5e28a

File tree

7 files changed

+325
-25
lines changed

7 files changed

+325
-25
lines changed

Cargo.lock

Lines changed: 67 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,4 @@ serde_derive = "1"
2020
regex = "1"
2121
num_cpus = "1"
2222
once_cell = "1"
23+
statsd = "0.14"

src/client.rs

Lines changed: 38 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ use crate::messages::*;
1616
use crate::pool::{ClientServerMap, ConnectionPool};
1717
use crate::server::Server;
1818
use crate::sharding::Sharder;
19+
use crate::stats::Reporter;
1920

2021
pub const SHARDING_REGEX: &str = r"SET SHARDING KEY TO '[0-9]+';";
2122
pub const ROLE_REGEX: &str = r"SET SERVER ROLE TO '(PRIMARY|REPLICA)';";
@@ -57,6 +58,9 @@ pub struct Client {
5758

5859
// Client parameters, e.g. user, client_encoding, etc.
5960
parameters: HashMap<String, String>,
61+
62+
// Statistics
63+
stats: Reporter,
6064
}
6165

6266
impl Client {
@@ -69,6 +73,7 @@ impl Client {
6973
transaction_mode: bool,
7074
default_server_role: Option<Role>,
7175
server_info: BytesMut,
76+
stats: Reporter,
7277
) -> Result<Client, Error> {
7378
loop {
7479
// Could be StartupMessage or SSLRequest
@@ -127,6 +132,7 @@ impl Client {
127132
client_server_map: client_server_map,
128133
default_server_role: default_server_role,
129134
parameters: parameters,
135+
stats: stats,
130136
});
131137
}
132138

@@ -148,6 +154,7 @@ impl Client {
148154
client_server_map: client_server_map,
149155
default_server_role: default_server_role,
150156
parameters: HashMap::new(),
157+
stats: stats,
151158
});
152159
}
153160

@@ -220,7 +227,6 @@ impl Client {
220227
};
221228

222229
// Grab a server from the pool.
223-
// None = any shard
224230
let connection = match pool.get(shard, role).await {
225231
Ok(conn) => conn,
226232
Err(err) => {
@@ -287,11 +293,19 @@ impl Client {
287293
}
288294
}
289295

290-
// Release server
291-
if !server.in_transaction() && self.transaction_mode {
292-
shard = None;
293-
role = self.default_server_role;
294-
break;
296+
// Send statistic
297+
self.stats.query();
298+
299+
// Transaction over
300+
if !server.in_transaction() {
301+
self.stats.transaction();
302+
303+
// Release server
304+
if self.transaction_mode {
305+
shard = None;
306+
role = self.default_server_role;
307+
break;
308+
}
295309
}
296310
}
297311

@@ -350,11 +364,17 @@ impl Client {
350364
}
351365
}
352366

367+
self.stats.query();
368+
353369
// Release server
354-
if !server.in_transaction() && self.transaction_mode {
355-
shard = None;
356-
role = self.default_server_role;
357-
break;
370+
if !server.in_transaction() {
371+
self.stats.transaction();
372+
373+
if self.transaction_mode {
374+
shard = None;
375+
role = self.default_server_role;
376+
break;
377+
}
358378
}
359379
}
360380

@@ -378,11 +398,14 @@ impl Client {
378398
};
379399

380400
// Release the server
381-
if !server.in_transaction() && self.transaction_mode {
382-
println!("Releasing after copy done");
383-
shard = None;
384-
role = self.default_server_role;
385-
break;
401+
if !server.in_transaction() {
402+
self.stats.transaction();
403+
404+
if self.transaction_mode {
405+
shard = None;
406+
role = self.default_server_role;
407+
break;
408+
}
386409
}
387410
}
388411

src/main.rs

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ extern crate num_cpus;
2121
extern crate once_cell;
2222
extern crate serde;
2323
extern crate serde_derive;
24+
extern crate statsd;
2425
extern crate tokio;
2526
extern crate toml;
2627

@@ -30,6 +31,7 @@ use tokio::signal;
3031

3132
use std::collections::HashMap;
3233
use std::sync::{Arc, Mutex};
34+
use tokio::sync::mpsc;
3335

3436
mod client;
3537
mod config;
@@ -38,11 +40,13 @@ mod messages;
3840
mod pool;
3941
mod server;
4042
mod sharding;
43+
mod stats;
4144

4245
// Support for query cancellation: this maps our process_ids and
4346
// secret keys to the backend's.
4447
use config::Role;
4548
use pool::{ClientServerMap, ConnectionPool};
49+
use stats::{Collector, Reporter};
4650

4751
/// Main!
4852
#[tokio::main(worker_threads = 4)]
@@ -87,7 +91,23 @@ async fn main() {
8791
);
8892
println!("> Connection timeout: {}ms", config.general.connect_timeout);
8993

90-
let mut pool = ConnectionPool::from_config(config.clone(), client_server_map.clone()).await;
94+
// Collect statistics and send them to StatsD
95+
let (tx, rx) = mpsc::channel(100);
96+
97+
tokio::task::spawn(async move {
98+
println!("> Statistics reporter started");
99+
100+
let mut stats_collector = Collector::new(rx);
101+
stats_collector.collect().await;
102+
});
103+
104+
let mut pool = ConnectionPool::from_config(
105+
config.clone(),
106+
client_server_map.clone(),
107+
Reporter::new(tx.clone()),
108+
)
109+
.await;
110+
91111
let transaction_mode = config.general.pool_mode == "transaction";
92112
let default_server_role = match config.query_router.default_role.as_ref() {
93113
"any" => None,
@@ -115,6 +135,7 @@ async fn main() {
115135
let pool = pool.clone();
116136
let client_server_map = client_server_map.clone();
117137
let server_info = server_info.clone();
138+
let reporter = Reporter::new(tx.clone());
118139

119140
let (socket, addr) = match listener.accept().await {
120141
Ok((socket, addr)) => (socket, addr),
@@ -136,6 +157,7 @@ async fn main() {
136157
transaction_mode,
137158
default_server_role,
138159
server_info,
160+
reporter,
139161
)
140162
.await
141163
{
@@ -170,7 +192,10 @@ async fn main() {
170192

171193
// Setup shut down sequence
172194
match signal::ctrl_c().await {
173-
Ok(()) => {}
195+
Ok(()) => {
196+
println!("> Shutting down...");
197+
}
198+
174199
Err(err) => {
175200
eprintln!("Unable to listen for shutdown signal: {}", err);
176201
}

0 commit comments

Comments
 (0)