From eb55c3c3da8d54c5ad15a1384c9ae707f7739a55 Mon Sep 17 00:00:00 2001 From: joshieDo <93316087+joshieDo@users.noreply.github.com> Date: Wed, 21 Jan 2026 22:09:42 +0000 Subject: [PATCH] feat(grafana): add RocksDB metrics dashboard (#21243) Co-authored-by: Amp --- crates/node/builder/src/launch/common.rs | 4 + crates/node/metrics/src/server.rs | 21 + crates/storage/provider/Cargo.toml | 2 +- .../src/providers/rocksdb/provider.rs | 38 + .../provider/src/providers/rocksdb_stub.rs | 9 +- etc/grafana/dashboards/overview.json | 851 ++++++++++++++++-- 6 files changed, 845 insertions(+), 80 deletions(-) diff --git a/crates/node/builder/src/launch/common.rs b/crates/node/builder/src/launch/common.rs index d97ecab876..c9237ac63b 100644 --- a/crates/node/builder/src/launch/common.rs +++ b/crates/node/builder/src/launch/common.rs @@ -1277,6 +1277,10 @@ pub fn metrics_hooks(provider_factory: &ProviderFactory) }) } }) + .with_hook({ + let rocksdb = provider_factory.rocksdb_provider(); + move || throttle!(Duration::from_secs(5 * 60), || rocksdb.report_metrics()) + }) .build() } diff --git a/crates/node/metrics/src/server.rs b/crates/node/metrics/src/server.rs index 4777e26853..ea24e6572e 100644 --- a/crates/node/metrics/src/server.rs +++ b/crates/node/metrics/src/server.rs @@ -106,6 +106,7 @@ impl MetricServer { // Describe metrics after recorder installation describe_db_metrics(); describe_static_file_metrics(); + describe_rocksdb_metrics(); Collector::default().describe(); describe_memory_stats(); describe_io_stats(); @@ -238,6 +239,26 @@ fn describe_static_file_metrics() { ); } +fn describe_rocksdb_metrics() { + describe_gauge!( + "rocksdb.table_size", + Unit::Bytes, + "The estimated size of a RocksDB table (SST + memtable)" + ); + describe_gauge!("rocksdb.table_entries", "The estimated number of keys in a RocksDB table"); + describe_gauge!( + "rocksdb.pending_compaction_bytes", + Unit::Bytes, + "Bytes pending compaction for a RocksDB table" + ); + describe_gauge!("rocksdb.sst_size", Unit::Bytes, "The size of SST files for a RocksDB table"); + describe_gauge!( + "rocksdb.memtable_size", + Unit::Bytes, + "The size of memtables for a RocksDB table" + ); +} + #[cfg(all(feature = "jemalloc", unix))] fn describe_memory_stats() { describe_gauge!( diff --git a/crates/storage/provider/Cargo.toml b/crates/storage/provider/Cargo.toml index 2aa30ab1b9..677c1c642b 100644 --- a/crates/storage/provider/Cargo.toml +++ b/crates/storage/provider/Cargo.toml @@ -85,7 +85,7 @@ rand.workspace = true tokio = { workspace = true, features = ["sync", "macros", "rt-multi-thread"] } [features] -edge = ["reth-storage-api/edge"] +edge = ["reth-storage-api/edge", "rocksdb"] rocksdb = ["dep:rocksdb"] test-utils = [ "reth-db/test-utils", diff --git a/crates/storage/provider/src/providers/rocksdb/provider.rs b/crates/storage/provider/src/providers/rocksdb/provider.rs index 7824059086..d866f59cd9 100644 --- a/crates/storage/provider/src/providers/rocksdb/provider.rs +++ b/crates/storage/provider/src/providers/rocksdb/provider.rs @@ -3,9 +3,11 @@ use crate::providers::{compute_history_rank, needs_prev_shard_check, HistoryInfo use alloy_consensus::transaction::TxHashRef; use alloy_primitives::{Address, BlockNumber, TxNumber, B256}; use itertools::Itertools; +use metrics::Label; use parking_lot::Mutex; use reth_chain_state::ExecutedBlock; use reth_db_api::{ + database_metrics::DatabaseMetrics, models::{ sharded_key::NUM_OF_INDICES_IN_SHARD, storage_sharded_key::StorageShardedKey, ShardedKey, StorageSettings, @@ -529,6 +531,42 @@ impl Clone for RocksDBProvider { } } +impl DatabaseMetrics for RocksDBProvider { + fn gauge_metrics(&self) -> Vec<(&'static str, f64, Vec