Skip to content

Commit 16f7435

Browse files
Merge pull request #30 from readysettech/issue-16-log-verbosity
Add verbosity level to log messages
2 parents 3fdcbf9 + d0c0b7c commit 16f7435

File tree

10 files changed

+86
-23
lines changed

10 files changed

+86
-23
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,6 @@ target/
1010
*.pdb
1111

1212
.vscode/
13+
14+
# Demo config
15+
config_demo.cnf

Cargo.lock

Lines changed: 1 addition & 0 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
@@ -12,6 +12,7 @@ toml = "0.8.12"
1212
serde = "1.0"
1313
chrono = "0.4.35"
1414
file-guard = "0.2.0"
15+
once_cell = "1.10.0"
1516

1617

1718
[package.metadata.generate-rpm]

build/docker-compose.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ services:
1313
environment:
1414
- MYSQL_ROOT_PASSWORD=noria
1515
- MYSQL_DATABASE=noria
16-
command: --server-id=1
16+
command: --server-id=1 --local-infile=1
1717
ports:
1818
- "3306:3306"
1919
healthcheck:
@@ -28,7 +28,7 @@ services:
2828
- "3307:3307"
2929
- "6034:6034"
3030
environment:
31-
- UPSTREAM_DB_URL=mysql://root:[email protected]:3306/noria
31+
- UPSTREAM_DB_URL=mysql://root:[email protected]:3306/imdb
3232
- LISTEN_ADDRESS=0.0.0.0:3307
3333
depends_on:
3434
mysql-master:

readyset_proxysql_scheduler.cnf

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ source_hostgroup = 11
88
readyset_hostgroup = 99
99
warmup_time_s = 60
1010
lock_file = '/tmp/readyset_scheduler.lock'
11-
operation_mode="All"
11+
operation_mode='All'
1212
number_of_queries=10
13-
query_discovery_mode='SumTime'
13+
query_discovery_mode='SumTime'
14+
log_verbosity='Note'

src/config.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@ use std::{
44
io::Read,
55
};
66

7-
#[derive(serde::Deserialize, Clone, Copy, PartialEq, PartialOrd, Default)]
7+
use crate::messages::MessageType;
8+
9+
#[derive(serde::Deserialize, Clone, Copy, PartialEq, PartialOrd, Default, Debug)]
810
pub enum OperationMode {
911
HealthCheck,
1012
QueryDiscovery,
@@ -33,7 +35,7 @@ impl Display for OperationMode {
3335
}
3436
}
3537

36-
#[derive(serde::Deserialize, Clone, Copy, PartialEq, PartialOrd, Default)]
38+
#[derive(serde::Deserialize, Clone, Copy, PartialEq, PartialOrd, Default, Debug)]
3739
pub enum QueryDiscoveryMode {
3840
#[default]
3941
CountStar,
@@ -66,7 +68,7 @@ impl From<String> for QueryDiscoveryMode {
6668
}
6769
}
6870

69-
#[derive(serde::Deserialize, Clone)]
71+
#[derive(serde::Deserialize, Clone, Debug)]
7072
pub struct Config {
7173
pub proxysql_user: String,
7274
pub proxysql_password: String,
@@ -83,6 +85,7 @@ pub struct Config {
8385
pub query_discovery_mode: Option<QueryDiscoveryMode>,
8486
pub query_discovery_min_execution: Option<u64>,
8587
pub query_discovery_min_row_sent: Option<u64>,
88+
pub log_verbosity: Option<MessageType>,
8689
}
8790

8891
pub fn read_config_file(path: &str) -> Result<String, std::io::Error> {

src/main.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ mod queries;
77
use clap::Parser;
88
use config::read_config_file;
99
use file_guard::Lock;
10+
use messages::MessageType;
1011
use mysql::{Conn, OptsBuilder};
1112
use proxysql::ProxySQL;
1213
use std::fs::OpenOptions;
@@ -25,10 +26,11 @@ struct Args {
2526
}
2627

2728
fn main() {
28-
messages::print_info("Running readyset_scheduler");
2929
let args = Args::parse();
3030
let config_file = read_config_file(&args.config).expect("Failed to read config file");
3131
let config = config::parse_config_file(&config_file).expect("Failed to parse config file");
32+
messages::set_log_verbosity(config.clone().log_verbosity.unwrap_or(MessageType::Note));
33+
messages::print_info("Running readyset_scheduler");
3234
let file = match OpenOptions::new()
3335
.read(true)
3436
.write(true)

src/messages.rs

Lines changed: 59 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,72 @@
11
use std::process;
22

33
use chrono::{DateTime, Local};
4+
use once_cell::sync::Lazy;
5+
use std::sync::Mutex;
46

5-
enum MessageType {
7+
#[derive(Clone, Copy, serde::Deserialize, Debug, Default, PartialEq, PartialOrd)]
8+
pub enum MessageType {
9+
/// Information message, this will not result in any action
610
Info,
11+
/// Note message, this will result in some action that changes state
12+
#[default]
13+
Note,
14+
/// Warning message
715
Warning,
16+
/// Error message
817
Error,
918
}
19+
20+
impl std::fmt::Display for MessageType {
21+
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
22+
match self {
23+
MessageType::Info => write!(f, "Info"),
24+
MessageType::Note => write!(f, "Note"),
25+
MessageType::Warning => write!(f, "Warning"),
26+
MessageType::Error => write!(f, "Error"),
27+
}
28+
}
29+
}
30+
31+
static LOG_VERBOSITY: Lazy<Mutex<MessageType>> = Lazy::new(|| Mutex::new(MessageType::default()));
32+
33+
pub fn set_log_verbosity(level: MessageType) {
34+
let mut verbosity = LOG_VERBOSITY.lock().unwrap();
35+
*verbosity = level;
36+
}
37+
38+
pub fn get_log_verbosity() -> MessageType {
39+
let verbosity = LOG_VERBOSITY.lock().unwrap();
40+
*verbosity
41+
}
42+
1043
fn print_message_with_ts(message: &str, message_type: MessageType) {
1144
let datetime_now: DateTime<Local> = Local::now();
1245
let date_formatted = datetime_now.format("%Y-%m-%d %H:%M:%S");
1346
let pid = process::id();
1447
match message_type {
15-
MessageType::Info => println!("{} [INFO] Readyset[{}]: {}", date_formatted, pid, message),
16-
MessageType::Warning => println!(
17-
"{} [WARNING] Readyset[{}]: {}",
18-
date_formatted, pid, message
19-
),
48+
MessageType::Info => {
49+
if MessageType::Info >= get_log_verbosity() {
50+
println!("{} [INFO] Readyset[{}]: {}", date_formatted, pid, message);
51+
}
52+
}
53+
MessageType::Note => {
54+
if MessageType::Note >= get_log_verbosity() {
55+
println!("{} [NOTE] Readyset[{}]: {}", date_formatted, pid, message);
56+
}
57+
}
58+
MessageType::Warning => {
59+
if MessageType::Warning >= get_log_verbosity() {
60+
eprintln!(
61+
"{} [WARNING] Readyset[{}]: {}",
62+
date_formatted, pid, message
63+
);
64+
}
65+
}
2066
MessageType::Error => {
21-
eprintln!("{} [ERROR] Readyset[{}]: {}", date_formatted, pid, message)
67+
if MessageType::Error >= get_log_verbosity() {
68+
eprintln!("{} [ERROR] Readyset[{}]: {}", date_formatted, pid, message);
69+
}
2270
}
2371
}
2472
}
@@ -27,6 +75,10 @@ pub fn print_info(message: &str) {
2775
print_message_with_ts(message, MessageType::Info);
2876
}
2977

78+
pub fn print_note(message: &str) {
79+
print_message_with_ts(message, MessageType::Note);
80+
}
81+
3082
pub fn print_warning(message: &str) {
3183
print_message_with_ts(message, MessageType::Warning);
3284
}

src/proxysql.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -88,10 +88,10 @@ impl ProxySQL {
8888
let date_formatted = datetime_now.format("%Y-%m-%d %H:%M:%S");
8989
if self.warmup_time_s > 0 {
9090
self.conn.query_drop(format!("INSERT INTO mysql_query_rules (username, mirror_hostgroup, active, digest, apply, comment) VALUES ('{}', {}, 1, '{}', 1, '{}: {}')", query.get_user(), self.readyset_hostgroup, query.get_digest(), MIRROR_QUERY_TOKEN, date_formatted)).expect("Failed to insert into mysql_query_rules");
91-
messages::print_info("Inserted warm-up rule");
91+
messages::print_note("Inserted warm-up rule");
9292
} else {
9393
self.conn.query_drop(format!("INSERT INTO mysql_query_rules (username, destination_hostgroup, active, digest, apply, comment) VALUES ('{}', {}, 1, '{}', 1, '{}: {}')", query.get_user(), self.readyset_hostgroup, query.get_digest(), DESTINATION_QUERY_TOKEN, date_formatted)).expect("Failed to insert into mysql_query_rules");
94-
messages::print_info("Inserted destination rule");
94+
messages::print_note("Inserted destination rule");
9595
}
9696
Ok(true)
9797
}
@@ -159,7 +159,7 @@ impl ProxySQL {
159159
comment, date_formatted
160160
);
161161
self.conn.query_drop(format!("UPDATE mysql_query_rules SET mirror_hostgroup = NULL, destination_hostgroup = {}, comment = '{}' WHERE rule_id = {}", self.readyset_hostgroup, comment, rule_id)).expect("Failed to update rule");
162-
messages::print_info(
162+
messages::print_note(
163163
format!("Updated rule ID {} from warmup to destination", rule_id).as_str(),
164164
);
165165
updated_rules = true;
@@ -180,7 +180,7 @@ impl ProxySQL {
180180
if ready {
181181
status_changes.push((host, HostStatus::Online));
182182
} else {
183-
messages::print_info("Readyset is still running Snapshot.");
183+
messages::print_note("Readyset is still running Snapshot.");
184184
status_changes.push((host, HostStatus::Shunned));
185185
}
186186
}
@@ -199,7 +199,7 @@ impl ProxySQL {
199199
host.get_hostname(),
200200
host.get_port()
201201
);
202-
messages::print_info(
202+
messages::print_note(
203203
format!(
204204
"Server HG: {}, Host: {}, Port: {} is currently {}. Changing to {}",
205205
self.readyset_hostgroup,

src/queries.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ impl QueryDiscovery {
178178
break;
179179
}
180180
let digest_text = self.replace_placeholders(query.get_digest_text());
181-
messages::print_info(
181+
messages::print_note(
182182
format!("Going to test query support for {}", digest_text).as_str(),
183183
);
184184
let supported = proxysql
@@ -187,7 +187,7 @@ impl QueryDiscovery {
187187
.check_query_support(&digest_text, query.get_schema()); // Safe to unwrap because we checked if hosts is empty
188188
match supported {
189189
Ok(true) => {
190-
messages::print_info(
190+
messages::print_note(
191191
"Query is supported, adding it to proxysql and readyset"
192192
.to_string()
193193
.as_str(),
@@ -207,7 +207,7 @@ impl QueryDiscovery {
207207
current_queries_digest.push(query.get_digest().to_string());
208208
}
209209
Ok(false) => {
210-
messages::print_info("Query is not supported");
210+
messages::print_note("Query is not supported");
211211
}
212212
Err(err) => {
213213
messages::print_warning(

0 commit comments

Comments
 (0)