simple status json and prometheus

This commit is contained in:
Bryan Stitt 2022-09-10 02:59:07 +00:00
parent 501f2b0b24
commit d98886db14
4 changed files with 30 additions and 22 deletions

View File

@ -340,7 +340,7 @@ impl Web3ProxyApp {
Ok((app, handle)) Ok((app, handle))
} }
pub fn prometheus_metrics(&self) -> anyhow::Result<String> { pub fn prometheus_metrics(&self) -> String {
let globals = HashMap::new(); let globals = HashMap::new();
// TODO: what globals? should this be the hostname or what? // TODO: what globals? should this be the hostname or what?
// globals.insert("service", "web3_proxy"); // globals.insert("service", "web3_proxy");
@ -356,9 +356,8 @@ impl Web3ProxyApp {
backend_rpc: &self.open_request_handle_metrics, backend_rpc: &self.open_request_handle_metrics,
}; };
let serialized = serde_prometheus::to_string(&metrics, Some("web3_proxy"), globals)?; serde_prometheus::to_string(&metrics, Some("web3_proxy"), globals)
.expect("prometheus metrics should always serialize")
Ok(serialized)
} }
#[instrument(skip_all)] #[instrument(skip_all)]

View File

@ -1,5 +1,7 @@
use crate::app::Web3ProxyApp; use crate::app::Web3ProxyApp;
use axum::{http::StatusCode, response::IntoResponse, Extension}; use axum::{http::StatusCode, response::IntoResponse, Extension, Json};
use moka::future::ConcurrentCacheExt;
use serde_json::json;
use std::sync::Arc; use std::sync::Arc;
use tracing::instrument; use tracing::instrument;
@ -13,23 +15,29 @@ pub async fn health(Extension(app): Extension<Arc<Web3ProxyApp>>) -> impl IntoRe
} }
} }
/// Prometheus metrics
/// TODO: when done debugging, remove this and only allow access on a different port
#[instrument(skip_all)]
pub async fn prometheus(Extension(app): Extension<Arc<Web3ProxyApp>>) -> impl IntoResponse {
app.prometheus_metrics()
}
/// Very basic status page /// Very basic status page
/// TODO: replace this with proper stats and monitoring /// TODO: replace this with proper stats and monitoring
#[instrument(skip_all)] #[instrument(skip_all)]
pub async fn status(Extension(app): Extension<Arc<Web3ProxyApp>>) -> impl IntoResponse { pub async fn status(Extension(app): Extension<Arc<Web3ProxyApp>>) -> impl IntoResponse {
// // TODO: what else should we include? uptime? // TODO: what else should we include? uptime?
// app.pending_transactions.sync(); app.pending_transactions.sync();
// app.user_cache.sync(); app.user_cache.sync();
// let body = json!({
// "total_queries": app.total_queries.load(atomic::Ordering::Acquire), 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.user_cache.entry_count(), "user_cache_count": app.user_cache.entry_count(),
// "user_cache_size": app.user_cache.weighted_size(), "user_cache_size": app.user_cache.weighted_size(),
// "balanced_rpcs": app.balanced_rpcs, "balanced_rpcs": app.balanced_rpcs,
// "private_rpcs": app.private_rpcs, "private_rpcs": app.private_rpcs,
// }); });
// Json(body)
// TODO: only expose this on a different port Json(body)
app.prometheus_metrics().unwrap()
} }

View File

@ -50,8 +50,9 @@ pub async fn serve(port: u16, proxy_app: Arc<Web3ProxyApp>) -> anyhow::Result<()
.route("/u/:user_key", post(rpc_proxy_http::user_proxy_web3_rpc)) .route("/u/:user_key", post(rpc_proxy_http::user_proxy_web3_rpc))
.route("/u/:user_key", get(rpc_proxy_ws::user_websocket_handler)) .route("/u/:user_key", get(rpc_proxy_ws::user_websocket_handler))
.route("/health", get(http::health)) .route("/health", get(http::health))
// TODO: we probably want to remove /status in favor of the separate prometheus thread
.route("/status", get(http::status)) .route("/status", get(http::status))
// TODO: make this optional or remove it since it is available on another port
.route("/prometheus", get(http::prometheus))
.route("/login/:user_address", get(users::get_login)) .route("/login/:user_address", get(users::get_login))
.route("/login/:user_address/:message_eip", get(users::get_login)) .route("/login/:user_address/:message_eip", get(users::get_login))
.route("/login", post(users::post_login)) .route("/login", post(users::post_login))

View File

@ -44,7 +44,7 @@ pub async fn serve(app: Arc<Web3ProxyApp>, port: u16) -> anyhow::Result<()> {
#[instrument(skip_all)] #[instrument(skip_all)]
async fn root(Extension(app): Extension<Arc<Web3ProxyApp>>) -> Response { async fn root(Extension(app): Extension<Arc<Web3ProxyApp>>) -> Response {
let serialized = app.prometheus_metrics().unwrap(); let serialized = app.prometheus_metrics();
let mut r = serialized.into_response(); let mut r = serialized.into_response();