Implement basic metrics in table
This commit is contained in:
parent
e349af13a7
commit
1e2cf26373
7 changed files with 36 additions and 7 deletions
1
Cargo.lock
generated
1
Cargo.lock
generated
|
@ -998,6 +998,7 @@ dependencies = [
|
||||||
"garage_util 0.6.0",
|
"garage_util 0.6.0",
|
||||||
"hexdump",
|
"hexdump",
|
||||||
"log",
|
"log",
|
||||||
|
"opentelemetry",
|
||||||
"rand",
|
"rand",
|
||||||
"rmp-serde 0.15.5",
|
"rmp-serde 0.15.5",
|
||||||
"serde",
|
"serde",
|
||||||
|
|
|
@ -76,7 +76,6 @@ struct AdminServerMetrics {
|
||||||
http_counter: BoundCounter<u64>,
|
http_counter: BoundCounter<u64>,
|
||||||
http_body_gauge: BoundValueRecorder<u64>,
|
http_body_gauge: BoundValueRecorder<u64>,
|
||||||
http_req_histogram: BoundValueRecorder<f64>,
|
http_req_histogram: BoundValueRecorder<f64>,
|
||||||
bucket_v2_merkle_updater_todo_queue_length: BoundValueRecorder<f64>,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl AdminServer {
|
impl AdminServer {
|
||||||
|
@ -102,11 +101,6 @@ impl AdminServer {
|
||||||
.with_description("The HTTP request latencies in seconds.")
|
.with_description("The HTTP request latencies in seconds.")
|
||||||
.init()
|
.init()
|
||||||
.bind(HANDLER_ALL.as_ref()),
|
.bind(HANDLER_ALL.as_ref()),
|
||||||
bucket_v2_merkle_updater_todo_queue_length: meter
|
|
||||||
.f64_value_recorder("bucket_v2.merkle_updater.todo_queue_length")
|
|
||||||
.with_description("Bucket merkle updater TODO queue length.")
|
|
||||||
.init()
|
|
||||||
.bind(HANDLER_ALL.as_ref()),
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,7 +35,7 @@ pub async fn run_server(config_file: PathBuf) -> Result<(), Error> {
|
||||||
.open()
|
.open()
|
||||||
.expect("Unable to open sled DB");
|
.expect("Unable to open sled DB");
|
||||||
|
|
||||||
info!("Configure and run admin web server...");
|
info!("Initialize admin web server and metric backend...");
|
||||||
let admin_server_init = AdminServer::init();
|
let admin_server_init = AdminServer::init();
|
||||||
|
|
||||||
info!("Initializing background runner...");
|
info!("Initializing background runner...");
|
||||||
|
|
|
@ -17,6 +17,8 @@ path = "lib.rs"
|
||||||
garage_rpc = { version = "0.6.0", path = "../rpc" }
|
garage_rpc = { version = "0.6.0", path = "../rpc" }
|
||||||
garage_util = { version = "0.6.0", path = "../util" }
|
garage_util = { version = "0.6.0", path = "../util" }
|
||||||
|
|
||||||
|
opentelemetry = "0.17"
|
||||||
|
|
||||||
async-trait = "0.1.7"
|
async-trait = "0.1.7"
|
||||||
bytes = "1.0"
|
bytes = "1.0"
|
||||||
hexdump = "0.1"
|
hexdump = "0.1"
|
||||||
|
|
|
@ -13,6 +13,7 @@ use garage_rpc::system::System;
|
||||||
|
|
||||||
use crate::crdt::Crdt;
|
use crate::crdt::Crdt;
|
||||||
use crate::gc::GcTodoEntry;
|
use crate::gc::GcTodoEntry;
|
||||||
|
use crate::metrics::*;
|
||||||
use crate::replication::*;
|
use crate::replication::*;
|
||||||
use crate::schema::*;
|
use crate::schema::*;
|
||||||
|
|
||||||
|
@ -28,6 +29,8 @@ pub struct TableData<F: TableSchema, R: TableReplication> {
|
||||||
pub(crate) merkle_todo: sled::Tree,
|
pub(crate) merkle_todo: sled::Tree,
|
||||||
pub(crate) merkle_todo_notify: Notify,
|
pub(crate) merkle_todo_notify: Notify,
|
||||||
pub(crate) gc_todo: sled::Tree,
|
pub(crate) gc_todo: sled::Tree,
|
||||||
|
|
||||||
|
pub(crate) metrics: TableMetrics,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<F, R> TableData<F, R>
|
impl<F, R> TableData<F, R>
|
||||||
|
@ -51,6 +54,8 @@ where
|
||||||
.open_tree(&format!("{}:gc_todo_v2", F::TABLE_NAME))
|
.open_tree(&format!("{}:gc_todo_v2", F::TABLE_NAME))
|
||||||
.expect("Unable to open DB tree");
|
.expect("Unable to open DB tree");
|
||||||
|
|
||||||
|
let metrics = TableMetrics::new(F::TABLE_NAME, merkle_todo.clone());
|
||||||
|
|
||||||
Arc::new(Self {
|
Arc::new(Self {
|
||||||
system,
|
system,
|
||||||
instance,
|
instance,
|
||||||
|
@ -60,6 +65,7 @@ where
|
||||||
merkle_todo,
|
merkle_todo,
|
||||||
merkle_todo_notify: Notify::new(),
|
merkle_todo_notify: Notify::new(),
|
||||||
gc_todo,
|
gc_todo,
|
||||||
|
metrics,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate log;
|
extern crate log;
|
||||||
|
|
||||||
|
mod metrics;
|
||||||
pub mod schema;
|
pub mod schema;
|
||||||
pub mod util;
|
pub mod util;
|
||||||
|
|
||||||
|
|
25
src/table/metrics.rs
Normal file
25
src/table/metrics.rs
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
use opentelemetry::{global, metrics::*, KeyValue};
|
||||||
|
|
||||||
|
/// TableMetrics reference all counter used for metrics
|
||||||
|
pub struct TableMetrics {
|
||||||
|
merkle_updater_todo_queue_length: ValueObserver<u64>,
|
||||||
|
}
|
||||||
|
impl TableMetrics {
|
||||||
|
pub fn new(table_name: &'static str, merkle_todo: sled::Tree) -> Self {
|
||||||
|
let meter = global::meter(table_name);
|
||||||
|
TableMetrics {
|
||||||
|
merkle_updater_todo_queue_length: meter
|
||||||
|
.u64_value_observer(
|
||||||
|
format!("merkle_updater_todo_queue_length"),
|
||||||
|
move |observer| {
|
||||||
|
observer.observe(
|
||||||
|
merkle_todo.len() as u64,
|
||||||
|
&[KeyValue::new("table_name", table_name)],
|
||||||
|
)
|
||||||
|
},
|
||||||
|
)
|
||||||
|
.with_description("Bucket merkle updater TODO queue length")
|
||||||
|
.init(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue