Implement basic metrics in table

This commit is contained in:
Maximilien R 2022-02-15 20:09:43 +01:00 committed by Alex Auvolat
parent e349af13a7
commit 1e2cf26373
No known key found for this signature in database
GPG key ID: 0E496D15096376BE
7 changed files with 36 additions and 7 deletions

1
Cargo.lock generated
View file

@ -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",

View file

@ -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()),
}, },
} }
} }

View file

@ -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...");

View file

@ -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"

View file

@ -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,
}) })
} }

View file

@ -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
View 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(),
}
}
}