Skip to content

Commit 5bf95a1

Browse files
committed
Add metrics
1 parent d012d39 commit 5bf95a1

File tree

5 files changed

+77
-18
lines changed

5 files changed

+77
-18
lines changed

Cargo.lock

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

Cargo.toml

+2
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ serde_json = "1.0.96"
2929
reth-rpc-layer = { git = "https://github.com/paradigmxyz/reth.git", tag = "v1.0.7" }
3030
reth-optimism-payload-builder = { git = "https://github.com/paradigmxyz/reth.git", tag = "v1.0.7", features = ["optimism"] }
3131
futures = "0.3.31"
32+
metrics-derive = "0.1"
33+
metrics = "0.24.0"
3234

3335
[dev-dependencies]
3436
anyhow = "1.0"

src/main.rs

+5
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use jsonrpsee::http_client::transport::HttpBackend;
77
use jsonrpsee::http_client::{HttpClient, HttpClientBuilder};
88
use jsonrpsee::server::Server;
99
use jsonrpsee::RpcModule;
10+
use metrics::ServerMetrics;
1011
use proxy::ProxyLayer;
1112
use reth_rpc_layer::{AuthClientLayer, AuthClientService};
1213
use server::{EngineApiServer, EthEngineApi};
@@ -16,6 +17,7 @@ use tracing::{info, Level};
1617
use tracing_subscriber::EnvFilter;
1718

1819
mod error;
20+
mod metrics;
1921
mod proxy;
2022
mod selector;
2123
mod server;
@@ -82,6 +84,8 @@ async fn main() -> Result<()> {
8284
.with_env_filter(EnvFilter::new(args.log_level.to_string())) // Set the log level
8385
.init();
8486

87+
let metrics = ServerMetrics::default();
88+
8589
// Handle JWT secret
8690
let jwt_secret = match (args.jwt_path, args.jwt_token) {
8791
(Some(file), None) => {
@@ -127,6 +131,7 @@ async fn main() -> Result<()> {
127131
.map(|c| Arc::new(c.clone()))
128132
.collect(),
129133
args.boost_sync,
134+
metrics,
130135
);
131136
let mut module: RpcModule<()> = RpcModule::new(());
132137
module

src/metrics.rs

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
use metrics::Counter;
2+
use metrics_derive::Metrics;
3+
4+
#[derive(Metrics)]
5+
#[metrics(scope = "metrics_custom")]
6+
pub struct ServerMetrics {
7+
#[metric(describe = "Count of fork_choice_updated_v3 calls proxied to the builder")]
8+
pub fcu_count: Counter,
9+
10+
#[metric(describe = "Count of new_payload_v3 calls proxied to the builder")]
11+
pub new_payload_count: Counter,
12+
13+
#[metric(describe = "Count of get_payload_v3 calls proxied to the builder")]
14+
pub get_payload_count: Counter,
15+
16+
#[metric(describe = "Count of send_raw_transaction calls proxied to the builder")]
17+
pub send_raw_tx_count: Counter,
18+
}

src/server.rs

+16-6
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ use reth_rpc_layer::AuthClientService;
1818
use std::sync::Arc;
1919
use tracing::{debug, error, info};
2020

21+
use crate::metrics::ServerMetrics;
2122
use crate::selector::{DefaultPayloadSelector, PayloadSelector};
2223

2324
#[rpc(server, client, namespace = "engine")]
@@ -55,18 +56,21 @@ pub struct EthEngineApi<S = AuthClientService<HttpBackend>> {
5556
builder_clients: Vec<Arc<HttpClient<S>>>,
5657
payload_selector: Arc<dyn PayloadSelector + Send + Sync>,
5758
boost_sync: bool,
59+
metrics: ServerMetrics,
5860
}
5961

6062
impl<S> EthEngineApi<S> {
6163
pub fn new(
6264
l2_client: Arc<HttpClient<S>>,
6365
builder_clients: Vec<Arc<HttpClient<S>>>,
6466
boost_sync: bool,
67+
metrics: ServerMetrics,
6568
) -> Self {
6669
Self {
6770
l2_client,
6871
builder_clients,
6972
boost_sync,
73+
metrics,
7074
payload_selector: Arc::new(DefaultPayloadSelector),
7175
}
7276
}
@@ -79,13 +83,16 @@ impl EthApiServer for EthEngineApi {
7983
message = "received send_raw_transaction",
8084
"bytes_len" = bytes.len()
8185
);
82-
let builder = self.builder_client.clone();
83-
let tx_bytes = bytes.clone();
84-
tokio::spawn(async move {
85-
builder.send_raw_transaction(tx_bytes).await.map_err(|e| {
86+
for builder in self.builder_clients.iter() {
87+
self.metrics.send_raw_tx_count.increment(1);
88+
let builder = builder.clone();
89+
let tx_bytes = bytes.clone();
90+
tokio::spawn(async move {
91+
builder.send_raw_transaction(tx_bytes).await.map_err(|e| {
8692
error!(message = "error calling send_raw_transaction for builder", "error" = %e);
87-
})
88-
});
93+
})
94+
});
95+
}
8996
self.l2_client
9097
.send_raw_transaction(bytes)
9198
.await
@@ -129,6 +136,7 @@ impl EngineApiServer for EthEngineApi {
129136
if should_send_to_builder {
130137
// async call to each builder to trigger payload building and sync
131138
for builder in self.builder_clients.iter() {
139+
self.metrics.fcu_count.increment(1);
132140
let builder = builder.clone();
133141
let attr = payload_attributes.clone();
134142
tokio::spawn(async move {
@@ -173,6 +181,7 @@ impl EngineApiServer for EthEngineApi {
173181
let builder_client_futures = self.builder_clients.iter().map(|builder| {
174182
let builder = builder.clone();
175183
Box::pin(async move {
184+
self.metrics.get_payload_count.increment(1);
176185
let payload = builder.get_payload_v3(payload_id).await.map_err(|e| {
177186
error!(message = "error calling get_payload_v3 from builder", "error" = %e, "payload_id" = %payload_id);
178187
e
@@ -231,6 +240,7 @@ impl EngineApiServer for EthEngineApi {
231240
// async call to builder to sync the builder node
232241
if self.boost_sync {
233242
for builder in self.builder_clients.iter() {
243+
self.metrics.new_payload_count.increment(1);
234244
let builder = builder.clone();
235245
let builder_payload = payload.clone();
236246
let builder_versioned_hashes = versioned_hashes.clone();

0 commit comments

Comments
 (0)