aboutsummaryrefslogtreecommitdiff
path: root/server/src/routes/ui/admin
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/routes/ui/admin')
-rw-r--r--server/src/routes/ui/admin/mod.rs61
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 }
+ }
+ })
+}