Skip to content

Commit a73a689

Browse files
authored
Clear DB size gauges when shutting a module down (#2259)
1 parent 92c8e95 commit a73a689

File tree

4 files changed

+53
-10
lines changed

4 files changed

+53
-10
lines changed

crates/core/src/db/datastore/locking_tx_datastore/committed_state.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -682,23 +682,23 @@ impl CommittedState {
682682
pub(super) fn report_data_size(&self, database_identity: Identity) {
683683
use crate::db::db_metrics::data_size::DATA_SIZE_METRICS;
684684

685-
for (table_id, table) in &self.tables {
685+
for (_, table) in &self.tables {
686686
let table_name = &table.schema.table_name;
687687
DATA_SIZE_METRICS
688688
.data_size_table_num_rows
689-
.with_label_values(&database_identity, &table_id.0, table_name)
689+
.with_label_values(&database_identity, table_name)
690690
.set(table.num_rows() as _);
691691
DATA_SIZE_METRICS
692692
.data_size_table_bytes_used_by_rows
693-
.with_label_values(&database_identity, &table_id.0, table_name)
693+
.with_label_values(&database_identity, table_name)
694694
.set(table.bytes_used_by_rows() as _);
695695
DATA_SIZE_METRICS
696696
.data_size_table_num_rows_in_indexes
697-
.with_label_values(&database_identity, &table_id.0, table_name)
697+
.with_label_values(&database_identity, table_name)
698698
.set(table.num_rows_in_indexes() as _);
699699
DATA_SIZE_METRICS
700700
.data_size_table_bytes_used_by_index_keys
701-
.with_label_values(&database_identity, &table_id.0, table_name)
701+
.with_label_values(&database_identity, table_name)
702702
.set(table.bytes_used_by_index_keys() as _);
703703
}
704704

crates/core/src/db/db_metrics/data_size.rs

+35-4
Original file line numberDiff line numberDiff line change
@@ -3,28 +3,30 @@ use prometheus::IntGaugeVec;
33
use spacetimedb_lib::Identity;
44
use spacetimedb_metrics::metrics_group;
55

6+
use crate::worker_metrics::WORKER_METRICS;
7+
68
metrics_group!(
79
#[non_exhaustive]
810
pub struct DbDataSize {
911
#[name = spacetime_data_size_table_num_rows]
1012
#[help = "The number of rows in a table"]
11-
#[labels(db: Identity, table_id: u32, table_name: str)]
13+
#[labels(db: Identity, table_name: str)]
1214
pub data_size_table_num_rows: IntGaugeVec,
1315

1416
#[name = spacetime_data_size_bytes_used_by_rows]
1517
#[help = "The number of bytes used by rows in pages in a table"]
16-
#[labels(db: Identity, table_id: u32, table_name: str)]
18+
#[labels(db: Identity, table_name: str)]
1719
pub data_size_table_bytes_used_by_rows: IntGaugeVec,
1820

1921
#[name = spacetime_data_size_table_num_rows_in_indexes]
2022
#[help = "The number of rows stored in indexes in a table"]
2123
// TODO: Consider partitioning by index ID or index name.
22-
#[labels(db: Identity, table_id: u32, table_name: str)]
24+
#[labels(db: Identity, table_name: str)]
2325
pub data_size_table_num_rows_in_indexes: IntGaugeVec,
2426

2527
#[name = spacetime_data_size_table_bytes_used_by_index_keys]
2628
#[help = "The number of bytes used by keys stored in indexes in a table"]
27-
#[labels(db: Identity, table_id: u32, table_name: str)]
29+
#[labels(db: Identity, table_name: str)]
2830
pub data_size_table_bytes_used_by_index_keys: IntGaugeVec,
2931

3032
#[name = spacetime_data_size_blob_store_num_blobs]
@@ -40,3 +42,32 @@ metrics_group!(
4042
);
4143

4244
pub static DATA_SIZE_METRICS: Lazy<DbDataSize> = Lazy::new(DbDataSize::new);
45+
46+
// Remove all gauges associated with a database.
47+
// This is useful if a database is being deleted.
48+
pub fn remove_database_gauges<'a, I>(db: &Identity, table_names: I)
49+
where
50+
I: IntoIterator<Item = &'a str>,
51+
{
52+
// Remove the per-table gauges.
53+
for table_name in table_names {
54+
let _ = DATA_SIZE_METRICS
55+
.data_size_table_num_rows
56+
.remove_label_values(db, table_name);
57+
let _ = DATA_SIZE_METRICS
58+
.data_size_table_bytes_used_by_rows
59+
.remove_label_values(db, table_name);
60+
let _ = DATA_SIZE_METRICS
61+
.data_size_table_num_rows_in_indexes
62+
.remove_label_values(db, table_name);
63+
let _ = DATA_SIZE_METRICS
64+
.data_size_table_bytes_used_by_index_keys
65+
.remove_label_values(db, table_name);
66+
}
67+
// Remove the per-db gauges.
68+
let _ = DATA_SIZE_METRICS.data_size_blob_store_num_blobs.remove_label_values(db);
69+
let _ = DATA_SIZE_METRICS
70+
.data_size_blob_store_bytes_used_by_blobs
71+
.remove_label_values(db);
72+
let _ = WORKER_METRICS.wasm_memory_bytes.remove_label_values(db);
73+
}

crates/core/src/host/host_controller.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@ use super::scheduler::SchedulerStarter;
33
use super::wasmtime::WasmtimeRuntime;
44
use super::{Scheduler, UpdateDatabaseResult};
55
use crate::database_logger::DatabaseLogger;
6-
use crate::db;
76
use crate::db::datastore::traits::Program;
87
use crate::db::db_metrics::DB_METRICS;
98
use crate::db::relational_db::{self, DiskSizeFn, RelationalDB, Txdata};
9+
use crate::db::{self, db_metrics};
1010
use crate::energy::{EnergyMonitor, EnergyQuanta};
1111
use crate::messages::control_db::{Database, HostType};
1212
use crate::module_host_context::ModuleCreationContext;
@@ -25,6 +25,7 @@ use spacetimedb_lib::hash_bytes;
2525
use spacetimedb_paths::server::{ReplicaDir, ServerDataDir};
2626
use spacetimedb_sats::hash::Hash;
2727
use std::future::Future;
28+
use std::ops::Deref;
2829
use std::sync::Arc;
2930
use std::time::{Duration, Instant};
3031
use tokio::sync::{watch, OwnedRwLockReadGuard, OwnedRwLockWriteGuard, RwLock as AsyncRwLock};
@@ -419,6 +420,8 @@ impl HostController {
419420
if let Some(host) = lock.write_owned().await.take() {
420421
let module = host.module.borrow().clone();
421422
module.exit().await;
423+
let table_names = module.info().module_def.tables().map(|t| t.name.deref());
424+
db_metrics::data_size::remove_database_gauges(&module.info().database_identity, table_names);
422425
}
423426
}
424427

crates/metrics/src/typed_prometheus.rs

+9
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,11 @@ macro_rules! metrics_histogram_vec {
8282
use $crate::typed_prometheus::AsPrometheusLabel as _;
8383
self.0.with_label_values(&[ $($labels.as_prometheus_str().as_ref()),+ ])
8484
}
85+
86+
pub fn remove_label_values(&self, $($labels: &$labelty),+) -> prometheus::Result<()> {
87+
use $crate::typed_prometheus::AsPrometheusLabel as _;
88+
self.0.remove_label_values(&[ $($labels.as_prometheus_str().as_ref()),+ ])
89+
}
8590
}
8691

8792
impl prometheus::core::Collector for $name {
@@ -111,6 +116,10 @@ macro_rules! metrics_vec {
111116
use $crate::typed_prometheus::AsPrometheusLabel as _;
112117
self.0.with_label_values(&[ $($labels.as_prometheus_str().as_ref()),+ ])
113118
}
119+
pub fn remove_label_values(&self, $($labels: &$labelty),+) -> prometheus::Result<()> {
120+
use $crate::typed_prometheus::AsPrometheusLabel as _;
121+
self.0.remove_label_values(&[ $($labels.as_prometheus_str().as_ref()),+ ])
122+
}
114123
}
115124

116125
impl prometheus::core::Collector for $name {

0 commit comments

Comments
 (0)