Skip to content

Commit 78ce229

Browse files
authored
feat: track active requests using jsonrpsee counters (#1746)
1 parent 830cbc4 commit 78ce229

File tree

4 files changed

+40
-64
lines changed

4 files changed

+40
-64
lines changed

Cargo.lock

+27-34
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ rlp = "=0.5.2"
7676
triehash = "=0.8.4"
7777

7878
# network
79-
jsonrpsee = { version = "=0.23.2", features = ["server", "client"] }
79+
jsonrpsee = { version = "=0.24.5", features = ["server", "client"] }
8080
reqwest = { version = "=0.12.4", features = ["json"] }
8181
tonic = "=0.11.0"
8282
tower = "=0.4.13"

src/eth/rpc/rpc_middleware.rs

+11-4
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use futures::future::BoxFuture;
88
use jsonrpsee::server::middleware::rpc::layer::ResponseFuture;
99
use jsonrpsee::server::middleware::rpc::RpcService;
1010
use jsonrpsee::server::middleware::rpc::RpcServiceT;
11+
use jsonrpsee::server::ConnectionGuard;
1112
use jsonrpsee::types::error::INTERNAL_ERROR_CODE;
1213
use jsonrpsee::types::Params;
1314
use jsonrpsee::MethodResponse;
@@ -60,7 +61,6 @@ impl<'a> RpcServiceT<'a> for RpcMiddleware {
6061
type Future = RpcResponse<'a>;
6162

6263
fn call(&self, mut request: jsonrpsee::types::Request<'a>) -> Self::Future {
63-
// track request
6464
let span = info_span!(
6565
parent: None,
6666
"rpc::request",
@@ -91,7 +91,7 @@ impl<'a> RpcServiceT<'a> for RpcMiddleware {
9191
client = tx_client;
9292
}
9393

94-
// trace request
94+
// trace event
9595
Span::with(|s| {
9696
s.rec_str("rpc_id", &request.id);
9797
s.rec_str("rpc_client", &client);
@@ -113,15 +113,22 @@ impl<'a> RpcServiceT<'a> for RpcMiddleware {
113113
"rpc request"
114114
);
115115

116-
// metrify request
116+
// track metrics
117117
#[cfg(feature = "metrics")]
118118
{
119+
// started requests
119120
let tx_ref = tx.as_ref();
120121
metrics::inc_rpc_requests_started(&client, &method, tx_ref.map(|tx| tx.contract), tx_ref.map(|tx| tx.function));
122+
123+
// active requests
124+
if let Some(guard) = request.extensions.get::<ConnectionGuard>() {
125+
let active = guard.max_connections() - guard.available_connections(); // TODO: wait for this to be fixed https://github.com/paritytech/jsonrpsee/issues/1467
126+
metrics::set_rpc_requests_active(active as u64);
127+
}
121128
}
122-
drop(middleware_enter);
123129

124130
// make span available to rpc-server
131+
drop(middleware_enter);
125132
request.extensions_mut().insert(span);
126133

127134
RpcResponse {

src/infra/tracing/tracing_services.rs

+1-25
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,6 @@ use crate::alias::JsonValue;
2929
use crate::ext::not;
3030
use crate::ext::to_json_string;
3131
use crate::ext::to_json_value;
32-
#[cfg(feature = "metrics")]
33-
use crate::infra::metrics;
3432

3533
// -----------------------------------------------------------------------------
3634
// Tracing service: Span field recorder
@@ -120,42 +118,20 @@ where
120118
}
121119
});
122120

123-
// TODO: temporary metrics from events
124-
let fields = to_json_value(event.field_map());
125-
#[cfg(feature = "metrics")]
126-
{
127-
event_to_metrics(&fields);
128-
}
129-
130121
// parse metadata and event
131122
let log = TracingLog {
132123
timestamp: Utc::now(),
133124
level: meta.level().as_serde(),
134125
target: meta.target(),
135126
thread: std::thread::current(),
136-
fields,
127+
fields: to_json_value(event.field_map()),
137128
context,
138129
};
139130

140131
writeln!(writer, "{}", to_json_string(&log))
141132
}
142133
}
143134

144-
#[cfg(feature = "metrics")]
145-
fn event_to_metrics(json: &JsonValue) {
146-
let Some(message) = json.as_object().and_then(|obj| obj.get("message")).and_then(|msg| msg.as_str()) else {
147-
return;
148-
};
149-
150-
// jsonrpsee active connections
151-
let Some(message) = message.strip_prefix("Accepting new connection ") else {
152-
return;
153-
};
154-
let Some((current, _)) = message.split_once('/') else { return };
155-
let Ok(current) = current.parse::<u64>() else { return };
156-
metrics::set_rpc_requests_active(current);
157-
}
158-
159135
#[derive(derive_new::new)]
160136
struct TracingLog<'a> {
161137
timestamp: DateTime<Utc>,

0 commit comments

Comments
 (0)