diff options
author | metamuffin <metamuffin@disroot.org> | 2024-04-15 23:19:55 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2024-04-15 23:19:55 +0200 |
commit | f369728cc783493f8f6cab921b3c609d127bf6f2 (patch) | |
tree | 638a2a23e27a4c843237186708daa1e07b1f28ba /server/src/routes | |
parent | 29a62d702b24d8ea30c72e17569d9a98ad2775b9 (diff) | |
download | jellything-f369728cc783493f8f6cab921b3c609d127bf6f2.tar jellything-f369728cc783493f8f6cab921b3c609d127bf6f2.tar.bz2 jellything-f369728cc783493f8f6cab921b3c609d127bf6f2.tar.zst |
database statistics
Diffstat (limited to 'server/src/routes')
-rw-r--r-- | server/src/routes/ui/admin/mod.rs | 61 |
1 files changed, 60 insertions, 1 deletions
diff --git a/server/src/routes/ui/admin/mod.rs b/server/src/routes/ui/admin/mod.rs index 55ac75d..00a68ac 100644 --- a/server/src/routes/ui/admin/mod.rs +++ b/server/src/routes/ui/admin/mod.rs @@ -20,13 +20,19 @@ use crate::{ uri, }; use anyhow::{anyhow, Context}; +use humansize::{format_size, DECIMAL}; use jellybase::{ assetfed::AssetInner, - database::{redb::ReadableTable, TableExt, T_INVITE, T_NODE}, + database::{ + redb::{ReadableTable, ReadableTableMetadata}, + tantivy::query::Bm25StatisticsProvider, + TableExt, T_INVITE, T_NODE, T_NODE_EXTENDED, T_USER_NODE, + }, federation::Federation, CONF, }; use jellyimport::{import, is_importing}; +use markup::DynRender; use rand::Rng; use rocket::{form::Form, get, post, FromForm, State}; use std::time::Instant; @@ -60,6 +66,7 @@ pub fn admin_dashboard<'a>( }; let flash = flash.map(|f| f.map_err(|e| format!("{e:?}"))); + let database = database.to_owned(); Ok(LayoutPage { title: "Admin Dashboard".to_string(), content: markup::new! { @@ -100,6 +107,12 @@ pub fn admin_dashboard<'a>( } } }} + + h2 { "Database" } + @match db_stats(&database) { + Ok(s) => { @s } + Err(e) => { pre.error { @format!("{e:?}") } } + } }, ..Default::default() }) @@ -215,3 +228,49 @@ pub async fn r_admin_transcode_posters( ))), ) } + +fn db_stats(db: &DataAcid) -> anyhow::Result<DynRender> { + let txn = db.inner.begin_read()?; + let stats = [ + ("node", txn.open_table(T_NODE)?.stats()?), + ("node-ext", txn.open_table(T_NODE_EXTENDED)?.stats()?), + ("user", txn.open_table(T_USER_NODE)?.stats()?), + ("user-node", txn.open_table(T_USER_NODE)?.stats()?), + ("invite", txn.open_table(T_INVITE)?.stats()?), + ]; + + let cache_stats = db.node_index.reader.searcher().doc_store_cache_stats(); + let ft_total_docs = db.node_index.reader.searcher().total_num_docs()?; + + Ok(markup::new! { + h3 { "Key-Value-Store Statistics" } + table { + tbody { + tr { + th { "table name" } + th { "tree height" } + th { "stored bytes" } + th { "metadata bytes" } + th { "fragmented bytes" } + th { "branch pages" } + th { "leaf pages" } + } + @for (name, stats) in &stats { tr { + td { @name } + td { @stats.tree_height() } + td { @format_size(stats.stored_bytes(), DECIMAL) } + td { @format_size(stats.metadata_bytes(), DECIMAL) } + td { @format_size(stats.fragmented_bytes(), DECIMAL) } + td { @stats.branch_pages() } + td { @stats.leaf_pages() } + }} + } + } + h3 { "Search Engine Statistics" } + ul { + li { "Total documents: " @ft_total_docs } + li { "Cache misses: " @cache_stats.cache_misses } + li { "Cache hits: " @cache_stats.cache_hits } + } + }) +} |