mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-07-01 20:37:25 +00:00
Better RPC prometheus metrics. (#9358)
* Better RPC prometehus metrics. * Add session metrics. * Add counting requests as well. * Fix type for web build. * Fix browser-node * Filter out unknown method names. * Change Gauge to Counters * Use micros instead of millis. * cargo fmt * Update client/rpc-servers/src/lib.rs Co-authored-by: Bastian Köcher <bkchr@users.noreply.github.com> * Apply suggestions from code review Co-authored-by: Bastian Köcher <bkchr@users.noreply.github.com> * move log to separate lines. * Fix compilation. * cargo +nightly fmt --all Co-authored-by: Bastian Köcher <bkchr@users.noreply.github.com>
This commit is contained in:
@@ -24,6 +24,7 @@ mod middleware;
|
||||
|
||||
use jsonrpc_core::{IoHandlerExtension, MetaIoHandler};
|
||||
use log::error;
|
||||
use prometheus_endpoint::{register, Counter, PrometheusError, Registry, U64};
|
||||
use pubsub::PubSubMetadata;
|
||||
use std::io;
|
||||
|
||||
@@ -42,7 +43,7 @@ const HTTP_THREADS: usize = 4;
|
||||
pub type RpcHandler<T> = pubsub::PubSubHandler<T, RpcMiddleware>;
|
||||
|
||||
pub use self::inner::*;
|
||||
pub use middleware::{RpcMetrics, RpcMiddleware};
|
||||
pub use middleware::{method_names, RpcMetrics, RpcMiddleware};
|
||||
|
||||
/// Construct rpc `IoHandler`
|
||||
pub fn rpc_handler<M: PubSubMetadata>(
|
||||
@@ -73,6 +74,43 @@ pub fn rpc_handler<M: PubSubMetadata>(
|
||||
io
|
||||
}
|
||||
|
||||
/// RPC server-specific prometheus metrics.
|
||||
#[derive(Debug, Clone, Default)]
|
||||
pub struct ServerMetrics {
|
||||
/// Number of sessions opened.
|
||||
session_opened: Option<Counter<U64>>,
|
||||
/// Number of sessions closed.
|
||||
session_closed: Option<Counter<U64>>,
|
||||
}
|
||||
|
||||
impl ServerMetrics {
|
||||
/// Create new WebSocket RPC server metrics.
|
||||
pub fn new(registry: Option<&Registry>) -> Result<Self, PrometheusError> {
|
||||
registry
|
||||
.map(|r| {
|
||||
Ok(Self {
|
||||
session_opened: register(
|
||||
Counter::new(
|
||||
"rpc_sessions_opened",
|
||||
"Number of persistent RPC sessions opened",
|
||||
)?,
|
||||
r,
|
||||
)?
|
||||
.into(),
|
||||
session_closed: register(
|
||||
Counter::new(
|
||||
"rpc_sessions_closed",
|
||||
"Number of persistent RPC sessions closed",
|
||||
)?,
|
||||
r,
|
||||
)?
|
||||
.into(),
|
||||
})
|
||||
})
|
||||
.unwrap_or_else(|| Ok(Default::default()))
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(not(target_os = "unknown"))]
|
||||
mod inner {
|
||||
use super::*;
|
||||
@@ -84,6 +122,16 @@ mod inner {
|
||||
/// Type alias for ws server
|
||||
pub type WsServer = ws::Server;
|
||||
|
||||
impl ws::SessionStats for ServerMetrics {
|
||||
fn open_session(&self, _id: ws::SessionId) {
|
||||
self.session_opened.as_ref().map(|m| m.inc());
|
||||
}
|
||||
|
||||
fn close_session(&self, _id: ws::SessionId) {
|
||||
self.session_closed.as_ref().map(|m| m.inc());
|
||||
}
|
||||
}
|
||||
|
||||
/// Start HTTP server listening on given address.
|
||||
///
|
||||
/// **Note**: Only available if `not(target_os = "unknown")`.
|
||||
@@ -114,6 +162,7 @@ mod inner {
|
||||
pub fn start_ipc<M: pubsub::PubSubMetadata + Default>(
|
||||
addr: &str,
|
||||
io: RpcHandler<M>,
|
||||
server_metrics: ServerMetrics,
|
||||
) -> io::Result<ipc::Server> {
|
||||
let builder = ipc::ServerBuilder::new(io);
|
||||
#[cfg(target_os = "unix")]
|
||||
@@ -122,7 +171,7 @@ mod inner {
|
||||
security_attributes.set_mode(0o600)?;
|
||||
security_attributes
|
||||
});
|
||||
builder.start(addr)
|
||||
builder.session_stats(server_metrics).start(addr)
|
||||
}
|
||||
|
||||
/// Start WS server listening on given address.
|
||||
@@ -136,6 +185,7 @@ mod inner {
|
||||
cors: Option<&Vec<String>>,
|
||||
io: RpcHandler<M>,
|
||||
maybe_max_payload_mb: Option<usize>,
|
||||
server_metrics: ServerMetrics,
|
||||
) -> io::Result<ws::Server> {
|
||||
let rpc_max_payload = maybe_max_payload_mb
|
||||
.map(|mb| mb.saturating_mul(MEGABYTE))
|
||||
@@ -147,6 +197,7 @@ mod inner {
|
||||
.max_connections(max_connections.unwrap_or(WS_MAX_CONNECTIONS))
|
||||
.allowed_origins(map_cors(cors))
|
||||
.allowed_hosts(hosts_filtering(cors.is_some()))
|
||||
.session_stats(server_metrics)
|
||||
.start(addr)
|
||||
.map_err(|err| match err {
|
||||
ws::Error::Io(io) => io,
|
||||
|
||||
Reference in New Issue
Block a user