cache status page for 1 second
This commit is contained in:
parent
4d8808b886
commit
5886db20dd
@ -16,15 +16,31 @@ use axum::{
|
|||||||
};
|
};
|
||||||
use http::header::AUTHORIZATION;
|
use http::header::AUTHORIZATION;
|
||||||
use log::info;
|
use log::info;
|
||||||
use std::iter::once;
|
use moka::future::Cache;
|
||||||
use std::net::SocketAddr;
|
use std::net::SocketAddr;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
use std::{iter::once, time::Duration};
|
||||||
use tower_http::cors::CorsLayer;
|
use tower_http::cors::CorsLayer;
|
||||||
use tower_http::sensitive_headers::SetSensitiveRequestHeadersLayer;
|
use tower_http::sensitive_headers::SetSensitiveRequestHeadersLayer;
|
||||||
|
|
||||||
/// Start the frontend server.
|
#[derive(Clone, Hash, PartialEq, Eq)]
|
||||||
|
pub enum FrontendResponseCaches {
|
||||||
|
Status,
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: what should this cache's value be?
|
||||||
|
pub type FrontendResponseCache =
|
||||||
|
Cache<FrontendResponseCaches, Arc<serde_json::Value>, hashbrown::hash_map::DefaultHashBuilder>;
|
||||||
|
|
||||||
|
/// Start the frontend server.
|
||||||
pub async fn serve(port: u16, proxy_app: Arc<Web3ProxyApp>) -> anyhow::Result<()> {
|
pub async fn serve(port: u16, proxy_app: Arc<Web3ProxyApp>) -> anyhow::Result<()> {
|
||||||
|
// setup caches for whatever the frontend needs
|
||||||
|
// TODO: a moka cache is probably way overkill for this.
|
||||||
|
// no need for max items. only expire because of time to live
|
||||||
|
let response_cache: FrontendResponseCache = Cache::builder()
|
||||||
|
.time_to_live(Duration::from_secs(1))
|
||||||
|
.build_with_hasher(hashbrown::hash_map::DefaultHashBuilder::default());
|
||||||
|
|
||||||
// build our axum Router
|
// build our axum Router
|
||||||
let app = Router::new()
|
let app = Router::new()
|
||||||
// routes should be ordered most to least common
|
// routes should be ordered most to least common
|
||||||
@ -70,6 +86,8 @@ pub async fn serve(port: u16, proxy_app: Arc<Web3ProxyApp>) -> anyhow::Result<()
|
|||||||
.layer(CorsLayer::very_permissive())
|
.layer(CorsLayer::very_permissive())
|
||||||
// application state
|
// application state
|
||||||
.layer(Extension(proxy_app.clone()))
|
.layer(Extension(proxy_app.clone()))
|
||||||
|
// frontend caches
|
||||||
|
.layer(Extension(response_cache))
|
||||||
// 404 for any unknown routes
|
// 404 for any unknown routes
|
||||||
.fallback(errors::handler_404.into_service());
|
.fallback(errors::handler_404.into_service());
|
||||||
|
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
//! For ease of development, users can currently access these endponts.
|
//! For ease of development, users can currently access these endponts.
|
||||||
//! They will eventually move to another port.
|
//! They will eventually move to another port.
|
||||||
|
|
||||||
|
use super::{FrontendResponseCache, FrontendResponseCaches};
|
||||||
use crate::app::Web3ProxyApp;
|
use crate::app::Web3ProxyApp;
|
||||||
use axum::{http::StatusCode, response::IntoResponse, Extension, Json};
|
use axum::{http::StatusCode, response::IntoResponse, Extension, Json};
|
||||||
use axum_macros::debug_handler;
|
use axum_macros::debug_handler;
|
||||||
@ -36,19 +37,28 @@ pub async fn prometheus(Extension(app): Extension<Arc<Web3ProxyApp>>) -> impl In
|
|||||||
/// TODO: replace this with proper stats and monitoring
|
/// TODO: replace this with proper stats and monitoring
|
||||||
#[debug_handler]
|
#[debug_handler]
|
||||||
|
|
||||||
pub async fn status(Extension(app): Extension<Arc<Web3ProxyApp>>) -> impl IntoResponse {
|
pub async fn status(
|
||||||
app.pending_transactions.sync();
|
Extension(app): Extension<Arc<Web3ProxyApp>>,
|
||||||
app.rpc_secret_key_cache.sync();
|
Extension(response_cache): Extension<FrontendResponseCache>,
|
||||||
|
) -> impl IntoResponse {
|
||||||
|
let body = response_cache
|
||||||
|
.get_with(FrontendResponseCaches::Status, async {
|
||||||
|
app.pending_transactions.sync();
|
||||||
|
app.rpc_secret_key_cache.sync();
|
||||||
|
|
||||||
// TODO: what else should we include? uptime, cache hit rates, cpu load
|
// TODO: what else should we include? uptime, cache hit rates, cpu load
|
||||||
let body = json!({
|
let body = json!({
|
||||||
"pending_transactions_count": app.pending_transactions.entry_count(),
|
"pending_transactions_count": app.pending_transactions.entry_count(),
|
||||||
"pending_transactions_size": app.pending_transactions.weighted_size(),
|
"pending_transactions_size": app.pending_transactions.weighted_size(),
|
||||||
"user_cache_count": app.rpc_secret_key_cache.entry_count(),
|
"user_cache_count": app.rpc_secret_key_cache.entry_count(),
|
||||||
"user_cache_size": app.rpc_secret_key_cache.weighted_size(),
|
"user_cache_size": app.rpc_secret_key_cache.weighted_size(),
|
||||||
"balanced_rpcs": app.balanced_rpcs,
|
"balanced_rpcs": app.balanced_rpcs,
|
||||||
"private_rpcs": app.private_rpcs,
|
"private_rpcs": app.private_rpcs,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Arc::new(body)
|
||||||
|
})
|
||||||
|
.await;
|
||||||
|
|
||||||
Json(body)
|
Json(body)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user